Cloutfind API
Run AI creator search, brand-fit scoring, and outreach generation from your own stack. JSON in, JSON out. Standard HTTP semantics. Auth with a bearer key from /settings.
Authentication
Every request needs an API key in either the X-API-Key header or as a Authorization: Bearer token. Keys start with cf_live_ and are 40 characters long. Manage them at /settings. Revoke a leaked key immediately, then issue a fresh one.
X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Rate limits
- AI search: 20 requests / minute, 500 / day per organization.
- AI brand-fit + outreach: 10 / minute, 200 / day per organization.
- Read-only endpoints (creator fetch, stats): the standard 60 / minute default.
- Hitting a limit returns HTTP 429 with
{"detail": "rate_limited"}. Back off and retry.
/search/aiRun a natural-language creator search.
Request body
{
"query": "beauty creators under 50K subs who've done paid skincare promos",
"manual_filters": {
"platform": "youtube",
"min_subscribers": 5000,
"max_subscribers": 50000
}
}Example
curl -X POST https://cloutfind.com/cf/search/ai \
-H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"query": "beauty creators under 50K subs who have done paid skincare promos"}'Response
{
"query": "...",
"tier": "agency",
"filters": {"platform": "youtube", "min_subscribers": null, "max_subscribers": 50000, ...},
"rationale": "Filtering YouTube beauty channels under 50K subs with paid promo history.",
"results": [
{
"id": "...uuid...",
"display_name": "...",
"platform": "youtube",
"subscriber_count": 28400,
"engagement_rate": 5.6,
"has_done_sponsors": true,
"sponsor_count_90d": 4,
"ai_fit_score": 87,
"ai_rationale": "Skincare-focused with three recent paid promotions ...",
"niche_matched_terms": ["skincare", "anti-aging"],
"niche_match_count": 2,
"niche_total_terms": 3,
"niche_density_pct": 64.2
}
],
"total": 23,
"ranked": true,
"coverage_thin": false,
"niche_term_count": 3,
"ingest_job_id": null,
"ingest_job_status": null
}
# When coverage_thin is true, ingest_job_id will reference a queued
# background YouTube ingest job. Poll GET /ingest-jobs/{id} for status.
# Hard rule: low ai_fit_score creators (< 30) are still returned but
# UIs should hide them by default - they're truly off-niche./ingest-jobs/{id}Poll the status of a background search-ingest job.
Example
curl https://cloutfind.com/cf/ingest-jobs/<job-uuid> \ -H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response
{
"id": "...uuid...",
"keyword": "vegan recipe creator",
"status": "done",
"creators_added": 7,
"videos_added": 145,
"channels_searched": 8,
"created_at": "2026-05-17T14:21:09Z",
"started_at": "2026-05-17T14:21:11Z",
"completed_at": "2026-05-17T14:21:54Z",
"error_message": null
}
# Status enum: queued | running | done | failed | rate_limited.
# Use this to render a live "expanding the index..." UI in your
# integration when /search/ai returns coverage_thin = true./creators/{id}/brand-fitScore a single creator against your brand profile.
Request body
{
"brand_context": "Skincare brand for sensitive skin",
"outreach_goal": "Sponsored review video"
}Example
curl -X POST https://cloutfind.com/cf/creators/<id>/brand-fit \
-H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{}'Response
{
"creator_id": "...uuid...",
"fit_score": 84,
"rationale": "Audience strongly overlaps your target demo ...",
"concerns": ["Heavy sponsor cadence may dilute your message"],
"suggested_angle": "Lead with a unique-skin-type framing ..."
}/creators/{id}/outreach-draftGenerate three personalized outreach variants for one creator.
Request body
{
"brand_context": "Indie game studio shipping Steam-bound puzzle title",
"outreach_goal": "Paid sponsorship for launch week"
}Example
curl -X POST https://cloutfind.com/cf/creators/<id>/outreach-draft \
-H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{}'Response
{
"creator_id": "...uuid...",
"drafts": [
{"tone": "casual", "subject": "...", "body": "..."},
{"tone": "professional","subject": "...", "body": "..."},
{"tone": "direct", "subject": "...", "body": "..."}
]
}/creators/{id}Fetch a full creator profile by ID.
Example
curl https://cloutfind.com/cf/creators/<id> \ -H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response
{
"id": "...uuid...",
"platform": "youtube",
"display_name": "...",
"subscriber_count": 12300,
"engagement_rate": 4.2,
"estimated_price_low": 80000,
"estimated_price_high": 220000,
"has_done_sponsors": true,
"sponsor_count_90d": 3,
...
}/stats/publicIndex size, useful for cache invalidation.
Example
curl https://cloutfind.com/cf/stats/public
Response
{"creators": 800, "videos": 19000, "verticals": 60, "refreshed_at": "..."}/me/saved-searchesSave a search to your watchlist (Agency + Enterprise for alerts).
Request body
{
"name": "Top mid-tier beauty creators",
"query": "beauty creators with paid skincare promotions, 5k-30k subs",
"alerts_enabled": true,
"alert_email": "ops@yourcompany.com",
"webhook_url": "https://hooks.example.com/incoming/abc"
}Example
curl -X POST https://cloutfind.com/cf/me/saved-searches \ -H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d @body.json
Response
{
"id": "...uuid...",
"name": "...",
"query": "...",
"alerts_enabled": true,
"alert_email": "ops@yourcompany.com",
"webhook_url": "https://...",
"last_run_at": null,
"last_match_count": null,
...
}/me/saved-searches/{id}/run-nowForce-run a watchlist immediately, bypassing the hourly schedule.
Example
curl -X POST https://cloutfind.com/cf/me/saved-searches/<id>/run-now \ -H "X-API-Key: cf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Response
{
"ok": true,
"match_count": 14,
"alert_sent": true,
"webhook_sent": true
}Outbound webhooks
Agency and Enterprise watchlists can set a webhook_url via PATCH /me/saved-searches/<id>. When the periodic runner detects new matches, Cloutfind POSTs a JSON payload to the webhook (in addition to or instead of email). Custom internal queues and Zapier webhook catchers consume the payload directly. For Slack, route through a Zapier or Make.com step that re-formats into Slack's blocks shape (we POST raw JSON, not Slack-shaped messages).
{
"event": "watchlist.new_matches",
"saved_search_id": "...uuid...",
"name": "Top mid-tier beauty creators",
"query": "beauty creators with paid skincare promotions, 5k-30k subs",
"previous_match_count": 8,
"new_match_count": 11,
"delta": 3,
"sample_creator_names": ["Glow Notes", "Cleo Routine", "Bloom by Mia"],
"open_url": "https://cloutfind.com/search?q=..."
}Need higher limits?
Enterprise plans bump every limit, add IP allowlists, and include dedicated support. Contact us to discuss.
Talk to us