API reference
Decisions
The decision log: list, fetch, and explain in plain words.
List decisions, newest first
/v1/decisionsDecisions made in the key's mode only: a test key lists test decisions, a live key live ones.
Parameters
outcome"allow" | "review" | "block"querypolicystringqueryPolicy id. ≤ 64 chars
modeanyqueryMust be the key's own mode, if given: a key lists its own mode's decisions only.
dry_run"true" | "false"queryfalseleaves out dry runs;truelists only them.sincestringqueryInclusive lower bound on created_at (ISO 8601).
untilstringqueryExclusive upper bound on created_at (ISO 8601).
check"minors_sexual" | "adult" | "real_person" | "copyrighted_ip"queryOnly decisions where this check decided or reached its review line.
userstringqueryOnly decisions for this end user (
useron POST /v1/check). 1–128 charsid_prefixstringqueryDecision ids starting with this.
limitintegerquery1–100 · default 50
cursorstringquery≤ 512 chars
Request
curl "https://api.getvindex.com/v1/decisions?limit=20" \
-H "Authorization: Bearer $VINDEX_KEY"Response 200
A page of decisions.
{
"data": [
{
"id": "dec_3f2a0c9e8b7d4c6a9f1e2d3c4b5a6978",
"outcome": "allow",
"tags": [],
"policy": {
"id": "pol_3f2a0c9e8b7d4c6a9f1e2d3c4b5a6978",
"version": 1
},
"mode": "test",
"dry_run": false,
"engine_version": "2026.09",
"latency_ms": 412,
"user": null,
"created_at": "2026-09-17T08:51:06.000Z"
}
],
"next_cursor": null
}Errors
400Invalid request (malformed JSON, or the body/query failed validation).401Missing, malformed, unknown or revoked API key.403modeisn't the key's own mode (mode_forbidden).429Rate limit exceeded for this API key. SeeRetry-After.
Get a decision
/v1/decisions/{id}A prompt blocked by the minors check comes back as a placeholder with prompt_redacted: true. A prompt older than the plan's retention has been deleted: prompt_purged: true. A decision made in the other mode (live for a test key, test for a live key) is a 404.
Parameters
idstringpathrequiredDecision id 1–64 chars
reveal"1" | "true"queryReturn a redacted prompt in full. Dashboard owners and admins only (
reveal_forbiddenotherwise); every reveal is written to the audit log.
Request
curl "https://api.getvindex.com/v1/decisions/$DECISION_ID" \
-H "Authorization: Bearer $VINDEX_KEY"Response 200
The decision, with its input, metadata and actions.
{
"id": "dec_3f2a0c9e8b7d4c6a9f1e2d3c4b5a6978",
"outcome": "allow",
"tags": [],
"checks": {
"minors_sexual": {
"score": 0.01,
"review_score": 0.01,
"fired": []
},
"adult": {
"score": 0.01,
"review_score": 0.01,
"fired": []
},
"real_person": {
"score": 0.01,
"review_score": 0.01,
"fired": []
},
"copyrighted_ip": {
"score": 0.01,
"review_score": 0.01,
"fired": []
}
},
"policy": {
"id": "pol_3f2a0c9e8b7d4c6a9f1e2d3c4b5a6978",
"version": 1
},
"engine_version": "2026.09",
"latency_ms": 412,
"dry_run": false,
"mode": "test",
"shadow_mode": false,
"input": {
"prompt": "a lighthouse at dusk, oil painting",
"negative_prompt": "blurry",
"context": []
},
"prompt_redacted": false,
"prompt_purged": false,
"user": null,
"metadata": {
"user": "u_42"
},
"actions": {
"review_id": null,
"webhook_events": [],
"webhooks_suppressed": null,
"shadow_mode": false,
"user_paused": false
},
"idempotency_key": null,
"input_tokens": 118,
"created_at": "2026-09-17T08:51:06.000Z"
}Errors
400Invalid request (malformed JSON, or the body/query failed validation).401Missing, malformed, unknown or revoked API key.403revealfrom anyone but a dashboard owner or admin (reveal_forbidden).404No such decision for this tenant.429Rate limit exceeded for this API key. SeeRetry-After.
Explain a decision in plain words
/v1/decisions/{id}/explainPer check: the signals that fired with their probability against the line they crossed, the minors floors hit (rule and character offsets, never the matched text), which policy line decided the outcome, and what actions ran.
Parameters
idstringpathrequiredDecision id 1–64 chars
Request
curl "https://api.getvindex.com/v1/decisions/$DECISION_ID/explain" \
-H "Authorization: Bearer $VINDEX_KEY"Response 200
The explanation.
{
"id": "dec_3f2a0c9e8b7d4c6a9f1e2d3c4b5a6978",
"outcome": "allow",
"dry_run": false,
"mode": "test",
"summary": "Allowed: no check reached its review line.",
"decided_by": null,
"policy": {
"id": "pol_3f2a0c9e8b7d4c6a9f1e2d3c4b5a6978",
"version": 1,
"youth_coded_adult": "review",
"adult_max_level": 5
},
"checks": [
{
"check": "adult",
"version": 1,
"routed": "allow",
"action": {
"type": "allow"
},
"policy_line": null,
"score": 0.01,
"review_score": 0.01,
"act_line": 0.5,
"review_line": 0.3,
"adult_level": 1,
"explanation": "Score 0.01 and review score 0.01 are below the review line 0.30: nothing to do.",
"signals": [],
"floors": []
}
],
"actions": {
"review_id": null,
"webhook_events": [],
"webhooks_suppressed": null,
"shadow_mode": false,
"user_paused": false,
"tags": [],
"ran": [
"No actions: nothing to do."
]
},
"engine_version": "2026.09",
"created_at": "2026-09-17T08:51:06.000Z"
}Errors
400Invalid request (malformed JSON, or the body/query failed validation).401Missing, malformed, unknown or revoked API key.404No such decision for this tenant.429Rate limit exceeded for this API key. SeeRetry-After.