Skip to content

Handle errors, quotas, and retries

Every API failure uses JSON and includes a support-safe request identifier. Branch on HTTP status and stable error.code, not on translated message text.

{
"error": {
"code": "student_not_found",
"message": "Student not found",
"request_id": "req_example",
"details": null
}
}
StatusMeaningClient action
400Invalid query, malformed JSON, or invalid idempotency headerCorrect the request
401Missing or invalid credentialStop and replace or fix the key
403Scope, rollout, feature, suspension, network, or policy denialObtain authorized configuration
404Route or tenant-safe resource not foundVerify the documented route and local identifier
409Lifecycle or idempotency conflictInspect the code; retry only when documented
413Body exceeds 1 MiBReduce the request
415Unsupported media typeSend JSON
422Valid JSON with invalid business fieldsCorrect the data
429Burst or daily quota reachedRespect Retry-After
500Unexpected server failureRetry cautiously and report the request ID
503API, policy, quota, or another required service unavailableBack off and retry later

Do not use 404 to infer whether an identifier belongs to another school.

After quota evaluation, responses include:

  • X-RateLimit-Limit
  • X-RateLimit-Remaining
  • X-RateLimit-Reset

Reset is the next midnight UTC as a Unix timestamp. -1 for limit and remaining means unlimited, but usage can still be metered. A 429 includes Retry-After. The current Enterprise default is 10,000 requests per UTC day unless an effective override applies.

  • Never loop on 400, 401, 403, 404, 413, 415, or 422.
  • For 409 idempotency_request_in_progress, wait for Retry-After and resend the identical request and key.
  • For 429 or 503, use bounded exponential backoff with jitter and respect Retry-After.
  • Retry an uncertain write only with its original idempotency value and exact request.
  • Cap attempts and surface a durable failed job for operator review.

Provide the timestamp, endpoint template, HTTP status, stable error code, and request_id. Do not provide the bearer credential, authorization header, raw idempotency value, full request body, or personal-data response.

See idempotent writes and troubleshooting the API.