GET /videos
List analyzed videos with filtering and sorting.
platform | string | instagram | tiktok |
username | string | Filter by creator handle (partial match) |
min_views | int | Minimum view count |
max_views | int | Maximum view count |
min_engagement | float | Minimum engagement rate |
published_after | ISO 8601 | Published on or after this timestamp |
published_before | ISO 8601 | Published on or before this timestamp |
format_id | int | Filter by viral format class |
hook_id | int | Filter by hook class |
tactic_id | int | Only videos using this tactic |
category_id | int | Filter by content category |
sort_by | string | views (default) | likes | comments | shares | engagement_rate | published_at | created_at | viral_probability | duration |
order | string | asc | desc (default desc) |
limit | int | Results per page (default 20, max 100) |
offset | int | Pagination offset (default 0) |
curl "https://api.blossai.com/api/v1/videos?platform=tiktok&min_views=100000&sort_by=engagement_rate&limit=10" \
-H "X-API-Key: $BLOSSOM_API_KEY" {
"data": [
{
"id": 18234,
"platform": "tiktok",
"username": "creator_handle",
"content_type": "video",
"content_url": "https://www.tiktok.com/@creator_handle/video/...",
"caption": "POV: you finally understand the algorithm",
"duration_sec": 27,
"views": 1283000,
"likes": 145200,
"comments": 3100,
"shares": 8900,
"saves": 12400,
"engagement_rate": 13.2,
"published_at": "2026-05-28T16:00:00.000Z",
"hashtags": ["#fyp", "#tutorial"],
"thumbnail_url": "https://...",
"format_id": 4,
"format_name": "Talking Head Tutorial",
"hook_id": 9,
"hook_name": "Direct Question",
"final_viral_probability": 0.82
}
],
"pagination": { "total": 1543, "limit": 10, "offset": 0, "has_more": true },
"meta": { "timestamp": "2026-06-12T10:00:00.000Z" }
}
Social Publishing
Manage connected Instagram / TikTok accounts and publish content through them — drafts, scheduling metadata, media, publishing, and post-performance metrics. Accounts are connected once in the Blossom dashboard; the API drives everything after that.
GET
/social/accountsList your connected social accounts.
platforminstagram|tiktokstatusconnected,expired)limitoffsetGET
/social/accounts/:idSingle connected account.
POST
/social/accounts/:id/sync-profileRefresh profile metadata (name, bio, follower count, avatar) from the platform.
POST
/social/accounts/:id/sync-postsPull the account's latest posts into Blossom and refresh their metrics.
amountGET
/social/postsList posts created or synced for your account.
account_idstatusdraft|scheduled|publishing|published|failedcontent_typepost|video|reel|carouselsort_bypublished_at)orderasc|desc(defaultdesc)limitoffsetGET
/social/posts/:idSingle post, including a
metricsHistoryarray of snapshots.POST
/social/postsCreate a post as a draft (or with scheduling metadata).
Creating and publishing are separate steps — see
POST /social/posts/:id/publish. Returns201 Createdwith the full post row.account_idcontent_typepost(default) |video|reel|carouselcaptionscheduled_forhashtagsnotesmedia_urlsthumbnail_urlcover_image_urlpost= 1 image,video/reel= 1 video,carousel= 2–10 mixed; TikTokvideo= 1 video (≤4GB),carousel= 2–35 images. Stories are not supported.media_urlsmust point at Blossom-hosted (Supabase) storage. Arbitrary external hosts are rejected with400 bad_requestunless external media is enabled for your deployment.PATCH
/social/posts/:idUpdate a draft or scheduled post.
Same fields as create, except
account_idis immutable.media_urlssemantics: omitted = keep existing media,[]= clear all, non-empty = replace wholesale.POST
/social/posts/:id/mediaAppend media URLs without replacing existing media.
media_urls400 bad_request.POST
/social/posts/:id/publishPublish a draft or scheduled post now.
Instagram publishes synchronously — the response has
status: "published"withplatform_post_idand the canonicalpost_url. TikTok is asynchronous — the response hasstatus: "publishing"and apublish_id; pollGET /social/posts/:iduntil it resolves topublishedorfailed.scheduled_foris planning metadata surfaced in the dashboard — there is no autopilot. Even scheduled posts publish only when this endpoint (or the dashboard button) is called.GET
/social/posts/:id/metricsHistorical metric snapshots (likes, views, comments, shares, saves) for a published post.
GET
/social/analytics/dashboardTop-level stats across all connected accounts.
GET
/social/analytics/overviewAggregated engagement and reach over a time window.
period7d|30d(default) |90daccount_id