Every OmniKitly tool, programmable.
Build document and media processing directly into your apps. One job model, every tool, async by design.
This is real and working today — upload, create a job and download the result with a Bearer key. Early access means the request and response shapes can still change, there is no SDK yet, and no webhooks yet: you poll for status.
Upload. Submit a job. Get a result.
Every operation — a single tool or a bulk batch — is a job. Upload the file(s) directly with a multipart POST, create the job with the tool slug, operation and settings, then poll it until it is done. The result comes back as a signed download URL that expires with your retention window. Verified working end to end — this is the actual response from a real key, not a mockup.
# Direct multipart upload — no signed PUT URL, one request
curl -X POST https://omnikitly.com/v1/uploads \
-H "Authorization: Bearer $OMNIKITLY_KEY" \
-F "[email protected]"curl -X POST https://omnikitly.com/v1/jobs \
-H "Authorization: Bearer $OMNIKITLY_KEY" \
-H "Content-Type: application/json" \
-d '{
"tool": "compress-pdf-to-target-size",
"operation": "pdf.compressToSize",
"uploads": ["5c2c9e14-…"],
"settings": { "target": 500, "unit": "KB" }
}'
# 202 Accepted, status: "queued" — then GET /v1/jobs/{id} to poll{
"id": "cf632351-e90f-439c-88dc-e6ffec13fe94",
"tool": "compress-pdf-to-target-size",
"operation": "pdf.compressToSize",
"status": "done", // queued → processing → done | failed | cancelled
"progress": 1,
"input_bytes": 842104, "output_bytes": 498211,
"duration_ms": 2140,
"created_at": "2026-09-08T22:56:31.133Z",
"finished_at": "2026-09-08T22:56:33.273Z",
"expires_at": "2026-09-09T04:56:31.133Z",
"files": [{
"name": "contract.pdf", "bytes": 498211, "mime": "application/pdf",
"meta": { "met_target": true },
"url": "/v1/jobs/cf632351…/files/…?t=…" // signed, expires with the job
}]
}Architecture
Three stages, the same for a single file or ten thousand.
Direct upload
POST the file straight to our API as multipart form data. It lands in private storage and you get an upload id back.
POST /v1/uploadsAsync jobs
Create a job naming a tool and that upload id. It queues, runs on an isolated worker, and reports progress you poll for.
POST /v1/jobsSigned downloads
The same status call returns a signed, expiring download URL once the job is done. Delete early with a single call.
GET /v1/jobs/{id}What works today
Not there yet: webhooks (you poll for status), an SDK for any language, and a published OpenAPI spec — the shapes below can still change until those exist.
The job object Early access
What GET /v1/jobs/{id} actually returns. Field names can still change before this settles into a versioned API.
| Field | Type | Description |
|---|
Build on the same engine as the site
Create a free account, generate a key, and call it today — no waitlist.