InsightSocial API
How-to

Read on-screen text from TikTok and Instagram posts

Get the text burned into a TikTok video or shown on an Instagram post's images, read by OCR, from the post URL. 50 credits per post.

To read the text shown on a TikTok video, call GET /v1/tiktok/video/screen-text with the video's url: it returns TikTok's native text stickers plus AI OCR of the cover frame, so captions burned in with an editor are caught too. For Instagram, call GET /v1/instagram/media/screen-text with the post's url: it reads the photo, each carousel slide up to 10, or a reel's cover frame, and returns the text per slide. Both cost 50 credits per post.

Cost

50 credits per post on either platform. Reading 100 posts costs 5,000 credits. Asking for the same URL again within 6 hours is answered from the shared cache for 2 credits. Failed calls and empty results are free.

Which text does each endpoint read?

A post carries text in three places, and each has its own endpoint.

TextTikTokInstagram
CaptionGET /v1/tiktok/post (10 credits)GET /v1/instagram/post (10 credits)
Spoken wordsGET /v1/tiktok/post/transcript (100 credits)GET /v1/instagram/media/transcript (100 credits)
Text on screenGET /v1/tiktok/video/screen-text (50 credits)GET /v1/instagram/media/screen-text (50 credits)

On TikTok, text typed with TikTok's own text tool is also on GET /v1/tiktok/post as post.ext.on_screen_texts. Use screen-text when you also need text burned into the video by an outside editor, which only OCR can see.

How do I find the URL?

Copy the post's link from the app or browser.

  • TikTok: a /video/ or /photo/ link, such as https://www.tiktok.com/@stoolpresidente/video/7499229683859426602.
  • Instagram: a /p/, /reel/, /reels/ or /tv/ link, such as https://www.instagram.com/p/DdEqEl5Dl-S/.

Make the request

cURL
# TikTok video
curl "https://api.insightsocial.app/v1/tiktok/video/screen-text?url=https://www.tiktok.com/@stoolpresidente/video/7499229683859426602" \
  -H "x-api-key: $INSIGHTSOCIAL_API_KEY"

# Instagram post or carousel
curl "https://api.insightsocial.app/v1/instagram/media/screen-text?url=https://www.instagram.com/p/DdEqEl5Dl-S/" \
  -H "x-api-key: $INSIGHTSOCIAL_API_KEY"

What comes back

Real responses from 2026-10-14. The TikTok one is complete:

TikTok response
{
  "success": true,
  "endpoint": "/v1/tiktok/video/screen-text",
  "schema_version": "2",
  "data": {
    "video_id": "7499229683859426602",
    "url": "https://www.tiktok.com/@stoolpresidente/video/7499229683859426602",
    "texts": ["Delicious Pizza"],
    "native_texts": null,
    "ocr_texts": ["Delicious Pizza"],
    "source": "ocr",
    "media_type": "video",
    "frame": "cover"
  },
  "unavailable": [],
  "credits_used": 50
}
FieldWhat it holds
data.textsAll the text found on the video, native and OCR combined.
data.native_textsText added with TikTok's text tool. null here, so everything came from OCR.
data.ocr_textsText read by AI from the image.
data.sourceWhere the text came from: ocr in this response.
data.frameWhich frame OCR read: cover.

The Instagram one, a 20-slide carousel, shortened: 2 of the 10 slides it read, and image URLs cut.

Instagram response (shortened)
{
  "success": true,
  "endpoint": "/v1/instagram/media/screen-text",
  "schema_version": "2",
  "data": {
    "post_id": "3982493004019425170",
    "shortcode": "DdEqEl5Dl-S",
    "url": "https://www.instagram.com/p/DdEqEl5Dl-S/",
    "media_type": "carousel",
    "texts": [
      "\"Ana, dein Speicherplatz ist voll.",
      "Du musst Fotos löschen\"",
      "...",
      "Ce KLAUSE",
      "Happy\nBirth Day",
      "Notfall: 81",
      "AK: 5122",
      "OA: 5140"
    ],
    "images": [
      {
        "index": 0,
        "image_url": "https://scontent-ord5-1.cdninstagram.com/…",
        "texts": ["\"Ana, dein Speicherplatz ist voll.", "Du musst Fotos löschen\""]
      },
      {
        "index": 2,
        "image_url": "https://scontent-ord5-2.cdninstagram.com/…",
        "texts": []
      }
    ],
    "source": "ocr",
    "frame": null,
    "slide_count": 20
  },
  "unavailable": [],
  "credits_used": 50
}
FieldWhat it holds
data.textsThe text from every slide read, in slide order.
data.images[]One entry per slide read: its index, image_url and the texts on it. A slide with no text has an empty list.
data.slide_countHow many slides the post has: 20 here, of which the first 10 were read.
data.media_typeThe kind of post: carousel here.
data.framenull for a carousel; for a reel, the frame read is the cover.

What are the limits?

  • Videos: the cover frame only. On both platforms OCR reads only the cover frame of a video, so burned-in text that appears later in a TikTok or a reel is not read.
  • Carousels: the first 10 slides. The sample post has 20 slides; images holds 10.
  • Lines, not sentences. OCR returns text in the lines it sees, so one sentence can arrive as two entries, and an entry can contain a line break ("Happy\nBirth Day"). Join them yourself if you need full sentences.
  • Not the caption, not the audio. Use the post and transcript endpoints in the table above for those.

What can I build with it?

  • Hook analysis. Collect the text on the cover frame of top-performing videos in a niche and compare which hooks get the most views.
  • Carousel research. Pull every slide's headline from a competitor's carousels to see what topics and formats they publish.
  • Searchable archive. Store caption, transcript and on-screen text together so a search finds a post by any words it shows.

On this page