OpenAI Compatibility
Verdict's Direct API is OpenAI-compatible per the published compatibility matrix on this page — not a claim of compatibility with anything OpenAI-compliant. Every request field lands in one of three dispositions; silent discard is never one of them.
Three dispositions
- supported — honored end to end.
- ignored (documented) — accepted, has no effect, called out here.
- rejected — HTTP 400 with a clear error naming the field.
Field-by-field matrix
POST /v1/chat/completions
| Field | Disposition | Notes |
|---|---|---|
model | supported | verdict/<model> or canonical vc/verdict/<model>; bare model ids resolve into the implicit openai vendor space and will not reach Verdict SKUs |
messages | supported | system/user/assistant/tool roles per the existing route |
stream | supported | server-sent events; incremental delivery |
stream_options.include_usage | supported | the final chunk carries the usage block |
max_tokens | supported | existing behavior |
max_completion_tokens | supported | mapped to max_tokens; if both are sent, max_completion_tokens wins |
temperature | supported | provider temperature rules apply |
top_p | supported | passed through to the provider |
stop | supported | string or array, passed through |
user | supported | passed to telemetry only; never used for auth |
tools / tool_choice | supported | existing route behavior |
n | rejected when n > 1 | 400 unsupported_parameter; n: 1 is accepted |
seed | rejected | 400 unsupported_parameter -- no determinism contract is offered |
response_format | rejected | 400 unsupported_parameter at launch |
logprobs / top_logprobs | rejected | 400 unsupported_parameter |
presence_penalty / frequency_penalty | ignored (documented) | accepted for client compatibility; not forwarded uniformly across vendors at launch |
logit_bias | rejected | 400 unsupported_parameter |
metadata / store | ignored (documented) | accepted; nothing is stored beyond standard telemetry |
any other unknown field | ignored (documented) | so future OpenAI SDK additions don't break existing clients; anything that would change semantics gets an explicit row here first |
Headers
| Header | Disposition | Notes |
|---|---|---|
Authorization: Bearer vrd_live_* | supported | argon2id-verified via indexed digest lookup |
Authorization: Bearer vrd_test_* | rejected on completions | 403 test_key_not_allowed -- no test environment exists at launch |
Idempotency-Key | supported | a retried identical attempt cannot double-reserve or double-burn credits; a duplicate returns 409 with the original request id |
X-Verdict-Request-Id | supported | equivalent to Idempotency-Key; auto-generated when neither header is present |
Retries withoutan idempotency key are separate billed inferences (OpenAI-parity behavior) — persist-and-replay is not offered.
Error bodies
A stable error envelope is returned on 400/401/402/403/409/429; insufficient credits returns 402. See Errors & Limits for the exact response shapes.
Rate limiting
Per-key rate limits (requests per minute / per day) are enforced per Gateway instance, approximately, at launch: with N instances the effective ceiling is up to N× the configured value. This is documented rather than hidden; a shared atomic counter is the upgrade path once the API tier carries real traffic. Key revocation propagates in 60 seconds or less across all instances.