Ingest once, query forever.
Three modes. One API. Auto-detect what is in the document. Send your own JSON Schema and get exactly that shape back. Or skip the document entirely and query the database you built last month, as typed rows or as a cited answer. Pick the mode that matches the call you are already writing.
One endpoint in. Two endpoints out.
Extract everything
Send a document, get every field the model finds, each with confidence and provenance. No schema needed.
curl -X POST https://api.talonic.com/v1/extract \
-H "Authorization: Bearer $TALONIC_API_KEY" \
-F "file=@invoice.pdf"Use when you do not yet know what is in the document, or you are prototyping and want to see what is there.
Extract exactly what you asked for
Send a document and the shape you want. Get back exactly that shape, validated, with confidence per field.
const result = await client.extract({
file_path: "invoice.pdf",
schema: {
type: "object",
properties: {
vendor: { type: "string" },
total_eur: { type: "number" },
due_date: { type: "string", format: "date" },
line_items: {
type: "array",
items: {
type: "object",
properties: {
description: { type: "string" },
amount_eur: { type: "number" }
}
}
}
},
required: ["vendor", "total_eur"]
}
});
// result.data == { vendor: "Acme Corp", total_eur: 1500.00, ... }
// Every field includes confidence and provenance.Three schema formats accepted
JSON Schema (most control)
{"type": "object", "properties": { ... }}Simplified fields (recommended)
{"fields": [
{"name": "vendor", "type": "string", "description": "..."}
]}Flat key-type map (quickest)
{"vendor": "string", "total": "number"}Use when your code already knows the shape it needs, which is every time an agent calls a function.
Skip the document, ask the database
The documents were ingested days or months ago. Filter them into typed rows with no model call, or ask a question and get a cited, verified answer.
# Typed rows over materialised field values. No model call, no credits.
POST /v1/documents/filter
{
"conditions": [
{ "fieldId": "vendor_name", "operator": "eq", "value": "Meridian Energy AG" },
{ "fieldId": "contract_year", "operator": "eq", "value": "2026" }
],
"limit": 50
}
# A cited answer over the same corpus.
POST /v1/ask
{
"question": "Which contracts renew in the next 30 days, and with what notice period?",
"scope": { "pipeline_id": "pipe_contracts_2026" }
}
# -> rows + the SQL that produced them + an exact source span behind every claimUse when the answer is already in your data. "Ingest once, query forever" as two endpoints, not a slogan.
Same auth, same response envelope, same provenance. Pick the mode that fits the call you are writing.
Authentication
API keys are prefixed tlnc_ and passed as Authorization: Bearer on every request. Keys are SHA-256 hashed at rest; the full value is shown exactly once, at creation.
Six scopes: extract, read, write, operations, billing and delivery. New keys get the first four. billing and delivery are added explicitly. A call outside the key’s scope returns 403 with insufficient_scope and names the scope it needed.
Authorization: Bearer $TALONIC_API_KEYCreate one key per integration, so each can be rotated and revoked on its own.
All write endpoints honour Idempotency-Key headers. Send the same key twice, get the same response, no duplicate resources.
The agent billing story.
Read the cost on every call
Every synchronous /v1/extract response includes cost headers. Agents track spending per call without a separate request, and can see how many cells came free from the database.
HTTP/1.1 200 OK
X-Talonic-Cost-Credits: 70
X-Talonic-Cost-EUR: 0.07
X-Talonic-Balance-Credits: 64930
X-Talonic-Cells-Resolved-Registry: 0
X-Talonic-Cells-Resolved-AI: 1Headers appear on synchronous 200 responses. Async 202 poll responses do not include them.
Check balance and runway
A single endpoint returns current balance, 30-day burn rate and projected runway in days.
GET /v1/credits/balance
{
"balance_credits": 64930,
"balance_eur": 64.93,
"burn_rate_30d_credits": 12400,
"projected_runway_days": 157,
"tier": "pro",
"tier_resets_at": "2026-05-01T00:00:00Z"
}Auto top-up (human-gated)
A human enables auto top-up via PATCH /v1/billing/settings with auto_topup_enabled: true, an auto_topup_threshold and an auto_topup_amount.
Once enabled, agents call POST /v1/billing/topup with the billing scope. The endpoint returns 403 if auto top-up is not enabled; agents cannot enable it themselves. When the balance is above the threshold, the endpoint returns { "topped_up": false } without adding credits.
Errors and retries
See the error reference for all error codes, the response envelope, retry guidance and backoff recommendations.
Webhooks
Async extractions and delivery events fire HMAC-SHA256 signed webhooks. Every payload carries X-Talonic-Signature, X-Talonic-Idempotency-Key, X-Talonic-Attempt and X-Talonic-Event-Id. Failed deliveries retry seven times over about ten hours (0s, 30s, 2min, 8min, 30min, 2h, 8h), overridable per binding. Terminal failures land in a dead-letter queue you can replay.
See the webhooks reference for event names, signature verification snippets and the retry policy.
SDKs and MCP
NODE SDK
npm install @talonic/nodeimport { Talonic } from "@talonic/node";
const client = new Talonic({
apiKey: process.env.TALONIC_API_KEY!
});MCP SERVER
Hosted at mcp.talonic.com, zero install. On Claude.ai the connector uses OAuth, so no key goes in the config:
{
"mcpServers": {
"talonic": {
"url": "https://mcp.talonic.com/mcp",
"headers": {
"Authorization": "Bearer tlnc_live_..."
}
}
}
}Or run locally over stdio with npx:
{
"mcpServers": {
"talonic": {
"command": "npx",
"args": ["-y", "@talonic/mcp@latest"],
"env": {
"TALONIC_API_KEY": "tlnc_live_..."
}
}
}
}Eleven tools and two resources, listed on the official MCP Registry: extract, request an upload link, OCR to markdown, omnisearch, filter by field value, get a document, list and save schemas, and read balance, pricing and usage so an agent can budget before it runs.
Pin a version in production so a release cannot silently change a tool description your agent depends on.
The Node SDK and MCP server are thin wrappers around the same REST API. For other languages, the API works directly. See the OpenAPI spec or jump to Mode 1 above.
Limits and metering
Talonic meters usage in credits, not request quotas. 1,000 credits are one euro, at every pack size.
- Free
- 5,000 credits/month, no credit card. A hard cap: 429 until the monthly reset or a top-up.
- Pay as you go
- Prepaid credit packs from €10, flat rate at every size, bought inside the app. Credits keep for twelve months.
- Enterprise
- Volume contracts, invoicing, custom quotas.
Per operation: 100 credits per page ingested, 20 per AI-resolved cell, 0 per cell resolved from the database, 100 per matching or case operation. Batch mode runs at 0.5x.
Separate abuse-protection limits apply per key and are not pricing: 30 requests per minute, 5 concurrent extractions, 50 MB per file by default. If a real workload hits them, write to info@talonic.ai and we raise them.
Every response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. When a limit is hit, the API returns 429 with a Retry-After header. Wait that many seconds, then retry.
Supported formats
25+ formats across documents, images, text and archives. German, English, French and Spanish at production quality.
Documents: PDF, DOCX, DOC, XLSX, XLS, XLSM, PPTX, PPT
Images: PNG, JPG, JPEG, GIF, WEBP, BMP
Text: TXT, MD, HTML, JSON, CSV, XML, EML, MSG
Archives: ZIP
Why not just RAG?
Because the second question should be free, and the same question tomorrow should return the same answer. Three published benchmarks, one method, with the rows we lose left in.
ACCURACY
Talonic vs. RAG
28 SEC 10-K filings, preregistered protocol, XBRL gold labels. Structure-first answers 5 of 5 headline ranking queries. BM25 top-12 answers 0 of 5.
Read the benchmark
COST
Cost per 1,000 queries
$10.14 once for 53 documents, then $0.00 per 1,000 questions. Retrieval’s cost line climbs with every question asked.
Read the cost benchmark
CONSISTENCY
Same 100 questions, ten runs
Hybrid RAG matched itself on 2 of 39 questions. The structured path was byte-identical across ten passes of 100 questions.
Read the consistency benchmark
On one-question-per-document numeric reading, structure-first and retrieval tie in our own runs. The benchmark page says so. The advantage is the second question, and every one after it.
Resources
- OpenAPI spec
- talonic.com/openapi.json
- Documentation
- talonic.com/docs
- MCP Registry
- io.github.talonicdev/talonic-mcp
- Benchmarks
- talonic.com/vs/rag
- llms.txt
- talonic.com/llms.txt
- Pricing
- talonic.com/pricing
- GitHub
- github.com/talonicdev
- Support
- info@talonic.ai