Files
fil/docs/guides/api-server.md
Henrik Jess Nielsen b4c07d3693
All checks were successful
Deploy fil (kreuzberg) / deploy (push) Successful in 49s
Nomad changes
2026-06-01 23:40:55 +02:00

15 KiB

API Server v4.0.0

Kreuzberg runs as an HTTP REST API server (kreuzberg serve) or as an MCP server (kreuzberg mcp) for AI agent integration.

HTTP REST API

Start

=== "CLI"

--8<-- "snippets/api_server/cli.md"

=== "Docker"

--8<-- "snippets/api_server/docker.md"

=== "Python"

--8<-- "snippets/api_server/python.md"

=== "Rust"

--8<-- "snippets/api_server/rust.md"

=== "Go"

--8<-- "snippets/api_server/go.md"

=== "Java"

--8<-- "snippets/api_server/java.md"

=== "C#"

--8<-- "snippets/api_server/csharp.md"

Endpoints

POST /extract

Extract text from uploaded files via multipart form data.

Field Required Description
files Yes (repeatable) Files to extract
config No JSON config overrides
output_format No plain (default), markdown, djot, or html
# Single file
curl -F "files=@document.pdf" http://localhost:8000/extract

# Multiple files
curl -F "files=@doc1.pdf" -F "files=@doc2.docx" http://localhost:8000/extract

# With config overrides
curl -F "files=@scanned.pdf" \
     -F 'config={"ocr":{"language":"eng"},"force_ocr":true}' \
     http://localhost:8000/extract
[
  {
    "content": "Extracted text...",
    "mime_type": "application/pdf",
    "metadata": { "page_count": 10, "author": "John Doe" },
    "tables": [],
    "detected_languages": ["eng"],
    "chunks": null,
    "images": null
  }
]

POST /embed

Generate vector embeddings. Requires the embeddings feature.

Field Required Description
texts Yes Array of strings
config No Embedding config overrides
curl -X POST http://localhost:8000/embed \
  -H "Content-Type: application/json" \
  -d '{"texts":["Hello world","Second text"]}'
Preset Dimensions Model
fast 384 AllMiniLML6V2Q
balanced (default) 768 BGEBaseENV15
quality 1024 BGELargeENV15
multilingual 768 MultilingualE5Base

POST /chunk

Chunk text for RAG pipelines.

Field Required Description
text Yes Text to chunk
chunker_type No "text" (default), "markdown", "yaml", or "semantic"
config.max_characters No Max chars per chunk (default: 2000)
config.overlap No Overlap between chunks (default: 100)
curl -X POST http://localhost:8000/chunk \
  -H "Content-Type: application/json" \
  -d '{"text":"Long text...","chunker_type":"text","config":{"max_characters":1000,"overlap":50}}'

=== "Python"

--8<-- "snippets/python/api/client_chunk_text.md"

=== "TypeScript"

--8<-- "snippets/typescript/api/client_chunk_text.md"

=== "Rust"

--8<-- "snippets/rust/api/client_chunk_text.md"

=== "Go"

--8<-- "snippets/go/api/client_chunk_text.md"

=== "Java"

--8<-- "snippets/java/api/client_chunk_text.md"

=== "C#"

--8<-- "snippets/csharp/client_chunk_text.md"

=== "Ruby"

--8<-- "snippets/ruby/api/client_chunk_text.md"

POST /extract-structured v4.8.0

Extract typed JSON from a document by running an LLM against the extracted text with a JSON schema (requires liter-llm feature; multipart/form-data request).

Field Required Description
file (or files) Yes The document to extract from
schema Yes JSON Schema string describing the structured output
model Yes LLM model identifier, for example openai/gpt-4o or anthropic/claude-sonnet-4-20250514
api_key No LLM provider API key. Falls back to provider env vars (OPENAI_API_KEY, ANTHROPIC_API_KEY, ...)
prompt No Custom Jinja2 prompt template overriding the default
schema_name No Schema identifier (default: extraction)
strict No "true" / "false" — enable OpenAI strict mode for exact schema matching
config No Extraction config overrides as a JSON string
curl -X POST http://localhost:8000/extract-structured \
  -F "file=@invoice.pdf" \
  -F 'schema={"type":"object","properties":{"invoice_number":{"type":"string"},"total":{"type":"number"}},"required":["invoice_number","total"]}' \
  -F "model=openai/gpt-4o" \
  -F "api_key=$OPENAI_API_KEY" \
  -F "strict=true"
{
  "structured_output": {
    "invoice_number": "INV-2026-0142",
    "total": 1284.5
  },
  "content": "Invoice INV-2026-0142...",
  "mime_type": "application/pdf"
}

Errors follow the same shape as /extract. A 501 response indicates the server was built without liter-llm.

Other Endpoints

Endpoint Method Description
/health GET {"status":"healthy","version":"4.6.3"}
/version GET {"version":"4.6.3"} v4.5.2
/detect POST MIME type detection (multipart) v4.5.2
/cache/stats GET Cache statistics
/cache/warm POST Pre-download models v4.5.2
/cache/manifest GET Model manifest with checksums v4.5.2
/cache/clear DELETE Clear all cached files
/info GET {"version":"...","rust_backend":true}
/openapi.json GET OpenAPI 3.0 schema

Client Examples

=== "Python"

--8<-- "snippets/python/api/client_extract_single_file.md"

=== "TypeScript"

--8<-- "snippets/typescript/getting-started/client_extract_single_file.md"

=== "Rust"

--8<-- "snippets/rust/api/client_extract_single_file.md"

=== "Go"

--8<-- "snippets/go/api/client_extract_single_file.md"

=== "Java"

--8<-- "snippets/java/api/client_extract_single_file.md"

=== "C#"

--8<-- "snippets/csharp/client_extract_single_file.md"

=== "Ruby"

--8<-- "snippets/ruby/api/client_extract_single_file.md"

Error Handling

{
  "error_type": "ValidationError",
  "message": "Invalid file format",
  "status_code": 400
}
Status Error type Meaning
400 ValidationError Invalid input
422 ParsingError, OcrError Processing failed
500 Internal errors Server errors

=== "Python"

--8<-- "snippets/python/utils/error_handling_extract.md"

=== "TypeScript"

--8<-- "snippets/typescript/api/error_handling_extract.md"

=== "Rust"

--8<-- "snippets/rust/api/error_handling_extract.md"

=== "Go"

--8<-- "snippets/go/api/error_handling_extract.md"

=== "Java"

--8<-- "snippets/java/api/error_handling_extract.md"

=== "C#"

--8<-- "snippets/csharp/error_handling_extract.md"

=== "Ruby"

--8<-- "snippets/ruby/api/error_handling_extract.md"

Configuration

The server discovers kreuzberg.toml in the current and parent directories. Pass --config path/to/file to use a different file.

Variable Default Description
KREUZBERG_MAX_UPLOAD_SIZE_MB 100 Max upload size in MB
KREUZBERG_CORS_ORIGINS * Comma-separated allowed origins

!!! Warning Default CORS allows all origins. Set KREUZBERG_CORS_ORIGINS explicitly in production.

See Configuration Guide for all options.


MCP Server

Start

kreuzberg mcp
kreuzberg mcp --config kreuzberg.toml

=== "Python"

--8<-- "snippets/python/mcp/mcp_server_start.md"

=== "TypeScript"

--8<-- "snippets/typescript/mcp/mcp_server_start.md"

=== "Rust"

--8<-- "snippets/rust/mcp/mcp_server_start.md"

=== "Go"

--8<-- "snippets/go/mcp/mcp_server_start.md"

=== "Java"

--8<-- "snippets/java/mcp/mcp_server_start.md"

=== "C#"

--8<-- "snippets/csharp/mcp_server_start.md"

=== "Ruby"

--8<-- "snippets/ruby/mcp/mcp_server_start.md"

Tools

Tool Key parameters Description
extract_file path Extract from file path
extract_bytes data (base64) Extract from encoded bytes
batch_extract_files paths Extract multiple files
detect_mime_type path Detect file format
list_formats List supported formats v4.5.2
get_version Library version v4.5.2
cache_stats Cache usage
cache_clear Remove cached files
cache_manifest Model checksums v4.5.2
cache_warm Pre-download models v4.5.2
embed_text texts Generate embeddings v4.5.2
chunk_text text Split text v4.5.2
extract_structured path, schema, model; optional schema_name (default "extraction"), schema_description, prompt, api_key, strict (default false) Extract structured JSON via LLM v4.8.0

All tools accept an optional config object. extract_file and extract_bytes also accept pdf_password. extract_structured requires the server to be built with the liter-llm feature; see the row above for optional fields and defaults.

AI Agent Integration

=== "Claude Desktop"

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "kreuzberg": {
      "command": "kreuzberg",
      "args": ["mcp"]
    }
  }
}
```

=== "Python"

--8<-- "snippets/python/mcp/mcp_custom_client.md"

=== "LangChain"

--8<-- "snippets/python/mcp/mcp_langchain_integration.md"

=== "TypeScript"

--8<-- "snippets/typescript/mcp/mcp_custom_client.md"

=== "Rust"

--8<-- "snippets/rust/mcp/mcp_custom_client.md"

=== "Go"

--8<-- "snippets/go/mcp/mcp_custom_client.md"

=== "Java"

--8<-- "snippets/java/mcp/mcp_client.md"

=== "C#"

--8<-- "snippets/csharp/mcp_custom_client.md"

=== "Ruby"

--8<-- "snippets/ruby/mcp/mcp_custom_client.md"

For Docker and Kubernetes deployment, see Docker Guide and Kubernetes Guide.