HonestHook

Free API key (1,000/mo)Sign in

Home · Docs · Endpoints · tiktok/post_transcript

tiktok/post_transcript — the spoken words, when there are any

The caption track of a TikTok video, if the platform generated one. An empty answer is normal, means two different things, and is charged either way — all three facts are on this page.

The call

PathGET /api/v1/tiktok/post/transcript
Catalogue idtiktok/post_transcript
Cost1 credit per call. A call that finds nothing costs nothing.
KeyRequired — Authorization: Bearer hk_live_...

Parameters (1)

NameInRequired
urlqueryyes

That list is the whole list, and anything else is ignored in silence. An undeclared parameter is not rejected — it produces no error, no warning and no filtering. Check a parameter against this table before assuming a narrower result came back.

What the parameter list does not tell you

THE SPOKEN WORDS, AND ONLY THOSE. This route reads the caption track the platform produced for the audio. It is the third of the three texts in a TikTok video — see `tiktok/video_screen_text` for the words drawn on the frames, which on short-form video usually carry the actual claim, and `tiktok/post` for the description the author wrote.

⚠️ AN EMPTY `items` IS THE COMMON CASE, NOT AN ERROR. A real call on 4 October 2026 returned `items: []` with HTTP 200 for a public post, because that post has no caption track. Most videos do not. Write the empty case first and treat a transcript as a bonus rather than as the expected payload.

⚠️ AND IT WAS CHARGED. The `consumo` row for that call records one credit and `houve_resultado: true` — the envelope arrived intact and only its `items` was empty, so the mechanism counted a result. This differs from `/movers`, which answers a quiet window for free, and the difference is NOT the price flag: both catalogue rows carry `cobra_sem_resultado: false`. What differs is what each route calls a result. We are telling you because `x-charges-without-result: false` in the published OpenAPI would otherwise read as a promise this route does not keep. Budget per call, not per transcript.

AND DO NOT RETRY AN EMPTY ANSWER IN A LOOP. Because the empty result cannot be distinguished from a transient upstream miss, a retry loop looks reasonable and is the one way to turn a 1-credit question into an unbounded bill. Read `items.length` once, record the absence, and move on.

Measured caveats (1)

An empty transcript is charged, and here is the mechanism

`tiktok/post/transcript` answered `items: []` with HTTP 200 for a post with no caption track, and the call WAS charged. That is not the same rule as `/movers`, which answers an empty window for free — and the difference is not the price flag. Both rows carry `cobra_sem_resultado: false`, meaning neither should charge when there is no result. What differs is what each route calls a result: `/movers` records none for a quiet window, while the transcript route recorded one, because the upstream envelope arrived intact and only its `items` was empty. So plan for the call to cost a credit whether or not a transcript exists, and read `items.length` rather than the status code or the charge to find out which you got.

Source: A real production call on 4 October 2026 against a public TikTok post, and the `consumo` row it produced — `creditos: 1`, `houve_resultado: true` — read back from the production table, alongside `cobra_sem_resultado: false` on both catalogue rows.

Why there is no success body on this page

The 200 body for this endpoint is not transcribed here. Reading it needs a client key, and there is no client key on the machine these pages were built from — internal keys exist only as hashes, by design. An example we never received would look exactly like one we did, so instead of composing one, the response shape is documented field by field on the schema pages below. Those are generated from the contract and tested against it in both directions; an invented example would be tested by nothing.

Response shapes (2)

Error codes (8)

Every one of them carries the same body shape: ApiError. The error value is a stable string you can branch on — branch on that, never on the message text.

400 · 401 · 402 · 404 · 405 · 451 · 503 · 502

Machine-readable

This endpoint is in /openapi.json (OpenAPI 3.1), with its cost on the operation itself. If you are generating a client, use the spec rather than this page — and note that the spec is filtered by what is switched on right now, so it is the better answer to "can I call this today".

The other 18 endpoint pages

archive/trends · archive/movers · archive/coverage · profile/history · youtube/channel · pinterest/boards · bluesky/post · tiktok/post · tiktok/search_suggestions · tiktok/video_screen_text · youtube/video · youtube/channel/videos · youtube/playlist · youtube/channel/shorts · youtube/channel/lives · youtube/channel/playlists · youtube/video/comments · youtube/video/comment/replies

← All endpoint pages · Recipes · Schemas · Full docs