HomeAPI Documentation

API Reference

Complete reference for the ReelFarm API. Create slideshows, manage automations, publish to TikTok, and more.

Base URL: https://reel.farm/api/v1Download Claude Code Skill

Authentication

All requests require a Bearer token. API access is available on the Growth, Scale, and Enterprise plans.

Include your API key in the Authorization header as a Bearer token. All keys start with rf_.

Generating an API Key

  1. Subscribe to the Growth, Scale, or Enterprise plan
  2. Go to your ReelFarm dashboard
  3. Click your user email at the bottom of the sidebar to open Settings
  4. Click the API Keys tab
  5. Generate a new API key
Keep your API key secret. Do not share it in public repositories, client-side code, or anywhere it could be exposed.
Example Request
curl -X GET https://reel.farm/api/v1/account \
  -H "Authorization: Bearer rf_your_api_key_here" \
  -H "Content-Type: application/json"

Slideshows

Generate slideshows from AI prompts or build them manually with full creative control.

POST

Generate a slideshow

/slideshows/generate

Create a new slideshow from a natural-language prompt. The AI generates text content, selects images, and rendering begins automatically. Returns immediately — the pipeline runs asynchronously (~45 seconds).

Request Body

ParameterTypeRequiredDescription
additional_contextstringRequiredNatural-language prompt controlling topic, slide count, text items, font sizes, positions, styles, fonts, tone, and content direction.
imagesstring[]Optional0-indexed array of image URLs for slide backgrounds. images[0] → slide 0, images[1] → slide 1, etc. Remaining slides use auto-selected images.
Example Request
{
  "additional_context": "5 habits that changed my morning routine, casual first-person tone, 6 slides",
  "images": [
    "https://example.com/morning-coffee.jpg",
    "https://example.com/cold-shower.jpg"
  ]
}
Response · 201
{
  "slideshow_id": 12345,
  "status": "processing",
  "message": "Slideshow generation started. Poll GET /api/v1/slideshows/12345/status to track progress."
}
POST

Create a slideshow (direct control)

/slideshows/create

Create a slideshow by specifying every slide's image, text, styling, and positioning directly. No AI generation — renders in ~10 seconds.

Request Body

ParameterTypeRequiredDescription
slidesobject[]RequiredArray of slide objects (1–20 slides). Each slide has image_url, text_items, and optional overrides.
titlestringOptionalSlideshow title (default "API Slideshow")
aspect_ratiostringOptional"4:5" (default), "9:16", "1:1", or "16:9"
text_positionstringOptional"top", "center", or "bottom" (default "center")
export_as_videobooleanOptionalExport the slideshow as a video (.mp4) in addition to the rendered slide images (default false)
durationnumberOptionalSeconds each slide is displayed in the video. Only applies when export_as_video is true (default 4)
is_bg_overlay_onbooleanOptionalDark overlay on body slides (default false)
is_bg_overlay_on_hook_imagebooleanOptionalDark overlay on hook slide (default false)
background_opacitynumberOptionalOverlay opacity 0–100 (default 20)
keep_original_aspect_ratiobooleanOptionalUse each image's native aspect ratio (default false)

Slide Object

ParameterTypeRequiredDescription
image_urlstringOptionalBackground image URL. Required for single-image slides.
image_urlsstring[]OptionalArray of image URLs for grid layouts.
image_layoutstringOptional"single" (default), "1:2", "1:3", "2:1", or "2:2"
text_itemsobject[]OptionalText items to overlay. Empty array = image-only slide.
aspect_ratiostringOptionalOverride the global aspect ratio for this slide. Options: "4:5", "9:16", "1:1", "16:9"
text_positionstringOptionalOverride text position for this slide

TextItem Object

ParameterTypeRequiredDescription
textstringRequiredThe text content to display
font_sizestringOptional"extra_extra_small" (6px), "extra_small" (8px), "small" (10px), "medium" (12px), "large" (14px), "extra_large" (16px), or raw "14px"
text_stylestringOptional"outline", "whiteText", "blackText", "yellowText", "white_background", "black_background", "white_50_background", "black_50_background"
fontstringOptional"TikTokDisplay-Bold", "BebasNeue-Regular", "CormorantGaramond-Regular", "CormorantGaramond-Italic"
text_widthstringOptional"100%", "80%", "50%", or "full"
Example Request
{
  "slides": [
    {
      "image_url": "https://example.com/hook.jpg",
      "text_items": [
        {
          "text": "5 habits that changed my morning routine",
          "font_size": "extra_large",
          "text_style": "outline"
        }
      ]
    },
    {
      "image_layout": "2:2",
      "image_urls": [
        "https://example.com/img1.jpg",
        "https://example.com/img2.jpg",
        "https://example.com/img3.jpg",
        "https://example.com/img4.jpg"
      ],
      "text_items": [
        {
          "text": "my 4 favorite outfits",
          "font_size": "medium",
          "text_style": "white_50_background"
        }
      ]
    }
  ],
  "aspect_ratio": "4:5",
  "text_position": "center",
  "export_as_video": true,
  "duration": 4,
  "is_bg_overlay_on": true
}
Response · 201
{
  "slideshow_id": 12345,
  "status": "processing",
  "message": "Slideshow created and rendering started. Poll GET /api/v1/slideshows/12345/status to track progress."
}
GET

Check slideshow status

/slideshows/{slideshow_id}/status

Lightweight polling endpoint for tracking slideshow generation progress. Poll every 5–10 seconds. Once the slideshow reaches the rendering stage, the response also includes video_id and video_status from the videos table for granular rendering progress.

Path Parameters

ParameterTypeRequiredDescription
slideshow_idintegerRequiredThe slideshow ID returned from generate or create

Response Fields

ParameterTypeRequiredDescription
slideshow_idintegerOptionalThe slideshow ID
statusstringOptional"draft", "generating", "rendering", "completed", or "failed"
video_idstringOptionalOnly present when a video export exists. The ID of the video record. A slideshow can have multiple exports — this returns the latest.
video_statusstringOptionalOnly present when a video export exists. Granular rendering progress (e.g. "Downloading and processing images...", "Creating slideshow video...", "Finished").
Note: video_id and video_status are omitted entirely when no video record is linked to the slideshow. A slideshow without a video export is just a draft.

Status Flow

draftgeneratingrenderingcompletedorfailed
Response · 200 (with video export)
{
  "slideshow_id": 12345,
  "status": "rendering",
  "video_id": "67890",
  "video_status": "Creating slideshow video..."
}
Response · 200 (video completed)
{
  "slideshow_id": 12345,
  "status": "completed",
  "video_id": "67890",
  "video_status": "Finished"
}
Response · 200 (draft — no video export)
{
  "slideshow_id": 12345,
  "status": "draft"
}

Automations

Set up recurring schedules that generate and publish new slideshows to TikTok automatically.

POST

Create an automation

/automations

Set up a recurring schedule that generates and publishes new slideshows automatically to your connected TikTok account.

Request Body

ParameterTypeRequiredDescription
tiktok_account_idstringRequiredTarget TikTok account ID (from GET /tiktok/accounts)
scheduleobject[]RequiredArray of { cron: "cron-expression" } in Pacific time
titlestringOptionalDescriptive name for this automation
product_idintegerOptionalLink to a product in the products table
slideshow_hooksstring[]OptionalHook/topic templates the AI rotates through
stylestringOptionalNatural-language prompt controlling text items, fonts, sizes, positions, tone, and writing style
languagestringOptionalLanguage for generated content (default "English")
tiktok_post_settingsobjectOptionalTikTok posting config (see below)
image_settingsobjectOptionalImage and display config (see below)

tiktok_post_settings

ParameterTypeRequiredDescription
captionobjectOptional{ mode: "prompt"|"static", prompt_text, static_text }
descriptionobjectOptional{ mode: "prompt"|"static", prompt_text, static_text }
auto_postbooleanOptionalAuto-publish when ready (default true)
visibilitystringOptional"PUBLIC_TO_EVERYONE", "SELF_ONLY", "MUTUAL_FOLLOW_FRIENDS", "FOLLOWER_OF_CREATOR"
auto_musicbooleanOptionalLet TikTok add trending music (default true)
post_modestringOptional"MEDIA_UPLOAD" (draft) or "DIRECT_POST"
allow_commentsbooleanOptionalDefault true
allow_duetbooleanOptionalDefault true
allow_stitchbooleanOptionalDefault true

image_settings

ParameterTypeRequiredDescription
first_slideobjectOptional{ collection, mode, single_image }
all_slidesstringOptionalCollection ID for body slide images
aspect_ratiostringOptional"4:5" (default), "9:16", "1:1", etc.
is_bg_overlay_onbooleanOptionalOverlay on body slides (default false)
is_bg_overlay_on_hook_imagebooleanOptionalOverlay on hook slide (default false)
background_opacityintegerOptional0–100 (default 20)
keep_original_aspect_ratiobooleanOptionalUse each image's native ratio (default false)
text_on_first_slide_onlybooleanOptionalText on hook slide only (default false)
no_text_on_slidesbooleanOptionalRemove all text (default false)
auto_pull_imagesbooleanOptionalAuto-pull from Pinterest (default false)
auto_images_no_textbooleanOptionalNo text on auto-pulled images (default false)
disable_auto_image_for_first_slidebooleanOptionalDon't auto-pull for hook (default false)
hook_grid_formatstringOptional"single", "1:2", "1:3", "2:1", "2:2"
body_grid_formatstringOptionalGrid layout for body slides
cta_slideobjectOptional{ check, cta_collection_check, cta_collection_id, image_id }
Example Request
{
  "tiktok_account_id": "tt_abc123",
  "schedule": [{ "cron": "0 14 * * *" }],
  "title": "Fitness motivation posts",
  "slideshow_hooks": [
    "5 habits that changed my fitness journey",
    "What I eat in a day for muscle building"
  ],
  "style": "The first slide should have 1 large text item...",
  "language": "English",
  "tiktok_post_settings": {
    "caption": { "mode": "prompt", "prompt_text": "Write an engaging caption" },
    "auto_post": true,
    "visibility": "PUBLIC_TO_EVERYONE",
    "post_mode": "DIRECT_POST"
  },
  "image_settings": {
    "aspect_ratio": "4:5",
    "auto_pull_images": true,
    "is_bg_overlay_on": true,
    "background_opacity": 30
  }
}
Response · 201
{
  "automation_id": "a1b2c3d4-e5f6-...",
  "title": "Fitness motivation posts",
  "status": "active",
  "product_id": null,
  "tiktok_account_id": "tt_abc123",
  "schedule": [
    { "job_id": "f7g8h9i0-...", "cron": "0 14 * * *" }
  ],
  "slideshow_hooks": ["5 habits that changed my fitness journey"],
  "style": "The first slide should have 1 large text item...",
  "language": "English",
  "tiktok_post_settings": { ... },
  "image_settings": { ... },
  "created_at": "2026-03-24T10:00:00Z"
}
GET

List automations

/automations

Returns all automations belonging to the authenticated user.

Response · 200
{
  "automations": [
    {
      "automation_id": "a1b2c3d4-...",
      "title": "Fitness motivation posts",
      "status": "active",
      "schedule": [
        { "job_id": "f7g8h9i0-...", "cron": "0 14 * * *" }
      ],
      "slideshow_hooks": ["5 habits that..."],
      "created_at": "2026-03-24T10:00:00Z"
    }
  ]
}
GET

Get a single automation

/automations/{automation_id}

Returns the full details of one automation.

Path Parameters

ParameterTypeRequiredDescription
automation_idstringRequiredThe automation UUID
Response · 200
// Same shape as a single item in the list response
PATCH

Update an automation

/automations/{automation_id}

Update any combination of automation settings. To pause/unpause, send { action: 'pause' } or { action: 'unpause' } instead of config fields.

Request Body (config update)

ParameterTypeRequiredDescription
titlestringOptionalUpdate the title
slideshow_hooksstring[]OptionalReplace the hooks list
stylestringOptionalUpdate the style prompt
languagestringOptionalUpdate the language
tiktok_account_idstringOptionalChange target TikTok account
tiktok_post_settingsobjectOptionalUpdate TikTok posting settings
product_idintegerOptionalChange linked product
image_settingsobjectOptionalUpdate image/collection settings

Request Body (pause/unpause)

ParameterTypeRequiredDescription
actionstringRequired"pause" or "unpause"
Example Request (config)
{
  "slideshow_hooks": ["New hook 1", "New hook 2"],
  "style": "Each slide should have 2 text items..."
}
Example Request (pause)
{ "action": "pause" }
Response · 200
// Returns the full updated automation object
DELETE

Delete an automation

/automations/{automation_id}

Permanently delete an automation and all its scheduled jobs.

Path Parameters

ParameterTypeRequiredDescription
automation_idstringRequiredThe automation UUID
Response · 200
{ "message": "Automation deleted" }
POST

Run an automation (one-off)

/automations/{automation_id}/run

Trigger a one-off slideshow generation using the automation's saved settings. Does not affect the cron schedule.

Request Body (all optional)

ParameterTypeRequiredDescription
hookstringOptionalOverride the hook/topic for this single run. If omitted, picks randomly from the automation's hooks list.
modestringOptional"export" (default, generates video) or "draft_only" (slideshow draft only, no video)
Finding the video: The /run endpoint returns no video_id. Note the time before calling /run, then poll GET /videos?automation_id=...&created_after={time}&limit=1.
Example Request
{ "hook": "My top 5 productivity tools", "mode": "export" }
Response · 202
{
  "message": "Slideshow generation started",
  "automation_id": "a1b2c3d4-...",
  "status": "processing",
  "mode": "export",
  "hook": "My top 5 productivity tools"
}

Automation Schedules

Manage cron schedule jobs on an automation. All cron expressions are in Pacific time.

POST

Add a schedule job

/automations/{automation_id}/schedule

Add a new cron schedule to an automation.

Request Body

ParameterTypeRequiredDescription
cronstringRequiredCron expression in Pacific time (e.g. "0 14 * * *" for 2pm daily)
Example Request
{ "cron": "0 14 * * *" }
Response · 201
// Returns the full updated automation object
PATCH

Update schedule jobs

/automations/{automation_id}/schedule

Update one or more schedule jobs. Supports single update or batch operations.

Single Update

ParameterTypeRequiredDescription
job_idstringRequiredThe job to update
cronstringRequiredNew cron expression

Batch Update

ParameterTypeRequiredDescription
actionsobject[]RequiredArray of { type: "update"|"delete", job_id, cron }
Single Update
{ "job_id": "f7g8h9i0-...", "cron": "0 10 * * 1-5" }
Batch Update
{
  "actions": [
    { "type": "update", "job_id": "f7g8h9i0-...", "cron": "0 10 * * *" },
    { "type": "delete", "job_id": "k1l2m3n4-..." }
  ]
}
DELETE

Delete a schedule job

/automations/{automation_id}/schedule

Remove a single schedule job from an automation.

Request Body

ParameterTypeRequiredDescription
job_idstringRequiredThe job to remove
Example Request
{ "job_id": "f7g8h9i0-..." }
Response · 200
// Returns the full updated automation object

Videos

Access rendered videos, view TikTok analytics, and publish to TikTok.

GET

List videos

/videos

Returns rendered videos with optional filtering by automation, video type, status, finished/failed state, and date range. Only safe, public fields are returned.

Query Parameters

ParameterTypeRequiredDescription
automation_idstringOptionalFilter by automation (created_by_cron_id)
video_typestringOptional"slideshow", "ugc", or "greenscreen"
statusstringOptional"completed", "processing", or "failed"
finishedstringOptional"true" or "false"
failedstringOptional"true" or "false"
created_afterstringOptionalISO 8601 timestamp
created_beforestringOptionalISO 8601 timestamp
limitnumberOptionalMax results (default 20, max 100)
offsetnumberOptionalPagination offset

Response Fields

ParameterTypeRequiredDescription
created_atstringOptionalWhen the video was created
statusstringOptionalCurrent status from the videos table
finishedbooleanOptionalWhether the video has finished rendering
failedbooleanOptionalWhether the video failed during rendering
created_by_cron_idstringOptionalAutomation cron ID (null if created manually)
video_typestringOptional"slideshow", "ugc", or "greenscreen"
slideshow_imagesarrayOptionalRendered slide images (only when video_type is "slideshow")
promptstringOptionalGeneration prompt (only when video_type is "slideshow")
video_urlstringOptionalDirect .mp4 URL (only when video_type is "ugc" or "greenscreen")
Response · 200 (slideshow)
{
  "videos": [
    {
      "created_at": "2026-03-24T14:00:00Z",
      "status": "completed",
      "finished": true,
      "failed": false,
      "created_by_cron_id": "a1b2c3d4-...",
      "video_type": "slideshow",
      "slideshow_images": [
        { "id": 0, "image_url": "https://slides.reel.farm/slide_0.png" },
        { "id": 1, "image_url": "https://slides.reel.farm/slide_1.png" }
      ],
      "prompt": "5 habits that changed my morning routine"
    }
  ],
  "total": 42,
  "limit": 20,
  "offset": 0
}
Response · 200 (ugc/greenscreen)
{
  "videos": [
    {
      "created_at": "2026-03-25T10:30:00Z",
      "status": "completed",
      "finished": true,
      "failed": false,
      "created_by_cron_id": "e5f6g7h8-...",
      "video_type": "ugc",
      "video_url": "https://automated-content.s3.amazonaws.com/abc123.mp4"
    }
  ],
  "total": 5,
  "limit": 20,
  "offset": 0
}
GET

Get a single video

/videos/{video_id}

Returns full details for one video including slideshow images and TikTok publish status.

Path Parameters

ParameterTypeRequiredDescription
video_idstringRequiredThe video ID
Response · 200
// Same shape as a single item in the list response
GET

Get TikTok analytics

/videos/{video_id}/analytics

Returns TikTok post analytics. The video must have been published to TikTok (post_id must be present).

Path Parameters

ParameterTypeRequiredDescription
video_idstringRequiredThe video ID
Response · 200
{
  "post_id": "7123456789",
  "video_id": 12345,
  "title": "5 habits that changed my morning",
  "caption": "morning routine tips",
  "view_count": 15400,
  "like_count": 1230,
  "comment_count": 89,
  "share_count": 234,
  "bookmark_count": 567,
  "tiktok_account_id": "tt_abc123",
  "account_username": "@yourusername",
  "account_name": "Your Name",
  "event": "post.publish.publicly_available",
  "publish_type": "DIRECT_PUBLISH",
  "published_at": "2026-03-20T14:00:00Z"
}
POST

Publish a video to TikTok

/videos/{video_id}/publish

Publish a completed video using the automation's saved TikTok settings. The video must have status 'completed' and be linked to an automation.

Request Body (optional)

ParameterTypeRequiredDescription
post_modestringOptional"DIRECT_POST" (publish) or "MEDIA_UPLOAD" (TikTok draft). Defaults to the automation's setting.
Example Request
{ "post_mode": "DIRECT_POST" }
Response · 202
{
  "message": "TikTok publish started",
  "video_id": "uuid-1234",
  "automation_id": "a1b2c3d4-...",
  "status": "processing"
}

TikTok

List connected TikTok accounts and view post analytics.

GET

List connected accounts

/tiktok/accounts

Returns TikTok accounts connected via OAuth. Only safe fields are returned — no tokens.

Response · 200
{
  "accounts": [
    {
      "tiktok_account_id": "tt_abc123",
      "account_name": "Your Name",
      "account_username": "@yourusername",
      "account_image": "https://..."
    }
  ]
}
GET

List TikTok posts with analytics

/tiktok/posts

Returns all TikTok posts with engagement metrics and aggregated statistics.

Query Parameters

ParameterTypeRequiredDescription
timeframenumber | stringOptional7, 30, 90, or "all" (default 30)
sortstringOptional"recent", "views", "likes", "shares", "comments", "bookmarks"
tiktok_account_idstringOptionalFilter by account
limitnumberOptionalDefault 20, max 200
offsetnumberOptionalPagination offset
Response · 200
{
  "posts": [
    {
      "post_id": "7123456789",
      "video_id": 12345,
      "title": "5 habits that changed my morning",
      "view_count": 15400,
      "like_count": 1230,
      "comment_count": 89,
      "share_count": 234,
      "bookmark_count": 567,
      "account_username": "@yourusername",
      "published_at": "2026-03-20T14:00:00Z"
    }
  ],
  "statistics": {
    "total_posts": 28,
    "total_views": 450000,
    "total_likes": 34000,
    "total_comments": 2100,
    "total_shares": 5600,
    "total_bookmarks": 12000
  },
  "timeframe": 30,
  "sort": "recent",
  "limit": 20,
  "offset": 0
}

Collections

Browse image collections. Collections are currently read-only via the API — create and upload endpoints are coming soon.

GET

List image collections

/collections

Returns all image collections belonging to the authenticated user.

Response · 200
{
  "collections": [
    {
      "collection_id": 5191,
      "name": "Nature Photos",
      "created_at": "2026-03-10T08:00:00Z"
    }
  ]
}
GET

Get images in a collection

/collections/{collection_id}/images

Returns images in a collection, paginated (max 100 per page).

Query Parameters

ParameterTypeRequiredDescription
limitnumberOptionalMax results (default 100, max 100)
offsetnumberOptionalPagination offset
Response · 200
{
  "collection_id": 5191,
  "images": [
    {
      "image_id": 215115,
      "image_url": "https://...",
      "added_at": "2026-03-15T12:00:00Z",
      "created_at": "2026-03-14T09:00:00Z"
    }
  ],
  "total": 248,
  "limit": 100,
  "offset": 0
}

Slideshow Library

Browse real TikTok slideshow profiles for inspiration and competitive research.

GET

List available niches

/library/niches

Returns all unique niches with profile counts, sorted by most profiles.

Response · 200
{
  "niches": [
    { "name": "fitness", "profile_count": 142 },
    { "name": "spirituality", "profile_count": 87 },
    { "name": "personal finance", "profile_count": 63 }
  ],
  "total": 45
}
GET

Search the library

/library

Search real TikTok slideshow profiles by niche, slide text, product medium, or audience region. At least one filter is required.

Query Parameters

ParameterTypeRequiredDescription
qstringOptionalText search across slide content
nichestringOptionalFilter by niche (e.g. "fitness")
product_mediumstringOptionalFilter by product type
regionstringOptionalAccount region code (e.g. "US")
audience_regionstringOptionalAudience country code (e.g. "US")
sortstringOptional"followers" (default) or "recent"
limitnumberOptionalDefault 3, max 3
offsetnumberOptionalPagination offset
Response · 200
{
  "profiles": [
    {
      "profile_id": 8554,
      "username": "everythingofzodiac",
      "nickname": "All About Zodiac",
      "bio": "Your daily zodiac feed",
      "follower_count": "42.5K",
      "niche": "spirituality",
      "region": "NL",
      "audience_regions": [
        {
          "count": 20,
          "country": "United States",
          "percentage": "20.83%",
          "countryCode": "US"
        }
      ],
      "slideshows": [
        {
          "index": 0,
          "views": "5.0M",
          "likes": "233.1K",
          "bookmarks": "39.4K",
          "image_count": 13
        }
      ]
    }
  ],
  "total": 87,
  "limit": 3,
  "offset": 0
}
GET

Get a single profile

/library/profiles/{profile_id}

Returns full profile details including all slideshow images, following count, and link in bio.

Path Parameters

ParameterTypeRequiredDescription
profile_idintegerRequiredThe profile ID

Same fields as the search response, plus following_count and link_in_bio.

Response · 200
{
  "profile_id": 8554,
  "username": "everythingofzodiac",
  "nickname": "All About Zodiac",
  "follower_count": "42.5K",
  "following_count": "120",
  "link_in_bio": "https://example.com/shop",
  "slideshows": [ ... ]
}

Pinterest

Search Pinterest for high-resolution images to use in your slideshows.

Account

Retrieve account details, subscription tier, and remaining credits.

GET

Get account info

/account

Returns account details, subscription tier, and remaining credits. credits represents your monthly allotment (resets each billing cycle), while purchased_credits are one-time purchases that never reset.

Response Fields

ParameterTypeRequiredDescription
creditsnumberOptionalMonthly credit allotment (resets each billing cycle)
purchased_creditsnumberOptionalOne-time purchased credits (never reset)
ai_creditsnumberOptionalRemaining AI credits
subscription_tierstring | nullOptional"Starter", "Growth", "Scale", or "Unlimited"
cancelledbooleanOptionalWhether the subscription has been cancelled
next_reset_datestring | nullOptionalWhen credits next reset (billing cycle date)
Response · 200
{
  "name": "Jane Doe",
  "email": "jane@example.com",
  "user_id": "user_abc123",
  "cancelled": false,
  "next_reset_date": "2027-04-01",
  "subscription_tier": "Growth",
  "credits": 142,
  "ai_credits": 50,
  "purchased_credits": 0
}

Error Codes

All errors follow a consistent JSON format with an error message and machine-readable code.

StatusCodeMeaning
401UNAUTHORIZEDMissing or invalid API key
402INSUFFICIENT_CREDITSNot enough credits
403FORBIDDENInsufficient permissions
404NOT_FOUNDResource doesn't exist or doesn't belong to you
422VALIDATION_ERRORInvalid request body or parameters
429RATE_LIMITEDToo many requests
429CONCURRENT_LIMITToo many slideshows in progress (max 3)
Error Response Format
{
  "error": "Human-readable error message",
  "code": "ERROR_CODE"
}
Example · 401
{
  "error": "Missing or invalid API key",
  "code": "UNAUTHORIZED"
}
Example · 429
{
  "error": "Too many concurrent slideshows. You have 3 in progress. Max is 3.",
  "code": "CONCURRENT_LIMIT"
}

Rate Limits

All endpoints share a single rate limit of 20 requests per 60-second sliding window, keyed per user.

Response HeaderDescription
X-RateLimit-LimitMax requests in the window
X-RateLimit-RemainingRequests remaining
X-RateLimit-ResetUnix timestamp (ms) when window resets
Retry-AfterSeconds to wait before retrying
Concurrent limit: Max 3 slideshows generating simultaneously. Wait for one to complete before starting another.
Rate Limited Response · 429
{
  "error": "Rate limit exceeded. Try again in 45 seconds.",
  "code": "RATE_LIMITED"
}

// Response Headers:
// X-RateLimit-Limit: 20
// X-RateLimit-Remaining: 0
// X-RateLimit-Reset: 1711324800000
// Retry-After: 45
ReelFarm - AI TikTok Automation & Video Marketing