VindexDocs

API reference

Decisions

The decision log: list, fetch, and explain in plain words.

List decisions, newest first

GET/v1/decisions

Decisions made in the key's mode only: a test key lists test decisions, a live key live ones.

Parameters

  • outcome"allow" | "review" | "block"query
  • policystringquery

    Policy id. ≤ 64 chars

  • modeanyquery

    Must be the key's own mode, if given: a key lists its own mode's decisions only.

  • dry_run"true" | "false"query

    false leaves out dry runs; true lists only them.

  • sincestringquery

    Inclusive lower bound on created_at (ISO 8601).

  • untilstringquery

    Exclusive upper bound on created_at (ISO 8601).

  • check"minors_sexual" | "adult" | "real_person" | "copyrighted_ip"query

    Only decisions where this check decided or reached its review line.

  • userstringquery

    Only decisions for this end user (user on POST /v1/check). 1–128 chars

  • id_prefixstringquery

    Decision ids starting with this.

  • limitintegerquery

    1–100 · default 50

  • cursorstringquery

    ≤ 512 chars

Request

cURL
curl "https://api.getvindex.com/v1/decisions?limit=20" \
  -H "Authorization: Bearer $VINDEX_KEY"

Response 200

A page of decisions.

Example
{
  "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.
  • 403mode isn't the key's own mode (mode_forbidden).
  • 429Rate limit exceeded for this API key. See Retry-After.

Get a decision

GET/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

  • idstringpathrequired

    Decision id 1–64 chars

  • reveal"1" | "true"query

    Return a redacted prompt in full. Dashboard owners and admins only (reveal_forbidden otherwise); every reveal is written to the audit log.

Request

cURL
curl "https://api.getvindex.com/v1/decisions/$DECISION_ID" \
  -H "Authorization: Bearer $VINDEX_KEY"

Response 200

The decision, with its input, metadata and actions.

Example
{
  "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.
  • 403reveal from anyone but a dashboard owner or admin (reveal_forbidden).
  • 404No such decision for this tenant.
  • 429Rate limit exceeded for this API key. See Retry-After.

Explain a decision in plain words

GET/v1/decisions/{id}/explain

Per 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

  • idstringpathrequired

    Decision id 1–64 chars

Request

cURL
curl "https://api.getvindex.com/v1/decisions/$DECISION_ID/explain" \
  -H "Authorization: Bearer $VINDEX_KEY"

Response 200

The explanation.

Example
{
  "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. See Retry-After.