Veridion Disclosure API · problems

Every error the API can return.

When a request cannot be answered, the API returns an RFC 9457 problem document with a stable code, a type that resolves to the entry below, and a request_id equal to the X-Request-ID header. 27 problems are defined for version 1.20.0. A route cannot emit a code that is not on this page; the build fails.

{
  "type": "https://www.veridionmarkets.com/data-api/problems/rate_limited",
  "code": "rate_limited",
  "title": "Free-tier request budget exceeded.",
  "status": 429,
  "detail": "The free tier allows 60 requests per hour per IP. ...",
  "request_id": "6f1c…"
}

HTTP 400

invalid_transaction_idcaller changes the request

The OGE transaction identifier is invalid.

The path does not carry the stored 64-character lowercase hexadecimal OGE transaction identifier.

Fix the request; do not retry as sent.

unknown_query_parametercaller changes the request

One or more query parameters are not supported.

The request named a query parameter this operation does not define. The API refuses the request instead of ignoring the parameter, because a silently ignored filter returns the wrong rows under a 200.

Fix the request; do not retry as sent.

invalid_requestcaller changes the request

One or more query parameters are invalid.

A known parameter carried a value outside its contract: a malformed date, a limit above the tier's cap, an unknown chamber, a badly formed identifier.

Fix the request; do not retry as sent.

invalid_disclosure_idcaller changes the request

The disclosure identifier is invalid.

The path segment is not shaped like a permanent v1 disclosure_id. This is a syntax check; it says nothing about whether such a record exists.

Fix the request; do not retry as sent.

invalid_cursorcaller changes the request

The cursor is not one this API issued for this query.

Cursors are signed and carry the query they belong to. A cursor that fails its signature, or that was issued for a different filter set or pull mode, is refused rather than applied to the wrong query.

Restart from page one without a cursor.

temporal_history_unavailablecaller changes the request

The requested point in time predates retained payload history.

as_of or updated_since is earlier than coverage.point_in_time_floor. The API returns a typed refusal instead of an empty page, because an empty page would read as "nothing happened" when the truth is "we cannot say".

Fix the request; do not retry as sent.

HTTP 401

unauthorizedcaller changes the request

A valid API key is required.

An Authorization header was present and did not carry a valid key. The free tier needs no key: omit the header entirely to use it.

Fix the request; do not retry as sent.

HTTP 403

full_history_requires_developercaller changes the request

A Developer key is required for historical access.

Anonymous, free and evaluator callers may read only the globally recent 25 serving candidates. Cursors and as_of cannot widen that window.

Fix the request; do not retry as sent.

insufficient_scopecaller changes the request

This key is not authorized for this Disclosure API endpoint.

The key is valid but its scopes do not include this operation.

Fix the request; do not retry as sent.

HTTP 404

executive_transaction_not_foundcaller changes the request

No receipt-qualified executive transaction is in this access window.

The transaction has no qualified active row in the caller's pinned snapshot or bounded free window. This does not assert that the filer never disclosed it.

Fix the request; do not retry as sent.

route_not_foundcaller changes the request

No Disclosure API endpoint exists at this path.

The path is not one this contract defines. Distinct from disclosure_not_found, which means the endpoint exists and the identifier does not. Until 2026-09-06 an undefined path under /api/v1 returned the website's HTML not-found page, so a client that had made a typo received markup where every other failure on this surface returns problem+json.

Fix the request; do not retry as sent.

disclosure_not_foundcaller changes the request

No disclosure exists for this permanent identifier.

The permanent disclosure_id namespace was searched across active and withdrawn records and nothing matched. Withdrawn identifiers still resolve with their reason, so a 404 means the identifier was never issued.

Fix the request; do not retry as sent.

no_snapshot_yetVeridion side

No bulk snapshot has been generated yet.

The bulk export is produced daily. This is a pipeline state, not an authorization failure.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

HTTP 405

method_not_allowedcaller changes the request

This endpoint answers GET only.

The path exists and the method does not. Every operation in this contract is a read: the API has no endpoint that changes the record, because the record belongs to the government sources it is parsed from. A 405 here is never a permission problem and never a temporary one.

Fix the request; do not retry as sent.

HTTP 409

cursor_snapshot_unavailableVeridion side

The cursor snapshot is no longer available.

Every cursor pins the snapshot it was issued against so later writes cannot shift a page mid-pull. That snapshot is no longer retained. The API refuses to continue the pull against a different snapshot.

Restart from page one without a cursor.

HTTP 429

rate_limitedcaller changes the request

Free-tier request budget exceeded.

The anonymous budget stated in X-RateLimit-Policy was used up for this address. Retry-After says how long until the window opens.

Retry after the Retry-After header elapses.

HTTP 503

executive_identity_ambiguousVeridion side

The executive transaction identity is ambiguous.

More than one accepted current version matched a stored OGE transaction identifier. The API refuses to choose a row.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

cursor_signing_unavailableVeridion side

Pagination signing is temporarily unavailable.

The server could not authenticate a cursor because its signing prerequisite is unavailable.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

cursor_position_unavailableVeridion side

The raw pagination position could not be validated.

The last raw row lacks an exact valid timestamp or immutable disclosure identity. Issuing a guessed cursor could skip or repeat rows.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

api_rate_limit_unavailableVeridion side

The request budget is temporarily unavailable.

The shared anonymous counter could not be read, or trusted client addressing is unavailable. No quota balance is published and no disclosure read runs.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

warehouse_unavailableVeridion side

The disclosure warehouse is temporarily unavailable.

The read behind this response did not complete within its budget. The API returns no rows rather than a partial page, and a 503 is never cached.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

api_auth_unavailableVeridion side

API authentication is temporarily unavailable.

The key could not be checked because the authentication store did not answer. This is not a judgement on the key.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

api_usage_meter_unavailableVeridion side

Evaluator usage evidence could not be recorded.

Evaluator-tier requests are metered in the database as evidence of use. Successful responses are withheld when usage cannot be confirmed. A terminal metering failure never replaces an existing 4xx status or problem code; it is logged internally under the request identifier.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

contract_validation_failedVeridion side

A stored disclosure does not satisfy the public contract.

A row read from the warehouse failed the published schema at serve time. The API refuses to serve a row that does not match its own contract. This is a Veridion defect, not a request problem.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

temporal_capability_unavailableVeridion side

Point-in-time history is temporarily unavailable.

as_of or updated_since needs the temporal read model and it did not answer. The detail field carries the measured reason.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

signing_failedVeridion side

The snapshot exists but a download URL could not be signed.

The bulk snapshot is present; the short-lived download link could not be produced.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

manifest_timestamp_unreadableVeridion side

The snapshot manifest carries a timestamp this contract cannot serve.

generated_at, snapshot_as_of and artifact_verified_at must each be a readable instant. One was missing or unparseable, so the manifest is withheld rather than served in a form the published schema rejects.

Retry later; the request was sound. Every 503 carries Retry-After with the minimum wait.

Problem documents are returned by every v1 route except where the OpenAPI document declares a legacy error body for an operation. Questions with a request id go to support@veridionmarkets.com.

Veridion by email

Disclosure findings, methodology notes, and product updates when we have them. No fixed schedule yet. No advertising list resale.