Atomiser for Platforms

Developer API

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.

How it works

1

Submit a job

POST a media URL (or text for TTS) with the tool you want. You get a job ID back instantly — processing is async.

2

We process it

Your job runs on the same production pipeline that powers Atomiser. We notify your webhook_url when done — or poll the job.

3

Collect the result

Completed jobs return a signed result URL (24h expiry) plus structured data like transcripts, clip metadata, and credits charged.

Authentication

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.

Authorization
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.

Quickstart

Create a transcription job:

Create a 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"
  }'
202 Accepted
{
  "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):

Get job status
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": { … } } } }

Endpoints

MethodPathDescription
GET/v1/toolsYour key’s enabled tools + rate card
POST/v1/jobsCreate an async processing job
GET/v1/jobs/:idJob status + signed result URL
GET/v1/jobsList / search jobs (filters + pagination)
POST/v1/jobs/:id/cancelCancel a queued/running job — never billed
POST/v1/jobs/:id/retryRetry a failed/cancelled job — returns a new job
GET/v1/api-usageMetering: totals, per-tool, per-end-user
GET/v1/voicesTTS voice catalogue

Tools

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.

transcription

Accurate transcripts with word-level timestamps

billed per media minute

subtitles

Burned-in animated captions (14 styles, 20+ languages)

billed per media minute

clips

AI-extracted short clips with virality scoring

billed per media minute

reframe

Auto-reframe to 9:16 / 1:1 / 4:5 with speaker tracking

billed per media minute

audio_enhance

Studio-quality cleanup: noise, level, clarity

billed per media minute

convert

Format conversion (mp3, wav, aac, ogg, mp4, …)

billed per media minute

dubbing

Voice-preserved dubbing into 30+ languages

billed per output minute

tts

Natural narration from text, 40+ voices

billed per 1k characters

Webhooks

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.

Signature verification (Node.js)
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)
  );
}

Reliability

Idempotent creation

Send an Idempotency-Key header. Retries within 24h return the same job — safe to retry on timeouts.

Rate limiting

Redis-backed limits per key. X-RateLimit-Remaining / X-RateLimit-Reset headers on every response.

Usage metering

GET /v1/api-usage breaks credits down per tool and per end_user_ref — reconcile against your own plans.

Errors

CodeHTTPResolution
invalid_api_key401Check the Authorization: Bearer header and key prefix.
tool_not_allowed403Tool not enabled on this key — ask us to extend it.
rate_limited429Respect Retry-After; see X-RateLimit-* headers.
insufficient_credits402Monthly allowance exhausted — top up or wait for reset.
idempotency_conflict409Key reused with a different payload within 24h.

FAQ

How do we test before going live?

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.

Our media is private — S3, GCS, behind auth. Can we use it?

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.

What if our end user cancels mid-processing?

Call POST /v1/jobs/:id/cancel — the job is marked cancelled, never billed, and a job.cancelled webhook confirms it.

Do result links expire?

No expiry trap — every GET /v1/jobs/:id returns a freshly signed URL valid for 24h. Download and re-host for long-term storage.

How does billing work for failed jobs?

Failed and cancelled jobs are never billed — no usage event is recorded. You only pay the API rate on completed jobs.

Fully white-label

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.