DEVELOPER API · 36 ENDPOINTS · REST + MCP

BUILD ON THE
VIRAL ENGINE.

Everything Blossom knows — the analyzed video library, trending formats, hooks and songs, full AI video analysis, and Instagram/TikTok publishing — behind one key.

Base URL
https://api.blossai.com/api/v1

Getting started

Create an API key in the dashboard under Account → API Keys. REST access is included on the Pro and Agency plans; the Creator plan includes the MCP server instead. Your key is shown once at creation — store it like a password.

Your first request
curl "https://api.blossai.com/api/v1/videos?limit=5" \
  -H "X-API-Key: blsm_your_key_here"

Authentication

Every request authenticates with an X-API-Key header. Keys look like blsm_ followed by 40 hex characters. We store only a SHA-256 hash — the raw key is never persisted and cannot be recovered, only rotated.

  • Category scoping — keys can be limited to specific content categories. A scoped key only ever sees data from its categories; everything else returns 404.
  • Rotation & revocation — create, rename, re-scope, and revoke keys anytime from the dashboard.
  • Use the X-API-Key header only — the Authorization header is reserved for dashboard sessions.

Plans & rate limits

Plan REST API Rate limit MCP server
Creator Not included Included
Pro Included 30 req/min Included
Agency Included Set in your contract Included
  • Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers; 429 responses add Retry-After.
  • Analysis quotas — analysis triggers share your dashboard allowance: 50/hour on Pro, and your contracted rate on Agency.
  • On the Creator plan, REST calls return 403 rest_api_not_included — the MCP server is the way in.

Responses & errors

Every successful response wraps its payload in data, adds pagination on list endpoints, and stamps a meta.timestamp. Errors use one envelope everywhere:

{ "error": { "code": "rate_limit_exceeded", "message": "Rate limit exceeded. Limit: 30 requests per minute.", "retry_after": 12 } }
Status Code Meaning
401 missing_api_key No X-API-Key header on the request
401 invalid_api_key Key is unknown, revoked, or malformed
403 insufficient_plan Your plan does not include API access
403 rest_api_not_included Creator plan — REST not included (MCP still works)
400 invalid_request Missing or malformed input (message has details)
400 invalid_url URL is not a TikTok or Instagram post
400 bad_request Validation failed (e.g. media rules, immutable field)
404 not_found Resource missing or outside your key’s scope
413 file_too_large Upload exceeds the 100MB limit
429 rate_limit_exceeded Per-minute rate limit hit — respect Retry-After
429 hourly_quota_exceeded Hourly analysis quota reached
429 monthly_quota_exceeded Monthly analysis quota reached
500 internal_error Something failed on our side

Videos

The analyzed video library. Every video has been through the full AI pipeline: format and hook classification, tactic detection, and virality scoring.

GET /videos

List analyzed videos with filtering and sorting.

Query parameters
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)
Example request
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"
Response
{
  "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" }
}

GET /videos/:id

Full detail for one video.

Everything from the list payload plus the full analysis JSON, the format/hook classification with confidence, detected tactics with execution scores, keywords with relevance weights, and linked music.

Example request
curl "https://api.blossai.com/api/v1/videos/18234" \
  -H "X-API-Key: $BLOSSOM_API_KEY"
Response
{
  "data": {
    "id": 18234,
    "platform": "tiktok",
    "...": "all list fields, plus:",
    "analysis_json": { "...": "full AI analysis" },
    "classification": {
      "format_id": 4, "format_name": "Talking Head Tutorial",
      "hook_id": 9, "hook_name": "Direct Question",
      "confidence": 0.94
    },
    "tactics": [
      { "id": 7, "name": "Fast cuts", "category": "editing", "viewer_effect": "retention", "execution_score": 8.5 }
    ],
    "keywords": [
      { "id": 112, "name": "productivity", "category": "topic", "relevance_weight": 0.91 }
    ],
    "music": [
      { "id": 12, "title": "Track Name", "artist": "Artist", "platform": "tiktok", "video_count": 234 }
    ]
  },
  "meta": { "timestamp": "2026-06-12T10:00:00.000Z" }
}

Influencers

Creator profiles aggregated from the video library, with audience and performance stats.

GET /influencers

List creators with filtering and sorting.

Query parameters
platform string instagram | tiktok
search string Search by username / display name
tier string Audience size tier: nano | micro | mid | macro | mega
followers_min int Minimum follower count
followers_max int Maximum follower count
engagement_min float Minimum average engagement rate
engagement_max float Maximum average engagement rate
created_after ISO 8601 Profiles added after this timestamp
updated_after ISO 8601 Profiles refreshed after this timestamp
sort_by string follower_count (default) | total_views | avg_views | viral_video_count | avg_engagement_rate | total_videos_fetched
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)
Example request
curl "https://api.blossai.com/api/v1/influencers?tier=micro&sort_by=avg_engagement_rate" \
  -H "X-API-Key: $BLOSSOM_API_KEY"

GET /influencers/:id

Single creator profile with performance stats and recent videos.

Classes & Library

The classification taxonomy behind every analysis: viral formats, hooks, tactics, music, AI content suggestions, and your accessible categories. All list endpoints share the same envelope and pagination.

GET /formats

Viral format classes with usage counts and trend stats.

Query parameters
search string Search by name / description
sort_by string video_count (default) | avg_views | avg_engagement_rate | name | trend_velocity | created_at
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /formats/:id

Single format class detail.

GET /hooks

Hook classes — the opening techniques that stop the scroll.

Query parameters
search string Search by name / description
sort_by string video_count (default) | avg_views | avg_engagement_rate | name | trend_velocity | created_at
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /hooks/:id

Single hook class detail.

GET /tactics

The tactics library — granular techniques detected inside videos.

Query parameters
category string Filter by tactic category
viewer_effect string Filter by intended viewer effect
search string Search by name / description
sort_by string video_count (default) | avg_views_when_present | performance_lift | avg_execution_score | name | created_at
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /tactics/:id

Single tactic detail.

GET /music

Music tracks used across the analyzed library.

Query parameters
platform string instagram | tiktok
search string Search by title / artist
sort_by string Sort column (default: usage)
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /music/:id

Single track detail with usage stats.

GET /suggestions

AI-generated content suggestions ranked by trend strength.

Query parameters
keyword_id int Filter by keyword
format_id int Filter by format class
date YYYY-MM-DD Suggestions generated on a specific day
sort_by string trend_strength (default) | upvotes | newest | approved
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /suggestions/:id

Single suggestion detail.

GET /categories

Content categories visible to the calling key's scope.

If your key is scoped to specific categories, only those are returned; unscoped keys see every category available to your plan.

Analysis

Run the full Blossom AI pipeline on any TikTok/Instagram URL or your own video file: hook breakdown, virality scoring, benchmarks, and concrete improvement suggestions.

POST /analysis

Trigger analysis for a TikTok or Instagram URL.

Returns 202 Accepted immediately with an analysis_id. Poll GET /analysis/:id for progress and the final result.

Body (application/json)
url string Public TikTok or Instagram post URL (required)
  • Analyses share your dashboard quota: 50/hour on Pro, 100/hour on Agency. Exceeding it returns 429 hourly_quota_exceeded.
Example request
curl -X POST "https://api.blossai.com/api/v1/analysis" \
  -H "X-API-Key: $BLOSSOM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://www.tiktok.com/@creator/video/1234567890" }'
Response — 202 Accepted
{
  "data": {
    "analysis_id": 4821,
    "status": "pending",
    "platform": "tiktok",
    "username": "creator",
    "thumbnail_url": "https://...",
    "caption": "...",
    "views": 1283000
  },
  "meta": { "timestamp": "2026-06-12T10:00:00.000Z" }
}

POST /analysis/upload

Analyze a video file before you post it anywhere.

Send multipart/form-data with the video in a video field. Same async flow and quotas as the URL trigger.

Body (multipart/form-data)
video file MP4, MOV, or WebM — max 100MB (required)
caption string Planned caption, included in the analysis
  • Oversize files return 413 file_too_large; non-video uploads return 400 invalid_file.
Example request
curl -X POST "https://api.blossai.com/api/v1/analysis/upload" \
  -H "X-API-Key: $BLOSSOM_API_KEY" \
  -F "video=@./draft-reel.mp4" \
  -F "caption=POV: my first launch video"

GET /analysis/:id

Poll analysis status and fetch the result.

status moves through pendingprocessingcomplete (or failed, with error set). While running, a steps object reports per-stage progress. Once complete, result contains the five analysis payloads. Recommended polling cadence: every 5 seconds — most analyses finish in 20–45s.

Example request
curl "https://api.blossai.com/api/v1/analysis/4821" \
  -H "X-API-Key: $BLOSSOM_API_KEY"
Response — complete
{
  "data": {
    "id": 4821,
    "status": "complete",
    "error": null,
    "result": {
      "full_analysis": { "...": "scene-by-scene breakdown" },
      "hook_analysis": { "...": "first-3-seconds analysis" },
      "virality": { "...": "platform virality scores" },
      "improvements": { "...": "ranked improvement suggestions" },
      "benchmarks": { "...": "category benchmarks" }
    }
  },
  "meta": { "timestamp": "2026-06-12T10:01: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/accounts

List your connected social accounts.

Query parameters
platform string instagram | tiktok
status string Connection status (e.g. connected, expired)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /social/accounts/:id

Single connected account.

POST /social/accounts/:id/sync-profile

Refresh profile metadata (name, bio, follower count, avatar) from the platform.

POST /social/accounts/:id/sync-posts

Pull the account's latest posts into Blossom and refresh their metrics.

Body (application/json)
amount int Recent posts to sync (1–200, default 50)

GET /social/posts

List posts created or synced for your account.

Query parameters
account_id int Filter to one connected account
status string draft | scheduled | publishing | published | failed
content_type string post | video | reel | carousel
sort_by string Sort column (default published_at)
order string asc | desc (default desc)
limit int Results per page (default 20, max 100)
offset int Pagination offset (default 0)

GET /social/posts/:id

Single post, including a metricsHistory array of snapshots.

POST /social/posts

Create a post as a draft (or with scheduling metadata).

Creating and publishing are separate steps — see POST /social/posts/:id/publish. Returns 201 Created with the full post row.

Body (application/json)
account_id int Connected account that owns the post (required)
content_type string post (default) | video | reel | carousel
caption string Post caption
scheduled_for ISO 8601 Planned publish time (metadata — see publish notes)
hashtags string[] Auto-extracted from caption if omitted
notes string Internal notes, never published
media_urls string[] http(s) URLs for the post's media
thumbnail_url string Custom thumbnail (auto-derived if omitted)
cover_image_url string TikTok cover frame; ignored on Instagram
  • Platform rules are validated on create: Instagram post = 1 image, video/reel = 1 video, carousel = 2–10 mixed; TikTok video = 1 video (≤4GB), carousel = 2–35 images. Stories are not supported.
  • By default media_urls must point at Blossom-hosted (Supabase) storage. Arbitrary external hosts are rejected with 400 bad_request unless external media is enabled for your deployment.
Example request
curl -X POST "https://api.blossai.com/api/v1/social/posts" \
  -H "X-API-Key: $BLOSSOM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "account_id": 17,
    "content_type": "carousel",
    "caption": "Behind the scenes of launch week #launch #bts",
    "media_urls": ["https://...storage.../img1.jpg", "https://...storage.../img2.jpg"]
  }'

PATCH /social/posts/:id

Update a draft or scheduled post.

Same fields as create, except account_id is immutable. media_urls semantics: omitted = keep existing media, [] = clear all, non-empty = replace wholesale.

POST /social/posts/:id/media

Append media URLs without replacing existing media.

Body (application/json)
media_urls string[] URLs to append
  • The combined media list is re-validated against the platform rules — exceeding a limit (e.g. 10 items on an Instagram carousel) returns 400 bad_request.

POST /social/posts/:id/publish

Publish a draft or scheduled post now.

Instagram publishes synchronously — the response has status: "published" with platform_post_id and the canonical post_url. TikTok is asynchronous — the response has status: "publishing" and a publish_id; poll GET /social/posts/:id until it resolves to published or failed.

  • scheduled_for is planning metadata surfaced in the dashboard — there is no autopilot. Even scheduled posts publish only when this endpoint (or the dashboard button) is called.
Example request
curl -X POST "https://api.blossai.com/api/v1/social/posts/902/publish" \
  -H "X-API-Key: $BLOSSOM_API_KEY"

GET /social/posts/:id/metrics

Historical metric snapshots (likes, views, comments, shares, saves) for a published post.

GET /social/analytics/dashboard

Top-level stats across all connected accounts.

GET /social/analytics/overview

Aggregated engagement and reach over a time window.

Query parameters
period string 7d | 30d (default) | 90d
account_id int Scope to one connected account

Account

Introspect the calling key: plan, rate limit, usage, and remaining quotas.

GET /account

The calling key's plan, rate limit, usage counters, and quotas.

Example request
curl "https://api.blossai.com/api/v1/account" \
  -H "X-API-Key: $BLOSSOM_API_KEY"
Response
{
  "data": {
    "plan": { "slug": "pro", "name": "Pro" },
    "rate_limit": { "per_minute": 30, "window": "60s" },
    "usage": { "today": 14, "last_30_days": 287, "total": 1203 },
    "quotas": { "monthly_analyses": null }
  },
  "meta": { "timestamp": "2026-06-12T10:00:00.000Z" }
}

MCP server

The @blossai/mcp-server package wraps every endpoint above as a Model Context Protocol tool (list_videos, trigger_analysis, get_account_info, …) so Claude, Cursor, and any other MCP client can drive Blossom directly. Available on every paid plan — including Creator. Drop this into your client config:

{
  "mcpServers": {
    "blossom": {
      "command": "npx",
      "args": ["-y", "@blossai/mcp-server"],
      "env": { "BLOSSOM_API_KEY": "blsm_your_key_here" }
    }
  }
}

SHIP SOMETHING VIRAL.

Create a key, make your first call in under a minute, and put the entire viral-content engine behind your product.

Get API Access

REST on Pro & Agency · MCP on every paid plan