Get the inclusion proof of one ledger entry
const url = 'https://dashboard.quantcdn.io/api/v2/organizations/test-org/projects/test-project/kv/test-org-test-project-orders/ledgers/aiUse/proof?key=ai-use%3Aagency-1%3A01M5104A000000000000000000-00';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/proof?key=ai-use%3Aagency-1%3A01M5104A000000000000000000-00' \ --header 'Authorization: Bearer <token>'Status pending until the entry is archived and the digest that covers it is signed (about 10 minutes). status archived: the stored entry (personal fields stay sealed), its hash, the Merkle audit path to the archive object root, the signed digest and its signature. The body is the exact bytes of the KV service (application/json). When the live entry differs from its archived copy the answer is 503 UNAVAILABLE with retryable false: run KV_ledgers_verify.
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 key of a ledger entry (collection:id), as in the append receipt.
Example
ai-use:agency-1:01M5104A000000000000000000-00Responses
Section titled “Responses”The proof, or pending.
Status pending: the entry is not archived and signed yet (about 10 minutes). status archived: the inclusion proof (RFC 9162 audit path). The body is the KV service bytes unchanged: digest is the signed RFC 8785 object.
object
The archived line in stored form; personal fields stay sealed.
object
Who wrote the entry, set by the KV service from the authenticated caller (never from the body) and covered by the entry hash. platform: a Quant service (quant-ledger writes the shred entries); api: an API caller (an append through this API with a portal token records principal token:
object
Archive period label, YYYYMMDDTHHmmZ.
object
Base64 DER ECDSA P-256 over SHA-256 of the digest bytes.
object
Example
{ "status": "pending", "source": { "type": "platform", "principal": "token:42" }, "anchor": { "type": "rfc3161" }, "anchorUnavailable": true}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"}