Should you pull this handle? One call scores a handle across platforms, ranks the best ones, and projects the data volume + credit cost to pull it.
Decide whether to pull a handle before paying for a full collection. Score model 2.0.0 returns nullable top-level and per-platform scores, explicit evidence and component coverage, surface estimates, and legs[] diagnostics. Unknown numeric values are null, not zero. Output is deterministic only for the same (score_version, evidence_fingerprint) and returned evidence; a later live collection may produce different evidence and a different score. Stale-if-error evidence is eligible for at most 24 hours, and future-dated evidence more than 300 seconds ahead is rejected. 5 credits for any selection of up to 4 supported platforms; +1 credit per selected platform beyond 4. Every successful HTTP 200 receives the full request-shaped charge with no partial refund. A non-200 execution failure receives a full refund when every requested platform is a definitive miss or cannot return usable profile evidence. Scores are advisory estimates from public evidence, not calibrated probabilities.
Supported platforms are tiktok, instagram, youtube, twitter, threads, bluesky, truthsocial. Default platforms are tiktok, instagram, youtube, twitter. Optional platforms are threads, bluesky, truthsocial. Reddit is deferred and not supported.
Any unknown platform rejects the whole request with HTTP 400 before billing.
The identity may be a bare handle or canonical supported profile URL. A YouTube channel ID is YouTube-only: omit platforms to audit YouTube or set platforms=youtube; other canonical profile URLs do not narrow the default fanout.
YouTube sampled-post collection sends includeExtras=true.
Profile evidence states are live, stale, not_found, and unavailable. Posts evidence states are sampled, observed_empty, not_supported, not_found, and unavailable. Stale platforms are also listed in stale_platforms. Unknown numeric values are null, not zero, and decision-grade post evidence is required for scoring.
When a platform's profile evidence is not_found, its not_found_reason says why: account_gone (removed, renamed, or never existed), account_private (the account exists but is not publicly readable), or handle_unresolved (no source stated a cause), the same vocabulary the profile endpoints publish as error.details.reason. not_found_reason is null on every platform whose profile was found or not observed. It is reported only and never changes the score or verdict.
observed_empty is decision-grade evidence of an empty posting history; days_since_last_post, media_fraction, avg_text_length, and the content_richness score stay null because no posts were observed.
Explicitly empty text is observed as length 0 and explicitly empty media is observed as false; unknown text or media stays null. Content-richness uses known-only inputs and re-normalizes across the known inputs instead of treating unknowns as zero.
legs[] is emitted in stable plan order. A genuinely pending leg abandoned at the global deadline is synthesized as 504 / UPSTREAM_TIMEOUT / 0 credits; an early rejected dispatch is 502 / UPSTREAM_ERROR / 0 credits, including when compatible stale evidence recovers the response. A terminal profile failure emits no speculative posts leg.
Scores are reproducible only when score_version and evidence_fingerprint are unchanged; score and evidence fields can be null when decision-grade evidence is unavailable.
Collection has a 6.4-second default budget, a 6.5-second hard cap, and a 7-second public API target. These are configured targets, not measured v2 performance.
Process-local monotonic last-known-good ordering prevents older writers within one process; global atomic CAS remains future work.
With relevant_to, up to 25 of the posts already sampled (live evidence only, taken in turn across platforms) are judged against your subject by the same published relevance rule as relevance=filter. domain_relevance.score is the share kept, 0 to 100, with the posts judged listed in judged_posts.
score_with_domain_relevance is 0.7 x score + 0.3 x domain_relevance.score, and verdict_with_domain_relevance applies the same thresholds to it. score, verdict, the five base components, their weights and evidence_fingerprint never read the subject.
domain_relevance is null with a _warnings entry when fewer than 3 posts could be judged (domain_relevance_insufficient_sample) or the judging step did not answer (domain_relevance_unavailable). It is a judged estimate to review, not a measurement. Without relevant_to none of these fields is present.
Request
- Base URL: https://www.socialcrawl.dev/v1
- URL: https://www.socialcrawl.dev/v1/prism/handle-audit
- Auth: API key in header x-api-key
Query parameters
The identity to audit. Accepts a bare handle, a leading @, a supported profile URL, or a YouTube channel ID. A YouTube channel ID is YouTube-only: omit platforms or set platforms=youtube.
CSV subset of tiktok,instagram,youtube,twitter,threads,bluesky,truthsocial (default: tiktok,instagram,youtube,twitter). Names are case-insensitive and deduplicated. Unknown platforms are rejected. At most 8 CSV members before deduplication.
Integer from 1 to 25: recent posts sampled per found platform for engagement and activity metrics (default 10).
Optional. Your subject in up to 200 characters, for example relevant_to=video games. Name ONE subject: A and B is read as posts about both. Adds domain_relevance (the share of sampled posts about it) and score_with_domain_relevance next to the unchanged score. No extra charge.
Headers
Send no-cache to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the no-cache directive triggers this. See the Response Schema guide for details.
Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: credits_used becomes 0, idempotent_replay becomes true, and credits_remaining is refreshed to the current balance. A known current balance appears in both the body and X-Credits-Remaining header; no balance row resolves to 0. On a transient lookup failure, body credits_remaining is null and X-Credits-Remaining is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use Accept: application/json when sending this header. The unsupported key-plus-SSE combination is rejected before billing.
Response
Successful response
Example response
{
"success": true,
"platform": "prism",
"endpoint": "/v1/prism/handle-audit",
"credits_used": 1,
"credits_remaining": 4999,
"request_id": "req-abc123",
"idempotent_replay": true,
"meta": {
"hint": {
"code": "search_multi",
"message": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged.",
"method": "GET",
"path": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
}
}
}Changes
No recorded changes to this operation across all 1 revision of this API.