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.
| Text | TikTok | |
|---|---|---|
| Caption | GET /v1/tiktok/post (10 credits) | GET /v1/instagram/post (10 credits) |
| Spoken words | GET /v1/tiktok/post/transcript (100 credits) | GET /v1/instagram/media/transcript (100 credits) |
| Text on screen | GET /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 ashttps://www.tiktok.com/@stoolpresidente/video/7499229683859426602. - Instagram: a
/p/,/reel/,/reels/or/tv/link, such ashttps://www.instagram.com/p/DdEqEl5Dl-S/.
Make the request
# 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:
{
"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
}| Field | What it holds |
|---|---|
data.texts | All the text found on the video, native and OCR combined. |
data.native_texts | Text added with TikTok's text tool. null here, so everything came from OCR. |
data.ocr_texts | Text read by AI from the image. |
data.source | Where the text came from: ocr in this response. |
data.frame | Which frame OCR read: cover. |
The Instagram one, a 20-slide carousel, shortened: 2 of the 10 slides it read, and image URLs cut.
{
"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
}| Field | What it holds |
|---|---|
data.texts | The 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_count | How many slides the post has: 20 here, of which the first 10 were read. |
data.media_type | The kind of post: carousel here. |
data.frame | null 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;
imagesholds 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.
Related
GET /v1/tiktok/video/screen-textreference andGET /v1/instagram/media/screen-textreference: every parameter and field.GET /v1/tiktok/post/transcriptandGET /v1/instagram/media/transcript: the spoken words instead.- Video transcription recipe: transcripts across platforms.
- TikTok endpoints and Instagram endpoints.
Get TikTok videos tagged at a location
List public TikTok videos tagged at a place, with views, likes, captions and authors, by TikTok place ID. 10 credits per page of 20 videos.
Get the employees of a LinkedIn company
List the LinkedIn members who work at a company, with headline, location and profile URL, by company ID. 100 credits per page of 10.