Get the chains, archive lag, digest, anchor and verify state of a ledger
const url = 'https://dashboard.quantcdn.io/api/v2/organizations/test-org/projects/test-project/kv/test-org-test-project-orders/ledgers/aiUse/status';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://dashboard.quantcdn.io/api/v2/organizations/test-org/projects/test-project/kv/test-org-test-project-orders/ledgers/aiUse/status \ --header 'Authorization: Bearer <token>'The ledger, its chain instances (one per collection and shard that holds entries; 50 per page) with head and archived sequence and archive lag, the retention end, the last digest time, the anchor state, lastVerify, verifyProgress and forked. Pass next_cursor as cursor for the next page of instances.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Organization identifier
Example
test-orgProject identifier
Example
test-projectKV store id, as returned by KV_list
Example
test-org-test-project-ordersExample
aiUseQuery Parameters
Section titled “Query Parameters”The next_cursor of the previous page.
Responses
Section titled “Responses”One page of instances.
The chain instances (50 per page), archive lag, digest, anchor and verify state of a ledger.
object
A ledger definition and its state.
object
A collection, or a pattern where * is one whole segment.
Present when subjectField is set.
Present when subjectField is set.
External witness of the daily digests. Default type none. customer-bucket writes each digest to your S3 bucket (needs bucketArn and accountId); rfc3161 gets a timestamp token from tsaUrl.
object
Customer-bucket only (required on declare).
Customer-bucket only, optional. Anchor keys are
Customer-bucket only (required on declare): the AWS account that owns the bucket. Every anchor write sends it as ExpectedBucketOwner.
Rfc3161 only.
Immutable allowlist of internal Quant platform writers, included in definitionHash. With a writer policy, appends through the API are refused (only the listed platform services can write). Without it, appends work as usual. A ledger with personalFields must list quant-ledger, which writes the shred entries. This is not a read or management access policy.
object
The platform service principals that may append (1 to 16, unique).
PENDING for 75 seconds after a declare, then ACTIVE or FAILED. DROPPED after KV_ledgers_delete.
When a PENDING ledger is checked again and becomes ACTIVE or FAILED.
Hex SHA-256 of the canonical (RFC 8785) definition.
FAILED only: why the ledger failed.
One chain: a collection and shard that holds entries.
object
Sequence number of the last entry.
Epoch ms of the last entry.
Last sequence number in the archive.
Age of the oldest unarchived entry; 0 when up to date.
Set when the archive worker found a chain fault (seq, reason, at).
object
object
Customer-bucket only: the bucket policy (JSON) that lets Quant write the witness copies.
The last verify result of the ledger (the daily scheduled full verify, or the last complete API or dashboard verify). ok is true only when complete is true and no shard failed.
object
The verification record; KV_ledgers_verifications_report returns it signed.
The request range; empty for a full verify.
object
object
Present while a scheduled verify runs or is paused between daily runs.
object
Present when the store table no longer matches its archive; appends are refused with LEDGER_FORKED.
object
Pass as cursor for the next page of instances; null on the last page.
Example
{ "ledger": { "name": "aiUse", "collection": "ai-use:*", "chains": 4, "retentionDays": 2555, "lockMode": "governance", "personalFields": [ "requesterName" ], "subjectField": "requesterId", "anchor": { "type": "none" }, "state": "PENDING", "createdAt": "2026-10-16T00:00:00.000Z", "activeAfter": "2026-10-16T00:01:15.000Z", "definitionHash": "c4a5e0f1d2b3a4958671e2d3c4b5a6978e9f0a1b2c3d4e5f60718293a4b5c6d7" }, "anchor": { "type": "none" }, "lastVerify": { "trigger": "scheduled", "firstFailure": { "reason": "hash_mismatch" } }}Invalid request: VALIDATION, LIMIT_EXCEEDED, CURSOR_INVALID, REQUIRES_FORMAT_2 and the route-specific 400 codes.
Error body of every KV v2 route. A superset of V2Error. HTTP 400, 404, 409, 429 and 503 keep the KV service status, code and retryable. A KV service failure that the caller cannot act on is 500 INTERNAL. When retryable is true, the same request can be sent again (after Retry-After when present).
| code | status | retryable | meaning |
|---|---|---|---|
| VALIDATION | 400 | false | The request is not valid (body, parameter, key or value). |
| LIMIT_EXCEEDED | 400 | false | A size or count limit is exceeded (item over 400 KB, batch, transact, value). |
| CURSOR_INVALID | 400 | false | The cursor is not valid for this request. Start the list again. |
| REQUIRES_FORMAT_2 | 400 | false | The operation needs a format 2 store. Upgrade the store first. |
| INDEX_FIELD_ENCRYPTED | 400 | false | An indexed field is in a secret (encrypted) value. |
| COUNT_WITH_TTL | 400 | false | A count index cannot include items that have a ttl. |
| LEDGER_IMMUTABLE | 400 | false | A ledger entry cannot be changed or deleted. Use append. |
| LEDGER_INDEX_KIND | 400 | false | This index kind is not allowed on a ledger collection. |
| LEDGER_SUBJECT_REQUIRED | 400 | false | The ledger needs a subject field in each entry. |
| LEDGER_DIRECTION | 400 | false | A ledger setting can only be raised, not lowered. |
| CONFIRMATION_REQUIRED | 400 | false | confirm is missing or does not equal the store name. |
| SCOPE_REQUIRED | 403 | false | The token does not list the scope that the route needs. |
| PERMISSION_DENIED | 403 | false | The role of the token user does not have the permission. |
| FORBIDDEN | 403 | false | The store is a system store and cannot be purged. |
| KEY_NOT_FOUND | 404 | false | The key does not exist or has expired. |
| STORE_NOT_FOUND | 404 | false | The store does not exist or is not in this project. |
| EXPORT_NOT_FOUND | 404 | false | The store has no export. |
| LEDGER_NOT_FOUND | 404 | false | The ledger does not exist. |
| SUBJECT_NOT_FOUND | 404 | false | The ledger has no entries for the subject. |
| VERIFICATION_NOT_FOUND | 404 | false | The verification run does not exist. |
| SHRED_NOT_FOUND | 404 | false | The erasure record does not exist. |
| INDEX_NOT_FOUND | 404 | false | The index does not exist. |
| NOT_FOUND | 404 | false | No archive, tombstone or purge exists for the store or purge id. |
| UPGRADE_CONFLICT | 409 | false | The upgrade action is not valid in the current upgrade state. |
| CONFLICT | 409 | false | A condition (ifAbsent, ifVersion, check) failed. See reason, key and currentVersion. |
| UNIQUE_VIOLATION | 409 | false | A unique index already has the value. See index and existingKey. |
| EXPORT_IN_PROGRESS | 409 | false | An export of the store is already running. |
| LEDGER_COLLECTION_NOT_EMPTY | 409 | false | The collection already has items, so it cannot become a ledger. |
| LEDGER_RETAINED | 409 | false | The ledger is in its retention period. See retainUntil. |
| LEDGER_PRESENT | 409 | false | A ledger blocks the action. See ledgers. |
| STORE_NAME_RETAINED | 409 | false | The store name is held by a retained ledger archive. |
| LEDGER_FORKED | 409 | false | The ledger chain does not agree with its archive or digest. See reason. |
| LEDGER_DROPPED | 409 | false | The ledger was dropped. |
| LEDGER_FORMAT_RETIRED | 409 | false | The ledger uses a retired subject format. Declare a new ledger. |
| STORE_NOT_DELETED | 409 | false | The store still exists. Delete the store first. |
| ARCHIVE_RETAINED | 409 | false | The archive is still locked or in its 24-hour quiet period. See retainedUntil. |
| PURGE_IN_PROGRESS | 409 | false | Another purge of the store is running. See purgeId. |
| PURGE_BLOCKED | 409 | false | The last purge is blocked and needs Quant support. See purgeId. |
| PURGE_NOT_COMPLETE | 409 | false | The purge is not complete, so there is no receipt yet. See state. |
| DIGEST_OWED | 409 | true | The last ledger entries are not in a signed digest yet. Send the delete again in a few minutes. |
| CONTENTION | 409 | true | Another write changed the same data at the same time. Send again. |
| INDEX_NOT_READY | 409 | true | The index is still building. Send again later. |
| LEDGER_NOT_READY | 409 | true | The ledger is PENDING. Send again after activeAfter. |
| RATE_LIMITED | 429 | true | Too many requests. Wait for Retry-After seconds. Also retryAfter (seconds) on a purge start. |
| INTERNAL | 500 | false | The KV service failed. No detail is given. |
| STORE_MIGRATING | 503 | true | The store is being upgraded. Wait for Retry-After seconds. |
| UNAVAILABLE | 503 | true (false when the outcome of a write is unknown) | The KV service did not answer. With retryable false, read the data before you send the write again. |
object
Always true.
True when the same request can be sent again safely.
CONFLICT: the key the condition named.
CONFLICT: the current version, when the key exists and has not expired.
CONFLICT: why the condition failed. LEDGER_COLLECTION_NOT_EMPTY, LEDGER_RETAINED, LEDGER_FORKED: the cause.
LEDGER_RETAINED: when the archive retention ends.
LEDGER_NOT_READY: when the PENDING ledger can become ACTIVE.
LEDGER_RETAINED (unarchived): the collection with unarchived entries.
LEDGER_RETAINED (unarchived): the shard with unarchived entries.
Transact: the index of the failing operation.
UNIQUE_VIOLATION: the unique index.
UNIQUE_VIOLATION: the key that holds the value.
LEDGER_PRESENT (store delete): the ledgers that block the delete.
object
The ledger name.
The ledger state (PENDING, ACTIVE or DROPPED).
Not_dropped: drop the ledger first (after its retention ends). not_drained: the ledger is DROPPED but its last entries are not archived yet.
What to do next, when the KV service gives a hint.
The current state of the store, index, ledger or export, when the error names it.
Example
{ "error": true, "message": "The condition failed", "code": "CONFLICT", "retryable": false, "key": "user:1", "reason": "version", "currentVersion": "01JB2Z6V8Q3M4N5P6R7S8T9V0W"}SCOPE_REQUIRED (the token does not list the scope) or PERMISSION_DENIED (the role does not have the permission).
Error body of every KV v2 route. A superset of V2Error. HTTP 400, 404, 409, 429 and 503 keep the KV service status, code and retryable. A KV service failure that the caller cannot act on is 500 INTERNAL. When retryable is true, the same request can be sent again (after Retry-After when present).
| code | status | retryable | meaning |
|---|---|---|---|
| VALIDATION | 400 | false | The request is not valid (body, parameter, key or value). |
| LIMIT_EXCEEDED | 400 | false | A size or count limit is exceeded (item over 400 KB, batch, transact, value). |
| CURSOR_INVALID | 400 | false | The cursor is not valid for this request. Start the list again. |
| REQUIRES_FORMAT_2 | 400 | false | The operation needs a format 2 store. Upgrade the store first. |
| INDEX_FIELD_ENCRYPTED | 400 | false | An indexed field is in a secret (encrypted) value. |
| COUNT_WITH_TTL | 400 | false | A count index cannot include items that have a ttl. |
| LEDGER_IMMUTABLE | 400 | false | A ledger entry cannot be changed or deleted. Use append. |
| LEDGER_INDEX_KIND | 400 | false | This index kind is not allowed on a ledger collection. |
| LEDGER_SUBJECT_REQUIRED | 400 | false | The ledger needs a subject field in each entry. |
| LEDGER_DIRECTION | 400 | false | A ledger setting can only be raised, not lowered. |
| CONFIRMATION_REQUIRED | 400 | false | confirm is missing or does not equal the store name. |
| SCOPE_REQUIRED | 403 | false | The token does not list the scope that the route needs. |
| PERMISSION_DENIED | 403 | false | The role of the token user does not have the permission. |
| FORBIDDEN | 403 | false | The store is a system store and cannot be purged. |
| KEY_NOT_FOUND | 404 | false | The key does not exist or has expired. |
| STORE_NOT_FOUND | 404 | false | The store does not exist or is not in this project. |
| EXPORT_NOT_FOUND | 404 | false | The store has no export. |
| LEDGER_NOT_FOUND | 404 | false | The ledger does not exist. |
| SUBJECT_NOT_FOUND | 404 | false | The ledger has no entries for the subject. |
| VERIFICATION_NOT_FOUND | 404 | false | The verification run does not exist. |
| SHRED_NOT_FOUND | 404 | false | The erasure record does not exist. |
| INDEX_NOT_FOUND | 404 | false | The index does not exist. |
| NOT_FOUND | 404 | false | No archive, tombstone or purge exists for the store or purge id. |
| UPGRADE_CONFLICT | 409 | false | The upgrade action is not valid in the current upgrade state. |
| CONFLICT | 409 | false | A condition (ifAbsent, ifVersion, check) failed. See reason, key and currentVersion. |
| UNIQUE_VIOLATION | 409 | false | A unique index already has the value. See index and existingKey. |
| EXPORT_IN_PROGRESS | 409 | false | An export of the store is already running. |
| LEDGER_COLLECTION_NOT_EMPTY | 409 | false | The collection already has items, so it cannot become a ledger. |
| LEDGER_RETAINED | 409 | false | The ledger is in its retention period. See retainUntil. |
| LEDGER_PRESENT | 409 | false | A ledger blocks the action. See ledgers. |
| STORE_NAME_RETAINED | 409 | false | The store name is held by a retained ledger archive. |
| LEDGER_FORKED | 409 | false | The ledger chain does not agree with its archive or digest. See reason. |
| LEDGER_DROPPED | 409 | false | The ledger was dropped. |
| LEDGER_FORMAT_RETIRED | 409 | false | The ledger uses a retired subject format. Declare a new ledger. |
| STORE_NOT_DELETED | 409 | false | The store still exists. Delete the store first. |
| ARCHIVE_RETAINED | 409 | false | The archive is still locked or in its 24-hour quiet period. See retainedUntil. |
| PURGE_IN_PROGRESS | 409 | false | Another purge of the store is running. See purgeId. |
| PURGE_BLOCKED | 409 | false | The last purge is blocked and needs Quant support. See purgeId. |
| PURGE_NOT_COMPLETE | 409 | false | The purge is not complete, so there is no receipt yet. See state. |
| DIGEST_OWED | 409 | true | The last ledger entries are not in a signed digest yet. Send the delete again in a few minutes. |
| CONTENTION | 409 | true | Another write changed the same data at the same time. Send again. |
| INDEX_NOT_READY | 409 | true | The index is still building. Send again later. |
| LEDGER_NOT_READY | 409 | true | The ledger is PENDING. Send again after activeAfter. |
| RATE_LIMITED | 429 | true | Too many requests. Wait for Retry-After seconds. Also retryAfter (seconds) on a purge start. |
| INTERNAL | 500 | false | The KV service failed. No detail is given. |
| STORE_MIGRATING | 503 | true | The store is being upgraded. Wait for Retry-After seconds. |
| UNAVAILABLE | 503 | true (false when the outcome of a write is unknown) | The KV service did not answer. With retryable false, read the data before you send the write again. |
object
Always true.
True when the same request can be sent again safely.
CONFLICT: the key the condition named.
CONFLICT: the current version, when the key exists and has not expired.
CONFLICT: why the condition failed. LEDGER_COLLECTION_NOT_EMPTY, LEDGER_RETAINED, LEDGER_FORKED: the cause.
LEDGER_RETAINED: when the archive retention ends.
LEDGER_NOT_READY: when the PENDING ledger can become ACTIVE.
LEDGER_RETAINED (unarchived): the collection with unarchived entries.
LEDGER_RETAINED (unarchived): the shard with unarchived entries.
Transact: the index of the failing operation.
UNIQUE_VIOLATION: the unique index.
UNIQUE_VIOLATION: the key that holds the value.
LEDGER_PRESENT (store delete): the ledgers that block the delete.
object
The ledger name.
The ledger state (PENDING, ACTIVE or DROPPED).
Not_dropped: drop the ledger first (after its retention ends). not_drained: the ledger is DROPPED but its last entries are not archived yet.
What to do next, when the KV service gives a hint.
The current state of the store, index, ledger or export, when the error names it.
Example
{ "error": true, "message": "The condition failed", "code": "CONFLICT", "retryable": false, "key": "user:1", "reason": "version", "currentVersion": "01JB2Z6V8Q3M4N5P6R7S8T9V0W"}KEY_NOT_FOUND, STORE_NOT_FOUND, LEDGER_NOT_FOUND, SUBJECT_NOT_FOUND, EXPORT_NOT_FOUND, VERIFICATION_NOT_FOUND, SHRED_NOT_FOUND, INDEX_NOT_FOUND or NOT_FOUND (no archive, tombstone or purge).
Error body of every KV v2 route. A superset of V2Error. HTTP 400, 404, 409, 429 and 503 keep the KV service status, code and retryable. A KV service failure that the caller cannot act on is 500 INTERNAL. When retryable is true, the same request can be sent again (after Retry-After when present).
| code | status | retryable | meaning |
|---|---|---|---|
| VALIDATION | 400 | false | The request is not valid (body, parameter, key or value). |
| LIMIT_EXCEEDED | 400 | false | A size or count limit is exceeded (item over 400 KB, batch, transact, value). |
| CURSOR_INVALID | 400 | false | The cursor is not valid for this request. Start the list again. |
| REQUIRES_FORMAT_2 | 400 | false | The operation needs a format 2 store. Upgrade the store first. |
| INDEX_FIELD_ENCRYPTED | 400 | false | An indexed field is in a secret (encrypted) value. |
| COUNT_WITH_TTL | 400 | false | A count index cannot include items that have a ttl. |
| LEDGER_IMMUTABLE | 400 | false | A ledger entry cannot be changed or deleted. Use append. |
| LEDGER_INDEX_KIND | 400 | false | This index kind is not allowed on a ledger collection. |
| LEDGER_SUBJECT_REQUIRED | 400 | false | The ledger needs a subject field in each entry. |
| LEDGER_DIRECTION | 400 | false | A ledger setting can only be raised, not lowered. |
| CONFIRMATION_REQUIRED | 400 | false | confirm is missing or does not equal the store name. |
| SCOPE_REQUIRED | 403 | false | The token does not list the scope that the route needs. |
| PERMISSION_DENIED | 403 | false | The role of the token user does not have the permission. |
| FORBIDDEN | 403 | false | The store is a system store and cannot be purged. |
| KEY_NOT_FOUND | 404 | false | The key does not exist or has expired. |
| STORE_NOT_FOUND | 404 | false | The store does not exist or is not in this project. |
| EXPORT_NOT_FOUND | 404 | false | The store has no export. |
| LEDGER_NOT_FOUND | 404 | false | The ledger does not exist. |
| SUBJECT_NOT_FOUND | 404 | false | The ledger has no entries for the subject. |
| VERIFICATION_NOT_FOUND | 404 | false | The verification run does not exist. |
| SHRED_NOT_FOUND | 404 | false | The erasure record does not exist. |
| INDEX_NOT_FOUND | 404 | false | The index does not exist. |
| NOT_FOUND | 404 | false | No archive, tombstone or purge exists for the store or purge id. |
| UPGRADE_CONFLICT | 409 | false | The upgrade action is not valid in the current upgrade state. |
| CONFLICT | 409 | false | A condition (ifAbsent, ifVersion, check) failed. See reason, key and currentVersion. |
| UNIQUE_VIOLATION | 409 | false | A unique index already has the value. See index and existingKey. |
| EXPORT_IN_PROGRESS | 409 | false | An export of the store is already running. |
| LEDGER_COLLECTION_NOT_EMPTY | 409 | false | The collection already has items, so it cannot become a ledger. |
| LEDGER_RETAINED | 409 | false | The ledger is in its retention period. See retainUntil. |
| LEDGER_PRESENT | 409 | false | A ledger blocks the action. See ledgers. |
| STORE_NAME_RETAINED | 409 | false | The store name is held by a retained ledger archive. |
| LEDGER_FORKED | 409 | false | The ledger chain does not agree with its archive or digest. See reason. |
| LEDGER_DROPPED | 409 | false | The ledger was dropped. |
| LEDGER_FORMAT_RETIRED | 409 | false | The ledger uses a retired subject format. Declare a new ledger. |
| STORE_NOT_DELETED | 409 | false | The store still exists. Delete the store first. |
| ARCHIVE_RETAINED | 409 | false | The archive is still locked or in its 24-hour quiet period. See retainedUntil. |
| PURGE_IN_PROGRESS | 409 | false | Another purge of the store is running. See purgeId. |
| PURGE_BLOCKED | 409 | false | The last purge is blocked and needs Quant support. See purgeId. |
| PURGE_NOT_COMPLETE | 409 | false | The purge is not complete, so there is no receipt yet. See state. |
| DIGEST_OWED | 409 | true | The last ledger entries are not in a signed digest yet. Send the delete again in a few minutes. |
| CONTENTION | 409 | true | Another write changed the same data at the same time. Send again. |
| INDEX_NOT_READY | 409 | true | The index is still building. Send again later. |
| LEDGER_NOT_READY | 409 | true | The ledger is PENDING. Send again after activeAfter. |
| RATE_LIMITED | 429 | true | Too many requests. Wait for Retry-After seconds. Also retryAfter (seconds) on a purge start. |
| INTERNAL | 500 | false | The KV service failed. No detail is given. |
| STORE_MIGRATING | 503 | true | The store is being upgraded. Wait for Retry-After seconds. |
| UNAVAILABLE | 503 | true (false when the outcome of a write is unknown) | The KV service did not answer. With retryable false, read the data before you send the write again. |
object
Always true.
True when the same request can be sent again safely.
CONFLICT: the key the condition named.
CONFLICT: the current version, when the key exists and has not expired.
CONFLICT: why the condition failed. LEDGER_COLLECTION_NOT_EMPTY, LEDGER_RETAINED, LEDGER_FORKED: the cause.
LEDGER_RETAINED: when the archive retention ends.
LEDGER_NOT_READY: when the PENDING ledger can become ACTIVE.
LEDGER_RETAINED (unarchived): the collection with unarchived entries.
LEDGER_RETAINED (unarchived): the shard with unarchived entries.
Transact: the index of the failing operation.
UNIQUE_VIOLATION: the unique index.
UNIQUE_VIOLATION: the key that holds the value.
LEDGER_PRESENT (store delete): the ledgers that block the delete.
object
The ledger name.
The ledger state (PENDING, ACTIVE or DROPPED).
Not_dropped: drop the ledger first (after its retention ends). not_drained: the ledger is DROPPED but its last entries are not archived yet.
What to do next, when the KV service gives a hint.
The current state of the store, index, ledger or export, when the error names it.
Example
{ "error": true, "message": "The condition failed", "code": "CONFLICT", "retryable": false, "key": "user:1", "reason": "version", "currentVersion": "01JB2Z6V8Q3M4N5P6R7S8T9V0W"}RATE_LIMITED (retryable): a rate limit is used up. The limits are the per-token limit (api-token, default 240 requests per minute per token and organisation) and, on some operations, the per-project KV limits (kv-admin 10, kv-erase 30, kv-verify 6 requests per minute). Wait for Retry-After seconds, then send the request again. See Rate limits in the API description.
Error body of every KV v2 route. A superset of V2Error. HTTP 400, 404, 409, 429 and 503 keep the KV service status, code and retryable. A KV service failure that the caller cannot act on is 500 INTERNAL. When retryable is true, the same request can be sent again (after Retry-After when present).
| code | status | retryable | meaning |
|---|---|---|---|
| VALIDATION | 400 | false | The request is not valid (body, parameter, key or value). |
| LIMIT_EXCEEDED | 400 | false | A size or count limit is exceeded (item over 400 KB, batch, transact, value). |
| CURSOR_INVALID | 400 | false | The cursor is not valid for this request. Start the list again. |
| REQUIRES_FORMAT_2 | 400 | false | The operation needs a format 2 store. Upgrade the store first. |
| INDEX_FIELD_ENCRYPTED | 400 | false | An indexed field is in a secret (encrypted) value. |
| COUNT_WITH_TTL | 400 | false | A count index cannot include items that have a ttl. |
| LEDGER_IMMUTABLE | 400 | false | A ledger entry cannot be changed or deleted. Use append. |
| LEDGER_INDEX_KIND | 400 | false | This index kind is not allowed on a ledger collection. |
| LEDGER_SUBJECT_REQUIRED | 400 | false | The ledger needs a subject field in each entry. |
| LEDGER_DIRECTION | 400 | false | A ledger setting can only be raised, not lowered. |
| CONFIRMATION_REQUIRED | 400 | false | confirm is missing or does not equal the store name. |
| SCOPE_REQUIRED | 403 | false | The token does not list the scope that the route needs. |
| PERMISSION_DENIED | 403 | false | The role of the token user does not have the permission. |
| FORBIDDEN | 403 | false | The store is a system store and cannot be purged. |
| KEY_NOT_FOUND | 404 | false | The key does not exist or has expired. |
| STORE_NOT_FOUND | 404 | false | The store does not exist or is not in this project. |
| EXPORT_NOT_FOUND | 404 | false | The store has no export. |
| LEDGER_NOT_FOUND | 404 | false | The ledger does not exist. |
| SUBJECT_NOT_FOUND | 404 | false | The ledger has no entries for the subject. |
| VERIFICATION_NOT_FOUND | 404 | false | The verification run does not exist. |
| SHRED_NOT_FOUND | 404 | false | The erasure record does not exist. |
| INDEX_NOT_FOUND | 404 | false | The index does not exist. |
| NOT_FOUND | 404 | false | No archive, tombstone or purge exists for the store or purge id. |
| UPGRADE_CONFLICT | 409 | false | The upgrade action is not valid in the current upgrade state. |
| CONFLICT | 409 | false | A condition (ifAbsent, ifVersion, check) failed. See reason, key and currentVersion. |
| UNIQUE_VIOLATION | 409 | false | A unique index already has the value. See index and existingKey. |
| EXPORT_IN_PROGRESS | 409 | false | An export of the store is already running. |
| LEDGER_COLLECTION_NOT_EMPTY | 409 | false | The collection already has items, so it cannot become a ledger. |
| LEDGER_RETAINED | 409 | false | The ledger is in its retention period. See retainUntil. |
| LEDGER_PRESENT | 409 | false | A ledger blocks the action. See ledgers. |
| STORE_NAME_RETAINED | 409 | false | The store name is held by a retained ledger archive. |
| LEDGER_FORKED | 409 | false | The ledger chain does not agree with its archive or digest. See reason. |
| LEDGER_DROPPED | 409 | false | The ledger was dropped. |
| LEDGER_FORMAT_RETIRED | 409 | false | The ledger uses a retired subject format. Declare a new ledger. |
| STORE_NOT_DELETED | 409 | false | The store still exists. Delete the store first. |
| ARCHIVE_RETAINED | 409 | false | The archive is still locked or in its 24-hour quiet period. See retainedUntil. |
| PURGE_IN_PROGRESS | 409 | false | Another purge of the store is running. See purgeId. |
| PURGE_BLOCKED | 409 | false | The last purge is blocked and needs Quant support. See purgeId. |
| PURGE_NOT_COMPLETE | 409 | false | The purge is not complete, so there is no receipt yet. See state. |
| DIGEST_OWED | 409 | true | The last ledger entries are not in a signed digest yet. Send the delete again in a few minutes. |
| CONTENTION | 409 | true | Another write changed the same data at the same time. Send again. |
| INDEX_NOT_READY | 409 | true | The index is still building. Send again later. |
| LEDGER_NOT_READY | 409 | true | The ledger is PENDING. Send again after activeAfter. |
| RATE_LIMITED | 429 | true | Too many requests. Wait for Retry-After seconds. Also retryAfter (seconds) on a purge start. |
| INTERNAL | 500 | false | The KV service failed. No detail is given. |
| STORE_MIGRATING | 503 | true | The store is being upgraded. Wait for Retry-After seconds. |
| UNAVAILABLE | 503 | true (false when the outcome of a write is unknown) | The KV service did not answer. With retryable false, read the data before you send the write again. |
object
Always true.
True when the same request can be sent again safely.
CONFLICT: the key the condition named.
CONFLICT: the current version, when the key exists and has not expired.
CONFLICT: why the condition failed. LEDGER_COLLECTION_NOT_EMPTY, LEDGER_RETAINED, LEDGER_FORKED: the cause.
LEDGER_RETAINED: when the archive retention ends.
LEDGER_NOT_READY: when the PENDING ledger can become ACTIVE.
LEDGER_RETAINED (unarchived): the collection with unarchived entries.
LEDGER_RETAINED (unarchived): the shard with unarchived entries.
Transact: the index of the failing operation.
UNIQUE_VIOLATION: the unique index.
UNIQUE_VIOLATION: the key that holds the value.
LEDGER_PRESENT (store delete): the ledgers that block the delete.
object
The ledger name.
The ledger state (PENDING, ACTIVE or DROPPED).
Not_dropped: drop the ledger first (after its retention ends). not_drained: the ledger is DROPPED but its last entries are not archived yet.
What to do next, when the KV service gives a hint.
The current state of the store, index, ledger or export, when the error names it.
Example
{ "error": true, "message": "The condition failed", "code": "CONFLICT", "retryable": false, "key": "user:1", "reason": "version", "currentVersion": "01JB2Z6V8Q3M4N5P6R7S8T9V0W"}Headers
Section titled “Headers”Seconds to wait before the next request.
The request limit of the window (IETF draft). X-RateLimit-Limit carries the same value.
Requests left in the window: 0 on a 429 (IETF draft). X-RateLimit-Remaining carries the same value.
Seconds until the window resets (IETF draft). X-RateLimit-Reset is the same moment as a Unix timestamp.
INTERNAL: the KV service failed. No detail is given.
Error body of every KV v2 route. A superset of V2Error. HTTP 400, 404, 409, 429 and 503 keep the KV service status, code and retryable. A KV service failure that the caller cannot act on is 500 INTERNAL. When retryable is true, the same request can be sent again (after Retry-After when present).
| code | status | retryable | meaning |
|---|---|---|---|
| VALIDATION | 400 | false | The request is not valid (body, parameter, key or value). |
| LIMIT_EXCEEDED | 400 | false | A size or count limit is exceeded (item over 400 KB, batch, transact, value). |
| CURSOR_INVALID | 400 | false | The cursor is not valid for this request. Start the list again. |
| REQUIRES_FORMAT_2 | 400 | false | The operation needs a format 2 store. Upgrade the store first. |
| INDEX_FIELD_ENCRYPTED | 400 | false | An indexed field is in a secret (encrypted) value. |
| COUNT_WITH_TTL | 400 | false | A count index cannot include items that have a ttl. |
| LEDGER_IMMUTABLE | 400 | false | A ledger entry cannot be changed or deleted. Use append. |
| LEDGER_INDEX_KIND | 400 | false | This index kind is not allowed on a ledger collection. |
| LEDGER_SUBJECT_REQUIRED | 400 | false | The ledger needs a subject field in each entry. |
| LEDGER_DIRECTION | 400 | false | A ledger setting can only be raised, not lowered. |
| CONFIRMATION_REQUIRED | 400 | false | confirm is missing or does not equal the store name. |
| SCOPE_REQUIRED | 403 | false | The token does not list the scope that the route needs. |
| PERMISSION_DENIED | 403 | false | The role of the token user does not have the permission. |
| FORBIDDEN | 403 | false | The store is a system store and cannot be purged. |
| KEY_NOT_FOUND | 404 | false | The key does not exist or has expired. |
| STORE_NOT_FOUND | 404 | false | The store does not exist or is not in this project. |
| EXPORT_NOT_FOUND | 404 | false | The store has no export. |
| LEDGER_NOT_FOUND | 404 | false | The ledger does not exist. |
| SUBJECT_NOT_FOUND | 404 | false | The ledger has no entries for the subject. |
| VERIFICATION_NOT_FOUND | 404 | false | The verification run does not exist. |
| SHRED_NOT_FOUND | 404 | false | The erasure record does not exist. |
| INDEX_NOT_FOUND | 404 | false | The index does not exist. |
| NOT_FOUND | 404 | false | No archive, tombstone or purge exists for the store or purge id. |
| UPGRADE_CONFLICT | 409 | false | The upgrade action is not valid in the current upgrade state. |
| CONFLICT | 409 | false | A condition (ifAbsent, ifVersion, check) failed. See reason, key and currentVersion. |
| UNIQUE_VIOLATION | 409 | false | A unique index already has the value. See index and existingKey. |
| EXPORT_IN_PROGRESS | 409 | false | An export of the store is already running. |
| LEDGER_COLLECTION_NOT_EMPTY | 409 | false | The collection already has items, so it cannot become a ledger. |
| LEDGER_RETAINED | 409 | false | The ledger is in its retention period. See retainUntil. |
| LEDGER_PRESENT | 409 | false | A ledger blocks the action. See ledgers. |
| STORE_NAME_RETAINED | 409 | false | The store name is held by a retained ledger archive. |
| LEDGER_FORKED | 409 | false | The ledger chain does not agree with its archive or digest. See reason. |
| LEDGER_DROPPED | 409 | false | The ledger was dropped. |
| LEDGER_FORMAT_RETIRED | 409 | false | The ledger uses a retired subject format. Declare a new ledger. |
| STORE_NOT_DELETED | 409 | false | The store still exists. Delete the store first. |
| ARCHIVE_RETAINED | 409 | false | The archive is still locked or in its 24-hour quiet period. See retainedUntil. |
| PURGE_IN_PROGRESS | 409 | false | Another purge of the store is running. See purgeId. |
| PURGE_BLOCKED | 409 | false | The last purge is blocked and needs Quant support. See purgeId. |
| PURGE_NOT_COMPLETE | 409 | false | The purge is not complete, so there is no receipt yet. See state. |
| DIGEST_OWED | 409 | true | The last ledger entries are not in a signed digest yet. Send the delete again in a few minutes. |
| CONTENTION | 409 | true | Another write changed the same data at the same time. Send again. |
| INDEX_NOT_READY | 409 | true | The index is still building. Send again later. |
| LEDGER_NOT_READY | 409 | true | The ledger is PENDING. Send again after activeAfter. |
| RATE_LIMITED | 429 | true | Too many requests. Wait for Retry-After seconds. Also retryAfter (seconds) on a purge start. |
| INTERNAL | 500 | false | The KV service failed. No detail is given. |
| STORE_MIGRATING | 503 | true | The store is being upgraded. Wait for Retry-After seconds. |
| UNAVAILABLE | 503 | true (false when the outcome of a write is unknown) | The KV service did not answer. With retryable false, read the data before you send the write again. |
object
Always true.
True when the same request can be sent again safely.
CONFLICT: the key the condition named.
CONFLICT: the current version, when the key exists and has not expired.
CONFLICT: why the condition failed. LEDGER_COLLECTION_NOT_EMPTY, LEDGER_RETAINED, LEDGER_FORKED: the cause.
LEDGER_RETAINED: when the archive retention ends.
LEDGER_NOT_READY: when the PENDING ledger can become ACTIVE.
LEDGER_RETAINED (unarchived): the collection with unarchived entries.
LEDGER_RETAINED (unarchived): the shard with unarchived entries.
Transact: the index of the failing operation.
UNIQUE_VIOLATION: the unique index.
UNIQUE_VIOLATION: the key that holds the value.
LEDGER_PRESENT (store delete): the ledgers that block the delete.
object
The ledger name.
The ledger state (PENDING, ACTIVE or DROPPED).
Not_dropped: drop the ledger first (after its retention ends). not_drained: the ledger is DROPPED but its last entries are not archived yet.
What to do next, when the KV service gives a hint.
The current state of the store, index, ledger or export, when the error names it.
Example
{ "error": true, "message": "The condition failed", "code": "CONFLICT", "retryable": false, "key": "user:1", "reason": "version", "currentVersion": "01JB2Z6V8Q3M4N5P6R7S8T9V0W"}STORE_MIGRATING (retryable, Retry-After) or UNAVAILABLE. UNAVAILABLE with retryable true (for example a new store whose table is still being created, with Retry-After 5) is safe to retry with backoff; honour Retry-After. With retryable false the outcome of a write is unknown: read before you write again.
Error body of every KV v2 route. A superset of V2Error. HTTP 400, 404, 409, 429 and 503 keep the KV service status, code and retryable. A KV service failure that the caller cannot act on is 500 INTERNAL. When retryable is true, the same request can be sent again (after Retry-After when present).
| code | status | retryable | meaning |
|---|---|---|---|
| VALIDATION | 400 | false | The request is not valid (body, parameter, key or value). |
| LIMIT_EXCEEDED | 400 | false | A size or count limit is exceeded (item over 400 KB, batch, transact, value). |
| CURSOR_INVALID | 400 | false | The cursor is not valid for this request. Start the list again. |
| REQUIRES_FORMAT_2 | 400 | false | The operation needs a format 2 store. Upgrade the store first. |
| INDEX_FIELD_ENCRYPTED | 400 | false | An indexed field is in a secret (encrypted) value. |
| COUNT_WITH_TTL | 400 | false | A count index cannot include items that have a ttl. |
| LEDGER_IMMUTABLE | 400 | false | A ledger entry cannot be changed or deleted. Use append. |
| LEDGER_INDEX_KIND | 400 | false | This index kind is not allowed on a ledger collection. |
| LEDGER_SUBJECT_REQUIRED | 400 | false | The ledger needs a subject field in each entry. |
| LEDGER_DIRECTION | 400 | false | A ledger setting can only be raised, not lowered. |
| CONFIRMATION_REQUIRED | 400 | false | confirm is missing or does not equal the store name. |
| SCOPE_REQUIRED | 403 | false | The token does not list the scope that the route needs. |
| PERMISSION_DENIED | 403 | false | The role of the token user does not have the permission. |
| FORBIDDEN | 403 | false | The store is a system store and cannot be purged. |
| KEY_NOT_FOUND | 404 | false | The key does not exist or has expired. |
| STORE_NOT_FOUND | 404 | false | The store does not exist or is not in this project. |
| EXPORT_NOT_FOUND | 404 | false | The store has no export. |
| LEDGER_NOT_FOUND | 404 | false | The ledger does not exist. |
| SUBJECT_NOT_FOUND | 404 | false | The ledger has no entries for the subject. |
| VERIFICATION_NOT_FOUND | 404 | false | The verification run does not exist. |
| SHRED_NOT_FOUND | 404 | false | The erasure record does not exist. |
| INDEX_NOT_FOUND | 404 | false | The index does not exist. |
| NOT_FOUND | 404 | false | No archive, tombstone or purge exists for the store or purge id. |
| UPGRADE_CONFLICT | 409 | false | The upgrade action is not valid in the current upgrade state. |
| CONFLICT | 409 | false | A condition (ifAbsent, ifVersion, check) failed. See reason, key and currentVersion. |
| UNIQUE_VIOLATION | 409 | false | A unique index already has the value. See index and existingKey. |
| EXPORT_IN_PROGRESS | 409 | false | An export of the store is already running. |
| LEDGER_COLLECTION_NOT_EMPTY | 409 | false | The collection already has items, so it cannot become a ledger. |
| LEDGER_RETAINED | 409 | false | The ledger is in its retention period. See retainUntil. |
| LEDGER_PRESENT | 409 | false | A ledger blocks the action. See ledgers. |
| STORE_NAME_RETAINED | 409 | false | The store name is held by a retained ledger archive. |
| LEDGER_FORKED | 409 | false | The ledger chain does not agree with its archive or digest. See reason. |
| LEDGER_DROPPED | 409 | false | The ledger was dropped. |
| LEDGER_FORMAT_RETIRED | 409 | false | The ledger uses a retired subject format. Declare a new ledger. |
| STORE_NOT_DELETED | 409 | false | The store still exists. Delete the store first. |
| ARCHIVE_RETAINED | 409 | false | The archive is still locked or in its 24-hour quiet period. See retainedUntil. |
| PURGE_IN_PROGRESS | 409 | false | Another purge of the store is running. See purgeId. |
| PURGE_BLOCKED | 409 | false | The last purge is blocked and needs Quant support. See purgeId. |
| PURGE_NOT_COMPLETE | 409 | false | The purge is not complete, so there is no receipt yet. See state. |
| DIGEST_OWED | 409 | true | The last ledger entries are not in a signed digest yet. Send the delete again in a few minutes. |
| CONTENTION | 409 | true | Another write changed the same data at the same time. Send again. |
| INDEX_NOT_READY | 409 | true | The index is still building. Send again later. |
| LEDGER_NOT_READY | 409 | true | The ledger is PENDING. Send again after activeAfter. |
| RATE_LIMITED | 429 | true | Too many requests. Wait for Retry-After seconds. Also retryAfter (seconds) on a purge start. |
| INTERNAL | 500 | false | The KV service failed. No detail is given. |
| STORE_MIGRATING | 503 | true | The store is being upgraded. Wait for Retry-After seconds. |
| UNAVAILABLE | 503 | true (false when the outcome of a write is unknown) | The KV service did not answer. With retryable false, read the data before you send the write again. |
object
Always true.
True when the same request can be sent again safely.
CONFLICT: the key the condition named.
CONFLICT: the current version, when the key exists and has not expired.
CONFLICT: why the condition failed. LEDGER_COLLECTION_NOT_EMPTY, LEDGER_RETAINED, LEDGER_FORKED: the cause.
LEDGER_RETAINED: when the archive retention ends.
LEDGER_NOT_READY: when the PENDING ledger can become ACTIVE.
LEDGER_RETAINED (unarchived): the collection with unarchived entries.
LEDGER_RETAINED (unarchived): the shard with unarchived entries.
Transact: the index of the failing operation.
UNIQUE_VIOLATION: the unique index.
UNIQUE_VIOLATION: the key that holds the value.
LEDGER_PRESENT (store delete): the ledgers that block the delete.
object
The ledger name.
The ledger state (PENDING, ACTIVE or DROPPED).
Not_dropped: drop the ledger first (after its retention ends). not_drained: the ledger is DROPPED but its last entries are not archived yet.
What to do next, when the KV service gives a hint.
The current state of the store, index, ledger or export, when the error names it.
Example
{ "error": true, "message": "The condition failed", "code": "CONFLICT", "retryable": false, "key": "user:1", "reason": "version", "currentVersion": "01JB2Z6V8Q3M4N5P6R7S8T9V0W"}