Transcribe something
curl -s -X POST https://tryslicemedia.com/api/v1/transcribe \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/episode.mp3"}'Answers 202 with an id and a poll_url. An hour of audio is usually done in under a minute. Then:
curl -s "https://tryslicemedia.com/api/v1/transcribe/JOB_ID?token=TOKEN"
While it runs: { "status": "processing", "elapsed_seconds": 12, "poll_after_seconds": 5 }. When it is done:
{
"id": "0182d3a8-71b0-4e14-b295-98b7d9c7a6a4",
"status": "completed",
"duration_seconds": 3619,
"word_count": 12373,
"language": "en",
"text": "Welcome to the show ...",
"srt": "1\n00:00:00,720 --> 00:00:03,040\n...",
"vtt": "WEBVTT\n\n00:00:00.720 --> ..."
}The three files come back inline while they total under a megabyte, which an hour-long episode does. Over that you get text_url, srt_url and vtt_url instead, and a note saying why.
Get a key
Sign in to get a free key. It is shown once: we store a hash of it, never the key itself.
Revoke a key by pasting it
Paste any key to kill it, including one made before 30 October. Holding the key is proof enough, so a leaked key can be stopped by whoever noticed.
Buy API hours
Free: 2 a month, the same as the website. Then $2 an hour, bought in packs. You pay by the minute and the hours never expire. The hours stay with the key you buy them with: keep that key safe. Another key, even with the same email, cannot use them, and a lost key cannot be recovered.
Your key goes only to our server, in the request header, and is not kept by this page. Or do it from code:
curl -s -X POST https://tryslicemedia.com/api/v1/credits/checkout -H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" -d '{"pack": "10h"}'
{ "url": "https://checkout.stripe.com/...", "pack": "10h", "hours": 10, "price_usd": 20 }And to see where a key stands:
curl -s https://tryslicemedia.com/api/v1/credits -H "Authorization: Bearer YOUR_KEY"
{ "free_left_this_month": 1, "files_per_month": 2, "used_this_month": 1,
"credit_seconds": 36000, "resets_at": "2026-12-01T00:00:00.000Z", ... }The limits, in full
- Free: 2 a month, the same as the website. Then $2 an hour, bought in packs.
- 2 free a month per account with a key, counted together with that account’s free use of the website, resetting on the 1st (UTC); 1 a day per address without a key.
- 1 hour a file free with a key, 3 hours on API hours, 10 minutes without a key.
- API hours: $20 for 10 hours or $90 for 50 hours. Charged by the minute, rounded up; a transcript that fails is given back in full. They stay with the key you buy them with (keep it safe: no other key can use them, and a lost key cannot be recovered), never expire, and are used only once the month’s free ones are gone. Buy API hours.
- 600MB a file.
- English. The language is detected and reported; other languages are not promised.
- No speaker labels. You get the words, not who said them.
- Sign in to get a free key. Up to five active keys per account, three made a day. Every key on an account shares its free allowance, so more keys never mean more. Keys made before 30 Oct keep working; sign in to manage your keys.
- The free ones are free. No card, no trial, no watermark. We cap what the free tool can spend in a month; when it runs out the API says so and gives the date it resets. API hours are not affected.
What happens to the file
A URL is fetched by the transcription provider and by us for a few hundred kilobytes, to read its length before anything is spent. Nothing is stored except the transcript. Audio uploaded through the web tool is deleted after 7 days, text after 30, by a job that runs daily. Nothing is used to train anything.
Errors
Every refusal carries the limit, what we measured, and when it resets, so a caller can act without reading a sentence. A refusal to a key also carries buy_credit (the link to this page’s Buy section) and the pack prices.
| code | http | means |
|---|---|---|
| too_long | 413 | Longer than 1 hour with no API hours. Carries max_duration_seconds, the length we measured and with_credit_max_duration_seconds: paid API hours lift the limit to 3 hours a file. |
| too_long_paid | 413 | Longer than 3 hours, the limit on API hours. |
| too_long_anon | 413 | Over ten minutes without a key. A free key raises it to 1 hour. |
| too_big | 413 | Bigger than 600MB. |
| monthly_limit | 429 | This month's 2 free ones are used (website and API together) and this key holds no API hours. Carries resets_at and buy_credit. |
| credits_short | 402 | Not enough API hours for that file. Carries need_seconds, credit_seconds and buy_credit. |
| anon_daily_limit | 429 | The no-key tier is one file a day per address. |
| unmeasured_limit | 429 | The file’s length could not be read from its server. A free one of those is allowed only before any of the month’s free ones is used; API hours have no such limit. |
| unreadable | 400 | Not a direct link to a media file — usually a web page rather than an .mp3. |
| no_speech | 200 | The job ran and there was no speech in the file. |
| bad_key | 401 | Unknown or revoked key. |
| sign_in_required | 401 | POST /api/v1/keys without a Slice sign-in. Carries sign_in_url: sign in there to get a key. |
| bad_callback | 400 | callback_url is not a public https address. |
| ceiling | 503 | The free tool has spent its budget for the month. Carries resets_at. |
| anon_ceiling | 503 | The no-key tier has spent its share. A key still works. |
A callback instead of polling
Send callback_url (a public https address) with the request. The 202 reply then carries a callback object with a secret starting whsec_, shown only there. When the job finishes we POST JSON to the address: { "type", "timestamp", "data" }, where type is transcript.completed or transcript.failed and data is what the GET above returns for the same job, plus its poll_url.
POST https://your-server.example.com/slice
webhook-id: msg_0182d3a8-71b0-4e14-b295-98b7d9c7a6a4_transcript.completed
webhook-timestamp: 1792224000
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
Content-Type: application/json
{
"type": "transcript.completed",
"timestamp": "2026-10-17T09:20:00.000Z",
"data": {
"id": "0182d3a8-71b0-4e14-b295-98b7d9c7a6a4",
"status": "completed",
"file_name": "episode.mp3",
"duration_seconds": 3619,
"word_count": 12373,
"language": "en",
"text": "Welcome to the show ...",
"srt": "1\n00:00:00,720 --> ...",
"vtt": "WEBVTT\n\n...",
"poll_url": "https://tryslicemedia.com/api/v1/transcribe/0182d3a8-...?token=..."
}
}It is signed the Standard Webhooks way, so their libraries verify it as is. Three headers: webhook-id (the same on every retry, so you can skip repeats), webhook-timestamp (unix seconds) and webhook-signature, which is v1, and then the base64 HMAC-SHA256 of id.timestamp.body, keyed with the base64-decoded part of the secret after whsec_. Reject anything with a timestamp more than five minutes old.
// Node: check the signature before trusting the body
const crypto = require('crypto');
function fromSlice(secret, headers, rawBody) {
const id = headers['webhook-id'], ts = headers['webhook-timestamp'];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
const sig = crypto.createHmac('sha256', key).update(`${id}.${ts}.${rawBody}`).digest('base64');
return headers['webhook-signature'].split(' ').includes('v1,' + sig);
}Answer with any 2xx to say you have it. We try three times over about twenty seconds, waiting up to five seconds for an answer each time, and do not follow redirects. If all three fail, the poll_url still works for 30 days. A file we had already transcribed for you comes back completed straight away and is not called back.
Clips, and agents
To have Claude, ChatGPT, Cursor or Claude Code make clips as well as transcripts, connect the Slice MCP server. Slice for AI agents has the setup for each.
If you would rather not use an API
The web tool takes an upload, shows the transcript on screen and emails you the files. Same limits, same engine, same transcripts.
Questions
Can I transcribe a podcast for free?
Do I need a key?
I made a key before 30 October. Does it still work?
What does it cost after the free ones?
What does it return?
Can it take an upload rather than a URL?
Does it label speakers?
How long do you keep the audio?
What is the catch?
This tool is looked after by Clack.Listens hard, types fast, never asks you to repeat yourself.
More Free Tools
Shorts by Slice
From the team behind these free tools
One video. A week of posts.
Upload an episode and get back the moments worth posting, cut and captioned.
- Reads the whole episode, then picks the excerpts worth posting
- Captions burned in and framed vertical, ready to post
- Your first video (we search the first hour) and first 2 clips are free, no card