Home
Home/Developers/Errors
Ed25519 signaturesSHA-256 hashes8 SDKs
Status
Sign inStart free
Home
Start here
Overview
Authentication
Errors
FAQ
API
Events
Canonical JSON and hashes
Documents
Anchoring a file
AI attestations
Attestation schema
Verifying attestations
Traces
Sealing a trace
Audit logs
Organizations
Streams
Portal
Public proof
Event schema
Exporting events
Integrations
Clerk
Auth0
Embeddable viewer
All endpoints
Reference
SDKs
Node.js
Python
Go
Java
Ruby
Rust
.NET
PHP
REST
Verification
Docs · Errors

Errors

Every error is an HTTP status and a JSON body with a stable code and a message. Match on the code; the message can change.

AuthenticationRetries
sha-256 · 3a352297…2592
sha-256 · 41553e3e…aee4
Error body
{
  "error": "invalid_api_key",
  "message": "The API key is invalid or does not exist. Double-check the key and try again."
}
Fields
errorstring · required

Stable machine-readable code; the catalogue below lists every value the API returns.

messagestring · required

Human-readable explanation; the wording may change, the code does not.

retry_afterinteger

Only on 429 rate_limited: seconds to wait, the same value as the Retry-After header.

plan_tierstring

Only on 429 rate_limited: the tier name derived from the limit that applied.

limit_per_secinteger

Only on 429 rate_limited: the per-second limit that applied.

upgrade_urlstring

Only on 429 rate_limited: the dashboard path for changing plan, /dashboard/plans/upgrade.

Status codes
400The request failed validation; the code names the field or rule.
401No key, a malformed key, an unknown key or a revoked key.
402The subscription is past due on a paid tier, so writes are blocked.
403The key lacks the scope, the address is not on its IP allowlist, or the plan does not include the feature.
404No record with that id for this tenant, or no public proof for it.
409The write conflicts with stored state: a reused Idempotency-Key, an anchored hash, a trace that is not open.
410The record passed its retention window and is no longer served.
413An AI attestation's canonical JSON exceeds 1 MB.
429rate_limited when the per-second or per-minute budget is used up; quota_exceeded when the monthly plan quota is.
5xxSomething failed on the server; see Retries.
Authentication and authorization
CodeStatusWhen
missing_api_key401Neither an Authorization header nor an X-API-Key header was sent.
invalid_authorization_scheme401An Authorization header is present but does not start with Bearer.
invalid_api_key_format401The key does not start with invoance_live_.
invalid_api_key401No key with that value exists, or GET /v1/me found no row for the authenticated key.
api_key_revoked401The key exists but has been revoked.
api_key_required401GET /v1/me was reached by an authenticated context that carries no API key id.
invalid_api_context401A write handler found no API key id in the authenticated context.
invalid_or_used_link401POST /v1/audit/portal/exchange received a portal link token that is unknown, expired or already exchanged.
missing_portal_token401A /v1/audit/portal/* read or stream route was called without an Authorization: Bearer header.
invalid_portal_token401The bearer token on a /v1/audit/portal/* route is not a portal JWT, has expired or has the wrong audience.
ip_not_allowed403The key has IP rules and the request came from an address that is not listed.
insufficient_scope403The key lacks the scope the endpoint checks: read, write, audit:read or audit:write.
wrong_intent403A portal token issued for another intent was used on an audit portal read.
trace_not_public403GET /v1/proof/trace/{trace_id} was called for a trace whose proof is not public.
Validation
CodeStatusWhen
invalid_path_parameter400A path id on an events, documents or AI attestations get, raw or verify call is not a UUID.
bad_request400An authenticated verify call on events, documents or AI attestations has a malformed or missing hash, or both payload and payload_hash.
invalid_event_type400event_type is empty or longer than 128 characters.
invalid_payload400The event payload is not a JSON object, or the payload sent to the public event verify could not be serialized.
payload_too_large400An event payload or an audit event body exceeds 64 KB.
payload_too_large413The canonical JSON of an AI attestation exceeds 1 MB, or a document anchor body exceeds the route's 8,462,336-byte limit.
empty_payload400An AI attestation's input or output is empty.
invalid_attestation_type400An AI attestation type is not one the backend accepts.
invalid_context400An AI attestation's model context is incomplete.
subject_too_many_keys400An AI attestation subject carries more than 20 extra keys.
subject_too_large400An AI attestation subject serializes to more than 8 KB.
invalid_document_hash400document_hash is not 64 hex characters.
invalid_metadata400Document metadata is not a JSON object, or audit event metadata breaks the key count, key length or value length limits.
metadata_too_large400Document metadata exceeds 8 KB or trace metadata exceeds 16 KB.
invalid_original_bytes_base64400original_bytes_b64 is not valid base64.
original_bytes_empty400original_bytes_b64 decodes to zero bytes.
original_bytes_too_large400original_bytes_b64 decodes to more than 5 MB.
original_bytes_hash_mismatch400The SHA-256 of the decoded original bytes differs from document_hash.
invalid_label400A trace label is missing, empty or longer than 255 characters.
invalid_status400A trace list status filter is not open, sealing or sealed.
trace_empty400Sealing was requested on a trace with no events.
trace_invalid_status400A document anchor or AI attestation names a trace whose status accepts no new items; event ingest returns the same code with status 409.
invalid_idempotency_key400The Idempotency-Key header is empty, not valid UTF-8 or longer than the endpoint's limit: 128 characters on events, 255 on audit events.
missing_idempotency_key400POST /v1/audit/events was called without an Idempotency-Key header.
invalid_json400An audit event body is not valid UTF-8 JSON, or the JSON sent to the public audit verify could not be parsed.
duplicate_json_key400An audit event body repeats a JSON key.
invalid_envelope400An audit event body does not match the audit event envelope.
invalid_org400organization_id on an audit event is empty after trimming.
invalid_action400An audit event action is malformed or longer than 128 characters.
invalid_actor400An audit event actor is missing a required field.
invalid_target400An audit event target is missing a required field.
too_many_targets400An audit event lists more than 20 targets.
invalid_version400An audit event carries an unsupported envelope version.
invalid_occurred_at400An audit event occurred_at is not a parseable timestamp.
occurred_at_out_of_window400An audit event occurred_at is more than 5 years in the past or more than 24 hours in the future.
invalid_event400The JSON sent to POST /v1/proof/audit/{event_id}/verify is not an audit event for the id in the path.
invalid_organization_id400organization_id is empty on an audit event list, or empty or longer than 255 characters on audit org create.
unknown_org400An audit event list names an organization_id the tenant does not have.
invalid_timestamp400occurred_after or occurred_before on an audit event list is not a parseable timestamp.
invalid_cursor400An audit event list cursor is malformed.
invalid_name400An audit organization name is longer than 255 characters; an empty name is accepted and clears the stored one.
nothing_to_update400An audit organization update carries no fields.
invalid_days400An audit organization retention days value is less than 1; values above the plan cap are clamped, not rejected.
invalid_format400An audit export format is not one the backend supports.
unsupported_stream_type400A stream was created or tested with a type the backend does not support.
invalid_url400A stream destination is not a valid absolute URL.
not_https400A stream destination does not use https.
no_host400A stream destination URL has no host.
resolution_failed400A stream destination host did not resolve in DNS.
forbidden_destination400A stream destination resolves to a private, loopback, link-local or cloud metadata address.
no_endpoint400A stream test was requested for a stream with no endpoint.
too_many_streams400The plan's limit on stream destinations for the audit organization has been reached.
invalid_intent400A portal session intent is not one the backend recognises.
invalid_duration400A portal session duration is outside the accepted range; the maximum is 86400 seconds.
invalid_link_duration400A portal link duration is outside the accepted range; the maximum is 3600 seconds.
invalid_hash400A public proof verify received a hash that is not 64 hex characters.
missing_input400POST /v1/proof/event/{event_id}/verify received neither payload_hash nor payload.
invalid_domain400GET /keys/{domain} received an empty domain or one longer than 253 characters.
Quota and billing
CodeStatusWhen
quota_exceeded429The monthly plan quota for the resource (events, documents, AI attestations, verifications, traces or audit events) is used up; message "Plan quota exceeded. Upgrade at /dashboard/plans/upgrade".
feature_not_available403The plan's monthly limit for the resource is 0, so the feature is not included; message "This feature is not included in your plan. Upgrade at /dashboard/plans/upgrade".
payment_required402The subscription is past due on a paid tier, so writes are blocked; message "Subscription payment is past due. Update your payment method at /dashboard/billing".
too_many_orgs403The plan's limit on audit organizations has been reached, on create or on ingest for a new organization.
quota_check_failed500The plan lookup or the Redis quota counter failed; the request is rejected rather than allowed.
Not found and expired
CodeStatusWhen
event_not_found404No event with that id belongs to the tenant, or no public event or audit proof exists for the id.
document_not_found404No anchored document with that event id belongs to the tenant.
attestation_not_found404No AI attestation with that id belongs to the tenant.
ai_attestation_not_found404No public AI proof exists for that attestation id.
trace_not_found404No trace with that id belongs to the tenant, or no public trace proof exists for the id.
proof_not_found404No document anchor exists for the event id given to the public document proof.
not_found404An audit organization, audit event, export, stream or portal record does not exist for the tenant.
org_not_found404The organization named in an audit event does not exist for the tenant.
domain_not_found404No organization is registered with the domain given to GET /keys/{domain}.
domain_not_verified404The domain is registered but has not completed verification.
keys_not_yet_provisioned404The domain is verified but the tenant has not signed anything yet, so no key exists.
retention_expired410The event, document or AI attestation has passed its retention window and is no longer served.
Conflict
CodeStatusWhen
idempotency_key_reuse_mismatch409The Idempotency-Key was already used with a different request.
document_already_anchored409A document with the same hash is already anchored for the tenant.
duplicate_trace409A trace with the same label already exists.
trace_not_open409A seal, delete, document anchor or AI attestation targets a trace that is not open.
trace_sealed409Event ingest targets a trace that is already sealed.
trace_sealing409Event ingest targets a trace that is being sealed.
trace_has_events409Delete was requested on a trace that contains events.
trace_not_sealed409A proof bundle, proof PDF or public trace proof was requested for a trace that is not sealed.
org_exists409An audit organization with the same identifier already exists.
org_archived409The audit organization is archived and accepts no new events, streams, exports or portal sessions.
org_not_deletable409The audit organization still has signed history, data retention has not purged, or events accepted in the last 24 hours.
Rate limit
CodeStatusWhen
rate_limited429The tenant exceeded its per-second or per-minute request budget; Retry-After says how long to wait.
Server
CodeStatusWhen
db_error500A database query failed.
db_query_failed500The lookup behind GET /v1/document/{event_id}/original or GET /v1/ai/attestations/{attestation_id}/raw failed.
r2_fetch_failed500The stored original document or raw attestation bytes could not be fetched from object storage.
internal_error500Document anchoring hit an unexpected failure.
encode_failed500An event, audit event or seal envelope could not be encoded for the write queue.
ingest_failed500Publishing to the write queue failed; any idempotency reservation is released so a retry can succeed.
serialization_failed500A response or queue message could not be serialized.
serialization_error500A row read in GET /keys/{domain} could not be decoded.
hash_error500Hashing an AI attestation failed.
hash_decode_failed500A validated hex hash could not be decoded to bytes.
trace_create_failed500Creating a trace failed.
seal_publish_failed500Publishing the seal job failed.
seal_event_missing500A sealed trace has no seal event to build the proof from.
pdf_generation_failed500Rendering a trace proof PDF failed.
api_key_lookup_failed500The API key could not be looked up in the database.
token_sign_failed500A portal JWT could not be signed.
key_unavailable500The tenant's signing key could not be loaded for a public audit proof.
Retries
429 rate_limitedWait Retry-After seconds, then send the same request: 1 for the per-second bucket, the seconds left in the minute for the minute bucket.
429 quota_exceededNo Retry-After. The same request fails until the quota changes; the message names the upgrade path.
202 processingA retry arrived while the first request was still running. Wait, then retry with the same Idempotency-Key.
5xxRetry with backoff and the same Idempotency-Key. ingest_failed releases the reservation so the retry is processed; a completed request replays its stored response for 24 hours.
Other 4xxDo not retry unchanged. Fix the request; 409 idempotency_key_reuse_mismatch means the key was already used with a different body.

Verified documents and records. Invoance records the exact version of every invoice, report and notice your company sends, so the people who receive them can confirm they have the version you sent, without taking your word for it.

Products

  • Evidence Rooms
  • Audit Logs
  • Event Ledger
  • AI Attestation
  • Document Anchoring
  • Traces

Developers

  • Documentation
  • API reference
  • SDKs
  • How it works
  • How traces seal
  • System status

Verify

  • Audit Log
  • Event
  • AI Attestation
  • Document
  • Trace

Company

  • Company overview
  • What is Invoance
  • Pricing
  • Security
  • Compliance teams
  • Finance teams
  • Partners
  • Brand assets
  • Resources
  • Help center
  • Contact
© 2025 – 2026 Invoance, Inc. All rights reserved.© 2026 Invoance, Inc. All rights reserved.
PrivacyLegal noticeLegal FAQ