Complete reference documentation for all Transcript Create API endpoints.
https://api.example.com
All endpoints use HTTPS. The API accepts JSON request bodies and returns JSON responses.
Most endpoints require authentication via session cookies. See Authentication Guide for details.
Include cookies in requests:
- JavaScript:
credentials: 'include' - cURL:
-H "Cookie: tc_session=..." - Python requests: Use
Session()object
Check if the API service is running.
Authentication: Not required
Response 200:
{
"status": "ok"
}Create and monitor transcription jobs for YouTube videos and channels.
Create a new transcription job.
Authentication: Required
Request Body:
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"kind": "single"
}Parameters:
url(string, required): YouTube video or channel URLkind(string, optional):"single"or"channel"(default:"single")
Response 200:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"kind": "single",
"state": "pending",
"error": null,
"created_at": "2025-10-25T10:30:00Z",
"updated_at": "2025-10-25T10:30:00Z"
}Job States:
pending: Job created, waiting to be processedexpanded: Videos identified (for channel jobs)completed: All videos transcribedfailed: An error occurred
Errors:
422: Invalid URL or parameters
Get the status of a transcription job.
Authentication: Required
Path Parameters:
job_id(UUID): Job identifier
Response 200:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"kind": "single",
"state": "completed",
"error": null,
"created_at": "2025-10-25T10:30:00Z",
"updated_at": "2025-10-25T10:35:00Z"
}Errors:
404: Job not found
Access video information and transcripts.
List all videos with pagination.
Authentication: Required
Query Parameters:
limit(integer, optional): Max results (1-100, default: 50)offset(integer, optional): Pagination offset (default: 0)
Response 200:
[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"youtube_id": "dQw4w9WgXcQ",
"title": "Example Video",
"duration_seconds": 212
}
]Get information about a specific video.
Authentication: Required
Path Parameters:
video_id(UUID): Video identifier
Response 200:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"youtube_id": "dQw4w9WgXcQ",
"title": "Example Video",
"duration_seconds": 212
}Errors:
404: Video not found
Get Whisper-generated transcript for a video.
Authentication: Required
Path Parameters:
video_id(UUID): Video identifier
Response 200:
{
"video_id": "123e4567-e89b-12d3-a456-426614174000",
"segments": [
{
"start_ms": 1000,
"end_ms": 3500,
"text": "Hello and welcome to this video",
"speaker_label": "Speaker 1"
}
]
}Errors:
404: Video not found503: Transcript not ready (still processing)
Get YouTube's native closed captions.
Authentication: Required
Path Parameters:
video_id(UUID): Video identifier
Response 200:
{
"video_id": "123e4567-e89b-12d3-a456-426614174000",
"language": "en",
"kind": "asr",
"full_text": "Full transcript text...",
"segments": [
{
"start_ms": 1000,
"end_ms": 3500,
"text": "Hello and welcome"
}
]
}Errors:
404: Video not found503: YouTube captions not available
Full-text search across transcripts.
Search transcripts with filtering and pagination.
Authentication: Required
Query Parameters:
q(string, required): Search query (1-500 chars)source(string, optional):"native"or"youtube"(default:"native")video_id(UUID, optional): Filter to specific videolimit(integer, optional): Max results (1-200, default: 50)offset(integer, optional): Pagination offset (default: 0)
Response 200:
{
"total": 42,
"hits": [
{
"id": 12345,
"video_id": "123e4567-e89b-12d3-a456-426614174000",
"start_ms": 45000,
"end_ms": 48500,
"snippet": "This is an example of <em>search term</em> in context"
}
]
}Errors:
400: Empty query or invalid parameters429: Rate limit exceeded (free plan)503: Search backend unavailable
Rate Limits:
- Free plan: 100 searches per day
- Pro plan: Unlimited
Export transcripts in various formats.
Export Whisper transcript as SubRip subtitle file.
Authentication: Required
Format: SRT
Response 200: Text file download
Errors:
401: Authentication required402: Export quota exceeded (free plan)503: Transcript not ready
Export Whisper transcript as WebVTT subtitle file.
Authentication: Required
Format: VTT
Response 200: Text file download
Export Whisper transcript as JSON.
Authentication: Required
Format: JSON
Response 200:
[
{
"start_ms": 1000,
"end_ms": 3500,
"text": "Hello world",
"speaker_label": "Speaker 1"
}
]Export Whisper transcript as formatted PDF document.
Authentication: Required
Format: PDF
Response 200: PDF file download
Features:
- Timestamps for each segment
- Speaker labels
- Video metadata (title, duration)
- Page numbers
Export YouTube captions as SRT.
Authentication: Required
Export YouTube captions as VTT.
Authentication: Required
Export YouTube captions as JSON.
Authentication: Required
Rate Limits:
- Free plan: Limited exports per day
- Pro plan: Unlimited
OAuth 2.0 authentication and session management.
Get current authenticated user information.
Authentication: Optional
Response 200 (authenticated):
{
"user": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"email": "user@example.com",
"name": "John Doe",
"avatar_url": "https://example.com/avatar.jpg",
"plan": "free",
"searches_used_today": 5,
"search_limit": 100
}
}Response 200 (not authenticated):
{
"user": null
}Initiate Google OAuth login flow.
Authentication: Not required
Response: Redirect to Google OAuth consent screen
OAuth callback endpoint (called by Google).
Authentication: OAuth code in query params
Response: Redirect to frontend with session cookie set
Initiate Twitch OAuth login flow.
Authentication: Not required
Response: Redirect to Twitch OAuth consent screen
OAuth callback endpoint (called by Twitch).
Authentication: OAuth code in query params
Response: Redirect to frontend with session cookie set
Logout and invalidate session.
Authentication: Required
Response 200:
{
"ok": true
}Stripe subscription management (Pro plan).
Create Stripe checkout session for Pro subscription.
Authentication: Required
Request Body:
{
"period": "monthly"
}Parameters:
period(string, optional):"monthly"or"yearly"(default:"monthly")
Response 200:
{
"id": "cs_test_123",
"url": "https://checkout.stripe.com/pay/cs_test_123"
}Errors:
401: Authentication required503: Stripe not configured
Get Stripe customer portal URL for managing subscription.
Authentication: Required
Response 200:
{
"url": "https://billing.stripe.com/session/123"
}Errors:
400: No Stripe customer account401: Authentication required503: Stripe not configured
Stripe webhook endpoint for subscription events.
Authentication: Stripe webhook signature
Request Body: Stripe event payload
Response 200:
{
"received": true
}Errors:
400: Invalid webhook signature503: Stripe not configured
Manage favorite transcript segments.
List user's favorite segments.
Authentication: Required
Query Parameters:
video_id(UUID, optional): Filter by video
Response 200:
{
"items": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"video_id": "987e6543-e21b-34c5-b678-426614174999",
"start_ms": 10000,
"end_ms": 15000,
"text": "Favorite quote",
"created_at": "2025-10-25T10:30:00Z"
}
]
}Add a favorite segment.
Authentication: Required
Request Body:
{
"video_id": "987e6543-e21b-34c5-b678-426614174999",
"start_ms": 10000,
"end_ms": 15000,
"text": "Favorite quote"
}Response 200:
{
"id": "123e4567-e89b-12d3-a456-426614174000"
}Errors:
400: Missing required fields401: Authentication required
Delete a favorite segment.
Authentication: Required
Path Parameters:
favorite_id(UUID): Favorite identifier
Response 200:
{
"ok": true
}Client-side event tracking for analytics.
Track a single event.
Authentication: Optional (associates with user if authenticated)
Request Body:
{
"type": "video_view",
"payload": {
"video_id": "123e4567-e89b-12d3-a456-426614174000"
}
}Response 200:
{
"ok": true
}Track multiple events in one request.
Authentication: Optional
Request Body:
{
"events": [
{
"type": "page_view",
"payload": {"page": "/home"}
},
{
"type": "search",
"payload": {"query": "example"}
}
]
}Response 200:
{
"ok": true,
"count": 2
}Administrative endpoints (admin access required).
List tracked events with filtering.
Authentication: Admin required
Query Parameters:
type(string, optional): Filter by event typeuser_email(string, optional): Filter by user emailstart(string, optional): Filter after timestampend(string, optional): Filter before timestamplimit(integer, optional): Max results (default: 100)offset(integer, optional): Pagination offset (default: 0)
Response 200:
{
"items": [...]
}Errors:
403: Admin access required
Export events as CSV.
Authentication: Admin required
Query Parameters: Same as /admin/events
Response 200: CSV file download
Get event statistics.
Authentication: Admin required
Query Parameters:
start(string, optional): Filter after timestampend(string, optional): Filter before timestamp
Response 200:
{
"by_type": [
{"type": "search", "count": 150}
],
"by_day": [
{"day": "2025-10-25", "count": 42}
]
}Set a user's subscription plan.
Authentication: Admin required
Path Parameters:
user_id(UUID): User identifier
Request Body:
{
"plan": "pro"
}Parameters:
plan(string):"free"or"pro"
Response 200:
{
"ok": true,
"user_id": "123e4567-e89b-12d3-a456-426614174000",
"plan": "pro"
}Errors:
400: Invalid plan value403: Admin access required
All errors follow this format:
{
"error": "error_code",
"message": "Human-readable message",
"details": {}
}200: Success400: Bad Request - Invalid parameters401: Unauthorized - Authentication required402: Payment Required - Quota exceeded403: Forbidden - Insufficient permissions404: Not Found - Resource doesn't exist422: Unprocessable Entity - Validation error429: Too Many Requests - Rate limit exceeded500: Internal Server Error - Server error503: Service Unavailable - Service/resource not ready
- Getting Started - Quick start guide
- Authentication - OAuth setup and usage
- Webhooks - Stripe webhook integration
- Examples - Code examples in multiple languages