How it works
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.
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", ... }
# ]
# }
# }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": "..." }
# ]
# }
# }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
# }
# }
# }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.
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_failedcurl 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.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.
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
# }
# }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/completedWhy use the Slidestorm API?
TikTok slideshows need text burned into every image. Slidestorm renders captions onto your slides automatically — no image-processing pipeline required on your end.
OAuth tokens, image hosting, creator info lookups, and post status polling — all wrapped behind a single, straightforward endpoint.
Give Slidestorm a topic and it writes the captions, generates matching AI images, and packages everything into a ready-to-post slideshow.
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 accountsGET/image-styles— browse image generation stylesGET/collections— browse image collections for backgroundsGET/usage— credit balance and costsSlideshows
POST/slideshows— start generating a new slideshowGET/slideshows/{id}— check progress and get slidesPosts
POST/posts— post a completed slideshow to TikTokGET/posts— list your posts, optionally filtered by statusGET/posts/{id}— get a post and its delivery statusPOST/posts/{id}/check-status— refresh delivery status from TikTokPATCH/posts/{id}— update a mutable postPOST/posts/{id}/retry— retry failed deliveriesDELETE/posts/{id}— delete a pending or scheduled postKey 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 pending → uploaded → posted. 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.
{
"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.
| Field | Required | Description |
|---|---|---|
prompt | Yes | Topic or instructions for the slideshow |
slide_count | Yes | Number of slides (1–12) |
background_option | Yes | generate, library, or single |
image_style_id | Conditional | Required with generate if no custom_image_style |
custom_image_style | Conditional | Free-text style prompt (max 1000 chars). Alternative to image_style_id |
collection_id | Conditional | Required when background_option is library |
single_image_id | Conditional | Required when background_option is single |
reference_image_id | No | Reference image for style guidance |
influencer_id | No | Influencer preset for consistent branding |
model | No | Image generation model override |
Managing posts
Once a post is created, you can track its delivery, retry failures, or update it before it goes out.
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)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 deliveriescurl -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)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_configurationscurl -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