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.