DEVELOPER GUIDE6 min read
Changelog
This page is for an agent checking what changed in the Zaun API and documentation before it writes or updates an integration. Entries are newest first and list only changes a customer can see. If you are the person, this is the page to watch for changes that need action; those entries say what to do.
2026-10-13: Documentation for agents#
- The docs are published for agents:
/llms.txtlists every page with its Markdown URL,/llms-full.txtholds every page in one file, and each page is served as Markdown at/docs/<page>.md, including the API reference at/docs/openapi.md. - New pages: Set up with your agent, Try it, Choose a capture path, one page each for Claude Code, Claude Cowork, Codex, Cursor and OpenTelemetry for custom agents, and Hex v1.3 known limits.
- Limits and Responses state the
POST /v1/responsestime budget: a non-streaming response must finish within 180 seconds, and a stream must release its first text within 180 seconds, or the request returns 504deadline_exceeded. Action: sendstream: truefor long generations and high reasoning effort.
2026-10-13: Scans that could not be assessed are not billed#
- A scan Hex v1.3 could not complete, which returns as an alert for review, is no longer
charged: its
usagereports zero tokens. Images read for such a scan are still charged.
2026-10-13: Session calls are billed once, with cached tokens#
- A scan with a
session_uuidis billed for the tokens it assesses for the first time at the scan rate ($0.20 per million) and for the session's earlier tokens, read back as context, at $0.02 per million. Before, every session call was billed for the session's whole count at the scan rate. usage.input_tokensnow reports only the new tokens, and the newusage.cached_input_tokensreports the earlier tokens. A resend with nothing new bills zero new tokens. Requests without a session and document scans are unchanged. Action: if you total usage yourself, addcached_input_tokensat its own rate.
2026-10-13: GPT-6 reasoning effort#
- The GPT-6 routes on
POST /v1/responsesaccept everyreasoning.effortlevel;gpt-6-solandgpt-6-lunadefault tomedium, andgpt-6-astrahas no documented default, so itszaun.effort.defaultis null. Ongpt-6-solandgpt-6-luna, send function tools or an effort, not both. See Responses.
2026-10-13: Detection samples and the test string#
GET /v1/detection-sampleslists Zaun-written sample requests, one or more per category plus benign ones, each with the outcome expected under the default controls of a new self-serve project. No key is needed. The console Playground offers the same samples as one-click runs, up to 30 runs a minute per organization.- The test string
ZAUN-TEST-VIOLATION-7f3a9cis always reported as a blocked input check namedzaun_test, in prompts and inside tool arguments. No project setting can lower it. Use it to prove a key, a hook, a gateway or an alert; see Try it.
2026-10-13: One assessment path for every project#
- Project configurations no longer accept
classifier.mode: reference. Projects that selected it receive a new configuration version that selectscascade_v1, the default. Projects onprimaryare unchanged. Action: if you publish configurations through the administration API, stop sendingreference. - Results keep
stages.embedandstages.knn, now alwaysskipped, so existing clients keep parsing them. New results never carrysignals.knn. - The error codes
embedder_unavailable,vector_search_unavailableandembedding_invalidare no longer returned. - A new organization's keys can scan as soon as the organization is enabled, and the console Playground no longer waits for setup.
2026-10-05: Completion assessment usage and interrupted completions#
- Input and tool-call assessments on
POST /v1/responsesreport the tokens they are charged inzaun.scan.usage,zaun.output_scan.usageandGET /v1/result, instead of zero. What you pay is unchanged: they were always billed at the scan rate. Assessments recorded before this change keep reporting zero until they expire. - A completion that stops before the model call finishes now settles its credit hold. Usage the model already reported is charged when the input assessment blocks or fails, a streaming client stops reading, or held text exceeds its cap. A request that never reached the model, or that was refused before generating, releases its hold without a charge.
2026-09-30: /v1/docs redirects to the console#
GET /v1/docsreturns a 308 redirect tohttps://console.zaun.ai/docs, and the API reference documents it.
2026-09-26: GPT-6 models on POST /v1/responses#
gpt-6-astra,gpt-6-solandgpt-6-lunaare available throughPOST /v1/responsesand listed byGET /v1/models. See models for limits and prices.- Requests large enough to reach the provider's higher long-context price are rejected before any charge.
2026-09-22: Generation moves to the Responses API#
POST /v1/responsesis compatible with the OpenAI Responses API and its official SDKs. It takesinputas a string or as message,function_callandfunction_call_outputitems, plusinstructions, functiontools,tool_choice,max_output_tokensandstream.POST /v1/chat/completionsandPOST /v1/completionsare removed and return 404. Action: move callers to Responses.- Responses are stateless:
store: trueandprevious_response_idreturn 422. Send the full conversation as input items on every call. - Streams send typed Responses events with
sequence_numberand end withresponse.completed,response.incompleteorerror; there is no[DONE]line. - A blocked output ends as
status: incompletewithincomplete_details.reason: content_filter; a token cutoff reportsmax_output_tokens. usageuses the Responses spelling:input_tokens,output_tokens,input_tokens_details.cached_tokensandcache_write_tokens.
2026-09-22: Results no longer name models or vendors#
GET /v1/result,GET /v1/sessions/{session_uuid}and completion assessments no longer returnsignals.classifier,signals.path,usage[].model,revisions.modelorrevisions.corpus.revisions.pipelineis an opaque fingerprint that changes whenever the assessment changes.- Only
latency_ms.totalis reported; per-stage timings are gone. - Document results drop
extraction_evidence.providerandextraction_evidence.model_versionand reportcoverage.extraction_source: ocrfor recognized text. OCR regions and confidence remain. usageon results is the billed{input_tokens, output_tokens}, matching the scan response.GET /v1/usageno longer acceptsgroup_by=modelorgroup_by=stage. Day grouping is unchanged. Action: remove those parameters from usage queries.
2026-09-22: Faster, fail-soft document scans#
- A PDF whose own text layer covers every page is read from that layer
(
extraction_source: pdf_text_layer) in milliseconds. Scanned or partly scanned PDFs are read with OCR, page by page. - TXT, Markdown, CSV and HTML are scored exactly as uploaded. DOC, DOCX, XLS and XLSX go through a native parser first.
- A document with no text anywhere is refused.
- A transcription that is refused, times out or comes back empty is reported inside an HTTP
200 body with
status: failed,error.stage,review_recommendedandreview_reason. HTTP 4xx is reserved for requests rejected before any processing. Idempotent replays return the same body. See document scans.
Maintained with the API contract · Defaults may vary by deployment.