GenuineAIGenuineAI
For usersFor developers
  • Overview
  • Guides
  • How-to
  • API reference
Documentation
  • Quickstart
  • Authentication
  • Errors
  • Rate limits
  • API reference
Platform
  • Platform overview
  • Solutions
  • Pricing
  • Sign in
Company
  • Status
  • Trust Center
  • Contact
  • Terms of Service
  • Privacy Policy

© 2026 GenuineAI Ventures LLC

support@genuinehq.com
Start here
QuickstartAuthentication
Working with the API
Objects and fieldsErrorsPaginationRate limitsMaintenance windowsVersioning and deprecation
Security
Security and tenancyRoles and permissionsPermission referenceSharing and access
Your plan
Plans and modules
Guides

Errors

Every non-2xx response is application/problem+json (RFC 9457). One shape, on every endpoint:

Code
{ "type": "https://docs.genuineai.app/errors/validation-failed", "title": "Validation failed", "status": 422, "detail": "Validation error", "instance": "/api/v1/agents", "code": "validation_failed", "errorId": "8f14e45f" }
Field
typeURI identifying the kind of error.
titleShort summary of the kind. Prose; do not branch on it.
statusThe HTTP status, repeated in the body.
detailWhat went wrong with this request. Prose.
instanceThe path that produced it.
codeBranch on this. A value from the closed list below.
errorIdCorrelates with our logs. Quote it when asking us about a request.

Branch on code

code comes from a fixed vocabulary, and the list is enforced closed: a code minted by a provider we call (a payment processor, a telephony provider) never appears here. It travels in upstreamCode instead, so code always means something we defined.

Adding a code is a contract change. Removing or renaming one is a breaking change and is subject to the deprecation policy.

Codes by status

StatusDefault codeMeans
400bad_requestMalformed request.
401unauthorizedMissing or invalid credentials.
402payment_requiredBilling action needed.
403forbiddenAuthenticated, not permitted.
404resource_not_foundNo such resource, or not visible to you.
409conflictConflicts with current state.
410resource_goneExisted, deliberately removed.
413payload_too_largeBody over the limit (see below).
415unsupported_media_typeSend JSON.
422validation_failedFailed validation; see invalidFields.
429rate_limitedSlow down. See rate limits.
500internal_errorOur fault. errorId is the thing to quote.
502upstream_errorA service we depend on failed.
503service_unavailableTemporary. Check status, then retry.

Several codes are narrower than their status, because each calls for a different response:

  • license_required (403): your workspace does not have this module, and a permission change will not fix it. The response names the module in feature, so you can match on that rather than parse the message:

    Code
    { "status": 403, "code": "license_required", "detail": "This workspace does not have the \"module-design\" license feature. See https://docs.genuineai.app/plans-and-modules", "feature": "module-design" }

    See plans and modules for what each module covers.

  • insufficient_credits (403): the workspace is out of credits. Top up rather than retry.

  • maintenance (503): planned downtime, as against service_unavailable for an unplanned failure. Every endpoint answers this for the length of the window, detail carries the message written for it, and Retry-After estimates how long it has left. Nothing you sent was applied, so the request is safe to replay in full. See maintenance windows.

  • business_rule (varies): a deliberate refusal rather than a fault. The detail explains it and is written to be shown to a person.

The rest of the vocabulary

The remaining codes are narrower still. Each names a situation a client can do something specific about, and most appear on one area of the API only.

CodeStatusWhereMeans
daily_cap_reached429Chat widgetsThe widget's daily credit cap for this workspace is spent. Resets with the day.
session_limit_reached429Chat widgetsThis visitor has started as many widget sessions today as the widget allows.
session_expired401Chat widgetsThe widget session token is no longer valid. Start a new session.
assistant_busy409Chat widgetsThis conversation already has a reply in flight. Wait for it rather than sending again.
server_busy429Chat widgetsThe shared AI queue is saturated. Back off and retry.
turnstile_failed403Chat widgetsThe bot check did not pass.
agent_not_public410Chat widgetsThe agent behind the widget is no longer published.
origin_not_allowed403Browser callsThe request came from a web origin that is not on the workspace's allowlist.
design_locked403DesignsThe design is locked and cannot be edited until it is unlocked.
design_is_template403DesignsThe operation applies to a design, and this one is a template. Create a design from it first.
template_missing400DesignsThe request needs a template and named none.
template_gone404DesignsThe template the request named no longer exists.
fields_missing400DesignsThe template declares no fields the request could fill.
text_fields_missing400DesignsThe template declares no text fields the request could write into.
export_too_large422DesignsThe export exceeds the pixel budget. Lower the resolution or the size.
ai_generation_failed502GenerationThe model produced no usable result. Retrying is reasonable; the request itself was fine.
file_not_recoverable409FilesThe file is past the point where it can be restored from the trash.
db_pool_timeout503AnyThe database is under load. Back off and retry.

Eight more codes are reserved in the vocabulary for request-parsing and platform failures and are not answered today: malformed_json, malformed_body, unsupported_encoding, unsupported_charset, request_aborted, not_implemented, gateway_timeout and geo_restricted. A client that branches on code needs no special handling for them; an unknown code falls through to the handling for its status.

Validation errors

A 422 adds invalidFields, with one entry per field that failed:

Code
{ "status": 422, "code": "validation_failed", "invalidFields": [ { "path": "agent_audience", "location": "body", "msg": "core:validation.enum" } ] }

msg is a translation key rather than an English sentence. Resolve it or show your own copy.

4xx and 5xx

The distinction is meaningful. A 4xx reports a problem with what you sent and returns a usable detail. A 5xx reports only that something failed on our side; it carries errorId and is investigated by us.

If 5xx responses are arriving in numbers rather than one at a time, the status page is the fastest way to tell a platform incident from something specific to your integration, and to see when it is resolved without retrying to find out. Quote the errorId if what you are seeing is not on it.

Request body size

Request bodies are capped at 10 MB. Exceeding the cap returns 413 with the limit named in detail. This does not apply to file uploads, which go directly to storage through signed URLs and never pass through the API.

Last modified on October 8, 2026
Objects and fieldsPagination
On this page
  • Branch on code
  • Codes by status
  • The rest of the vocabulary
  • Validation errors
  • 4xx and 5xx
  • Request body size
JSON
if (err.code === "insufficient_credits") promptTopUp(); else if (err.code === "rate_limited") retryAfter(res.headers.get("Retry-After")); else if (err.code === "validation_failed") showFieldErrors(err.invalidFields);
JSON
JSON