Agency tier · Enterprise · API access

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.
POST/search/ai

Run 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.
GET/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.
POST/creators/{id}/brand-fit

Score 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 ..."
}
POST/creators/{id}/outreach-draft

Generate 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": "..."}
  ]
}
GET/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,
  ...
}
GET/stats/public

Index size, useful for cache invalidation.

Example

curl https://cloutfind.com/cf/stats/public

Response

{"creators": 800, "videos": 19000, "verticals": 60, "refreshed_at": "..."}
POST/me/saved-searches

Save 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,
  ...
}
POST/me/saved-searches/{id}/run-now

Force-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
API Docs | Cloutfind