CollabFeed API
API Beta Docs
Pull CollabFeed partnership records, creator contact fields, brand contact enrichment and performance metrics into your own tools.
Authentication
Send your API key as a bearer token. X-API-Key also works.
Authorization: Bearer cf_live_xxxMint or rotate your key from Account Settings. The raw key is only shown once; store it somewhere safe.
Endpoint
GET https://collabfeed.io/api/v1/collabsExamples
Common recipes. All return the same response shape (see below).
Latest collabs across all platforms
curl "https://collabfeed.io/api/v1/collabs?limit=50" \
-H "Authorization: Bearer cf_live_xxx"Filter by platform and niche
curl "https://collabfeed.io/api/v1/collabs?platform=tiktok&niche=Gaming&limit=50" \
-H "Authorization: Bearer cf_live_xxx"High-performing posts only
curl "https://collabfeed.io/api/v1/collabs?min_views=10000&min_engagement_rate=3&sort=engagement_rate&order=desc" \
-H "Authorization: Bearer cf_live_xxx"Everything a single brand has done
curl "https://collabfeed.io/api/v1/collabs?brand=Gymshark&limit=100" \
-H "Authorization: Bearer cf_live_xxx"Incremental sync (recommended for ongoing pulls)
curl "https://collabfeed.io/api/v1/collabs?updated_since=2026-05-01T00:00:00Z&limit=200" \
-H "Authorization: Bearer cf_live_xxx" Store the highest updated_at from the response and pass it as updated_since on the next call. When updated_since is set, results default to oldest-updated first so that cursor never skips records. This is the only fully reliable way to paginate large pulls.
Filters
| Param | Description |
|---|---|
| platform | tiktok, instagram, youtube, or all (default all) |
| brand | Brand prefix search. Also matches known spelling variants of the brand |
| creator | Creator username prefix search, @ optional |
| niche | Alias for niche_main |
| niche_main | Case-insensitive exact match (e.g. Fashion, Beauty, Gaming) |
| niche_sub | Case-insensitive exact match |
| date_from | Filter by post date (YYYY-MM-DD) |
| date_to | Filter by post date (YYYY-MM-DD) |
| updated_since | Incremental sync by updated_at (ISO 8601) |
| min_views | Minimum view count |
| min_engagement_rate | Minimum engagement rate percentage (e.g. 3 for 3%) |
| sort | posted_at (default), inserted_at, updated_at, views, likes, engagement_rate, brand, creator |
| order | asc or desc (default desc) |
| limit | Default 100, max 200 |
| page | Default 1, max 10. page * limit cannot exceed 1,000 - use updated_since beyond that. |
Response shape
Every response has a data array of collab records and a meta object with the applied filters and your usage counters.
{
"data": [
{
"id": "tiktok_7638682041013357855",
"source_id": "7638682041013357855",
"platform": "tiktok",
"brand": "Sony Electronics",
"brand_raw": "Sony Electronics",
"creator": {
"username": "wisteriem",
"full_name": "Em | Cozy Games & Lifestyle",
"email": "em@hermanaagency.com",
"followers_count": 231339,
"follows_count": 261,
"profile_likes": 5022316,
"profile_url": "https://www.tiktok.com/@wisteriem",
"external_url": "https://beacons.ai/wisteriem",
"biography": "your introverted cozy lifestyle & gaming bestie",
"is_business_account": false,
"is_verified": false
},
"niche": {
"main": "Gaming",
"sub": "Gaming Accessories"
},
"post": {
"url": "https://www.tiktok.com/@wisteriem/video/7638682041013357855",
"caption": "#SponsoredbySony I love tuning out the world and immersing myself in my games...",
"cover_url": "https://p19-common-sign.tiktokcdn-eu.com/...",
"cached_cover_url": "https://ltiqztjqumeaakcsovjl.supabase.co/storage/v1/object/public/tiktok_covers/...",
"duration_seconds": 45,
"hashtags": ["sponsoredbysony", "sonyinzone"],
"posted_at": "2026-05-11T17:08:11+00:00"
},
"metrics": {
"views": 430,
"likes": 38,
"likes_hidden": false,
"comments": 3,
"shares": 0,
"engagement_rate": 9.5349
},
"estimated_post_rate": {
"low": 2086,
"high": 3823
},
"confidence": {
"brand": 1,
"niche_main": 1,
"niche_sub": 0.95
},
"is_ad": true,
"inserted_at": "2026-05-12T06:01:31.630941+00:00",
"updated_at": "2026-05-12T06:01:31.630941+00:00",
"brand_contact": {
"domain": "sony.com",
"partnership_email": "partnerships@sony.com",
"partnership_email_verified": true,
"partnership_email_result_type": "ok",
"fallback_emails": ["press@sony.com"],
"partnership_url": "https://creators.sony.com",
"social_links": {
"instagram": "sonyelectronics",
"tiktok": "sonyelectronics"
}
}
}
],
"meta": {
"page": 1,
"limit": 100,
"has_more": true,
"records_returned": 1,
"filters": {
"platform": "tiktok",
"niche_main": "Gaming",
"sort": "posted_at",
"order": "desc"
},
"usage": {
"month_start": "2026-05-01T00:00:00.000Z",
"month_end": "2026-06-01T00:00:00.000Z",
"requests_this_month": 1,
"rate_limit_per_minute": 120
}
}
}Response fields
All fields can be null unless noted otherwise. Below is what each block contains.
top-level
Identifiers and timestamps for the collab record itself.
- id - Stable ID prefixed by platform (e.g. tiktok_xxx, instagram_xxx).
- source_id - Raw platform-side ID without the prefix.
- platform - tiktok, instagram, or youtube.
- brand - Canonical brand name. Spelling variants of the same brand resolve to one name, and brand_contact is looked up on the canonical brand.
- brand_raw - The brand string exactly as labeled on this post, before canonicalization.
- is_ad - true when the post is labeled as a paid partnership or contains an ad hashtag.
- inserted_at - When CollabFeed first ingested this record.
- updated_at - Last time metrics or enrichment changed. Use for incremental syncs.
creator
Public profile fields plus extracted contact email when present.
- username - Platform handle.
- full_name - Display name.
- email - Email extracted from the creator bio. Null when none was found.
- followers_count - Follower count at last scrape.
- follows_count - Number of accounts the creator follows.
- profile_likes - Total likes across the profile (TikTok only).
- profile_url - Direct link to the creator profile.
- external_url - Single external link from the bio (linktr.ee, beacons, etc.).
- bio_links - Full list of bio links with titles (Instagram only).
- biography - Raw bio text.
- is_business_account - Whether the profile is marked as a business account.
- is_verified - Platform verification badge.
niche
Two-level niche classification from the enrichment pipeline.
- main - Primary niche, e.g. Fashion, Beauty, Gaming, Food & Beverage.
- sub - Subniche, e.g. Activewear, Skincare, Mobile Game. Free-form.
post
Post content and media URLs.
- url - Canonical post URL on the platform.
- caption - Full caption text including hashtags and mentions.
- cover_url - Original CDN cover image URL. May expire over time.
- cached_cover_url - CollabFeed-hosted cached cover. Stable, recommended for display.
- duration_seconds - Video duration (TikTok only).
- hashtags - Array of hashtags extracted from the caption (no leading #).
- posted_at - When the post was originally published.
metrics
Engagement counts. Instagram metrics freeze 3 days after posting; TikTok is a single snapshot at scrape time.
- views - View / play count.
- likes - Like count. Null when the creator has hidden likes (see likes_hidden).
- likes_hidden - true when the creator has chosen to hide like counts on the post.
- comments - Comment count.
- shares - Share count (TikTok only).
- engagement_rate - (likes + comments) / views * 100, as a percentage.
estimated_post_rate
Estimated USD rate range for a single sponsored post by this creator. Computed from follower count, platform, niche, and engagement rate. YouTube long-form videos are priced on the video's actual views at integration CPM with a subscriber baseline; Shorts price like short-form video. Null when followers are unknown. Treat as a starting point, not a quote.
- low, high - Lower and upper bound of the estimated rate, in USD.
confidence
Model confidence scores (0-1) for the enrichment classifications. Useful for filtering low-quality labels.
- brand - Confidence the labeled brand is correct.
- niche_main - Confidence the primary niche is correct.
- niche_sub - Confidence the subniche is correct.
brand_contact
Brand-side enrichment: domain, verified partnership email, and social links.
- domain - Brand website domain.
- partnership_email - Verified brand partnership email (when available).
- partnership_email_verified - true if the email was confirmed deliverable by the verifier.
- partnership_email_result_type - ok, catch_all, unknown, etc. Detail on the verification status.
- fallback_emails - Additional emails found on the brand site that may also work.
- partnership_url - Direct link to the brand collab/affiliate program when one was found.
- social_links - Object with the brand handles on Instagram, TikTok, etc.
meta
Per-response metadata: pagination state, applied filters, and your usage counters.
- page, limit, records_returned - Echo the pagination parameters and how many records this response contains.
- has_more - true if additional records exist past this page or window.
- filters - Normalized view of the filters the server applied.
- usage.requests_this_month - Running request count for the current calendar month (UTC).
- usage.rate_limit_per_minute - Configured rate limit on this key (default 120).
Row semantics
Each row is one post, not one relationship. A creator who ran five partnerships with the same brand appears in five rows, so to count distinct creators for a brand, dedupe on creator.username per platform; to count distinct brands for a creator, dedupe on brand. Spelling variants of the same brand resolve to one canonical brand value; the label exactly as scraped is kept in brand_raw, and sort=brand orders by brand_raw.
Pagination
Two ways to paginate. For ongoing data syncs, prefer updated_since.
- Incremental sync (recommended): pass
updated_since=<ISO timestamp>. Store the maximumupdated_atfrom the response and use it on the next request. Whenupdated_sinceis set, results default tosort=updated_at&order=ascso the cursor never skips records; keep that ordering if you override sort. This is the only fully reliable primitive for large pulls. - Offset pagination:
page(default 1, max 10) andlimit(default 100, max 200).page * limitcannot exceed 1,000 records per filter window; requests past either cap return a 400. Withplatform=all, deep pages can show approximate ordering because each platform is fetched independently then merged. For full snapshots, narrow byplatform,date_from/date_to, or abrand/nichefilter. - Has more:
meta.has_moreistrueif there are additional records past the current page or window.
Rate limits and errors
API keys are rate-limited to 120 requests per minute. No monthly usage cap.
| Status | Meaning |
|---|---|
| 200 | Success. |
| 400 | Malformed query parameter (e.g. invalid date format). |
| 401 | Missing, invalid, or revoked API key. Check that the bearer token starts with cf_live_. |
| 429 | Rate limit exceeded (more than 120 requests in the last 60 seconds). Back off and retry. |
| 5xx | Server-side error. Retry with exponential backoff. |
If your Polar subscription is canceled, the linked API key is deactivated automatically and subsequent requests will return 401.
Usage terms
The API license is deliberately broad: use the data inside your own products and analyses, display it to your end users, keep a full synced copy on your side (that's what updated_since is for), and build the features you want on top of it, including exports.
The few rules:
- Your use of the data, including contact details, has to comply with the laws that apply to you, and the data can't be used to spam or harm the creators and brands in it
- Contact details can't be republished as a standalone public database
- Your API key stays inside your team
We may revoke API access for use that violates these rules. See also our Terms of Service.