

# Chronometrica vs Clockworks for TikTok Transcript Text and Timed Segments

Choose Chronometrica when your dataset needs native TikTok caption text and timed segments inside each result row; choose Clockworks when downloadable subtitles or optional speech-to-text matter more. This choice follows their checked output contracts. It is not a proved difference in reliability. [Chronometrica contract](https://apify.com/chronometrica/tiktok-transcript-scraper), [Clockworks contract](https://apify.com/clockworks/tiktok-transcript-extractor).

The key question is what your next program must receive. Does it need text and times ready to load from a row? Or does it expect a subtitle file?

An Actor is a hosted data collection program. An API is a way for programs to exchange data. Here, a timed segment means caption text linked to start and end times in seconds. Inline means those values sit directly inside the result row.

This guide compares those loading choices. It also shows how to check missing captions, requested languages, and segment times before you expand an input list.

## Choose the output your next program needs

Start with the program that will read the result. Its required input should guide your choice.

| Your required output | Checked fit |
| --- | --- |
| Native caption text and segment arrays inside result rows | Chronometrica |
| Downloadable native subtitles with timing | Clockworks |
| Optional generated text when native captions are missing | Clockworks |

Chronometrica documents inline `text` and `segments` fields. Each segment contains `startSeconds`, `endSeconds`, and `text`. This fits a program that expects named values in JSON, a structured data format with fields and lists. [Chronometrica contract](https://apify.com/chronometrica/tiktok-transcript-scraper).

Clockworks documents native subtitle links in `videoMeta.subtitleLinks`. Native VTT files retain timing. Its optional `transcriptionLink` supplies generated speech-to-text; the generated TXT transcript has continuous text without timed segments. VTT is a subtitle file format. [Clockworks contract](https://apify.com/clockworks/tiktok-transcript-extractor).

The difference matters at the point where collected data enters your system. A result can contain useful information and still require a loading step before your program can use it.

Write down that step before you choose. If your required table has a segment start column, a segment end column, and a caption text column, check how those values will reach it. A product name alone does not answer that question.

## Define what counts as usable text

Native captions are caption tracks available from the source video. They are the source type in the Chronometrica contract discussed here. A successful caption result does not, by itself, establish that every spoken word appears correctly. Keep the source type clear in your dataset.

Before you submit a URL, define your acceptance rules. These rules tell your program which results it can use.

For example, your consumer may require all of the following:

- A successful native caption outcome.
- A language that meets the study requirement.
- Caption text stored in a text field.
- Segment boundaries expressed in seconds.
- A link back to the submitted input and video.

These are proposed data requirements, not claims about a completed extraction. Adjust them to your actual use.

Decide whether complete text alone is enough. A search index may need a whole caption track. A time-based review needs separate segments. If you need both, preserve both forms instead of trying to rebuild segment boundaries from joined text later.

Also decide what an unsuccessful result means for the next step. It may need human review. It may remain in an audit table. It should not enter text analysis as though it contained a valid caption track.

This decision protects the meaning of your dataset. An empty caption field and a caption that contains no words are not facts you can treat as equal without checking the outcome.

## Keep every submitted input visible

Chronometrica returns one result row for each submitted input, including explicit unsuccessful outcomes. Its documented fields include `inputIndex`, `inputUrl`, `videoId`, `videoUrl`, `languageCode`, `text`, `segments`, `status`, `statusReason`, `isBillable`, and `scrapedAt`. [Chronometrica contract](https://apify.com/chronometrica/tiktok-transcript-scraper).

That row structure is useful when your system must account for the whole submitted list. You can retain the input reference and outcome even when no caption text is available. You do not need to infer an outcome from a missing successful record.

The public result states include `succeeded`, `no_public_captions`, `language_unavailable`, `duplicate_input`, and `invalid_input`. Read the state before you load the text. Use `statusReason` where you need more context about the returned outcome. [Chronometrica contract](https://apify.com/chronometrica/tiktok-transcript-scraper).

Keep these outcomes separate. A requested language that is unavailable is a different result from an input with no public captions. A duplicate input is also a different result from a successful new caption track.

Do not turn all unsuccessful outcomes into one blank text value and discard the reason. That would remove information you need to explain the dataset later.

A useful design has two views of the same collected data. The first retains every returned outcome. The second contains only rows that meet your text analysis rules. This is a suggested downstream design, not an extra Actor feature.

Preserve unknown values as unknown. Do not replace missing times with zero. Zero is a real time value at the start of a video. Using it as a missing-value marker can create a false segment boundary.

## Check one small public input first

Choose a public video that is relevant to your intended dataset. Request the native caption language you need. Then inspect the returned result before you expand the list.

The following input uses the checked public schema. The URL illustrates the input shape only. It is not evidence that this video currently has an available caption track.

```json
{
  "startUrls": [
    "https://www.tiktok.com/@hankgreen1/video/7047596209028074758"
  ],
  "preferredLanguages": [
    "en"
  ]
}
```

Check one small public input first

Replace that URL with your relevant public source. The `preferredLanguages` list requests native caption languages. Here, `en` requests English captions. It does not request translation of another language into English. [Chronometrica input schema](https://apify.com/chronometrica/tiktok-transcript-scraper/input-schema).

Chronometrica does not fill missing tracks through translation or newly generated speech recognition. Check the returned status instead of assuming that an English request must produce English text. [Chronometrica contract](https://apify.com/chronometrica/tiktok-transcript-scraper).

There is also a public timestamped-segments Task. A Task is a saved input preset. You can inspect it as a starting point, then check its input against your own requirement. The existence of that preset does not establish current caption availability for your chosen video. [Timestamped transcript segments Task](https://apify.com/chronometrica/tiktok-transcript-scraper/examples/tiktok-timestamped-transcript-segments).

A small check should answer a specific question. For this comparison, a useful question is whether your consumer can read the required segment fields directly from a successful row. Opening a result page is only the first part of that check. Your own loader must also accept the data.

## Preserve meaning when you load the result

For the inline route, retain the whole result row before you make a text-only copy. Then read `status`. Send only accepted outcomes into the next analysis step.

Load `text` when your consumer needs the complete caption text. Load `segments` when it needs text linked to intervals. Keep the original segment boundaries and the returned language with those intervals. These fields are part of Chronometrica's documented output. [Chronometrica contract](https://apify.com/chronometrica/tiktok-transcript-scraper).

If you put each segment in a separate database row, keep a link to its parent result. Otherwise, the segment text can lose its input reference, language, or outcome context. This is a downstream storage choice. The Actor does not need to return your final database layout to provide a useful source record.

For native VTT, download the file and parse its timed blocks. Preserve the text and both time boundaries.

In either loading design, check the time unit before you calculate durations or compare a study point with an interval. Field names, stored values, and your consumer's expectations must agree.

Do not flatten segments merely because a single text field is easier to store. Flattening may be useful for search, but it removes the boundaries from that copy. Keep the timed source alongside it if you will need those boundaries later.

If you use generated speech-to-text, label it separately. Do not call it recovered native captions.

## A fictional example shows the loading decision

This example is fictional. It is not a live extraction, a benchmark, or a customer result.

Suppose you request three videos. Two have available native caption tracks. One has a no-public-caption outcome. In the inline workflow, you have two ready text-and-segment records and one explicit unsuccessful row.

The file workflow could load two VTT files and parse their times.

The example holds caption availability constant. It shows how the same assumed native tracks enter a downstream dataset. It does not show that either product finds more captions or completes the work sooner.

Now suppose one invented segment contains these values:

```json
{
  "startSeconds": 2.50,
  "endSeconds": 4.25,
  "text": "An invented caption for this example."
}
```

A fictional example shows the loading decision

Its duration is `4.25 - 2.50 = 1.75` seconds. A study point at `3.00` seconds lies inside that interval. A study point at `5.00` seconds does not.

That calculation supports a limited claim: the study point falls within the caption segment's time interval. It does not place each word at an exact time. It also does not explain why viewers watched, stopped, or engaged with the video.

Keep the unsuccessful row in the fictional dataset. Do not give it an invented segment with a start time of zero. Do not treat its missing text as evidence that the video contains no speech.

If your consumer requires the interval values directly in JSON rows, the inline result fits that requirement. The example gives you a loading decision without inventing a performance result.

## Use a short acceptance method before expanding

Turn the comparison into a small acceptance check. Write down what must pass, then use one relevant public input to inspect the actual result.

1. Define the required source and shape. State whether your consumer needs native caption evidence, complete text, timed rows, or a file. Name the required fields.
2. Set the requested native language. Use a language that matches the task. Keep translation outside this request.
3. Read the returned outcome. Retain the submitted input reference. Separate success, unavailable language, absent public captions, and other returned states.
4. Load the required values. Check that your consumer can read the accepted text and timing fields without losing their relationship.
5. Check time meaning. Confirm the unit before subtraction or interval checks. Preserve missing values and segment boundaries.
6. Record the decision. State which required field passed, which outcome appeared, and what remains unknown before you expand the list.

For an inline requirement, make the acceptance statement concrete: “The consumer can read `startSeconds`, `endSeconds`, and segment `text` from an accepted result.” That is more useful than “the transcript looks good.”

Check language as its own condition. A readable result can still fail a language requirement. Likewise, a successful whole-text load does not prove that your segment loader works.

Keep the original outcome available while you inspect the loaded copy. This lets you trace a missing downstream value back to its source row. It also helps you distinguish an extraction outcome from a mistake in your own loading code.

If the required native track is unavailable, record that finding. Do not change the acceptance rule only to make the small check pass. Decide whether the requirement itself can change, then record that change explicitly.

## What this comparison can establish

The observed public question asks about a stable API for TikTok content. The saved historical snippet also mentions text and timestamp needs. It helps define the reader's problem, but it does not prove either product's reliability. [Observed public question](https://www.reddit.com/r/smallbusiness/comments/1odqo5g/is_there_a_stable_api_to_get_tiktok_content/).

The public contracts used here were checked on October 20, 2026. They support the output-shape comparison. They do not establish a runtime, price, availability, or reliability winner. Check the current contract again when you implement your loader.

A smaller loading step can be useful without proving faster collection. Judge the fit by what your consumer requires and what your small input actually returns.

Once you have suitable timed caption data, content analysis becomes a separate task. For a method focused on video openings, see [the TikTok hook coding guide](/en/articles/tiktok-hook-coding/). First confirm the source, language, outcome, and timing that your analysis will use.

## Verify one required field before expanding

Use the [Chronometrica TikTok Transcript Scraper](https://apify.com/chronometrica/tiktok-transcript-scraper) when your consumer needs native caption text and timed segments directly inside result rows. Start with one relevant public input. Check its status, then verify one required field in your own loader before you expand the list.

Choose Clockworks when downloadable subtitles or optional generated text fit your requirement better. That remains the main condition that changes the recommendation. [Clockworks contract](https://apify.com/clockworks/tiktok-transcript-extractor).

## Sources

- [Chronometrica TikTok Transcript Scraper contract](https://apify.com/chronometrica/tiktok-transcript-scraper)
- [Chronometrica input schema](https://apify.com/chronometrica/tiktok-transcript-scraper/input-schema)
- [Chronometrica timestamped transcript segments Task](https://apify.com/chronometrica/tiktok-transcript-scraper/examples/tiktok-timestamped-transcript-segments)
- [Clockworks TikTok Transcript Extractor contract](https://apify.com/clockworks/tiktok-transcript-extractor)
- [Clockworks input schema](https://apify.com/clockworks/tiktok-transcript-extractor/input-schema)
- [Public question about a stable TikTok API](https://www.reddit.com/r/smallbusiness/comments/1odqo5g/is_there_a_stable_api_to_get_tiktok_content/)