SocialCrawl Cohorts — Audience-Filtered Mention Search
socialcrawl_cohortsAnswer 'which of THESE specific public identities is talking about my keywords?' — the opposite of open social listening. You upload a panel of up to 10,000 platform-qualified public handles (instagram, tiktok, youtube, twitter, threads, bluesky, truth-social, kwai, twitch, linkedin), submit a keyword query bounded to a recent window, and read back the matching posts per member PLUS a coverage record for every member, including the ones that matched nothing — so a partial crawl can never read as 'nobody talked about you'. Actions: create, add_members (1,000 per call, upsert on external_id so a nightly re-push is safe), estimate_cost (local, no API call — sizes the reservation before you commit), query (async, returns 202), query_status, query_results (paged, carries items + coverage), query_cancel, get, delete. Matching is deterministic: literal, whole-word, Unicode-normalized — no stemming, fuzzy matching, or alias inference. Every lifecycle call costs 0 credits; only the query is metered — it reserves a worst-case ceiling at submission and refunds down to the pages that actually succeeded. SocialCrawl only ever receives platform + handle + your opaque external_id, encrypted at rest. Requires a valid SOCIALCRAWL_API_KEY.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | create: human-readable label, up to 120 characters. | |
| limit | No | query_results: page size, 1-500 (default 100). It governs the coverage list too. | |
| action | Yes | Cohort operation. Lifecycle order: 'create' a cohort → 'add_members' (up to 1,000 per call, 10,000 per cohort) → 'estimate_cost' locally to size max_credits → 'query' (async, 202) → 'query_status' until it succeeds → 'query_results' (page with cursor). Also 'get' a cohort, 'query_cancel' a running query, and 'delete' a cohort with everything under it. Everything except 'query' costs 0 credits. | |
| cursor | No | query_results: pass `next_cursor` back verbatim. Keep going until it is null. | |
| date_to | No | query: optional RFC3339 upper bound on the window. | |
| members | No | add_members (or estimate_cost): up to 1,000 identities per call, 10,000 per cohort. Rows are FLAT — a member with identities on several platforms is several rows sharing one external_id, not a nested array. Re-sending an external_id updates its identity rather than adding a row, so a nightly full re-push is safe. LinkedIn takes the full profile URL, not a bare handle. | |
| keywords | No | query (required): up to 20 terms. Matching is literal and whole-word after Unicode NFKC case-folding — no stemming, fuzzy matching, or brand-alias inference. Pass 'Acme' and 'AcmeCo' separately if you want both. | |
| query_id | No | Query id from 'query'. Required for query_status/query_results/query_cancel. | |
| cohort_id | No | Cohort id from 'create'. Required for get/delete/add_members/query. | |
| date_from | No | query (required): a full RFC3339 timestamp (e.g. '2026-08-01T00:00:00.000Z'), not a bare calendar date. It bounds how far back each crawl reaches. | |
| platforms | No | query: restrict the run to a subset of the platforms present in the cohort. Omit to query them all. | |
| max_credits | No | query (required, no default): your own safety limit. Submission fails with a 400 before any credit is held if the computed ceiling exceeds it — run action 'estimate_cost' first to size it. | |
| idempotencyKey | No | UUIDv4 for the write actions (create/add_members/query), which the API requires. Omit it and one is generated and echoed back — but supply your own (or reuse the echoed one) to make a retry replay the original call instead of creating a second cohort or reserving a second query. | |
| retention_days | No | create: 7-90, default 30. When it elapses the cohort and everything under it is purged. Uploading members or submitting a query renews the clock. | |
| platform_counts | No | estimate_cost: the panel's platform mix as { instagram: 4000, youtube: 1000, ... } when you want a ceiling without passing the identities themselves. | |
| max_items_per_identity | No | query (required, no default): item budget per member, 1-1,000. | |
| max_pages_per_identity | No | query (required, no default) and estimate_cost: page budget per member, 1-20. Twitter, Bluesky, Threads and Twitch serve one fixed page per identity and ignore anything above 1. |