Krenzo
Documentation

Docs

Everything you need for the first call and the millionth. Full reference, copy-pasteable.

Quickstart

Install a client, set your key, make a call. Three minutes end to end.

install.sh
# Python
pip install krenzo

# Node
npm install @krenzo/sdk
first-call.ts
import { Krenzo } from "@krenzo/sdk";

const client = new Krenzo({ apiKey: process.env.KRENZO_API_KEY });

const res = await client.search("who acquired Figma competitors in 2026", {
  depth: "quick",
  maxResults: 5,
});

res.results.forEach((r) => console.log(r.title, "—", r.url));

Authentication

Every request carries a bearer token in the Authorization header. Create and rotate keys in the dashboard; a revoked key stops working immediately.

Keep keys server-side. A key in browser JavaScript is a public key. Proxy calls through your own backend.

API reference

Base URL https://krenzo.in/api/v1. All endpoints are POST and take JSON.

search.sh
curl https://krenzo.in/api/v1/search \
  -H "Authorization: Bearer $KRENZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "latest guidance on model evaluation",
    "depth": "deep",
    "max_results": 8
  }'
POST /v1/searchRanked results with cleaned passages.
POST /v1/extractStructured content for known URLs.
POST /v1/answerGrounded synthesis with citations.
GET /v1/usageCredits consumed in the current period.

Parameters

NameTypeDescription
querystringThe search intent. Natural language beats keywords — the reranker uses the full phrasing.
depth"quick" | "deep"`quick` hits the index and returns. `deep` fans out, fetches more candidates, and reranks. Costs 3 credits.
max_resultsint (1–20)How many results to return after ranking. Defaults to 5.
time_range"hour" | "day" | "week" | "month" | "year"Restrict to content published inside the window. Omit for no constraint.
include_domainsstring[]Only return results from these domains. Mutually exclusive with `exclude_domains`.
exclude_domainsstring[]Drop results from these domains before ranking.
include_answerboolAlso return a synthesized, cited answer alongside the results.
include_rawboolAttach the full cleaned page text per result, not just the ranked passages.

Errors & rate limits

Errors return a consistent envelope with a machine-readable type. Retry on 429 and 503; everything else is a bug in the request.

error.json
{
  "error": {
    "type": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Retry after the window resets.",
    "retry_after_ms": 400
  }
}
400 invalid_requestA parameter is missing or malformed. The message names the field.
401 unauthorizedMissing or revoked API key. Keys start with `bv-`.
402 insufficient_creditsFree calls are spent and the prepaid balance is too low. Top up to resume.
429 rate_limit_exceededToo many requests per second. Back off by `retry_after_ms`.
503 upstream_timeoutThe fetch stage blew its latency budget. Safe to retry once.

SDKs

Official clients with typed responses and automatic retry on transient failures.

Python

pip install krenzo

3.9+

TypeScript

npm i @krenzo/sdk

Node 18+, Edge, Deno

Go

go get krenzo.in/go

1.21+

REST

Any HTTP client

No SDK required