# X (Twitter) Video Transcriber — Timestamps + Bulk URLs (`tictechid/vanzi-x-transcriber`) Actor

Low-cost X (Twitter) video transcriber: paste one or many post URLs and get timestamped transcripts, plus post metadata when available. Billed by the second of audio, so short clips cost very little. Built for content repurposing, research, brand monitoring and AI pipelines.

- **URL**: https://apify.com/tictechid/vanzi-x-transcriber.md
- **Developed by:** [TicTech](https://apify.com/tictechid) (community)
- **Categories:** Videos, Social media, AI
- **Features:** Limited permissions
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.21 / 1,000 transcriptions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## X (Twitter) Video Transcriber — Timestamps + Bulk URLs

Transform your X (Twitter) videos into actionable insights! Instantly convert public X / Twitter video posts (`x.com`, `twitter.com`) into searchable transcripts with optional timestamps, speaker labels, and automatic (or manual) language detection. Process one link or many in a single run. Unlock the full value of your content for analysis, accessibility, and growth.

> **Note:** Only publicly available media can be transcribed. Private or restricted files are not supported.

> **Important:** Due to CORS security and anti-scraping/bot measures, success rates are not guaranteed. The source platform may block automated access, which can result in failed downloads even for public content.

### Why Use This Tool?

- **Automate tedious work:** No more manual transcription, get results in minutes, not hours.
- **Unlock hidden insights:** Search, analyze, and repurpose your content for new opportunities.
- **Boost accessibility:** Make your media inclusive for all audiences with accurate transcripts.
- **Enhance discoverability:** Improve SEO and compliance with rich, timestamped text.
- **Stay ahead:** Track trends, monitor competitors, and optimize your content strategy with ease.

### Features

- Supports **public X / Twitter video posts (`x.com`, `twitter.com`)** only
- **Bulk transcription:** process multiple URLs in a single run
- **Timestamps:** `[start - end]` markers on each line (on by default; can be turned off)
- **Optional speaker diarization:** label different speakers (`[Speaker 0]`, `[Speaker 1]`, …) inside the transcript text (off by default)
- **Language:** auto-detect by default, or pick a specific language (see supported languages below)

### Use Cases

- **Content Creators:** Generate captions, repurpose content, and analyze performance.
- **Marketers:** Track brand mentions, analyze trends, and optimize strategy.
- **Researchers:** Study public discourse and extract insights from spoken content.
- **Businesses:** Create training materials, monitor feedback, and maintain compliance records.

### Supported Languages

- Bulgarian `bg`, Catalan `ca`, Chinese (Simplified) `zh-CN`, Chinese (Traditional) `zh-TW`
- Czech `cs`, Danish `da`, Dutch / Flemish `nl`, English `en`, Estonian `et`, Finnish `fi`
- French `fr`, German `de`, German (Switzerland) `de-CH`, Greek `el`, Hindi `hi`, Hungarian `hu`
- Indonesian `id`, Italian `it`, Japanese `ja`, Korean `ko`, Latvian `lv`, Lithuanian `lt`
- Malay `ms`, Norwegian `no`, Polish `pl`, Portuguese `pt`, Romanian `ro`, Russian `ru`
- Slovak `sk`, Spanish `es`, Swedish `sv`, Thai `th`, Turkish `tr`, Ukrainian `uk`, Vietnamese `vi`

### Input Example

```json
{
  "urls": [
    "https://x.com/CaptainAmerica/status/719944021058060289"
  ],
  "include_timestamps": true,
  "enable_diarization": false,
  "language": "auto"
}
```

All fields except `urls` are optional. `include_timestamps` defaults to `true`, `enable_diarization` to `false`, and `language` to `"auto"` (auto-detect).

### Output Example (Success)

```json
{
  "sourceUrl": "https://x.com/CaptainAmerica/status/719944021058060289",
  "videoId": "unique-video-id",
  "status": "success",
  "durationSec": 45.2,
  "transcript": "[0.00s - 2.50s] Welcome! [2.50s - 8.10s] Here is the main point.",
  "detected_language": "en",
  "author": "Example User",
  "handle": "example",
  "media_title": "Example post title",
  "caption": "Post caption text...",
  "posted_at": "2024-01-01T12:00:00Z",
  "like_count": 123,
  "view_count": 4567,
  "comment_count": 8,
  "repost_count": 2,
  "post_url": "https://x.com/CaptainAmerica/status/719944021058060289",
  "media_url": null,
  "timestamp": "2024-01-01T12:00:00.000Z"
}
```

> With `include_timestamps: false`, the transcript is plain text without the `[start - end]` markers. With `enable_diarization: true`, lines are labeled `[Speaker 0] ...` inside `transcript` (no separate speakers field).
>
> Social metadata (`author`, `handle`, `media_title`, `caption`, `posted_at`, engagement counts, `post_url`, `media_url`) is best-effort from the platform and never blocks the transcript if missing.

### Output Example (Failed)

```json
{
  "sourceUrl": "https://x.com/CaptainAmerica/status/719944021058060289",
  "videoId": "unique-video-id",
  "status": "failed",
  "errorCode": "DOWNLOAD_FAILED",
  "error": "Failed to download media (may be private or restricted)",
  "timestamp": "2024-01-01T12:00:00.000Z"
}
```

#### Output Fields

- **sourceUrl**: Original post URL
- **videoId**: Unique identifier for the processed item
- **status**: "success" or "failed"
- **durationSec**: Media duration in seconds (success only)
- **transcript**: Transcribed text with optional `[start - end]` / `[Speaker N]` labels (success only)
- **detected_language**: BCP-47 code when available (success only)
- **author** / **handle** / **media_title** / **caption** / **posted_at**: best-effort post/profile metadata
- **like_count** / **view_count** / **comment_count** / **repost_count**: best-effort engagement
- **post_url** / **media_url**: canonical post and media URLs when available
- **errorCode** / **error**: failure detail (failed only)
- **timestamp**: Processing time

### How to Run on Apify

1. Open the actor on Apify and click **Try actor**.
2. Add one or more public X / Twitter video URLs in **Video URLs** (`urls`). Optionally toggle timestamps, speaker diarization, or pick a language. Private/restricted posts will fail.
3. Start the run. When it finishes, check the **Dataset** tab for the transcripts.

#### Input Schema

- `urls` (string\[]): public media URLs to process (one or many).
- `include_timestamps` (boolean, default `true`): add `[start - end]` markers to each line.
- `enable_diarization` (boolean, default `false`): label different speakers inside the transcript.
- `language` (string, default `"auto"`): spoken language, or auto-detect.
- `start_urls` (string): **deprecated** single-URL field, kept for backward compatibility. Ignored when `urls` is provided.

#### Output Location

- Results are saved to the run’s **Dataset** in JSON items matching the examples above.

### More tools from TicTech

| Need | Actor |
| --- | --- |
| TikTok / IG / Facebook / YouTube Shorts → transcript | [Shorts Transcriber](https://apify.com/tictechid/anoxvanzi-Transcriber) |
| Scrape X posts, search & watchlists | [X / Twitter Monitor](https://apify.com/tictechid/vanzi-x-monitor) |

> Need captions outside X? Use **[Shorts Transcriber](https://apify.com/tictechid/anoxvanzi-Transcriber)** for TikTok, Instagram, Facebook, and YouTube Shorts. Keep X / Twitter video posts on this Actor.

### Usage Limits

- **Free Apify accounts:** Limited to **5 Actor runs** on this Actor (Actor-side free-tier gate), plus your monthly platform credit (typically $5) for pay-per-event charges.
- **Paid plans:** Unlimited Actor runs (subject to your monthly credit) and the same flat PPE rates as every other plan.

> Hit the free-run cap? Upgrade at [Apify Pricing](https://apify.com/pricing?fpr=maxknj).

### Pricing

This actor uses Apify's pay-per-event model. You are charged for two things: starting a URL, and each second of media transcribed. Platform usage (compute, storage, proxies) is included at no extra cost, so there are no separate infrastructure charges on top of the rates below.

> **Low-cost:** about $0.013 per minute of audio, same price on every plan (a 60 s video is about $0.0155; a failed link is $0.0029).

| Event | Unit | Price (all plans: Free, Bronze, Silver, Gold, Platinum, Diamond) |
|---|---|---|
| **Transcription** | per second of media | $0.00021 |
| **Actor start** | per URL | $0.0029 |

Apify's pricing page lists the same rates per 1,000 units: $0.21 per 1,000 seconds and $2.90 per 1,000 URLs, on every plan.

```
total = (actor start × number of URLs) + (per-second rate × total seconds of media)
```

Two details that matter:

- **Actor start is charged per URL, not per run.** A single run containing 10 URLs is charged 10 actor-start events. Bulk runs do not amortize this fee.
- **Length is rounded to the nearest second**, measured from the media's audio track. A 30.4 second file bills as 30 seconds. A file that rounds to 0 seconds is not charged for transcription.

Example, 10 items of 30 seconds each (any plan): (10 × $0.0029) + (300 × $0.00021) = **$0.092**.

A URL that cannot be downloaded (private, removed, geo-blocked, or blocked by anti-bot measures) is still charged the actor start fee, because the download was attempted. It is not charged any transcription seconds. A failed URL costs $0.0029 on every plan.

***

For more details, contact the maintainer or email us at contact@tictech.id

# Actor input Schema

## `urls` (type: `array`):

Public X (Twitter) video post URLs (x.com or twitter.com). Add one or many for bulk transcription.

## `include_timestamps` (type: `boolean`):

Include \[start - end] timestamps in the transcript output. No effect on cost.

## `enable_diarization` (type: `boolean`):

Identify and label different speakers (\[Speaker 0], \[Speaker 1], ...). Useful for interviews and podcasts; leave off for single-speaker media. No effect on cost.

## `language` (type: `string`):

Spoken language of the audio. Leave on Auto-detect unless detection is unreliable.

## `start_urls` (type: `string`):

Deprecated — kept only for backward compatibility with older API integrations. Use the Media URLs field above instead, which supports one or many links.

## Actor input object example

```json
{
  "urls": [
    "https://x.com/CaptainAmerica/status/719944021058060289"
  ],
  "include_timestamps": true,
  "enable_diarization": false,
  "language": "auto"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://x.com/CaptainAmerica/status/719944021058060289"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tictechid/vanzi-x-transcriber").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": ["https://x.com/CaptainAmerica/status/719944021058060289"] }

# Run the Actor and wait for it to finish
run = client.actor("tictechid/vanzi-x-transcriber").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://x.com/CaptainAmerica/status/719944021058060289"
  ]
}' |
apify call tictechid/vanzi-x-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tictechid/vanzi-x-transcriber"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TadJNX1c08i7hYGD1/builds/FybedCfk7MxpuKVoU/openapi.json
