Rate Limits

Corvo rate limits are application-level sliding windows keyed to the authenticated organization. When a request is throttled, the API returns HTTP 429 and a `Retry-After` header in seconds.

EndpointMethodLimit
/api/v1/statusGETNo application-level limit
/api/v1/documents/uploadPOST30/min per organization
/api/v1/documents/upload-urlPOST30/min per organization
/api/v1/documents/confirmPOST30/min per organization
/api/v1/shipmentsPOST30/min per organization
/api/v1/shipmentsGET60/min per organization
/api/v1/shipments/{id}GET1 request / 5 min / shipment for API keys
/api/v1/shipments/{id}/buyPOST30/min per organization
/api/v1/shipments/{id}/cancelPOST30/min per organization
/api/v1/shipments/{id}/proofGETNo application-level limit
/api/v1/shipments/{id}/artifactsGETNo application-level limit
/api/v1/shipments/{id}/artifacts/{artifactId}GETNo application-level limit
/api/v1/shipments/{id}/evidence-bundleGETNo application-level limit
Response429Rate limited
{
  "error": {
    "message": "Too many requests. Please try again later.",
    "code": "RATE_LIMITED"
  }
}
TypeScript
async function fetchWithRetry(url: string, options: RequestInit) {
  const response = await fetch(url, options);

  if (response.status !== 429) {
    return response;
  }

  const retryAfter = response.headers.get("Retry-After");
  const waitSeconds = retryAfter ? Number.parseInt(retryAfter, 10) : 1;
  await new Promise((resolve) => setTimeout(resolve, waitSeconds * 1000));

  return fetch(url, options);
}