Skip to main content
Looking for public financial filings (SEC, HKEX)? See the Data API — free, no auth required.

Base URL

All Platform API requests use the following base URL:
https://app.okrapdf.com/api/v1

Authentication

Include your API key in every request using one of these methods:
# Bearer token (recommended)
Authorization: Bearer okra_YOUR_KEY

# Header
x-api-key: okra_YOUR_KEY
Get your API key at app.okrapdf.com/settings/api-keys.

Quick example

# 1. Submit a PDF
curl -X POST https://app.okrapdf.com/api/v1/extract \
  -H "Authorization: Bearer okra_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/report.pdf"}'

# Response: {"job_id": "ocr-abc123", "status": "queued", ...}

# 2. Poll for completion
curl https://app.okrapdf.com/api/v1/jobs/ocr-abc123 \
  -H "Authorization: Bearer okra_YOUR_KEY"

# 3. Get results
curl https://app.okrapdf.com/api/v1/jobs/ocr-abc123/results \
  -H "Authorization: Bearer okra_YOUR_KEY"

Endpoints

MethodPathDescription
POST/api/v1/extractCreate async extraction job
POST/api/v1/extract/syncCreate sync extraction (waits up to 60s)
GET/api/v1/jobsList jobs
GET/api/v1/jobs/{jobId}Get job status
GET/api/v1/jobs/{jobId}/resultsGet extraction results
GET/api/v1/jobs/{jobId}/exportExport as markdown/xlsx/docx
DELETE/api/v1/jobs/{jobId}Cancel a job
POST/api/v1/jobs/{jobId}/schemaStructured extraction with typed fields
POST/api/v1/chatAsk questions about a document
POST/api/v1/upload/signed-urlGet signed URL for large file uploads

Response format

All responses return JSON with consistent error formatting:
// Success
{
  "job_id": "ocr-abc123",
  "status": "completed",
  ...
}

// Error
{
  "error": {
    "code": "bad_request",
    "message": "Either url, file_base64, or gcs_path is required",
    "doc_url": "https://okrapdf.dev/api-reference/errors"
  }
}