Embed the full Atomiser pipeline — transcription, subtitles, clips, reframing, dubbing, TTS and audio enhancement — inside your own product. Fully white-label: your users never see us.
POST a media URL (or text for TTS) with the tool you want. You get a job ID back instantly — processing is async.
Your job runs on the same production pipeline that powers Atomiser. We notify your webhook_url when done — or poll the job.
Completed jobs return a signed result URL (24h expiry) plus structured data like transcripts, clip metadata, and credits charged.
Every request carries your API key as a Bearer token. Keys are scoped to an environment and to a specific set of tools — test keys (at_test_…) and live keys (at_live_…) are fully separated.
curl https://api.atomiser.ai/v1/tools \
-H "Authorization: Bearer at_test_xxxxxxxxxxxxxxxx"Keys are shown once at creation. Store them server-side only — never in client code.
Create a transcription job:
curl -X POST https://api.atomiser.ai/v1/jobs \
-H "Authorization: Bearer $ATOMISER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: episode-42-transcribe" \
-d '{
"tool": "transcription",
"input_url": "https://cdn.you.com/episode-42.mp3",
"options": { "language": "auto" },
"end_user_ref": "user_4821",
"webhook_url": "https://api.you.com/hooks/atomiser"
}'{
"job": {
"id": "job_9f2k...",
"tool": "transcription",
"status": "queued",
"created_at": "2026-09-26T10:15:00Z",
"credits_charged": null,
"result": null
}
}Then poll (or wait for your webhook):
curl https://api.atomiser.ai/v1/jobs/job_9f2k... \
-H "Authorization: Bearer $ATOMISER_API_KEY"
# → { "job": { "status": "completed",
# "credits_charged": 47.2,
# "result": { "url": "https://…signed…", "expires_at": "…", "data": { … } } } }| Method | Path | Description |
|---|---|---|
| GET | /v1/tools | Your key’s enabled tools + rate card |
| POST | /v1/jobs | Create an async processing job |
| GET | /v1/jobs/:id | Job status + signed result URL |
| GET | /v1/jobs | List / search jobs (filters + pagination) |
| POST | /v1/jobs/:id/cancel | Cancel a queued/running job — never billed |
| POST | /v1/jobs/:id/retry | Retry a failed/cancelled job — returns a new job |
| GET | /v1/api-usage | Metering: totals, per-tool, per-end-user |
| GET | /v1/voices | TTS voice catalogue |
Each API key is enabled for a specific toolset. Per-tool rates are set on your rate card during onboarding — GET /v1/tools always returns the live rates for your key.
Accurate transcripts with word-level timestamps
billed per media minute
Burned-in animated captions (14 styles, 20+ languages)
billed per media minute
AI-extracted short clips with virality scoring
billed per media minute
Auto-reframe to 9:16 / 1:1 / 4:5 with speaker tracking
billed per media minute
Studio-quality cleanup: noise, level, clarity
billed per media minute
Format conversion (mp3, wav, aac, ogg, mp4, …)
billed per media minute
Voice-preserved dubbing into 30+ languages
billed per output minute
Natural narration from text, 40+ voices
billed per 1k characters
Pass webhook_url on job creation and we POST a signed callback on job.completed / job.failed / job.cancelled. Verify the X-Signature header (HMAC-SHA256 of the raw body, hex-encoded) with your webhook secret. Retries use exponential backoff.
const crypto = require('crypto');
function verify(rawBody, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}Send an Idempotency-Key header. Retries within 24h return the same job — safe to retry on timeouts.
Redis-backed limits per key. X-RateLimit-Remaining / X-RateLimit-Reset headers on every response.
GET /v1/api-usage breaks credits down per tool and per end_user_ref — reconcile against your own plans.
| Code | HTTP | Resolution |
|---|---|---|
| invalid_api_key | 401 | Check the Authorization: Bearer header and key prefix. |
| tool_not_allowed | 403 | Tool not enabled on this key — ask us to extend it. |
| rate_limited | 429 | Respect Retry-After; see X-RateLimit-* headers. |
| insufficient_credits | 402 | Monthly allowance exhausted — top up or wait for reset. |
| idempotency_conflict | 409 | Key reused with a different payload within 24h. |
Your at_test_ key runs the same production pipeline against a separate test credit pool — onboarding includes a complimentary allocation so you can integrate end-to-end before switching to at_live_. Failed and cancelled jobs are never billed.
Yes. Generate a presigned GET URL on your side (S3, GCS, R2, CloudFront — all work) and pass it as input_url. We never see your storage credentials.
Call POST /v1/jobs/:id/cancel — the job is marked cancelled, never billed, and a job.cancelled webhook confirms it.
No expiry trap — every GET /v1/jobs/:id returns a freshly signed URL valid for 24h. Download and re-host for long-term storage.
Failed and cancelled jobs are never billed — no usage event is recorded. You only pay the API rate on completed jobs.
Result URLs, errors, and metadata never expose Atomiser or upstream provider names. Your end users see your product — we stay invisible. Subprocessors are disclosed to you in your partner agreement, not to your users.