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-here

The 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.

ParameterRequiredDescription
statusYesscheduled, posted, or all
account_idNoFilter to a specific account (UUID)
page_sizeNoItems per page, default 20, max 100
pageNoPage number, default 1
date_from / date_toNoInclusive 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/create creates a video or slideshow post in one multipart request: caption, files, target account (or randomAccount), optional music. The post takes the account's next open posting slot, or the time given as scheduledAt when 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 locked scheduledAt, or estimatedScheduledAt while posting is paused.
  • GET /api/v1/posts/queue lists each account's queued posts in firing order with each one's locked scheduled_at (or an estimated_at while posting is paused); POST /api/v1/posts/queue/reorder swaps 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}/status moves a post between draft and scheduled. 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-request files a tracked deletion request instead; the post is marked delete_requested for 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.

ParameterRequiredDescription
searchNoCase-insensitive name or description pattern
only_pinnedNotrue to return only pinned templates
page / page_sizeNoPagination, 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}/accounts lists tracked creators (paginated).
  • POST and DELETE on 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.