Errors
All API errors use RFC 7807 Problem+JSON. Every error response includes a request_id for support triage.
"type" : " https://docs.verbitas.io/api/errors#verbitas.sign.invalid_recipe " ,
"title" : " Invalid recipe " ,
"detail" : " Recipe 'my-recipe-v99' not found for tenant t_01j... " ,
"request_id" : " req_01j... " ,
"code" : " verbitas.sign.invalid_recipe "
Field Description typeURI identifying the error type; links to this page titleShort human-readable title statusHTTP status code detailSpecific detail about this instance of the error request_idUnique request ID; include this in all support requests codeMachine-readable dot-separated error code
Stack traces are never included in API responses. Use request_id to correlate with server logs when contacting support.
Error codes by category
Authentication
Code HTTP Description verbitas.auth.invalid_key401 API key does not exist or has been revoked verbitas.auth.key_expired401 API key has passed its expiry date verbitas.auth.insufficient_scope403 Key scope does not permit this operation verbitas.auth.tenant_suspended403 Tenant account is suspended (e.g. failed payment)
Sign
Code HTTP Description verbitas.sign.invalid_recipe400 Recipe ID not found or validation failed verbitas.sign.unsupported_mime400 File type not allowed by this recipe verbitas.sign.missing_idempotency_key400 Idempotency-Key header is missingverbitas.sign.invalid_metadata400 Metadata JSON is malformed or contains unknown assertion keys verbitas.sign.file_too_large413 File exceeds 100 MB direct upload limit verbitas.sign.idempotency_conflict409 Same Idempotency-Key, different payload
Verify
Code HTTP Description verbitas.verify.no_input400 No file, asset_id, or manifest_uri provided verbitas.verify.unsupported_file_type415 File format not in supported set verbitas.verify.asset_not_found404 asset_id not found in tenant’s recordsverbitas.verify.manifest_not_found404 Manifest URI could not be fetched
Lookup
Code HTTP Description verbitas.lookup.no_input400 No asset or fingerprint provided verbitas.lookup.unsupported_file_type415 File format not supported verbitas.lookup.invalid_algorithm400 algorithm value not in allowed set
Recipes
Code HTTP Description verbitas.recipes.invalid_schema400 YAML fails schema validation; detail includes field errors verbitas.recipes.unknown_step_kind400 step.kind outside closed enumverbitas.recipes.invalid_extends400 Base preset not found verbitas.recipes.byok_plan_required402 kms_mode: byok requires Enterprise BYOK planverbitas.recipes.conflict409 Recipe ID + version already exists verbitas.recipes.immutable409 Recipe has been used; cannot modify
Billing
Code HTTP Description verbitas.billing.quota_exceeded402 Monthly operation quota reached for current plan verbitas.billing.spending_cap_reached402 Tenant spending cap has been hit
Audit
Code HTTP Description verbitas.audit.invalid_date_range400 from after to, or range too large
Rate limiting
Code HTTP Description verbitas.ratelimit.exceeded429 Per-tenant or per-IP rate limit exceeded
Rate limit responses include:
X-RateLimit-Reset: 1715248800
Infrastructure
Code HTTP Description verbitas.signer.unavailable503 KMS signer temporarily unavailable; retry with backoff verbitas.internal_error500 Unexpected internal error; include request_id in support ticket
SDK error handling
SDKs map error codes to typed exceptions:
Python
from verbitas.exceptions import (
result = client. sign ( " image.png " , recipe = " image-genai-v1 " )
# e.code = "verbitas.auth.invalid_key"
print ( f "Auth failed: {e.message} " )
except QuotaExceededError:
print ( " Monthly quota reached; upgrade plan " )
except RateLimitError as e:
print ( f "Rate limited; retry after {e.retry_after} s" )
except SignerUnavailableError:
# Retry with backoff; SDK retries automatically (max 3 attempts)
except VerbtiasAPIError as e:
print ( f "API error {e.code} : {e.detail} (request_id= {e.request_id} )" )
TypeScript
import { VerbitasClient, VerbtiasAPIError, AuthError, RateLimitError } from " @verbitas/sdk " ;
const result = await client . sign ( " image.png " , { recipe: " image-genai-v1 " } );
if (e instanceof AuthError ) {
console . error ( " Auth failed: " , e . code );
} else if (e instanceof RateLimitError ) {
console . error ( " Rate limited; retry after " , e . retryAfter , " s " );
} else if (e instanceof VerbtiasAPIError ) {
console . error ( ` ${ e . code } : ${ e . detail } (requestId= ${ e . requestId } ) ` );
Retries
SDKs automatically retry on 429 and 5xx responses with exponential backoff (max 3 attempts). The retry logic respects the Retry-After header. Idempotency keys ensure retried sign calls do not create duplicate records.
Manual retry guidance:
429: back off per Retry-After header
503 verbitas.signer.unavailable: back off 2–30 seconds; the signer recovers quickly in most cases
500 verbitas.internal_error: do not retry more than 3 times; contact support with request_id