Ssemble API
Endpoints

List Posts

List your scheduled and published social posts with status, public URL and publish time.

GET /posts

Returns the social posts made from your clips on YouTube, Instagram and TikTok: what is scheduled, what is still uploading, what is live (with its public URL and publish time), and what failed (with a plain-language reason). Posts scheduled by hand from the shorts list and posts made by channel automation are both included; the source field tells them apart.

Typical use: after shorts.completed you schedule clips to your accounts; poll this endpoint once a minute with date=published&since=<last check> to collect the links of posts that just went live.


Query parameters

ParameterTypeDefaultDescription
pagenumber1Page number (starting from 1)
limitnumber50Items per page (1–100)
statusstring—scheduled, processing, published, failed or canceled (see Post statuses)
platformstring—youtube, instagram or tiktok
sourcestring—manual (scheduled from the shorts list) or automation (channel automation)
requestIdstring—Only posts made from this request
shortIdstring—Only posts made from this clip
sincestring—ISO 8601 lower bound
untilstring—ISO 8601 upper bound
datestringscheduledWhich timestamp since/until filter and sort by: scheduled (the planned time) or published (when it went live; implies status=published)

Results are newest first.


Request

# posts that went live in the last hour
curl -H "X-API-Key: sk_ssemble_your_key" \
  "https://aiclipping.ssemble.com/api/v1/posts?date=published&since=2026-10-09T05:00:00Z&limit=100"

Response

{
  "data": {
    "posts": [
      {
        "id": "6ac8829c0000000000000001",
        "platform": "youtube",
        "status": "published",
        "scheduledAt": "2026-10-09T06:15:00.000Z",
        "publishedAt": "2026-10-09T06:15:02.827Z",
        "url": "https://www.youtube.com/watch?v=cR9Ki-TtW-w",
        "shortId": "a1581dd6-9f1c-4a7e-9b1a-2c3d4e5f6a7b",
        "requestId": "6a8d8d41aefabd4ce4f5b66f",
        "title": "Build a VM for VS Code",
        "account": { "handle": "deepak anand" },
        "source": "manual",
        "error": null,
        "errorCode": null,
        "retryable": null,
        "createdAt": "2026-10-09T05:50:12.000Z"
      },
      {
        "id": "6ac8829e0000000000000002",
        "platform": "tiktok",
        "status": "processing",
        "scheduledAt": "2026-10-09T06:15:00.000Z",
        "publishedAt": null,
        "url": null,
        "shortId": "a1581dd6-9f1c-4a7e-9b1a-2c3d4e5f6a7b",
        "requestId": "6a8d8d41aefabd4ce4f5b66f",
        "title": "Build a VM for VS Code",
        "account": { "handle": "DripSnipsHQ" },
        "source": "manual",
        "error": null,
        "errorCode": null,
        "retryable": null,
        "createdAt": "2026-10-09T05:50:12.000Z"
      },
      {
        "id": "6ac8829e0000000000000003",
        "platform": "instagram",
        "status": "failed",
        "scheduledAt": "2026-10-09T06:15:00.000Z",
        "publishedAt": null,
        "url": null,
        "shortId": "a1581dd6-9f1c-4a7e-9b1a-2c3d4e5f6a7b",
        "requestId": "6a8d8d41aefabd4ce4f5b66f",
        "title": "Build a VM for VS Code",
        "account": { "handle": "dripsnips" },
        "source": "automation",
        "error": "Instagram disconnected this account. Reconnect it in Social Accounts, then schedule the post again.",
        "errorCode": "auth_expired",
        "retryable": false,
        "createdAt": "2026-10-09T05:50:12.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "totalPages": 1,
      "totalCount": 3
    }
  }
}
FieldDescription
idPost ID
platformyoutube, instagram or tiktok
statusSee Post statuses
scheduledAtWhen the post was due to go out
publishedAtWhen the platform confirmed it (only for published)
urlPublic URL of the post (only for published)
shortId, requestIdThe clip and the request it came from
titleCaption / title used for the post
account.handleThe connected account it was posted to
sourcemanual or automation
error, errorCode, retryableOnly for failed: a plain-language reason, a stable code, and whether rescheduling can fix it (see below)

The same posts array is also attached to each short in GET /shorts/:id.


Post statuses

StatusMeaning
scheduledQueued for a future time
processingBeing uploaded, or accepted by the platform and waiting for it to finish (TikTok typically takes 1–3 minutes to assign the public URL)
publishedLive; url and publishedAt are set
failedNot published; error says why
canceledRemoved by the user before it went out

Typical time from scheduledAt to published: YouTube within seconds, Instagram 1–3 minutes, TikTok 2–4 minutes.


Failure reasons

errorCodeMeaningretryable
auth_expiredThe connected account's token expired or was revoked. Reconnect it in Social Accounts.false
daily_capThe platform's daily posting or upload limit was reached. Resets within 24 hours.true
account_restrictedTikTok's spam filter blocked the post from this account (spam_risk). The user has to resolve it in the TikTok app.false
account_not_eligibleAccount type can't post this way (Instagram personal account, Google account without a YouTube channel, TikTok permissions not granted).false
media_rejectedThe platform rejected the video (length, format, resolution, frame rate). Re-export the clip.false
video_missingThe clip's video file is no longer available. Re-create the clip.false
processing_timeoutThe platform didn't finish processing the video in time.true
rate_limitedThe platform is temporarily limiting requests.true
unknownAnything else; error includes the platform's own message.true

retryable: true means scheduling the post again at a later time is a reasonable fix; false means the user has to change something first.


Polling for newly published posts

Keep the time of your last check and ask for everything published since then. publishedAt is the watermark and id is the dedupe key.

let since = new Date().toISOString();
const seen = new Set();
 
setInterval(async () => {
  const res = await fetch(
    `https://aiclipping.ssemble.com/api/v1/posts?date=published&since=${encodeURIComponent(since)}&limit=100`,
    { headers: { 'X-API-Key': 'sk_ssemble_your_key' } }
  );
  const { data } = await res.json();
  for (const post of data.posts) {
    if (seen.has(post.id)) continue;
    seen.add(post.id);
    await submitLink(post.platform, post.url, post.publishedAt); // your side
    if (post.publishedAt > since) since = post.publishedAt;
  }
}, 60_000);

Once a minute is well within the rate limit (500 requests per minute per key).


Errors

HTTPerror.codeWhen
400invalid_requestA query parameter is invalid; the message names it
401missing_api_key / invalid_api_keyMissing, malformed or revoked key
403subscription_requiredThe key's account has no active subscription
429rate_limit_exceededToo many requests; see X-RateLimit-* headers and details.retryAfter

On this page