Getting started
Quickstart
Authenticate, send one link, and read the transcript back. Under five minutes.
You need a key. Email hi@instagramtotranscript.com and ask for one, with a rough monthly volume.
Authenticate
Send the key as a bearer token on every request.
Authorization: Bearer sk_live_your_key_here
Keep it on your server. A key in browser JavaScript is a key anyone can read and spend.
Your first request
curl https://api.instagramtotranscript.com/v1/transcripts \
-H "Authorization: Bearer $ITT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.instagram.com/reel/CxAmPl3C0d3/"}'
The response
{
"ok": true,
"source": "instagram",
"title": "Three things I wish I knew earlier",
"author": "@example",
"durationSec": 47.2,
"language": "en",
"transcript": "Three things I wish I knew earlier about ...",
"timestamped": "[00:00] Three things I wish I knew earlier about ...",
"srt": "1\n00:00:00,000 --> 00:00:03,120\nThree things I wish ...",
"vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.120\nThree things I wish ...",
"segments": [
{ "start": 0, "end": 3.12, "text": "Three things I wish I knew earlier about ..." }
]
}
In TypeScript
type Segment = { start: number; end: number; text: string };
type Transcript = {
ok: true;
source: "instagram";
title?: string;
author?: string;
durationSec?: number;
language?: string;
transcript: string;
timestamped: string;
srt: string;
vtt: string;
segments: Segment[];
};
type ApiError = { ok: false; code: string; message: string };
export async function transcribe(url: string): Promise<Transcript> {
const response = await fetch("https://api.instagramtotranscript.com/v1/transcripts", {
method: "POST",
headers: {
authorization: `Bearer ${process.env.ITT_API_KEY}`,
"content-type": "application/json",
},
body: JSON.stringify({ url }),
});
const body = (await response.json()) as Transcript | ApiError;
if (!body.ok) throw new Error(`${body.code}: ${body.message}`);
return body;
}
In Python
import os
import requests
def transcribe(url: str) -> dict:
response = requests.post(
"https://api.instagramtotranscript.com/v1/transcripts",
headers={"Authorization": f"Bearer {os.environ['ITT_API_KEY']}"},
json={"url": url},
timeout=120,
)
body = response.json()
if not body.get("ok"):
raise RuntimeError(f"{body['code']}: {body['message']}")
return body
Handle the failures
Two of them will happen in normal use, so write for both from the start.
PRIVATE means the post needs a login. Skip it and move on. Retrying will not help.
RATE_LIMITED means wait. Read retry-after and sleep for that many seconds.
The error reference lists the rest.
Try it without a key first
The free tool on the home page runs the same pipeline. Paste a link there to see the output shape before you write any code.