Base URL: https://api.voiceclips.app/api/v1
AI agent? Append .md to this page's URL for a raw Markdown version.
All requests require an Authorization header with a Bearer token.
Authorization: Bearer vc_live_abc123...API keys can be created from the Voice Clips dashboard (Business plan required). Keys use the format vc_live_{random} (production) or vc_test_{random} (test).
Each key has assigned scopes that control access:
Note: API access (via API keys) requires a Business plan. Free and Pro users can only access the API through the web dashboard.
Rate limit headers are included in every response:
X-RateLimit-Limit — Max requests per windowX-RateLimit-Remaining — Remaining requestsX-RateLimit-Reset — Unix timestamp when window resetsRetry-After — Seconds to wait (only on 429 responses)All errors follow a consistent shape:
{
"error": {
"type": "validation_error",
"message": "Human-readable description",
"status": 400
}
}data keysnake_casepagination object/jobswriteSubmit a Twitter/X Space or tweet URL for processing. The system will download the audio, transcribe it, and extract notable quotes.
curl -X POST https://api.voiceclips.app/api/v1/jobs \
-H "Authorization: Bearer vc_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"space_url": "https://x.com/i/spaces/1BRJjZaOZzXGw",
"callback_url": "https://example.com/webhook",
"callback_secret": "my_webhook_secret_123"
}'Response (201):
{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"space_url": "https://x.com/i/spaces/1BRJjZaOZzXGw",
"space_title": null,
"status": "pending",
"progress": 0,
"error": null,
"retry_count": 0,
"space_duration": null,
"project_id": null,
"is_archived": false,
"created_at": "2025-01-15T10:30:00.000Z",
"updated_at": "2025-01-15T10:30:00.000Z"
}
}Job limits per plan:
/jobsreadResponse (200):
{
"data": [
{
"id": "uuid",
"space_url": "string",
"space_title": "string or null",
"status": "ready",
"progress": 100,
"error": null,
"retry_count": 0,
"space_duration": 3600.5,
"project_id": "uuid or null",
"is_archived": false,
"quote_count": 8,
"created_at": "ISO 8601",
"updated_at": "ISO 8601"
}
],
"pagination": {
"total": 42,
"limit": 20,
"offset": 0,
"has_more": true
}
}/jobs/:idreadReturns the full job with all quotes and metadata.
{
"data": {
"id": "uuid",
"space_url": "string",
"space_title": "string or null",
"status": "ready",
"progress": 100,
"error": null,
"retry_count": 0,
"space_duration": 3600.5,
"project_id": "uuid or null",
"is_archived": false,
"created_at": "ISO 8601",
"updated_at": "ISO 8601",
"speaker_suggestions": [
{ "username": "elonmusk", "display_name": "Elon Musk" }
],
"space_metadata": {
"host": { "username": "host_user", "display_name": "Host Name" },
"total_live_listeners": 1500,
"total_replay_watched": 3200,
"started_at": "ISO 8601"
},
"quotes": [
{
"id": "uuid",
"text": "The actual quote text...",
"original_text": "string or null",
"image_text": "string or null",
"original_image_text": "string or null",
"speaker_label": "Speaker 1",
"username": "twitter_handle",
"display_name": "Full Name",
"start_time": 120.5,
"end_time": 135.2,
"audio_clip_url": "string or null",
"image_card_url": "string or null",
"video_card_url": "string or null",
"is_favorite": false,
"render_status": "completed",
"render_progress": 100
}
]
}
}/jobs/:id/retrywriteResets a failed job back to pending for reprocessing. Maximum 3 retries.
Response (200): Returns the job object with status: "pending" and incremented retry_count.
/jobs/:idwrite{
"data": { "status": "deleted" }
}/jobs/:id/archivewriteToggles the archive status.
{
"data": {
"id": "uuid",
"is_archived": true
}
}/jobs/:id/files/:filenamereadDownload audio clips, images, videos, or metadata files associated with a job. Returns binary content with the appropriate Content-Type.
/quotes/:idread{
"data": {
"id": "uuid",
"text": "The quote text...",
"original_text": "string or null",
"image_text": "string or null",
"original_image_text": "string or null",
"speaker_label": "Speaker 1",
"username": "twitter_handle",
"display_name": "Full Name",
"start_time": 120.5,
"end_time": 135.2,
"audio_clip_url": "string or null",
"image_card_url": "string or null",
"video_card_url": "string or null",
"is_favorite": false,
"render_status": "completed",
"render_progress": 100
}
}/quotes/:idwriteEdit the quote text or reset it to the original.
One of text or reset is required. Response (200): Returns the updated quote object.
/quotes/:id/speakerwriteAssign or update the speaker on a single quote. Clears any cached video so the next render uses the new name.
Response (200): Returns the updated quote object.
/quotes/:id/render-videowriteTriggers a video render for the quote.
{
"data": { "status": "rendering" }
}/quotes/:id/render-imagewriteTriggers a server-side image render for the quote.
{
"data": {
"id": "uuid",
"status": "processing",
"image_url": null
}
}/quotes/:id/favoritewrite{
"data": {
"id": "uuid",
"is_favorite": true
}
}/render/bulkwriteQueue multiple image and/or video renders at once. Max 50 per batch. Video renders require Pro or Business plan.
curl -X POST https://api.voiceclips.app/api/v1/render/bulk \
-H "Authorization: Bearer vc_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"renders": [
{ "quote_id": "uuid1", "type": "image" },
{ "quote_id": "uuid2", "type": "video" }
],
"callback_url": "https://example.com/webhook",
"callback_secret": "my_webhook_secret_123"
}'Response (202):
{
"data": {
"id": "uuid",
"status": "processing",
"total": 2,
"completed": 0,
"failed": 0,
"created_at": "ISO 8601",
"updated_at": "ISO 8601",
"items": [
{
"id": "uuid",
"quote_id": "uuid1",
"type": "image",
"status": "pending",
"error": null,
"result_url": null,
"created_at": "ISO 8601"
}
]
}
}/render/:idreadReturns the current status of a render batch, including per-item progress.
/themereadReturns the current theme settings, or null if no custom theme is set.
{
"data": {
"id": "uuid",
"user_id": "uuid",
"preset": "brutalist",
"background_color": "#0A0A0A",
"pattern_color": "#111111",
"accent_color": "#FF3366",
"text_color": "#FFFFFF",
"background_pattern": "stripes",
"font_family": "inter",
"show_corner_brackets": true,
"show_accent_line": true,
"logo_url": null,
"custom_watermark_text": null,
"created_at": "ISO 8601",
"updated_at": "ISO 8601"
}
}/themewriteCreate or update the theme. All color fields are required as 6-digit hex strings.
Response (200): Returns the updated theme object.
/themewriteResets the theme to defaults (removes custom settings).
{
"data": { "status": "deleted" }
}/theme/logowriteUpload a logo image via multipart form data. The logo appears above the branding text on quote cards. Both logo and custom_watermark_text can be displayed simultaneously.
{
"data": {
"logoUrl": "https://files.voiceclips.app/logos/{userId}/logo.png"
}
}/theme/logowriteRemoves the uploaded logo.
{
"data": { "status": "deleted" }
}When you provide callback_url and callback_secret on job creation or bulk render, Voice Clips will send POST requests to your URL on completion or failure.
Every callback includes an X-VoiceClips-Signature header:
X-VoiceClips-Signature: sha256=abc123def456...Verify it by computing HMAC-SHA256(request_body, callback_secret) and comparing the hex digest.