Prism Find Accounts API
사람이나 회사 이름으로 Instagram, TikTok, X, LinkedIn, Threads의 공개 계정 후보를 찾아 플랫폼별 순위로 반환합니다. 플랫폼마다 일치 수준과 일치 신뢰도가 붙습니다.
GET /v1/prism/find-accountsPrism Find Accounts API는 언제 쓰나요
핸들은 모르고 이름만 알 때 검토할 후보 목록을 받으려면 사용하세요. 플랫폼마다 검색해 프로필을 직접 비교하지 않아도 됩니다. 계정의 실제 운영자를 확정하지는 않으며 최종 판단은 검토 담당자가 합니다.
API 레퍼런스 영문 원문
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.
75개 플랫폼을 병렬로 검색합니다
Find Accounts API로 무엇을 할 수 있을까요
Find Accounts 엔드포인트가 통합 스키마와 계산 필드를 담은 Prism 데이터를 한 번의 요청으로 보내드려요. 스크래핑 인프라를 직접 만들거나 유지할 필요가 없어요.
요청 예시
# 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);파라미터
| 파라미터 | 필수 | 설명 |
|---|---|---|
| name | 예 | The person's or the company's name, 2 to 120 characters. |
| type | 아니오 | `person` (default) or `company`. Sets the default platforms and the LinkedIn search used. (person | company) |
| platforms | 아니오 | 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 | 아니오 | Optional current employer of the person, used only as context for the judgment (type=person only). |
| location | 아니오 | Optional city or country, used only as context for the judgment. |
| website | 아니오 | Optional official website or domain (e.g. ogilvy.com). A platform-verified account linking to it is taken as the match without judging. |
| candidates | 아니오 | 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 | 아니오 | 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. |
Prism Find Accounts API는 무엇을 돌려주나요
모든 응답은 하나의 통합 스키마를 따라요. 크레딧을 쓰기 전에 어떤 필드가 돌아오는지, 실제 응답 본문 그대로 확인해 보세요.
응답 예시 보기
{
"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": "user_1a9c42",
"display_name": "user_d30414",
"url": "https://www.instagram.com/user_1a9c42/",
"followers": null,
"verified": true,
"bio_excerpt": null,
"choice_probability": 0.18
},
{
"rank": 2,
"handle": "user_eff048",
"display_name": "user_72a44c",
"url": "https://www.instagram.com/user_eff048/",
"followers": null,
"verified": false,
"bio_excerpt": null,
"choice_probability": 0.18
}
],
"match": {
"handle": null,
"level": "none",
"confidence": 0.53,
"basis": "judged",
"evidence": {
"website_match": null,
"cross_link": null,
"bio_consistent": null,
"fan_or_parody": null,
"domain": "ogilvy.com",
"domain_match": null,
"domain_source": null
},
"match_confidence": null,
"accepted": false
}
},
{
"platform": "tiktok",
"status": "ok",
"candidates": [
{
"rank": 1,
"handle": "user_0e7e8a",
"display_name": "user_80a888",
"url": "https://www.tiktok.com/@user_0e7e8a",
"followers": 10592,
"verified": false,
"bio_excerpt": null,
"choice_probability": 0.07
},
{
"rank": 2,
"handle": "user_23d674",
"display_name": "user_23d674",
"url": "https://www.tiktok.com/@user_23d674",
"followers": 6201,
"verified": false,
"bio_excerpt": null,
"choice_probability": 0.02
}
],
"match": {
"handle": null,
"level": "none",
"confidence": 0.84,
"basis": "judged",
"evidence": {
"website_match": null,
"cross_link": null,
"bio_consistent": null,
"fan_or_parody": null,
"domain": "ogilvy.com",
"domain_match": null,
"domain_source": null
},
"match_confidence": null,
"accepted": false
}
}
],
"items": [
{
"platform": "twitter",
"target": {
"name": "Ogilvy",
"type": "person",
"website": "ogilvy.com"
},
"author": {
"id": "5894902",
"username": "Ogilvy",
"display_name": "Ogilvy",
"avatar_url": "https://pbs.twimg.com/profile_images/1844438195150139424/RQesNOe-_normal.png",
"bio": "We inspire brands and people to impact the world.",
"verified": true,
"followers": 297364,
"following": 10930,
"posts_count": 32403,
"likes_count": null,
"url": "https://x.com/Ogilvy",
"location": "Global",
"private": false,
"joined_at": "2007-05-09",
"ext": {
"cover_url": "https://pbs.twimg.com/profile_banners/5894902/1740607678",
"bio_link": "http://www.ogilvy.com"
}
},
"match": {
"handle": "Ogilvy",
"level": "same",
"confidence": null,
"basis": "exact_link",
"evidence": {
"website_match": true,
"cross_link": false,
"bio_consistent": null,
"fan_or_parody": null,
"domain": "ogilvy.com",
"domain_match": true,
"domain_source": "external_url"
},
"match_confidence": 1,
"accepted": true
}
}
],
"match_confidence_floor": 0.6,
"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": 1522,
"error": null
},
{
"endpoint": "/v1/tiktok/search/users",
"status": 200,
"credits_used": 1,
"latency_ms": 2288,
"error": null
}
],
"coverage": 1,
"partial_failure": false,
"dropped": 0
},
"credits_used": 6,
"request_id": "req_example000000",
"cached": false,
"pagination": {
"next_cursor": null,
"has_more": false,
"page_size": 1,
"typical_page_size": null,
"next_page_credits": null
},
"credits_remaining": 9999,
"source": "captured",
"captured_at": "2026-11-02T02:51:23.959Z",
"redacted": true
}통합 응답 구조를 보여 주는 실제 샘플이에요. 필드 값은 조회한 대상에 따라 달라져요.
Prism Find Accounts API는 어떻게 동작하나요
API 키와 함께 GET 요청을 보내면, 통합 스키마와 계산 필드를 담은 깔끔한 JSON이 돌아와요.
메서드
GET
응답 형식
JSON
소셜 미디어 데이터를 몇 초 만에 수집하는 방법
개발자를 위한 가장 빠른 소셜 미디어 스크래핑 API. 월간 활성 사용자 100억 명 이상을 포괄하는 75개 플랫폼에서 프로필, 게시물, 댓글, 분석 데이터를 수집하세요.
모든 플랫폼을 하나의 스키마로
동일한 응답 구조로 75개 플랫폼을 조회하세요. 연동은 한 번이면 충분합니다.
단순 수집을 넘어 계산된 필드 제공
엔드포인트가 해당 지표를 지원하고 계산에 필요한 원본 값이 있을 때, 정규화된 레코드에 engagement_rate, estimated_reach, content_category, language를 함께 담아 바로 활용할 수 있습니다.
코드 한 줄 쓰기 전에, 데이터부터
Visual Data Explorer에 URL만 붙여넣으면 결과 카드와 정형화된 테이블, CSV 내보내기를 바로 사용할 수 있습니다.
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"
}
}
}자주 묻는 질문
API, 요금제, 기능에 대한 질문과 답변입니다.
문의하기Prism Find Accounts API는 어떤 데이터를 돌려주나요?
Prism Find Accounts 엔드포인트는 언제 쓰면 좋나요?
Prism Find Accounts API 비용은 얼마인가요?
Prism Find Accounts API에는 어떤 파라미터가 필요한가요?
Prism Find Accounts API는 어떻게 호출하나요?
AI에게 SocialCrawl을 물어보세요
Prism Find Accounts 데이터, 가져올 준비 되셨어요?
API 키 받고 60초 안에 Prism 데이터를 받아 가세요.
