Documentation /docs/limits-quotas

Limits & Quotas

Use this page when deciding whether a workflow should run synchronously, asynchronously, or through a batch worker.

Document limits

  • Upload accepts PDF, PNG, JPEG/JPG, TIFF/TIF, WebP, BMP, and GIF.
  • Upload uses repeated multipart field files.
  • Each uploaded file is limited to 50 MB.
  • Multi-page TIFF files are stored and processed as page-indexed documents.
  • Native DOCX/XLSX workflows are available through beta APIs by writing to Docspeed; they are not part of the standard production upload path.

Execution limits

Prefer execution_mode: "sync" for interactive product flows and execution_mode: "async" for larger files, packets, table-heavy documents, or batch processing.

Async jobs use these statuses:

{
  "status": "pending"
}

Valid values are pending, processing, completed, and failed.

Rate limits

Rate limits are API-key and account specific. When a request is rate-limited, the API returns 429 and may include a Retry-After header.

cURL

curl -sS -X POST "https://api.docspeed.ai/api/v1/upload" \
  -H "Authorization: Bearer ${DOCSPEED_API_KEY}" \
  -F "files=@sample-invoice.pdf"

Python

import time
import requests

response = requests.post(
    "https://api.docspeed.ai/api/v1/upload",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    files=[("files", ("sample-invoice.pdf", open("sample-invoice.pdf", "rb"), "application/pdf"))],
    timeout=120,
)

if response.status_code == 429:
    retry_after = int(response.headers.get("Retry-After", "2"))
    time.sleep(retry_after)

TypeScript

const response = await fetch("https://api.docspeed.ai/v1/jobs/job_123", {
  headers: { Authorization: "Bearer YOUR_API_KEY" },
});

if (response.status === 429) {
  const retryAfterSeconds = Number(response.headers.get("Retry-After") ?? "2");
  await new Promise((resolve) => setTimeout(resolve, retryAfterSeconds * 1000));
}

Production notes

  • Back off status polling; do not poll jobs in a tight loop.
  • Treat failed as terminal until you inspect the job result or error payload.
  • Keep API keys server-side so rate-limit and billing behavior maps to your backend service, not a public browser client.
  • If you need fixed account-level concurrency, page-count, retention, or credit quotas, confirm them in your Docspeed agreement or support thread.