Skip to main content

Errors and retries

Errors use one JSON shape:

{
"error": {
"code": "invalid_request",
"message": "request body failed validation",
"request_id": "6ee0f7d4532d4632bb01a27b328bece9"
}
}

The same request ID is returned in the X-Request-ID header. Record it when investigating a failed request; do not infer handling from the human-readable message alone.

Status handling

HTTP statusHandling
401 or 403Correct the credential or its operation scope before retrying.
411Send a request with Content-Length; standard HTTP clients and curl --data-binary do this automatically.
413Reduce the operating snapshot to the configured request-size limit.
422Correct the request or trial-limit violation before retrying it unchanged.
429Retry only after Retry-After when present. Without that header, the trial allowance may be exhausted rather than temporarily rate-limited.
500, 502, or 503Retry with bounded exponential backoff. Retain the request ID if the failure persists.
504The end-to-end planning deadline expired. Retry once, then reduce the planning problem or request a larger solve allowance.

Manifest and booking-check requests are stateless and do not modify source-platform data, so transport retries do not duplicate bookings or manifests. A repeated bounded solve may return a different valid plan as road data, queue time, or optimizer search changes.

Result statuses are not HTTP errors

A successful booking check returns HTTP 200 with feasible, infeasible_proven, or unknown. In particular, unknown means the bounded check reached neither a valid plan nor a proof of impossibility. It must not be converted into an automatic rejection.