Prism Find Accounts API
Returns candidate public accounts for a person's or a company's name on Instagram, TikTok, X, LinkedIn and Threads, ranked per platform, each with a match level and a match confidence.
GET /v1/prism/find-accountsLast updated November 2026Maintained by the SocialCrawl team
When to use the Prism Find Accounts API
Use it when you have a name, and perhaps a domain, but no handles and want a shortlist to review. It never states who runs an account; your reviewer decides.
From the API reference
Runs the existing account searches for name on each platform (instagram/search/profiles, tiktok/search/users, twitter/search/users, and linkedin/search/people for a person or linkedin/search/companies for a company), keeps the top candidates public accounts of each (private accounts are dropped), and ranks them. With website, an account in the search results whose own website is that domain is always among the candidates, in place of the lowest one without that link. For a company with website, a LinkedIn company search that fails is answered by linkedin/company/by-domain, whose page is then the one LinkedIn candidate. Each platform returns candidates (rank, handle, display name, profile URL, followers, verified flag, a bio excerpt and choice_probability, the judged probability that this account is the target's own) and one match: handle is the leading candidate, level is same, possible (connected but not shown to be the target's own, such as a fan or regional account), different, uncertain (the ranking was flat or the check was unsure), or none (none of the candidates is the target's own account, or the search found nothing), with confidence (the weaker of the ranking and the check), basis and evidence (website_match, cross_link, bio_consistent, fan_or_parody). The leading candidate is always checked a second time against the name and context you sent; a ranking alone is never a match. With website, an account that links to that site and is platform-verified is taken as the match without judging (basis: exact_link); an unverified account linking to it is judged like the rest. employer (person only) and location give the judgment context. These are automated labels for a human reviewer, not an identification: automated_decision is false and the response never states who runs an account. If the judgment is unavailable, candidates come back in search order with match.level null, _warnings says why, and the judging credits are refunded. LinkedIn is included by default for a company only, because its search costs 10 credits. Threads (threads/search/users) and YouTube (youtube/search with type=channels, whose channel rows carry the description and subscribers) are searched only when named in platforms. Each platform's match also carries match_confidence (0 to 1, null when there is no candidate), how sure the response is that handle is the target's own account, and accepted, true when match_confidence is at or above match_confidence_floor (0.6). data.items lists the accepted accounts, one per platform at most, as canonical author rows with their match; a platform below the floor lists no item, so a reader of items gets no match rather than a guess. With website, match.evidence adds domain (the site checked), domain_match and domain_source (external_url or bio): whether the leading account's own website, or else a link or a domain in its bio, is that domain or a subdomain of it. The account's own website is the strong evidence: it lifts a flat ranking (uncertain) or a same to at least 0.9. A link or domain in the bio is weaker, because a reseller or a fan names the site too: it lifts only a same, to at least 0.75. An email address at the domain is not a domain match, an own website on another domain overrules the bio, and a possible or different account is never lifted. A profile, link-in-bio or site-builder page given as website (LinkedIn, a Google Site, a link page) is not checked. With profile_check=true, the leading candidate on Instagram, TikTok, Threads and (for a company) LinkedIn, whose search results carry no bio or website, is looked up on its profile before the check, so the domain check and the check read its bio and website; X search results already carry both.
Searching 69 platforms in parallel
What can you do with the Find Accounts API?
The Find Accounts endpoint gives you structured Prism data with computed fields in a single request. No scraping infrastructure to build or maintain.
Example Request
# GET /v1/prism/find-accounts: Metered: holds 17 credits per call up front and refunds what the call does not use. Cache hits are free and failed calls are refunded.
# Check the price first for 0 credits: add dry_run=1 to the query. Nothing is fetched or charged.
# --max-time 28: this endpoint's measured p99 latency x 1.5.
# --retry 3: retries timeouts, 429 and 5xx, honoring Retry-After.
# -o response.json keeps only the final attempt's body.
# One Idempotency-Key per request, reused on every retry, so a retried call is never charged twice.
IDEMPOTENCY_KEY=$(od -An -N16 -tx1 /dev/urandom | tr -d ' \n')
curl -sS --max-time 28 --retry 3 -o response.json \
-H "x-api-key: YOUR_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
"https://www.socialcrawl.dev/v1/prism/find-accounts?name=Ogilvy&type=company&website=ogilvy.com" && cat response.json# GET /v1/prism/find-accounts: Metered: holds 17 credits per call up front and refunds what the call does not use. Cache hits are free and failed calls are refunded.
# Check the price first for 0 credits: add dry_run=1 to the query. Nothing is fetched or charged.
import os
import random
import time
import uuid
import requests
API_KEY = os.environ.get("SOCIALCRAWL_API_KEY", "YOUR_API_KEY")
TIMEOUT_S = 28 # this endpoint's measured p99 latency x 1.5.
MAX_RETRIES = 3
URL = "https://www.socialcrawl.dev/v1/prism/find-accounts"
def backoff(attempt):
# Exponential backoff with jitter: about 1 s, 2 s, then 4 s.
return 2 ** attempt * (0.5 + random.random() / 2)
def socialcrawl(params):
# One Idempotency-Key per request, reused on every retry, so a retried call is never charged twice.
idempotency_key = str(uuid.uuid4())
for attempt in range(MAX_RETRIES + 1):
try:
res = requests.get(
URL,
params=params,
headers={"x-api-key": API_KEY, "Idempotency-Key": idempotency_key},
timeout=TIMEOUT_S,
)
body = res.json()
except (requests.RequestException, ValueError):
# A timeout, a dropped connection or a non-JSON gateway page: retry with the same key.
if attempt == MAX_RETRIES:
raise
time.sleep(backoff(attempt))
continue
if body["success"]:
return body
error = body["error"]
# Branch on error["type"], never on the message text.
if error["type"] == "RESOURCE_NOT_FOUND":
return None # refunded: nothing to read
retry_after = res.headers.get("Retry-After")
# SERVICE_UNAVAILABLE without Retry-After is a withdrawn endpoint: permanent.
permanent = error["type"] == "SERVICE_UNAVAILABLE" and retry_after is None
if not error.get("retryable") or permanent or attempt == MAX_RETRIES:
raise RuntimeError(f"{error['type']}: {error['message']} (request_id {body['request_id']})")
# Retry-After (seconds) wins; otherwise back off.
time.sleep(float(retry_after) if retry_after else backoff(attempt))
params = {
"name": "Ogilvy",
"type": "company",
"website": "ogilvy.com",
}
body = socialcrawl(params)
if body is not None:
print(body["data"])// GET /v1/prism/find-accounts: Metered: holds 17 credits per call up front and refunds what the call does not use. Cache hits are free and failed calls are refunded.
// Check the price first for 0 credits: add dry_run=1 to the query. Nothing is fetched or charged.
const API_KEY = process.env.SOCIALCRAWL_API_KEY ?? "YOUR_API_KEY";
const TIMEOUT_MS = 28_000; // this endpoint's measured p99 latency x 1.5.
const MAX_RETRIES = 3;
type Page = { next_cursor: string | null; has_more: boolean };
type SocialCrawlResponse =
| { success: true; data: any; pagination?: Page; credits_used: number; request_id: string }
| { success: false; error: { type: string; message: string; retryable: boolean }; request_id: string };
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
// Exponential backoff with jitter: about 1 s, 2 s, then 4 s.
const backoffMs = (attempt: number) => 2 ** attempt * 1000 * (0.5 + Math.random() / 2);
async function socialcrawl(url: URL) {
// One Idempotency-Key per request, reused on every retry, so a retried call is never charged twice.
const idempotencyKey = crypto.randomUUID();
for (let attempt = 0; ; attempt++) {
let res: Response;
let body: SocialCrawlResponse;
try {
res = await fetch(url, {
headers: {
"x-api-key": API_KEY,
"Idempotency-Key": idempotencyKey,
},
signal: AbortSignal.timeout(TIMEOUT_MS),
});
body = (await res.json()) as SocialCrawlResponse;
} catch (error) {
// A timeout, a dropped connection or a non-JSON gateway page: retry with the same key.
if (attempt >= MAX_RETRIES) throw error;
await sleep(backoffMs(attempt));
continue;
}
if (body.success) return body;
// Branch on error.type, never on the message text.
if (body.error.type === "RESOURCE_NOT_FOUND") return null; // refunded: nothing to read
const retryAfter = res.headers.get("Retry-After");
// SERVICE_UNAVAILABLE without Retry-After is a withdrawn endpoint: permanent.
const permanent = body.error.type === "SERVICE_UNAVAILABLE" && retryAfter === null;
if (!body.error.retryable || permanent || attempt >= MAX_RETRIES) {
throw new Error(`${body.error.type}: ${body.error.message} (request_id ${body.request_id})`);
}
// Retry-After (seconds) wins; otherwise back off.
await sleep(retryAfter ? Number(retryAfter) * 1000 : backoffMs(attempt));
}
}
const url = new URL("https://www.socialcrawl.dev/v1/prism/find-accounts");
url.searchParams.set("name", "Ogilvy");
url.searchParams.set("type", "company");
url.searchParams.set("website", "ogilvy.com");
const body = await socialcrawl(url);
if (body) console.log(body.data);Parameters
| Parameter | Required | Description |
|---|---|---|
| name | Yes | The person's or the company's name, 2 to 120 characters. |
| type | No | `person` (default) or `company`. Sets the default platforms and the LinkedIn search used. (person | company) |
| platforms | No | Comma-separated subset of linkedin, instagram, tiktok, twitter, threads, youtube. Default: instagram, tiktok, twitter for a person; linkedin, instagram, tiktok, twitter for a company. Threads and YouTube are searched only when named. An unknown member is a 400. |
| employer | No | Optional current employer of the person, used only as context for the judgment (type=person only). |
| location | No | Optional city or country, used only as context for the judgment. |
| website | No | Optional official website or domain (e.g. ogilvy.com). A platform-verified account linking to it is taken as the match without judging. |
| candidates | No | Accounts judged per platform, 1 to 5 (default 5), taken from the top of each search. With `website`, an account whose own website is that domain is always included. |
| profile_check | No | Optional, default false. When true, the leading candidate on Instagram, TikTok, Threads and (for a company) LinkedIn is looked up on its profile before the check, so the domain check reads its bio and website: 1 credit a lookup (5 for a LinkedIn company page), refunded when it fails. |
What does the Prism Find Accounts API return?
Every response follows one unified schema. Here is a real, unmodified response body, so you can see the exact fields you get back before spending a credit.
Example response
{
"success": true,
"platform": "prism",
"endpoint": "/v1/prism/find-accounts",
"data": {
"name": "Ogilvy",
"type": "person",
"context": {
"employer": null,
"location": null,
"website": "ogilvy.com"
},
"platforms": [
{
"platform": "instagram",
"status": "ok",
"candidates": [
{
"rank": 1,
"handle": "ogilvy",
"display_name": "Ogilvy",
"url": "https://example.com/redacted",
"followers": 583444,
"verified": true,
"bio_excerpt": "Sample comment text (redacted).",
"choice_probability": 0.37
},
{
"rank": 2,
"handle": "user_2b0fa2",
"display_name": "user_9f80b3",
"url": "https://example.com/redacted",
"followers": 43619,
"verified": false,
"bio_excerpt": "Sample comment text (redacted).",
"choice_probability": 0.01
}
],
"match": {
"handle": null,
"level": "none",
"confidence": 0.54,
"basis": "judged",
"evidence": {
"website_match": null,
"cross_link": null,
"bio_consistent": null,
"fan_or_parody": null
}
}
},
{
"platform": "tiktok",
"status": "ok",
"candidates": [
{
"rank": 1,
"handle": "user_32e1e4",
"display_name": "user_47133f",
"url": "https://example.com/redacted",
"followers": 6572,
"verified": false,
"bio_excerpt": null,
"choice_probability": 0.01
},
{
"rank": 2,
"handle": "user_32c4f9",
"display_name": "user_c00da1",
"url": "https://example.com/redacted",
"followers": 639,
"verified": false,
"bio_excerpt": null,
"choice_probability": 0.01
}
],
"match": {
"handle": null,
"level": "none",
"confidence": 0.96,
"basis": "judged",
"evidence": {
"website_match": null,
"cross_link": null,
"bio_consistent": null,
"fan_or_parody": null
}
}
}
],
"automated_decision": false,
"notice": "Candidate accounts ranked from public search results, for human review. A match level is an automated label, not proof of who runs an account; your reviewer decides. Private accounts are not listed.",
"methodology_version": "find-accounts-v1",
"identity_methodology_version": "identity-v1",
"legs": [
{
"endpoint": "/v1/instagram/search/profiles",
"status": 200,
"credits_used": 1,
"latency_ms": 5992,
"error": null
},
{
"endpoint": "/v1/tiktok/search/users",
"status": 200,
"credits_used": 1,
"latency_ms": 2479,
"error": null
}
],
"coverage": 1,
"partial_failure": false
},
"credits_used": 6,
"request_id": "req_example000000",
"cached": false,
"credits_remaining": 9999,
"source": "captured",
"captured_at": "2026-10-02T12:49:03.604Z",
"redacted": true
}Live sample illustrating the unified response shape. Field values reflect the record you query.
How does the Prism Find Accounts API work?
Send a GET request with your API key and get back clean, structured JSON in our unified schema. Supported computed fields are populated when the source provides the required inputs.
Method
GET
Response
JSON
How do you scrape social media data in seconds?
The fastest social media scraping API for developers. Scrape profiles, posts, comments, and analytics from 69 platforms covering 10B+ monthly active users.
One schema, every platform
Query 69 platforms with identical response structures. Write your integration once.
Computed fields, not just scraped
When an endpoint supports these metrics and the source provides the required inputs, the normalized record includes engagement_rate, estimated_reach, content_category, and language. Ready to use.
See your data before you code
Visual Data Explorer. Paste any URL, get rich result cards, sortable tables, CSV export.
import requests
response = requests.get(
'https://www.socialcrawl.dev/v1/tiktok/profile',
params={'handle': 'charlidamelio'},
headers={'x-api-key': 'sc_YOUR_API_KEY'}
)
data = response.json(){
"success": true,
"platform": "tiktok",
"data": {
"author": {
"username": "charlidamelio",
"followers": 152400000
},
"engagement": {
"likes": 12400000000,
"engagement_rate": 0.087
},
"metadata": {
"language": "en",
"content_category": "lifestyle"
}
}
}Have a question? We got answers
Find answers to frequently asked questions about SocialCrawl's API, pricing, and capabilities.
Contact usWhat does the Prism Find Accounts API return?
When should I use the Prism Find Accounts endpoint?
How much does the Prism Find Accounts API cost?
What parameters does the Prism Find Accounts API need?
How do I call the Prism Find Accounts API?
Ask AI about SocialCrawl
Ready to scrape Prism Find Accounts data?
Get your API key and start pulling Prism data in under 60 seconds.
