Skip to main content
POST
Each call searches one platform. Set platform: "linkedin" for professional profiles (including Crustdata) and LinkedIn posts, platform: "reddit" for Reddit posts and comments, platform: "x" for X posts and replies, platform: "instagram" for Instagram Reels, transcripts, post comments and replies, platform: "tiktok" for TikTok videos, transcripts and comments, or platform: "facebook" for public Facebook posts and post comments. An explicit platform skips automatic routing and restricts the available search tools, even if the query mentions another platform. Omit platform for Auto: a short LLM call chooses LinkedIn, Reddit, X, Instagram, TikTok or Facebook from the query. A platform parameter overrides the query’s platform preference. Auto does not search every platform. The response’s top-level platform tells you which was selected. The full result limit and credit budget apply to that platform, including the routing call’s model cost. To search multiple platforms, make separate requests with explicit platforms and separate limits; agents can run these requests in parallel.
Describe the people you’re looking for as you would to a colleague: a name, a role, a current or past employer, a school, a city, the kind of company they work at (“500 product managers at Series A+ startups, excluding fintech”), or an email or LinkedIn address (“who is jane@acme.com”). For LinkedIn searches, the agent uses professional profiles and posts:
  1. It identifies the person behind each email (work or personal) or LinkedIn address the description gives, with Crustdata’s person identify. An email Crustdata doesn’t have on file can still match by the name in the address at the company that owns the domain.
  2. It looks up each company the description names (free). When the description describes the companies instead, it filters people by their employer’s industry, headquarters country, size or type directly, or searches companies by funding, latest round, revenue, headcount growth, industry, founding year or country, and can rank them by what they do in plain language (“revenue depends on a live consumer app”).
  3. It reads the exact values Crustdata stores for round types, industries and job titles (free), so filters match them.
  4. It searches people by name, current or past employer, title, location or a radius around a place, school or seniority, including conditions met in different jobs (“an ML engineer who also founded a company”), checking small samples (at most 20 people each) and loosening or tightening the filters until they find the right people.
  5. When the description is about what people post rather than what their profile says (“founders hiring a founding engineer this month”, “PMs who write about onboarding drop-off”, “people speaking at SaaStr”), it searches public LinkedIn posts (up to 100 posts a search) and keeps the authors whose post shows they fit, reading their LinkedIn profiles (about half a cent each) when it needs to check where they live or what they do. It can also keep only the people it found who post about a topic.
For Reddit searches, the agent searches posts, reads thread context and comments, and selects authors whose own words support the match. It checks public profiles only when helpful. It has no professional search tools for that run. You get as many people as the description asks for: one for “Jane Doe at Acme”, a thousand for “1000 designers at…”, 20 when it gives no number, up to 5,000. max_results sets the number instead. The agent checks small samples until its filters find the right people, then the people come from those filters: the sample it checked first, then the next pages, each person fetched and charged once. A specific person the description names, or identifies by email or LinkedIn address, comes first. requested is how many were asked for and total how many people the filters match in all, so fewer people than requested means fewer matched. Each LinkedIn person is a short preview: name, title, company, headline, location, linkedin_url, and picture_url when Crustdata has a photo. People identified by email or LinkedIn address come without company. People found by a LinkedIn post have no Crustdata record, so they come with an empty id, their headline, and the post that found them (url, date, text). Their title, company and location come from their LinkedIn profile when the agent checked it, which it does when the description asks for something a headline doesn’t show (“in the Bay Area”), and are empty otherwise. Anyone else a post search found also comes with their post. For the full professional profile and matched social accounts, pass a result’s linkedin_url to Enrich person. Social results include platform once on the person; their nested post inherits that platform. Unavailable title, company, and location fields are omitted. X includes location when a checked profile provides one. Reddit results have platform: "reddit", id: "reddit:<lowercase username>", username, name (u/<username>), profile_url, and match_reason. Their post includes kind (post or comment), url, thread_url, date, text, title, and subreddit. is_locked and is_archived are null when unknown. A checked public bio can appear in headline. Professional fields are omitted and linkedin_url is null: pass their profile_url to Enrich person to load the public profile, avatar, posts and comments. Accounts are deduplicated by username within Reddit, without assuming a connection to a LinkedIn identity. Profile and conversation links provide context for engagement; they do not establish DM availability. X searches use AnyAPI’s twitter.search and twitter.replies. Each search page typically contains about 20 posts; this is not a total result limit. The agent follows nextCursor as needed, preserving the query and ordering, and requests a pagination-capable provider on the first page of both searches and replies. It stops when enough matching people are found, no useful searches remain, or the budget is exhausted. Results are not guaranteed to cover every matching X post. X results have platform: "x", id: "x:<numeric user ID>" when available (otherwise x:handle:<lowercase username>), username, name, profile_url, and match_reason. Supporting post evidence includes kind (post or reply), url, thread_url, an ISO UTC date, text, and nullable parent_id and conversation_id. A conversation root is not necessarily the immediate parent. Optional profile checks add public bio, avatar and self-reported location. Title, company and LinkedIn URL remain unknown. X profile URLs open the account directly; /v1/people/enrich does not yet accept X profile URLs.
Instagram can be selected automatically or with platform: "instagram". The agent discovers Reels through Instagram’s relevance-ranked search, with web-index search as a supplement, and reads comments and replies on relevant posts. You can also include a post or Reel URL in the query. Discovery does not cover all Instagram posts or globally search comments. Web recency hints refer to crawl/discovery time; the agent checks actual evidence dates. When a requested opinion may be spoken in a video, the agent reads its transcript: cheaper transcript text first, then audio transcription within the remaining budget. Captions remain separate from speech. Missing speech is unknown; explicit captions and comments can still qualify. The agent must establish that an opinion belongs to the account rather than a quoted speaker, repost or advertisement. Pricing explanations and ambiguous reactions alone do not qualify. Discovery is not a global transcript search, and these tools do not interpret on-screen text. Instagram results include platform, username, name, profile_url, match_reason, and id (instagram:<numeric user ID> when available, otherwise instagram:handle:<lowercase username>). Each selection requires an exact supporting quote in post.text. post.evidence_type distinguishes caption, transcript and comment. caption retains the original caption separately. Supporting post also contains kind (reel, post, comment, or reply), text, ISO UTC date, url, and thread_url. Comment URLs open the containing post; comment_id identifies the comment. Replies also include parent_id and parent_text; context_text retains the containing caption. Public bio checks can populate headline and picture_url. Professional fields are omitted, and /v1/people/enrich does not accept Instagram profile URLs. Reads are cached within a run. Each native Reels query is capped at 10 provider pages, web search at 11, and each comment/reply feed at 5. Large provider pages are buffered without dropping their remaining rows. Results are deduplicated by known account ID and handle; searches stop at the configured bounds, enough matches, exhaustion, or budget. Fewer results do not mean there are no other matching Instagram accounts.
An empty people list means no matching people were found in the searches performed.

Credits

Credits grow with the people returned. Crustdata charges about 0.23 credits per person returned (0.03, plus 0.1 each for filtering on and returning their roles), a company search 0.03 per company plus 0.1–0.2 for each of industry, headcount and funding it filters on, identifying a person by email or LinkedIn address 1 credit per match (misses are free), a LinkedIn post search or profile check about half a cent each, and the agent’s model time is about a cent. A search runs only while the workspace has credits for it: max_credits caps the call lower. When the credits run out first, the call returns the people found so far with stopped: "budget", and is charged only for what it spent. Reddit search, post, comment and profile reads are charged from the provider receipts, including paid misses or failures. Search and comment pages are fetched as needed; repeated reads within a run are cached. Per-attempt provider caps are $0.0012 for search, comments and profiles, and $0.00224 for post details (checked November 13, 2026). These are provider costs before workspace billing markup. X calls are charged from actual AnyAPI receipts, including paid misses and failures. Per-attempt provider caps are $0.0154 for search, $0.0138 for replies, and $0.0012 for post and profile reads (checked November 13, 2026). These caps cover backup providers; actual charges can be much lower. Repeated reads in a run are cached and parallel calls reserve their maximum cost before dispatch. Instagram bills actual AnyAPI receipts, including paid misses and failures. Per-attempt caps are $0.0024 for native search, comments, replies and profiles; $0.0012 for web search; $0.00188 for post lookup; $0.00272 for transcript text; and $0.095 for audio transcription without hosted video. Transcript reads are cached, including misses, and long transcripts can be read in overlapping chunks. Both possible attempts are reserved before dispatch. These are provider costs before workspace markup. A search usually takes 8–30 seconds; transcript processing or reading multiple threads and pages can take longer. It needs OPENAI_API_KEY and the selected platform’s provider credentials: CRUSTDATA_API_KEY for professional search, ANYAPI_API_KEY for Facebook, TikTok, Instagram, X, Reddit and LinkedIn post search, and Crustdata allows 30 searches a minute.

TikTok

TikTok searches discover videos by keyword, then read their transcripts, comments and replies. Search captions are discovery context, not spoken transcripts. Creators become selectable only after a transcript read; the agent must establish that the complaint is the uploader’s own opinion rather than a quote, repost or pricing explanation. Commenters qualify from their own words. Each selection requires an exact quote from evidence already read. Searches may return fewer people than requested. This is not a global comment search, and on-screen text is not interpreted. Transcripts use tiktok.video_transcript first, then tiktok.video_transcript_full speech-to-text when native captions are unavailable, within the request budget. Missing transcripts remain unknown; comment discovery can continue. Long transcripts can be read in overlapping chunks. Search and comment pagination preserve original queries and context; repeated reads within a run are cached. Results include platform: "tiktok", id (tiktok:<numeric user ID> or tiktok:handle:<lowercase handle>), username, profile_url, and match_reason. post.text is the selected exact quote. post.kind is video, comment or reply; evidence_type is transcript or comment. Video caption, date, video ID, comment ID and known parent comment ID preserve context. Comment and reply evidence URLs include share_comment_id and share_item_id when a valid comment ID is available; thread_url remains the video URL. Other evidence links use the video URL. Professional fields remain unknown. TikTok profile URLs are for viewing; /v1/people/enrich does not accept them. Uses the existing ANYAPI_API_KEY. Provider receipts, including paid misses and failures, count toward the budget. Per-attempt caps: search/comments $0.0032, replies $0.0036, profiles/native transcripts $0.0012, and speech-to-text $0.095 (without hosted video). Both possible attempts are reserved before dispatch, including parallel reads. These are provider costs before billing markup, checked November 13, 2026; native transcript routes above the cap are excluded. Transcript processing can make TikTok searches take longer than text-only searches.

Facebook posts and comments

Use platform: "facebook", ask explicitly for Facebook in Auto, or include a direct Facebook post URL. The agent searches public posts by keyword and reads comments on relevant posts; no group URL is needed. Each keyword search returns up to 20 posts and has no pagination cursor. Comment feeds paginate up to five provider pages per post. This does not globally search comments or access private groups. Auto favors other sources for general requests unless Facebook is clearly the best fit.
Results have platform: "facebook", id (facebook:<numeric account ID> when available, otherwise a namespaced canonical profile URL), name, profile_url, and match_reason. username is empty when no handle is established. Each selected person requires an exact quote from their own observed post or comment, returned as post.text, with kind, date, url, and thread_url. Comments retain comment_id and the containing post’s context_text; links open the containing post, not a guaranteed comment deep link. Missing account identities and anonymous participants are skipped. Public profile checks can add a bio and avatar; professional fields are omitted and Facebook URLs do not support /v1/people/enrich. Location search favors place-tagged posts and does not verify residence. Captions are not video transcripts. The agent filters for individuals and evidence of the requested need; business Pages, promotions and ambiguous reactions should not qualify as people matches. Uses the existing ANYAPI_API_KEY. Actual provider receipts, including paid misses and failures, count toward the budget. Per-attempt caps are $0.0649 for post search, $0.00477 for comments, $0.0036 for post lookup and $0.0032 for profiles (checked November 13, 2026), before workspace markup. Both possible attempts are reserved before dispatch, including parallel calls. Keyword search can take about 20 seconds per call; searches with several queries or comment reads can take longer. If a search reaches its five-minute run time limit, it returns the people already selected with stopped: "timeout" when fewer than requested are available, including completed provider and model usage. This is a partial result, not evidence that no further matches exist. Try fewer requested results or a more specific query.

Authorizations

Authorization
string
header
required

An API key from the dashboard's API Keys page (sign in or sign up there with a constants.io account), sent as Authorization: Bearer <key>. Keys start with cps_.

Body

application/json
query
string
required

A description of the people to find, such as a role with an employer, school or location, or the kind of company they work at. It can say how many to return.

Maximum string length: 4000
max_results
integer

People to return, in place of the number the description asks for (20 when it gives none). Crustdata charges about 0.23 credits per person returned.

Required range: 1 <= x <= 5000
max_credits
integer

The most credits the call may spend. It stops at the workspace's credits left anyway; when either runs out first, the people found so far come back with stopped: "budget".

Required range: x >= 1
platform
enum<string>

Restrict this call to one platform. Omit for Auto, which chooses LinkedIn, Reddit, X, Instagram, TikTok or Facebook using an LLM; it does not search all platforms.

Available options:
linkedin,
reddit,
x,
instagram,
tiktok,
facebook

Response

The matching people, best first. An empty people list means nothing matched.

platform
enum<string>
required

The platform searched, including when selected automatically.

Available options:
linkedin,
reddit,
x,
instagram,
tiktok,
facebook
people
object[]
usage
object

What the call cost.

ms
integer
requested
integer

How many people were asked for, by max_results or the description.

total
integer | null

How many people the filters the rest came from match in all; null when only the agent's picks came back.

stopped
enum<string> | null

"budget" when credits ran out, or "timeout" when the search reached its time limit before returning the requested count. Completed selections and actual usage are returned in either case; fewer results do not establish that no more matches exist.

Available options:
budget,
timeout,
null