Null API
One OpenAI-compatible endpoint. Every frontier model. EU-hosted. With the privacy layer running inline, tokenize, route, reveal.
curl --request POST \ --url https://api.null.tl/v1/chat/completions \ --header 'Authorization: Bearer <NULL_API_KEY>' \ --header 'Content-Type: application/json' \ --header 'Null-Region: eu-fra' \ --data '{ "model": "openai/gpt-5.1", "privacy": { "tokenize": true, "reveal": "client" }, "messages": [ { "role": "system", "content": "You are a claims-triage assistant for Hanseatic Versicherung." }, { "role": "user", "content": "Summarize claim from Hermann Höfer (policy HV-2020-33891)." } ], "stream": true }'
OpenAI-compatible, always.
Point your existing SDK at api.null.tl. Model names, streaming, tools, structured outputs, same shape. Zero refactor.
Privacy runs in the request path.
Every request is inspected, tokenized, and logged before a single token reaches the upstream model. Reveal happens on your side.
Fra, Paris, Amsterdam. Pick a region.
Requests never cross the Atlantic. Region-locked routing, region-locked logs, region-locked key material, end to end.
One endpoint. Every model.
Pick the model per-request. Null routes it to the right provider, in the right region, under the right contract, with the privacy layer applied uniformly, regardless of the upstream.
Token-by-token, still private.
Server-sent events work exactly like OpenAI's. The twist: Null swaps tokens as they stream, not after. Your app receives a response that is coherent, addressable, and re-identifiable, all inside the browser.
event: message.delta
data: {"content": "The claim from "}
event: message.delta
data: {"content": "PERSON_A·S7FT9CD against "}
event: message.delta
data: {"content": "ORG_A·44LT3R shows a dispute of "}
event: message.delta
data: {"content": "AMOUNT_A·18420 on line 14."}
event: message.complete
data: {"vault_id": "vlt_8f2b4", "tokens_used": 342, "entities": 3}
Everything you'd expect. Plus a vault.
Chat, embeddings, images, audio, files, and the endpoints that make Null, Null.
Install. Swap base URL. Ship.
Use our thin SDK or any OpenAI SDK pointed at our base URL, both work. Thin SDKs add native support for the vault endpoints.
An API your Data Protection Officer will sign off on.
DPAs pre-signed with every upstream provider. Article 32 “state of the art” pseudonymization. EU data residency enforced at the edge. ROPA entries generated for you.
Put Null in front of your models.
Five minutes to swap your base URL. Thirty days to measure the delta. Your DPO will thank you.