POST /v1/instagram/accounts/search finds whole accounts. Send one account block with a semantic query about who the account is and structural filters. Add an optional posts scope that qualifies accounts through their publishing. This page is the whole endpoint: identity queries, filtering, the posts scope, ordering, and how to read what comes back.
To find content rather than people, use Search posts; it returns individual posts. A common workflow: discover content there, qualify its authors here.
Query the identity
account.query describes who you’re looking for, for example "sporty stay-at-home moms". Klint qualifies each account against its current observed identity: the public profile plus recurring or representative published content.
- curl
- Python
- TypeScript
Full response
Full response
- Every material trait must qualify. For “sporty stay-at-home moms,” an account must qualify as sporty and as a stay-at-home mom. Strength on one trait never compensates for absence of another.
- One direct self-description is enough for what it states. A biography saying “stay-at-home mom” establishes that trait without repetition.
- Behavioral traits need recurrence. An account is “sporty” through recurring fitness content, not one gym post. A single incidental post never redefines an account.
- Evidence can live anywhere. Relationship language in a caption (“my kids”) counts like biography text. You don’t predict where an account disclosed something; Klint looks across profile and content.
- Current contradictions block; missing history doesn’t. Klint qualifies against what it observed. Known current evidence that contradicts a trait prevents qualification; incomplete coverage alone doesn’t.
Writing a query that qualifies
Identity queries are stricter than content queries: every material trait must independently qualify. Ask for the one or two traits your workflow actually needs.
Two habits improve results:
- Move hard constraints into filters. Follower ranges, languages, account type, and locations are exact, so filters on them are exact.
- Don’t stack rare traits casually.
"left-handed vegan triathlete dads"mostly proves that what Klint has observed can’t evidence four independent traits at once.
Filter the accounts
Filters are hard constraints: Klint returns an account only if it satisfies every filter. Every filter value is an operator object; there is no bare-value shorthand."account_type": "creator" is rejected; "account_type": { "in": ["creator"] } is correct.
Operators
Rules that follow from the shapes:
- A field takes exactly one operator.
contains_anyandcontains_allnever combine on the same field. - Membership arrays are non-empty and hold unique values.
- Ranges need at least one bound and allow at most one lower and one upper bound. Klint rejects contradictory bounds.
Different fields AND together. No cross-field OR, no negation, no missing-value operator, no expression language. The grammar is deliberately closed and positive-only.
null never matches. A missing or hidden value satisfies no filter: no range, no membership, no boolean in either direction. “Unknown” is not expressible in the launch grammar."en" matches en-US), and classification IDs (niches) are exact catalog IDs, never display labels. Klint rejects an unrecognized ID with suggestions rather than fuzzy-resolving it.
Account filter fields
Each
declared_locations alternative is an object with a required country_code (ISO 3166-1) and optional region_code and locality. All supplied components must match the same declared location. You cannot combine one location’s country with another’s city.
Not filterable at launch: following_count, posts_count, category_label, biography text, privacy state (Klint never returns private accounts), growth, or any audience/demographic inference.
The posts scope
account.posts qualifies accounts through their publishing: minimum_matching_posts sets how many distinct posts must each satisfy the complete account.posts.filters predicate. Those filters use the post filter fields.
Full response
Full response
- The whole predicate must hold on one post. An account with one post carrying the right hashtags and a different post clearing the views bar does not qualify; facts from different posts never combine.
- A carousel counts once, no matter how many media items it contains.
- The default minimum is
1; the provisional launch maximum is3.
Whether
account.posts counts only posts the account authored, or also posts where it accepted Instagram Collab coauthorship, is an open contract decision.What gets rejected
A non-matching filter is a valid request that returnsdata: []. An invalid filter never executes; it returns a 422 validation-failed problem object that names the exact pointer, reason, and correction.
The clearest case is a classification ID that isn’t in the catalog. Klint never fuzzy-resolves it to a nearby ID and never lets it evaluate silently to an empty result. It rejects with reason INVALID and, when close IDs exist, a candidates list to correct from:
422 validation-failed:
- Bare values:
"account_type": "creator"instead of{ "in": ["creator"] }(reasonINVALID). - Unknown fields:
following_countorcategory_labelare not filterable keys (reasonUNKNOWN). - Contradictory ranges:
"followers_count": { "gte": 50000, "lte": 10000 }(reasonINVALID). - Negation attempts: there is no
not_in,exclude, ornone(reasonUNKNOWN).
Ordering and pagination
Ordering
A query-bearing search returns relevance order; Klint rejectssort sent with a query (422). A filters-only account search accepts an optional sort object, { "by": "followers_count", "order": "desc" }, over a closed list of stable scalar fields. A stable resource ID is the final tie-breaker. Ranking a relevance window by a metric would misrepresent a retrieval window as the whole of Instagram. Metric ordering therefore requires a structural (filters-only) population whose eligibility is exact.
Pagination
An initial search pins an immutable result sequence: Klint freezes the request, a snapshot of what it tracks, and the ranking together. Each response returns one page plus an opaque cursor. Continuation sends only that cursor plus an optional same-or-lowerlimit. The rules:
- The sequence never recomputes. An account whose identity changes after your search never shifts mid-pagination. Run a new search to see newer state.
has_morespeaks about the pinned session, not about whether Instagram holds other matches.- Pages can run short. Klint suppresses, rather than backfills, an account that goes private after the snapshot.
- Cursors expire. After a short lifetime, continuation returns
410 expired-cursorrather than recomputing against live data:
Reading the results
Search and Get account return the identical full account representation; there is no reduced “search card.” A few semantics keep it trustworthy:idis durable;handleis not. Theidsurvives handle changes, display-name changes, and profile rewrites. Never key onhandle.- Two kinds of truth on one object. Current profile facts (
biography,account_type,category_label,declared_locations,is_verified, counters) come from what Instagram displays now. Publishing interpretation (publishing_summary,publishing_languages,niches) comes from a bounded set of recent posts. They have different sources and different freshness; don’t cross-read them.category_label(Instagram’s self-presentation text) andniches(Klint catalog IDs) routinely disagree, and neither derives from the other. declared_locationsis declared, never inferred. Klint never reads it from geotags, travel content, or audience.[]means a complete check found no declared base.- Zero is real.
following_count: 0is an observed count; unavailable counts arenull. - Private accounts leave search. Search never returns a confirmed-private account; GET may still show its public profile facts with every publishing field cleared to
null.
id, handle, display_name, web_url, avatar_url, followers_count, is_verified). It’s relationship context, not analytical evidence. Dereference id with Get account when freshness or the fuller picture matters.
Continue from here
Search posts
Find individual posts by content, format, and metrics.
API reference
The full request and response schema.