API Reference
The doublespeed REST API lets you list and manage posts, discover templates, enqueue comments, manage comment monitors, and clone videos programmatically. Every endpoint is scoped to a single product through its API key.
Authentication
Generate a key from the API tab in your product dashboard, then send it in the Authorization header on every request:
Authorization: Bearer ds-your-api-key-hereThe key determines the product scope. Endpoints ignore any product_id or userId sent in the query or body.
Posts
GET /api/v1/posts
List scheduled or posted posts for your product.
| Parameter | Required | Description |
|---|---|---|
status | Yes | scheduled, posted, or all |
account_id | No | Filter to a specific account (UUID) |
page_size | No | Items per page, default 20, max 100 |
page | No | Page number, default 1 |
date_from / date_to | No | Inclusive YYYY-MM-DD date filters |
Responses are paginated (page, page_size, total_count, total_pages) and each post includes its status, account, caption, public post URL, and view/like/comment stats once live.
curl -H "Authorization: Bearer ds-your-api-key-here" \
"https://doublespeed.ai/api/v1/posts?status=posted&page_size=20"The other post endpoints cover the rest of the lifecycle:
POST /api/posts/createcreates a video or slideshow post in one multipart request: caption, files, target account (orrandomAccount), optional music. The post takes the account's next open posting slot, or the time given asscheduledAtwhen it falls between 8 AM and 8 PM Pacific and the account's scheduling rules (posts-per-day target, cooldown, device gaps, warms, and a 5-minute gap from the product's other accounts) allow it; the response carries the lockedscheduledAt, orestimatedScheduledAtwhile posting is paused.GET /api/v1/posts/queuelists each account's queued posts in firing order with each one's lockedscheduled_at(or anestimated_atwhile posting is paused);POST /api/v1/posts/queue/reorderswaps the slots of the posts you name so they go out in the order you give. Pausing and resuming posting keeps that order.PATCH /api/v1/posts/{post_id}/statusmoves a post betweendraftandscheduled. Scheduling places the post in the account's next available slot.DELETE /api/v1/posts/{post_id}removes a queued (scheduled) post. For live or pending posts,POST /api/v1/posts/{post_id}/deletion-requestfiles a tracked deletion request instead; the post is markeddelete_requestedfor follow-up rather than hard-deleted.
Post outcome webhooks
Instead of polling, register signed webhooks through /api/v1/webhooks (GET, POST, and PATCH/DELETE on /api/v1/webhooks/{webhook_id}). Up to 5 endpoints per product receive post.succeeded and post.failed the moment an outcome is known, and post.linked once the live post URL exists. The embedded post object matches GET /api/v1/posts items. Each endpoint keeps a paginated delivery history (GET /api/v1/webhooks/{webhook_id}/deliveries) with per-delivery resend, plus a POST /api/v1/webhooks/{webhook_id}/test event. Failed deliveries retry with backoff for up to 7 attempts; signatures use the same x-doublespeed-signature scheme as comment webhooks.
Templates
GET /api/v1/templates
List lightweight template metadata: id, name, description, thumbnail and preview URLs, tags, pinned/public flags, and timestamps. Pinned templates sort first, then most recently updated.
| Parameter | Required | Description |
|---|---|---|
search | No | Case-insensitive name or description pattern |
only_pinned | No | true to return only pinned templates |
page / page_size | No | Pagination, default 1 / 20, max 100 |
Comments
POST /api/v1/comments
Enqueue pre-written comments on public TikTok posts. Each request takes 1 to 500 rows of { postLink, comment }; comments are placed on a humanized schedule, by default at a random time between 5 minutes and 24 hours after submission. Pass placement_window: { min_hours, max_hours } for a tighter window (max 24 hours).
{
"rows": [
{
"postLink": "https://www.tiktok.com/@creator/video/7491234567890123456",
"comment": "This is so good"
}
],
"placement_window": { "min_hours": 8, "max_hours": 12 }
}Exact-duplicate comments on the same post are skipped rather than double-posted, so retrying a failed request is safe. Comments are billed to your product only when they actually publish.
GET /api/v1/comments/status
Poll delivery status for previously enqueued comment ids. Signed webhooks for status changes are available through the /api/v1/comments/webhook endpoints.
Comment Monitors
GET /api/v1/monitors
List your product's live comment monitors, then manage each monitor's tracked TikTok creators:
GET /api/v1/monitors/{monitorId}/accountslists tracked creators (paginated).POSTandDELETEon the same path add and remove creators by username.
Monitor creation and deletion happen in the dashboard, not through the API.
Clone
POST /api/v1/clone
Clone a source video into a fresh 15 second AI generation. Only source (a public video URL) is required; add a product object (name, description, and optional tone, audience, imageUrl) to have the clone feature your product, or omit it to recreate the reference faithfully. Optional prompt adds creative direction and voiceover: true generates native spoken audio.
Generation takes minutes, so the POST returns immediately with a jobId; poll GET /api/v1/clone/{jobId} for the result. Requests that the product's credit balance cannot cover return 402.
Errors
All endpoints return 400 for invalid parameters and 401 when the API key is missing, inactive, or invalid. Error bodies are JSON with ok: false and a message.