Build with the Slidestorm API

Go from a text prompt to a published TikTok slideshow in three API calls. Slidestorm generates the images, bakes the captions, and handles delivery — you just send the prompt.

Beta notice: The Slidestorm API is in beta. Endpoints and schemas may change as we refine things.

How it works

1

See what you have to work with

Fetch your connected TikTok accounts, browse the available image styles and collections, and make sure you have enough credits before generating.

List connected accounts
curl https://slidestorm.ai/api/v1/accounts \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Response:
# {
#   "ok": true,
#   "data": {
#     "accounts": [
#       { "id": "01JT5...", "platform": "tiktok", "username": "mychannel", ... }
#     ]
#   }
# }
Browse image styles
curl https://slidestorm.ai/api/v1/image-styles \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Response:
# {
#   "ok": true,
#   "data": {
#     "styles": [
#       { "id": "01JT5...", "name": "cinematic", "display_name": "Cinematic", "style_prompt": "..." }
#     ]
#   }
# }
Check credits
curl https://slidestorm.ai/api/v1/usage \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Response:
# {
#   "ok": true,
#   "data": {
#     "credits": {
#       "remaining": 47,
#       "subscription_remaining": 30,
#       "pack_remaining": 17,
#       "has_active_subscription": true
#     },
#     "costs": {
#       "slideshow_generation": 1,
#       "image_generation": 3
#     }
#   }
# }
2

Generate a slideshow

Send a text prompt and Slidestorm writes the captions, generates the images, and assembles everything into a slideshow. Poll until it's ready.

Create slideshow
curl -X POST https://slidestorm.ai/api/v1/slideshows \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: my-unique-key-1" \
  -d '{
    "prompt": "5 practical coffee brewing tips for beginners",
    "slide_count": 5,
    "background_option": "generate",
    "image_style_id": "01JT5..."
  }'

# You can also use "custom_image_style" instead of "image_style_id":
#   "custom_image_style": "warm cinematic lighting"

# Response (201):
# {
#   "ok": true,
#   "data": {
#     "slideshow": { "id": "01JT5...", "title": "Generating...", "status": "generating" },
#     "polling": { "endpoint": "/api/v1/slideshows/01JT5...", "status": "generating" }
#   }
# }
#
# Possible 422 errors include:
# - invalid_payload
# - idempotency_key_required
# - invalid_idempotency_key
# - slideshow_create_failed
Poll until complete
curl https://slidestorm.ai/api/v1/slideshows/01JT5... \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Poll until data.slideshow.status is "completed", "failed", or "timed_out"
# Prefer lifecycle hints for automation:
# - should_poll=true -> keep polling
# - should_poll=false + next_action="create_post" -> call POST /posts
# - should_poll=false + next_action="create_new_slideshow" -> stop and create a new slideshow request
# The response includes generation_summary with per-image progress:
#   "generation_summary": {
#     "total_slides": 5,
#     "completed_images": 3,
#     "failed_images": 0,
#     "pending_images": 2,
#     "missing_images": 0
#   }
# The response also includes diagnostics for timeout analysis:
#   "diagnostics": {
#     "failure_code": null,
#     "timed_out_at": null,
#     "last_progress_at": "2026-04-24T19:03:00.000Z",
#     "timeout_threshold_minutes": 30
#   }
# Do not keep creating new slideshows while should_poll=true.
3

Post to TikTok

Once the slideshow is ready, post it to one or more of your TikTok accounts. Slidestorm uses TikTok inbox upload mode, so you must open TikTok and publish manually after the upload succeeds.

Create post
curl -X POST https://slidestorm.ai/api/v1/posts \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "caption": "5 coffee tips you need to know",
    "slideshow_id": "01JT5...",
    "accounts": [{ "id": "YOUR_ACCOUNT_ID" }],
    "external_id": "my-post-abc123",
    "platform_configurations": {
      "tiktok": {
        "post_mode": "MEDIA_UPLOAD"
      }
    }
  }'

# post_mode currently supports MEDIA_UPLOAD only.
# MEDIA_UPLOAD uploads to TikTok inbox; user must publish manually in TikTok app.
# Text is validated before delivery (no auto-truncation):
# - title limit: 90 characters (derived from caption start)
# - description limit: 4000 characters
#
# Response (201):
# {
#   "ok": true,
#   "data": {
#     "post": {
#       "id": "01JT5...",
#       "type": "slideshow",
#       "platform": "tiktok",
#       "status": "pending",
#       "caption": "5 coffee tips you need to know",
#       "scheduled_at": "2026-04-24T19:00:00.000Z",
#       "created_at": "2026-04-24T19:00:00.000Z",
#       "external_id": "my-post-abc123",
#       "accounts": {
#         "total": 1,
#         "states": [
#           { "account_id": "01JT5...", "status": "pending", ... }
#         ]
#       }
#     },
#     "duplicate": false
#   }
# }
Sync status after create
curl -X POST https://slidestorm.ai/api/v1/posts/01JT5.../check-status \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Use data.status fields to drive automation:
# - post_status
# - provider_status
# - is_terminal
# - is_recoverable
#
# uploaded = sent to TikTok inbox for manual publish
# posted = published/completed

Why use the Slidestorm API?

Captions built in

TikTok slideshows need text burned into every image. Slidestorm renders captions onto your slides automatically — no image-processing pipeline required on your end.

TikTok complexity handled

OAuth tokens, image hosting, creator info lookups, and post status polling — all wrapped behind a single, straightforward endpoint.

Prompt in, slideshow out

Give Slidestorm a topic and it writes the captions, generates matching AI images, and packages everything into a ready-to-post slideshow.

Safe to retry

Idempotency keys for slideshows and external IDs for posts are built in. If something fails, just retry — you won't create duplicates.

Authentication

Every API request needs a bearer token. Create one from your account settings and you're ready to go. All resource IDs are ULIDs (26-character strings).

All endpoints are rate limited. If you hit the limit you'll receive a 429 with error_code=rate_limited — just back off and retry.

curl https://slidestorm.ai/api/v1/accounts \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

Endpoints

All endpoints are prefixed with https://slidestorm.ai/api/v1.

Discovery

GET/accounts— your connected TikTok accounts
GET/image-styles— browse image generation styles
GET/collections— browse image collections for backgrounds
GET/usage— credit balance and costs

Slideshows

POST/slideshows— start generating a new slideshow
GET/slideshows/{id}— check progress and get slides

Posts

POST/posts— post a completed slideshow to TikTok
GET/posts— list your posts, optionally filtered by status
GET/posts/{id}— get a post and its delivery status
POST/posts/{id}/check-status— refresh delivery status from TikTok
PATCH/posts/{id}— update a mutable post
POST/posts/{id}/retry— retry failed deliveries
DELETE/posts/{id}— delete a pending or scheduled post

Key concepts

Idempotency

Both slideshow creation and posting are safe to retry. POST /slideshows requires an Idempotency-Key header — send the same key with the same payload and you get the original response back, no duplicate created. Send the same key with a different payload and you'll get a 409. For posts, use the optional external_id field: matching payloads return the existing post with duplicate: true, while a mismatched payload returns 409 with error_code=external_id_reused_with_different_payload.

Polling

Slideshows are generated asynchronously. After creating one, poll GET /slideshows/{id} every few seconds while should_poll=true. Use next_action to drive automation: poll, create_post, or create_new_slideshow. While polling, track progress via generation_summary and inspect diagnostics if something goes wrong.

Post lifecycle

A post's overall status is derived from its per-account delivery outcomes. The typical flow is pendinguploadedposted. In this flow, uploaded means the post reached TikTok inbox, and publish is completed only after manual action in TikTok app. Call POST /posts/{id}/check-status to refresh the latest state from TikTok. If a delivery fails, check is_recoverable to see if you can retry it.

Response envelope

Every response uses the same predictable shape: ok, code, message, and data on success — or error_code and issues on failure. No guessing.

Error response example
{
  "ok": false,
  "code": 422,
  "message": "Invalid payload",
  "error_code": "invalid_payload",
  "issues": {
    "field_errors": {
      "caption": ["The caption field is required."]
    }
  }
}

Slideshow creation options

Here are the fields you can send to POST /slideshows. Don't forget the Idempotency-Key header.

FieldRequiredDescription
promptYesTopic or instructions for the slideshow
slide_countYesNumber of slides (1–12)
background_optionYesgenerate, library, or single
image_style_idConditionalRequired with generate if no custom_image_style
custom_image_styleConditionalFree-text style prompt (max 1000 chars). Alternative to image_style_id
collection_idConditionalRequired when background_option is library
single_image_idConditionalRequired when background_option is single
reference_image_idNoReference image for style guidance
influencer_idNoInfluencer preset for consistent branding
modelNoImage generation model override

Managing posts

Once a post is created, you can track its delivery, retry failures, or update it before it goes out.

List posts (with optional status filter)
curl "https://slidestorm.ai/api/v1/posts?status=failed&page=1&per_page=20" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Valid statuses: pending, scheduled, uploaded, posted, failed, cancelled, partial
# - pending = due-now pending posts
# - scheduled = future pending posts
# - partial = mixed delivery outcomes
#
# Each post includes title/description/caption plus:
# - social_account summary
# - postable summary (id, type, title, preview_image_url)
# - post.type can currently be: slideshow, video, talking_head_video
# - convenience fields (can_check_status, can_link_to_post, tiktok_url)
Retry failed deliveries
curl -X POST https://slidestorm.ai/api/v1/posts/01JT5.../retry \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ "account_ids": ["01JT5..."] }'

# account_ids is optional — omit to retry all failed/cancelled deliveries
Sync TikTok status now
curl -X POST https://slidestorm.ai/api/v1/posts/01JT5.../check-status \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Response includes data.status with:
# - post_status
# - provider_status
# - is_terminal
# - is_recoverable
# - platform_post_id
# - progress
#
# Note: uploaded means sent to TikTok inbox for manual review,
# not necessarily publicly posted.
#
# Provider sync failures can return:
# - platform_api_error (500)
# - post_status_check_error (500)
Update a mutable post
curl -X PATCH https://slidestorm.ai/api/v1/posts/01JT5... \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{ "caption": "Updated caption" }'

# Mutable statuses: pending, scheduled, failed, partial
# Updatable fields: caption, accounts, scheduled_at, platform_configurations
Delete a post
curl -X DELETE https://slidestorm.ai/api/v1/posts/01JT5... \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json"

# Only pending or scheduled posts can be deleted