Tlamakatl API
Programmatic access to all Tlamakatl tools. Use it to wire bulk PDF or image jobs into your own pipelines.
Quick start
- Create an account if you don't already have one.
- Mint an API key from Account → API Keys. The full token is shown once; copy it now.
- 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"] }
}
}
}| HTTP | Code | Meaning |
|---|---|---|
| 400 | INVALID_FILE_TYPE | File extension not in this job's allow-list. |
| 400 | INVALID_FILE_SIGNATURE | Magic bytes don't match the extension. |
| 400 | INVALID_PARAMETERS | The parameters JSON failed schema validation. |
| 401 | AUTH_REQUIRED | No session cookie or API key on the request. |
| 403 | REAUTH_REQUIRED | Sensitive action; session older than 15 min. |
| 413 | FILE_TOO_LARGE | Upload exceeds the 50 MB cap. |
| 429 | RATE_LIMITED | Tier window exceeded. See Retry-After. |
| 500 | INTERNAL_ERROR | Bug. 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.