Verdict

API reference

Every call goes to your issued base URL — https://api.verdictlabs.eu.org/…, path included. All endpoints speak JSON.

Overview

EndpointKeyPurpose
POST /v1/decisionsoptionalAsk questions about one input.
GET /v1/modelsnoThe served models.
GET /api/infonoModels, limits and service metadata as JSON.
GET /api/statusnoService state and latency.
GET /api/statsnoAggregate usage counters.
POST /api/keys/challengenoStart key creation (returns a proof-of-work challenge).
POST /api/keysnoFinish key creation.
GET /api/keys/selfyesYour key's status and usage.
DELETE /api/keys/selfyesRevoke your key.

Authentication

No key is required. Your base URL carries the access path; treat that URL as the credential and do not publish it. Calls made without the path return the same 404 as any unknown route.

If you do send a key it must be valid; an unknown or revoked key is rejected with 401.

Keys are optional and free: created on this site in one click, without an account, or from a terminal with the two proof-of-work calls below. Only a hash of each key is stored; a lost key cannot be recovered — create another one.

POST /api/keys/challenge      -> {"challenge":"...","difficulty":20,"expires_at":"..."}
POST /api/keys                -> {"challenge":"...","nonce":"...","accept_terms":true}
                              <- {"api_key":"sk-vrd-...","key_id":"...","created_at":"..."}

Solve the challenge by finding a decimal nonce such that SHA-256 of challenge + ":" + nonce starts with difficulty zero bits.

Request format

FieldTypeMeaning
modelstringOne of the model IDs below.
statestringThe input the questions are about.
questionsobjectQuestion IDs, each with its question. Answers return under the same IDs.
imagesstring[]Optional base64 data URLs (PNG, JPEG, WebP).
videosstring[]Optional base64 data URLs (MP4, WebM, QuickTime, Matroska).
statesobjectOptional. Several inputs in one call, each with its own state and questions.

Ask everything you need about one input in a single request: the input is read once and every question is answered together.

Question types

TypeAsksFieldsAnswer
choiceWhich option fits?criteria: 2 or more optionschoice, probabilities, confidence
noulYes or no?optional criteria: {false, true} descriptionsnoul: probability of yes
scoreHow much, on an ordered scale?criteria: 2 to 10 levels, lowest firstscore: expected level, probabilities
boxWhere is it in the image?none; the state carries one imagebox: top, left, bottom, right, confidence

Every question carries type and instructions. Box questions are answered by the flagship model only.

Responses

{
  "answers": {
    "route": {"type":"choice","choice":"engineering",
              "probabilities":{"billing":0.0004,"engineering":0.9996,"sales":0.0000},
              "confidence":0.9993},
    "urgent": {"type":"noul","noul":0.87}
  },
  "model": "vrd/decision-1",
  "usage": {"input_tokens": 141, "output_tokens": 0}
}

Decision models produce no text: output_tokens is always 0 and usage.input_tokens counts the input read by every question.

Models

IDNameProfileInputs
vrd/decision-1decision-1flagshiptext, image, video

Limits

No quotas on keys. Keys have no per-minute budget, no daily quota and no concurrency cap. Calls are served without a key; the only usage ceiling is a shared budget of 6.9M input tokens per minute — and more than a normal client can absorb, so a 429 is the ceiling anyway. Exceeding it returns retry-after in seconds; honour it and do not hot-loop. The request timeout is 180 seconds.

Request-size limits are technical, not usage limits:

Body64 MB
Questions per request64
Inputs (states)8
Images per request4
Videos per request1 (60 s)
Characters per state32,000

Errors

{"error":{"type":"invalid_request","code":"model_unknown","message":"..."}}
HTTPTypeWhen
400invalid_requestMalformed JSON, missing model or questions, unknown model, invalid question.
401unauthorizedAn unknown or revoked key was sent.
413request_too_largeBody over the size limit.
429rate_limitedThe service is over its token budget; honour retry-after.
503service_busyThe service is saturated; retry shortly.
504timeoutThe model did not finish in time.

Support

support@verdictlabs.eu.org