Skip to content

Anonymous sandbox

The quickstart's single-file snippets and the curl batch snippet run against the anonymous sandbox — no signup, no card, no email. The TypeScript, Go, and Dart batch snippets read KREUZBERG_API_KEY from the environment; point it at a sandbox key to keep them anonymous too. POST /v1/sandbox/key returns a fresh sk_sandbox_... key bound to the caller's IP.

curl -X POST https://api.kreuzberg.dev/v1/sandbox/key
{
  "api_key": "sk_sandbox_...",
  "pages_remaining": 50
}

Limits

Limit Value
Pages per key 50
Key lifetime 24 hours
Keys per IP per 24h 10
Authentication none (POST /v1/sandbox/key is unauthenticated)

When the IP hits the per-day cap, POST /v1/sandbox/key returns 429 rate_limited. When the per-key page quota is exhausted, subsequent extraction calls return 429.

SDK helpers

Three of the four SDKs ship a from_sandbox() constructor that calls POST /v1/sandbox/key for you and stores the key in the client:

from kreuzberg_cloud import AsyncKreuzbergCloud

async with await AsyncKreuzbergCloud.from_sandbox() as client:
    job = await client.extract_and_wait(file="invoice.pdf")
    print(job.result.content)
import { KreuzbergCloud } from "@kreuzberg/cloud";

const client = await KreuzbergCloud.fromSandbox();
const data = await readFile("invoice.pdf");
const result = await client.extractAndWait({
  file: { name: "invoice.pdf", data, mimeType: "application/pdf" },
});
client, err := kreuzbergcloud.FromSandbox(ctx)
if err != nil { log.Fatal(err) }

The Dart SDK doesn't ship a sandbox helper yet — POST to the endpoint directly and pass the returned api_key to KreuzbergCloudClient.

When to stop using it

The sandbox is for trial use from the docs and landing page. Once you're beyond a single document or two, get a real kz_ key from the dashboard — full quota, no IP binding, no 24-hour expiry.

Edit this page on GitHub