GET /v1/keys
| Call | GET /v1/keys |
| Price | free |
| Scope | keys:manage |
| Operation id | listKeys |
What it does
Section titled “What it does”Your organization’s keys with scopes, limits, status and last use. Secrets are never returned. Free. Scope: keys:manage.
Example request
Section titled “Example request”Copy it as curl. Set VERDICT_API_KEY first; uuidgen makes a fresh Idempotency-Key.
curl -X GET 'https://api.askverdict.io/v1/keys' \ -H "Authorization: Bearer $VERDICT_API_KEY"Example response
Section titled “Example response”200: A page of keys.
{ "data": [ { "id": "key_01JC3Z4Y8R9K2M5N7P1Q3S5T7V", "project_id": "prj_01JC3Z4Y8R9K2M5N7P1Q3S5T7V", "name": "outbound-agent prod", "environment": "live", "prefix": "vd_live_Ab12Cd", "scopes": [ "decisions:write", "index:read", "outcomes:write" ], "status": "active", "rate_limit_per_minute": 600, "daily_spend_cap_usd": 25, "ip_allowlist": [], "expires_at": null, "last_used_at": "2026-11-07T14:03:00Z", "created_at": "2026-11-01T09:00:00Z" } ], "next_cursor": null, "has_more": false}Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor |
query | string | no | Opaque cursor from the next_cursor of the previous page. Omit it for the first page. |
limit |
query | integer | no | Page size, 1 to 200. Default 50. |
x-verdict-version |
header | string | no | API version to use, a date. Defaults to the version current when the key was created. The current version is 2026-11-01. |
Response fields (200)
Section titled “Response fields (200)”| Field | Type | Required | Description |
|---|---|---|---|
data |
array of ApiKey | yes | Keys. |
data[].id |
string | yes | The key id. |
data[].project_id |
string | yes | Project the key belongs to. |
data[].name |
string | yes | Name. |
data[].environment |
enum: “live”, “test” | yes | live or test. |
data[].prefix |
string | yes | The key’s first characters, to recognize it. |
data[].scopes |
array of enum: “decisions:write”, “index:read”, “outcomes:write”, “watches:manage”, “vendors:call”, “account:read”, “account:manage”, “keys:manage” | yes | Scopes granted. |
data[].status |
enum: “active”, “rotating”, “revoked”, “expired” | yes | Lifecycle status. |
data[].rate_limit_per_minute |
integer | yes | Requests per minute allowed. |
data[].daily_spend_cap_usd |
number or null | yes | Daily spend cap, or null for none. US dollars, up to 6 decimals. |
data[].ip_allowlist |
array of string | yes | CIDR blocks the key may be used from; empty means anywhere. |
data[].expires_at |
string or null (date-time) | yes | Expiry, or null for none. |
data[].last_used_at |
string or null (date-time) | yes | Last successful use, or null. |
data[].created_at |
string (date-time) | yes | When the key was created. |
next_cursor |
string or null | yes | Pass as cursor to fetch the next page. null when this is the last page. |
has_more |
boolean | yes | Whether another page follows. |
Errors
Section titled “Errors”Errors are RFC 9457 problem details and are never billed. Branch on type. See Errors.
| Status | Meaning |
|---|---|
400 |
Invalid request: malformed JSON, an unknown field, a failed constraint or a size limit (invalid_request). |
401 |
Missing, malformed, revoked or expired API key, or a bad webhook signature (unauthorized). |
403 |
The key lacks the scope this operation needs (forbidden_scope). |
429 |
Rate limited (rate_limited). Wait Retry-After seconds. |
500 |
Unexpected server error (internal). Not billed; retry with the same Idempotency-Key. |
Try it
Section titled “Try it”Open the interactive reference to send this request from the browser. The full document is at /openapi.json.