API Reference
Base URL: https://indox.org, every path below is absolute from it and already carries its
/api/v1/ prefix. Running your own instance? Substitute your host; the paths are identical.
Authentication
Authorization: Bearer <api_key>
The Auth column in every table below says whether a request needs that header:
| Value |
Meaning |
| Bearer |
The endpoint returns 401/403 without a token. |
| **, ** |
The endpoint is reachable without a token. Anonymous requests are served within the free quota; sending a token attributes the job to your account and applies your plan's limits instead. |
Browser clients authenticated by session cookie may send the cookie instead of the header, the
backend accepts either. See Concepts for the full auth model.
Async conversion flow
Conversions do not block. Every convert endpoint returns 202 { "conversion_id": ... }; you then
poll the matching status endpoint for that media family and download when it reaches a terminal
state.
| Media family |
Submit |
Poll status |
Download |
| Documents / PDF |
POST /api/v1/pdf_handler/convert/ |
GET /api/v1/docs_core/conversion/{conversion_id}/ |
GET /api/v1/pdf_handler/{conversion_id}/download/ |
| Fonts |
POST /api/v1/fonts/convert/ |
GET /api/v1/fonts/conversion/{conversion_id}/ |
GET /api/v1/fonts/{conversion_id}/download/ |
| Images / video / 3D |
POST /api/v1/convert/{image\|video\|model}/convert/ |
GET /api/v1/media_core/conversion/{conversion_id}/ |
GET /api/v1/media_core/files/{conversion_id}/download/ |
GET /api/v1/docs_core/conversion/wait/{conversion_id}/ and
GET /api/v1/media_core/conversion/wait/{conversion_id}/ long-poll instead of returning
immediately, if you would rather not implement a poll loop.
DELETE /api/v1/conversion/{conversion_id}/ removes a conversion of any media family: the
converted output and the original upload are deleted from storage and the item leaves your
history. 204 on success, 404 when the id is unknown or not yours.
Health
| Method |
Path |
Auth |
Description |
GET |
/api/v1/health/ |
— |
Health probe, DB, cache, storage, Celery broker |
Documents
Document and PDF conversion. Job status, credits and batching for this family live under
/api/v1/docs_core/ below.
| Method |
Path |
Auth |
Description |
GET |
/api/v1/pdf_handler/formats/ |
— |
Supported document types |
GET |
/api/v1/pdf_handler/operations/ |
— |
Operations available for a from/to pair |
POST |
/api/v1/pdf_handler/convert/ |
— |
Convert a document (multipart) |
POST |
/api/v1/pdf_handler/convert/json/ |
— |
Convert a document (JSON body) |
POST |
/api/v1/pdf_handler/form-fields/ |
— |
List the fillable form fields in a PDF |
POST |
/api/v1/pdf_handler/save/ |
— |
Save an edited PDF and deliver it to a destination |
GET |
/api/v1/pdf_handler/history/ |
— |
List conversion history |
GET |
/api/v1/pdf_handler/conversion/{conversion_id}/ |
— |
Get conversion status |
GET |
/api/v1/pdf_handler/{conversion_id}/download/ |
— |
Download the converted file |
Document jobs, status, credits, batching
| Method |
Path |
Auth |
Description |
GET |
/api/v1/docs_core/conversion/{conversion_id}/ |
— |
Conversion info |
GET |
/api/v1/docs_core/conversion/wait/{conversion_id}/ |
— |
Long-poll until the conversion settles |
POST |
/api/v1/docs_core/batch/collect/ |
— |
Collect several conversions into one ZIP |
GET |
/api/v1/docs_core/batch/{batch_id}/download/ |
— |
Download the batch ZIP |
GET |
/api/v1/docs_core/credits/ |
— |
Remaining credits |
POST |
/api/v1/docs_core/visibility/hide/ |
— |
Hide items from history |
PDF pipelines
Saved, replayable sequences of PDF operations.
| Method |
Path |
Auth |
Description |
GET |
/api/v1/pdf_handler/pipeline/ |
Bearer |
List saved pipelines |
POST |
/api/v1/pdf_handler/pipeline/ |
Bearer |
Create a saved pipeline |
GET |
/api/v1/pdf_handler/pipeline/{pipeline_id}/ |
Bearer |
Get a saved pipeline |
DELETE |
/api/v1/pdf_handler/pipeline/{pipeline_id}/ |
Bearer |
Delete a saved pipeline |
POST |
/api/v1/pdf_handler/pipeline/{pipeline_id}/run/ |
Bearer |
Run a saved pipeline on a PDF |
Phone scan
Pair a phone to a desktop session, capture pages, assemble them into a PDF.
| Method |
Path |
Auth |
Description |
POST |
/api/v1/pdf_handler/scan/sessions/ |
Bearer |
Open a phone-scan session |
GET |
/api/v1/pdf_handler/scan/sessions/{session_id}/ |
Bearer |
Poll a phone-scan session |
POST |
/api/v1/pdf_handler/scan/sessions/{session_id}/finalize/ |
Bearer |
Queue assembly of the captured pages into a PDF |
GET |
/api/v1/pdf_handler/scan/pair/ |
Bearer |
Phone: read a paired scan session |
POST |
/api/v1/pdf_handler/scan/pair/pages/ |
— |
Phone: upload a captured page |
DELETE |
/api/v1/pdf_handler/scan/pair/pages/{page_id}/ |
Bearer |
Phone: discard a captured page |
E-signing
The session owner authenticates; each participant acts through a per-recipient {token}, so the
participant routes take no bearer token.
| Method |
Path |
Auth |
Description |
POST |
/api/v1/pdf_handler/signing/sessions/ |
Bearer |
Create a multi-party signing session |
GET |
/api/v1/pdf_handler/signing/sessions/{session_id}/ |
Bearer |
Get a signing session |
GET |
/api/v1/pdf_handler/signing/sign/{token}/ |
— |
Participant: view a document to sign |
POST |
/api/v1/pdf_handler/signing/sign/{token}/ |
— |
Participant: sign |
POST |
/api/v1/pdf_handler/signing/sign/{token}/decline/ |
— |
Participant: decline |
Fonts
| Method |
Path |
Auth |
Description |
GET |
/api/v1/fonts/formats/ |
— |
List font formats |
GET |
/api/v1/fonts/formats/{input_format}/ |
— |
Output formats available for an input format |
POST |
/api/v1/fonts/upload/ |
— |
Upload a font to object storage |
POST |
/api/v1/fonts/convert/ |
— |
Convert an uploaded font by key |
POST |
/api/v1/fonts/validate/ |
— |
Validate a conversion before running it |
POST |
/api/v1/fonts/inspect/ |
— |
Inspect an uploaded font file |
GET |
/api/v1/fonts/inspect/ |
— |
Inspect a stored font by key |
GET |
/api/v1/fonts/conversion/{conversion_id}/ |
— |
Get font conversion info |
GET |
/api/v1/fonts/{conversion_id}/download/ |
— |
Download the converted font |
GET |
/api/v1/fonts/{conversion_id}/download/{filename} |
— |
Download the converted font under a chosen filename |
GET |
/api/v1/fonts/quota/ |
— |
Remaining font quota |
GET |
/api/v1/fonts/health/ |
— |
Font service health |
Images, video and 3D models
Three media families share one path shape. Job status, downloads and credits for all three go
through /api/v1/media_core/ below.
| Method |
Path |
Auth |
Description |
GET |
/api/v1/convert/image/formats/ |
— |
List image formats |
GET |
/api/v1/convert/image/operations/ |
— |
List image operations |
POST |
/api/v1/convert/image/convert/ |
— |
Convert an image |
GET |
/api/v1/convert/image/conversion/{conversion_id}/ |
— |
Retrieve image conversion info |
GET |
/api/v1/convert/image/history/ |
Bearer |
List image conversion history |
GET |
/api/v1/convert/video/formats/ |
— |
List video formats |
POST |
/api/v1/convert/video/convert/ |
— |
Convert a video |
GET |
/api/v1/convert/model/formats/ |
— |
List 3D model formats |
GET |
/api/v1/convert/model/operations/ |
— |
List 3D model operations |
POST |
/api/v1/convert/model/convert/ |
— |
Convert a 3D model |
GET |
/api/v1/convert/model/conversion/{conversion_id}/ |
— |
Retrieve 3D model conversion info |
Video conversions have no dedicated status route, poll
GET /api/v1/media_core/conversion/{conversion_id}/.
| Method |
Path |
Auth |
Description |
GET |
/api/v1/media_core/conversion/{conversion_id}/ |
— |
Unified download link for a media conversion |
GET |
/api/v1/media_core/conversion/wait/{conversion_id}/ |
— |
Long-poll until the conversion or batch settles |
GET |
/api/v1/media_core/files/{conversion_id}/download/ |
— |
Download the converted media file |
POST |
/api/v1/media_core/batch/collect/ |
Bearer |
Collect several items into one ZIP |
GET |
/api/v1/media_core/batch/{batch_id}/download/ |
— |
Download the batch ZIP |
GET |
/api/v1/media_core/credits/ |
— |
Remaining credits |
POST |
/api/v1/media_core/visibility/hide/ |
— |
Hide items from history |
GET |
/api/v1/media_core/health/ |
— |
Media service health |
User
| Method |
Path |
Auth |
Description |
POST |
/api/v1/user/auth/login/ |
— |
Log in with username/email + password, Google OAuth or Apple Sign-In |
POST |
/api/v1/user/auth/logout/ |
— |
Log out |
GET |
/api/v1/user/me/ |
Bearer |
Current user profile |
PATCH |
/api/v1/user/me/ |
Bearer |
Update the current user profile |
GET |
/api/v1/user/usage/ |
Bearer |
Assigned pricing plans |
GET |
/api/v1/user/usage/summary/ |
Bearer |
Usage summary |
GET |
/api/v1/user/usage/trend/ |
Bearer |
Conversion trend over time |
GET |
/api/v1/user/usage/recent-conversions/ |
Bearer |
Recent conversions |
GET |
/api/v1/user/usage/conversions/{conversion_id}/ |
Bearer |
Detailed conversion record |
Storage
Files the account owns, uploads and conversion outputs alike.
| Method |
Path |
Auth |
Description |
GET |
/api/v1/user/storage/files/ |
Bearer |
List user-managed files |
POST |
/api/v1/user/storage/files/upload/ |
Bearer |
Upload a new file to the account's storage |
POST |
/api/v1/user/storage/files/register/ |
Bearer |
Register an existing object as a user-managed file |
POST |
/api/v1/user/storage/files/download/ |
Bearer |
Generate download URLs for stored files |
POST |
/api/v1/user/storage/files/download/zip/ |
Bearer |
Download stored files as a ZIP archive |
POST |
/api/v1/user/storage/files/delete/ |
Bearer |
Delete stored files and reclaim storage |
Shares
| Method |
Path |
Auth |
Description |
GET |
/api/v1/user/shares/ |
Bearer |
List the caller's share links |
POST |
/api/v1/user/shares/ |
Bearer |
Create a share link for a file the caller owns |
DELETE |
/api/v1/user/shares/{link_id}/ |
Bearer |
Revoke a share link |
GET |
/api/v1/user/shares/public/{token}/ |
— |
Public share metadata, never returns the file itself |
POST |
/api/v1/user/shares/public/{token}/download/ |
— |
Redeem a share link for a download URL |
Billing
| Method |
Path |
Auth |
Description |
GET |
/api/v1/subscription/pricing_plan/ |
— |
Structured pricing plans |
GET |
/api/v1/subscription/rate_card/ |
— |
Per-operation credit prices |
GET |
/api/v1/subscription/credits/balance/ |
Bearer |
Credit balance |
POST |
/api/v1/subscription/credits/promo-code/ |
Bearer |
Redeem a promo code for credits |
GET |
/api/v1/subscription/purchase_history/ |
Bearer |
Purchase history |
POST |
/api/v1/subscription/purchase_initiate/ |
Bearer |
Start a subscription purchase |
POST |
/api/v1/subscription/purchase_initiate/pay-as-you-go/ |
Bearer |
Start a pay-as-you-go purchase |
GET |
/api/v1/subscription/purchase_initiate/callback/ |
— |
Stripe checkout return callback |
POST |
/api/v1/subscription/storage/initiate/ |
Bearer |
Start a Stripe checkout for storage add-ons |
GET |
/api/v1/subscription/storage/callback/ |
— |
Stripe storage checkout return callback |
POST |
/api/v1/subscription/tasks/task-completion/ |
Bearer |
Report task completion and deduct credits |
GET |
/api/v1/subscription/tasks/task-history/ |
Bearer |
Recent task completion history |
The two callback/ routes are Stripe redirect targets, not endpoints you call directly.
Webhooks
| Method |
Path |
Auth |
Description |
GET |
/api/v1/webhooks/ |
Bearer |
List the account's webhooks |
POST |
/api/v1/webhooks/ |
Bearer |
Create a webhook, the raw secret is returned exactly once |
GET |
/api/v1/webhooks/{webhook_id}/ |
Bearer |
Get one webhook |
PATCH |
/api/v1/webhooks/{webhook_id}/ |
Bearer |
Update url / events / is_active / description |
DELETE |
/api/v1/webhooks/{webhook_id}/ |
Bearer |
Delete a webhook and its delivery history |
GET |
/api/v1/webhooks/{webhook_id}/deliveries/ |
Bearer |
Recent delivery attempts, newest first |
POST |
/api/v1/webhooks/{webhook_id}/test/ |
Bearer |
Enqueue a test delivery |
Notes
- Send the trailing slash. Every path above ends in
/ except
/api/v1/fonts/{conversion_id}/download/{filename}. Omitting it makes a GET cost an extra
301 round trip, and a POST without the slash fails, send the exact path.
- Legacy aliases. The image, video and 3D routes are also served under
/api/v1/image_converter/,
/api/v1/video_converter/ and /api/v1/model/. Those are legacy prefixes kept for older clients,
use the /api/v1/convert/{image|video|model}/ forms above in new code.
- Not listed here: internal, admin and self-test routes are outside the public surface and are
not part of the API contract. This page covers the 101 public operations only.
- Machine-readable schema. The same surface is published as OpenAPI at
/api/v1/openapi.json on any running instance; the official SDKs are generated
from it.