Errors

Error codes, formats, and handling guidance.


Error Format

All API errors return a consistent JSON structure:

{
"error": {
"code": "ENTITY_NOT_FOUND",
"message": "Entity with the given ID does not exist.",
"details": {}
}
}

HTTP Status Codes

StatusMeaningAction
400Bad RequestFix request body, parameters, or query strings
401UnauthorizedInclude a valid API key in the Authorization header
403ForbiddenKey lacks required scope, IP not allowed, or key revoked
404Not FoundResource does not exist
409ConflictDuplicate entity, wallet already registered, etc.
422Unprocessable EntityValidation error — check the details object
429Too Many RequestsBack off and retry after the X-RateLimit-Reset time
500Internal Server ErrorRetry with exponential backoff; contact support if persistent
503Service UnavailableTemporary outage — retry shortly

Common Error Codes

CodeDescription
ENTITY_NOT_FOUNDEntity ID does not exist
WALLET_NOT_REGISTEREDWallet address is not registered for any entity
COMPLIANCE_CHECK_FAILEDOne or more compliance checks did not pass
ENTITY_SUSPENDEDEntity is suspended and cannot transact
WALLET_FROZENWallet compliance has been revoked on the oracle
SANCTIONED_ADDRESSAddress appears on a sanctions list
TRAVEL_RULE_REQUIREDTransfer exceeds threshold and requires travel rule data
DUPLICATE_ENTITYEntity with same legal name and jurisdiction exists
INVALID_CHAIN_IDChain ID is not supported
RATE_LIMIT_EXCEEDEDAPI key has exceeded its rate limit tier

Handling Errors

Python
import httpx
resp = httpx.post("https://api.overvoid.io/v1/onboarding/entities", ...)
if resp.status_code == 429:
# Rate limited — check headers
reset_at = int(resp.headers["X-RateLimit-Reset"])
# Wait until reset_at (Unix timestamp)
elif resp.status_code >= 400:
error = resp.json()["error"]
print(f"Error {error['code']}: {error['message']}")
if error.get("details"):
print(f"Details: {error['details']}")

Retry Strategy

For transient errors (5xx, timeouts), use exponential backoff:

  • 1st retry: 1 second
  • 2nd retry: 2 seconds
  • 3rd retry: 4 seconds
  • Max 5 retries with jitter

Do not retry 4xx errors (except 429) — they indicate a client-side issue that must be fixed.