Skip to main content

Errors, limits and idempotency

Error shapes​

APIShape
Portal API and Ingest API{"detail": "message"}, or a list of validation problems for 422
SBOM upload{"detail": {"code": "too_large", "message": "..."}} with a stable code
AI GatewayOpenAI style: {"error": {"message": "...", "type": "invalid_request_error"}}

Status codes​

StatusMeaningWhat to do
200, 201, 202Success (202 for ingest: accepted for processing)Check rejected in ingest responses
400Malformed requestFix the request
401Credential missing, invalid, expired or revokedRefresh the session, or replace the token
403Your role or token lacks permission. The detail names it.Use an account with the permission
404Not found, or in another tenantCheck the ID and tenant
409Conflict: the change would do nothing, or the state forbids itRead the detail
413Body larger than the endpoint limitSend smaller batches
415Unsupported content typeUse the documented type
422Validation failedFix the fields listed in detail
429Rate limit exceededWait Retry-After seconds
502Gateway: your model provider could not be reachedRetry
503A dependency such as the rate limiter or storage is unavailableWait Retry-After seconds, then retry. It is safe to repeat.

Rate limits​

EndpointLimit
POST /api/ingest/events1,200 events a minute per sensor token; 500 events and 256 KB per request
POST /api/ingest/security-events600 events a minute per ingest token; 500 events and 256 KB per request
POST /api/ingest/otlp/v1/traces600 spans a minute per ingest token; 1 MB per request
POST /api/ingest/sbom30 documents a minute per ingest token; 20 MB per request
Failed authentication30 a minute per token prefix, then 429
POST /api/shadow-agents/scan10 a minute per tenant
Heavy Portal calls (simulations, scenarios, assessments, observability)Limited per tenant and user. Over the limit returns 429.
Gateway chat completionsNo gateway-side limit. Your provider's own limits still apply.

Limits fail closed on ingest​

If the rate limiter itself is down, ingest endpoints answer 503 with Retry-After. They never fall back to unlimited traffic. Your sender should back off and retry.

Retrying safely​

Every ingest call is idempotent:

CallIdempotency key
Sensor eventsevent_id per tenant
Security eventsevent_uid per source
OTLP spanstrace_id and span_id
SBOMSubject plus the SHA-256 of the document

Sending the same item again is reported as a duplicate and changes nothing, so retry after any timeout, 429 or 503. For the gateway, send Idempotency-Key so a retried model call is not counted twice in cost accounting.

Correlate and report​

Every Portal API response carries X-Request-ID. Send your own value to correlate, and include it when you contact support.