Skip to main content
TlamakatlTlamakatl

Tlamakatl API

Programmatic access to all Tlamakatl tools. Use it to wire bulk PDF or image jobs into your own pipelines.

Quick start

  1. Create an account if you don't already have one.
  2. Mint an API key from Account → API Keys. The full token is shown once; copy it now.
  3. Pass the token as Authorization: Bearer otk_… on every request.

Reference

The full OpenAPI spec — every endpoint, every parameter, every response shape — is auto-generated from the FastAPI app and served as JSON. Swagger UI and ReDoc both render it.

Example — split a PDF

Upload a file and poll for the result:

# 1. Upload and create the job
curl -X POST 'https://api-uat.open-tools.app/api/upload' \
  -H 'Authorization: Bearer otk_YOUR_KEY' \
  -F 'file=@input.pdf' \
  -F 'job_type=pdf-split' \
  -F 'parameters={"pages": "1-3"}'
# → {"job_id": "abc123", "status": "queued", "ws_token": "..."}

# 2. Poll job status (or subscribe via WebSocket /ws/<job_id>?token=<ws_token>)
curl 'https://api-uat.open-tools.app/api/jobs/abc123' \
  -H 'Authorization: Bearer otk_YOUR_KEY'
# → {"status": "completed", "output_file_url": "https://api-uat.open-tools.app/api/download/users/42/..."}

# 3. Download the result
curl -o output.pdf 'https://api-uat.open-tools.app/api/download/users/42/<uuid>.pdf' \
  -H 'Authorization: Bearer otk_YOUR_KEY'

Error codes

All errors share the same envelope shape:

{
  "detail": {
    "error": {
      "code": "INVALID_FILE_TYPE",
      "message": "image-resize requires PNG, JPG, or WEBP.",
      "details": { "expected_extensions": [".png", ".jpg", ".webp"] }
    }
  }
}
HTTPCodeMeaning
400INVALID_FILE_TYPEFile extension not in this job's allow-list.
400INVALID_FILE_SIGNATUREMagic bytes don't match the extension.
400INVALID_PARAMETERSThe parameters JSON failed schema validation.
401AUTH_REQUIREDNo session cookie or API key on the request.
403REAUTH_REQUIREDSensitive action; session older than 15 min.
413FILE_TOO_LARGEUpload exceeds the 50 MB cap.
429RATE_LIMITEDTier window exceeded. See Retry-After.
500INTERNAL_ERRORBug. Please include the request_id header.

Rate limits & usage

Every account gets per-minute, per-hour, per-day and per-month buckets. The current usage is visible at your account dashboard. Hit a 429? Wait for the window to slide; the response includesRetry-After seconds.