100 크레딧 무료, 카드 등록 없이지금 시작하기
Logo
Prism logo
100 크레딧 무료, 카드 등록 없이

Prism Share Of Voice API

브랜드 2개에서 5개까지의 점유 대화량을 인게이지먼트 가중치로 계산해 웹과 소셜로 나누고 감정 분포와 브랜드별 추이까지 반환합니다.

GET /v1/prism/share-of-voice

2026년 10월 업데이트SocialCrawl 팀이 직접 관리해요

Prism Share Of Voice API는 언제 쓰나요

여러 브랜드를 한 번에 맞붙여 볼 때 사용하세요. brand-mentions는 키워드 하나만 다루고 경쟁 구도는 갈라 주지 않습니다.

API 레퍼런스 영문 원문

Per brand, fans out to content_analysis summary/phrase-trends/sentiment plus /search/everywhere (consuming the real per-platform items_by_source counts, not the capped fused list), then computes a published-formula SOV (web + social, equal-weighted by default), optional true-share-of-category (numeric category_code), and ESOV (market_shares, Binet/Field: a planning signal, not a growth guarantee). The web share is divided from the windowed phrase-trends sum over date_from..date_to, never from the upstream's all-time total_count, which is censored at 4,000,000 and would tie any two brands above that cap at exactly 50/50; the all-time figure still rides along per brand as web_mentions_all_time with a web_mentions_all_time_censored flag. One axis is chosen for the whole table and named in methodology.web_axis, so a brand whose timeline is unavailable can never be compared against a rival's on a different footing; if no brand's timeline is available the table falls back to the all-time totals and _warnings states that your window was not applied, and if those totals are censored it returns no web share at all instead of a fabricated tie. Every measured brand is scored on the SAME evidence basis: if one brand's social leg returns nothing, the whole table drops to the axes every brand has, methodology.basis names it, and _warnings says which brand caused it, so the column is always a real share rather than a mix of formulas. methodology ships the weights, the formula, the axis and the denominators, so you can recompute any share by hand from the same payload. With the social leg on, each brand's highest-engagement social rows (up to methodology.about_brand.max_rows_per_brand) are also judged for whether they are about that brand at all, and a second set of numbers is published next to the first, never in place of it: engagement_sum_about_brand, social_sov_pct_about_brand and sov_pct_about_brand leave out the rows under methodology.about_brand.about_brand_at_or_above, and per_brand[].about_brand lists the excluded row ids, their engagement, and the negative mentions by aspect. The web axis is an index count and is not cleaned. If any brand's rows could not be judged the cleaned numbers are null for the whole table and _warnings says about_brand_unavailable. The price is the same either way. Metered at 40cr/brand (20 web-only); a brand whose social search half-failed is automatically cheaper, with the reason legible in legs[] + per-brand coverage.

69개 플랫폼을 병렬로 검색합니다

·TikTok logoTikTok·Instagram logoInstagram·YouTube logoYouTube·Facebook logoFacebook·X logoX·LinkedIn logoLinkedIn·Reddit logoReddit·Threads logoThreads·Pinterest logoPinterest·Twitch logoTwitch·Truth Social logoTruth Social·Snapchat logoSnapchat·Kick logoKick·Bluesky logoBluesky·Kwai logoKwai·Rumble logoRumble·Spotify logoSpotify·Apple Music logoApple Music·TikTok Shop logoTikTok Shop·Amazon Shop logoAmazon Shop·Google Shopping logoGoogle Shopping·Trustpilot logoTrustpilot·TripAdvisor logoTripAdvisor·Yelp logoYelp·Linktree logoLinktree·Komi logoKomi·Pillar logoPillar·lnk.bio logolnk.bio·Facebook Ads logoFacebook Ads·Google Ads logoGoogle Ads·LinkedIn Ads logoLinkedIn Ads·Google Search logoGoogle Search·Google News logoGoogle News·Finance logoFinance·Polymarket logoPolymarket·Tavily logoTavily·Hacker News logoHacker News·GitHub logoGitHub·Perplexity logoPerplexity·Naver logoNaver·Utility logoUtility·Universal Search logoUniversal Search
·TikTok logoTikTok·Instagram logoInstagram·YouTube logoYouTube·Facebook logoFacebook·X logoX·LinkedIn logoLinkedIn·Reddit logoReddit·Threads logoThreads·Pinterest logoPinterest·Twitch logoTwitch·Truth Social logoTruth Social·Snapchat logoSnapchat·Kick logoKick·Bluesky logoBluesky·Kwai logoKwai·Rumble logoRumble·Spotify logoSpotify·Apple Music logoApple Music·TikTok Shop logoTikTok Shop·Amazon Shop logoAmazon Shop·Google Shopping logoGoogle Shopping·Trustpilot logoTrustpilot·TripAdvisor logoTripAdvisor·Yelp logoYelp·Linktree logoLinktree·Komi logoKomi·Pillar logoPillar·lnk.bio logolnk.bio·Facebook Ads logoFacebook Ads·Google Ads logoGoogle Ads·LinkedIn Ads logoLinkedIn Ads·Google Search logoGoogle Search·Google News logoGoogle News·Finance logoFinance·Polymarket logoPolymarket·Tavily logoTavily·Hacker News logoHacker News·GitHub logoGitHub·Perplexity logoPerplexity·Naver logoNaver·Utility logoUtility·Universal Search logoUniversal Search
·TikTok logoTikTok·Instagram logoInstagram·YouTube logoYouTube·Facebook logoFacebook·X logoX·LinkedIn logoLinkedIn·Reddit logoReddit·Threads logoThreads·Pinterest logoPinterest·Twitch logoTwitch·Truth Social logoTruth Social·Snapchat logoSnapchat·Kick logoKick·Bluesky logoBluesky·Kwai logoKwai·Rumble logoRumble·Spotify logoSpotify·Apple Music logoApple Music·TikTok Shop logoTikTok Shop·Amazon Shop logoAmazon Shop·Google Shopping logoGoogle Shopping·Trustpilot logoTrustpilot·TripAdvisor logoTripAdvisor·Yelp logoYelp·Linktree logoLinktree·Komi logoKomi·Pillar logoPillar·lnk.bio logolnk.bio·Facebook Ads logoFacebook Ads·Google Ads logoGoogle Ads·LinkedIn Ads logoLinkedIn Ads·Google Search logoGoogle Search·Google News logoGoogle News·Finance logoFinance·Polymarket logoPolymarket·Tavily logoTavily·Hacker News logoHacker News·GitHub logoGitHub·Perplexity logoPerplexity·Naver logoNaver·Utility logoUtility·Universal Search logoUniversal Search
·TikTok logoTikTok·Instagram logoInstagram·YouTube logoYouTube·Facebook logoFacebook·X logoX·LinkedIn logoLinkedIn·Reddit logoReddit·Threads logoThreads·Pinterest logoPinterest·Twitch logoTwitch·Truth Social logoTruth Social·Snapchat logoSnapchat·Kick logoKick·Bluesky logoBluesky·Kwai logoKwai·Rumble logoRumble·Spotify logoSpotify·Apple Music logoApple Music·TikTok Shop logoTikTok Shop·Amazon Shop logoAmazon Shop·Google Shopping logoGoogle Shopping·Trustpilot logoTrustpilot·TripAdvisor logoTripAdvisor·Yelp logoYelp·Linktree logoLinktree·Komi logoKomi·Pillar logoPillar·lnk.bio logolnk.bio·Facebook Ads logoFacebook Ads·Google Ads logoGoogle Ads·LinkedIn Ads logoLinkedIn Ads·Google Search logoGoogle Search·Google News logoGoogle News·Finance logoFinance·Polymarket logoPolymarket·Tavily logoTavily·Hacker News logoHacker News·GitHub logoGitHub·Perplexity logoPerplexity·Naver logoNaver·Utility logoUtility·Universal Search logoUniversal Search
Prism API

Share Of Voice API로 무엇을 할 수 있을까요

Share Of Voice 엔드포인트가 통합 스키마와 계산 필드를 담은 Prism 데이터를 한 번의 요청으로 보내드려요. 스크래핑 인프라를 직접 만들거나 유지할 필요가 없어요.

요청 예시

# GET /v1/prism/share-of-voice: Metered: holds 120 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 60: the API's own time limit for this endpoint.
# --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 60 --retry 3 -o response.json \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  "https://www.socialcrawl.dev/v1/prism/share-of-voice?brands=notion%2Ccoda%2Cairtable&include=social%2Cemotions" && cat response.json
# GET /v1/prism/share-of-voice: Metered: holds 120 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 = 60  # the API's own time limit for this endpoint.
MAX_RETRIES = 3
URL = "https://www.socialcrawl.dev/v1/prism/share-of-voice"


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 = {
    "brands": "notion,coda,airtable",
    "include": "social,emotions",
}
body = socialcrawl(params)
if body is not None:
    print(body["data"])
// GET /v1/prism/share-of-voice: Metered: holds 120 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 = 60_000; // the API's own time limit for this endpoint.
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/share-of-voice");
url.searchParams.set("brands", "notion,coda,airtable");
url.searchParams.set("include", "social,emotions");

const body = await socialcrawl(url);
if (body) console.log(body.data);

파라미터

파라미터필수설명
brands예2-5 competitor brand names (CSV).
category_code아니오Numeric category-taxonomy code for true-share-of-category (look one up with `GET /v1/content_analysis/categories`).
market_shares아니오JSON map of real market share per brand (fraction or %), e.g. {"notion":0.4,"coda":0.25,"airtable":0.35}, to compute ESOV.
include아니오CSV toggles (default `emotions,social`). Drop `social` for the cheaper web-only variant; drop `emotions` to skip the sentiment leg. The emotion overlay is third-party NLP passed through unmodified and is not scoped to your date window; `methodology.sentiment_provenance` states that on every response that carries it.
page_type아니오Optional surface filter forwarded to the content_analysis legs. (ecommerce | news | blogs | message-boards | organization)
date_from아니오Window start (YYYY-MM-DD). Defaults to 90 days ago.
date_to아니오Window end (YYYY-MM-DD). Defaults to today.
brand_descriptions아니오Optional JSON map of a one-line description per brand, e.g. {"notion":"the workspace app"}, used to tell a brand apart from its namesakes.
응답 예시

Prism Share Of Voice API는 무엇을 돌려주나요

모든 응답은 하나의 통합 스키마를 따라요. 크레딧을 쓰기 전에 어떤 필드가 돌아오는지, 실제 응답 본문 그대로 확인해 보세요.

응답 예시 보기
{
  "success": true,
  "platform": "instagram",
  "endpoint": "/v1/instagram/engagement",
  "data": {
    "engagement_rate_percentages": 38.33,
    "recent_posts": 12,
    "followers": 87608035,
    "comments": 528912,
    "likes": 33049046,
    "recent_posts_explanation": "Statistics based on the last 12 posts",
    "id_user": "2278169415",
    "username": "mrbeast",
    "is_private": false,
    "posts_details": [
      {
        "likes": 5636982,
        "comments": 69484,
        "taken_at": 1781457954,
        "datetime": "2026-06-14 20:25:54",
        "hours_since_post": 461,
        "time_ago": "19 days ago",
        "likes_per_hour": 12228,
        "comments_per_hour": 151
      },
      {
        "likes": 20000768,
        "comments": 223510,
        "taken_at": 1732824650,
        "datetime": "2024-11-28 23:10:50",
        "hours_since_post": 13971,
        "time_ago": "2 years ago",
        "likes_per_hour": 1432,
        "comments_per_hour": 16
      },
      {
        "likes": 929226,
        "comments": 30633,
        "taken_at": 1782232475,
        "datetime": "2026-06-23 19:34:35",
        "hours_since_post": 246,
        "time_ago": "10 days ago",
        "likes_per_hour": 3777,
        "comments_per_hour": 125
      },
      {
        "likes": 487761,
        "comments": 22482,
        "taken_at": 1781799425,
        "datetime": "2026-06-18 19:17:05",
        "hours_since_post": 366,
        "time_ago": "15 days ago",
        "likes_per_hour": 1333,
        "comments_per_hour": 61
      },
      {
        "likes": 712265,
        "comments": 15716,
        "taken_at": 1781366405,
        "datetime": "2026-06-13 19:00:05",
        "hours_since_post": 487,
        "time_ago": "20 days ago",
        "likes_per_hour": 1463,
        "comments_per_hour": 32
      },
      {
        "likes": 1475116,
        "comments": 35386,
        "taken_at": 1781277094,
        "datetime": "2026-06-12 18:11:34",
        "hours_since_post": 512,
        "time_ago": "21 days ago",
        "likes_per_hour": 2881,
        "comments_per_hour": 69
      },
      {
        "likes": 1108220,
        "comments": 26632,
        "taken_at": 1780160249,
        "datetime": "2026-05-30 19:57:29",
        "hours_since_post": 822,
        "time_ago": "1 months ago",
        "likes_per_hour": 1348,
        "comments_per_hour": 32
      },
      {
        "likes": 542948,
        "comments": 28476,
        "taken_at": 1779375582,
        "datetime": "2026-05-21 17:59:42",
        "hours_since_post": 1040,
        "time_ago": "1 months ago",
        "likes_per_hour": 522,
        "comments_per_hour": 27
      },
      {
        "likes": 698514,
        "comments": 24401,
        "taken_at": 1779120014,
        "datetime": "2026-05-18 19:00:14",
        "hours_since_post": 1111,
        "time_ago": "2 months ago",
        "likes_per_hour": 629,
        "comments_per_hour": 22
      },
      {
        "likes": 468000,
        "comments": 13548,
        "taken_at": 1778947209,
        "datetime": "2026-05-16 19:00:09",
        "hours_since_post": 1159,
        "time_ago": "2 months ago",
        "likes_per_hour": 404,
        "comments_per_hour": 12
      },
      {
        "likes": 526594,
        "comments": 24411,
        "taken_at": 1777737719,
        "datetime": "2026-05-02 19:01:59",
        "hours_since_post": 1495,
        "time_ago": "2 months ago",
        "likes_per_hour": 352,
        "comments_per_hour": 16
      },
      {
        "likes": 462652,
        "comments": 14233,
        "taken_at": 1777580305,
        "datetime": "2026-04-30 23:18:25",
        "hours_since_post": 1538,
        "time_ago": "2 months ago",
        "likes_per_hour": 301,
        "comments_per_hour": 9
      }
    ]
  },
  "credits_used": 5,
  "credits_remaining": 9999,
  "request_id": "req-8Kq2ZmR4vT9xLb3P",
  "cached": false,
  "redacted": true
}

Instagram API에서 가져온 예시예요. 모든 SocialCrawl 엔드포인트가 똑같은 통합 스키마를 돌려주기 때문에, Prism Share Of Voice 응답도 같은 필드로 구성돼요.

API 상세

Prism Share Of Voice API는 어떻게 동작하나요

API 키와 함께 GET 요청을 보내면, 통합 스키마와 계산 필드를 담은 깔끔한 JSON이 돌아와요.

메서드

GET

응답 형식

JSON

왜 SocialCrawl인가요

Prism Share Of Voice 데이터는 왜 SocialCrawl로 가져올까요

Prism 데이터 추출에서 까다로운 부분은 SocialCrawl이 가려 드려요. 통합 스키마, AI 인리치먼트, 그리고 코드에 남지 않는 플랫폼 로직까지.

개발자 우선

소셜 미디어 데이터를 몇 초 만에 수집하는 방법

개발자를 위한 가장 빠른 소셜 미디어 스크래핑 API. 월간 활성 사용자 100억 명 이상을 포괄하는 69개 플랫폼에서 프로필, 게시물, 댓글, 분석 데이터를 수집하세요.

모든 플랫폼을 하나의 스키마로

동일한 응답 구조로 69개 플랫폼을 조회하세요. 연동은 한 번이면 충분합니다.

단순 수집을 넘어 계산된 필드 제공

엔드포인트가 해당 지표를 지원하고 계산에 필요한 원본 값이 있을 때, 정규화된 레코드에 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()
[ .JSON ]
{
  "success": true,
  "platform": "tiktok",
  "data": {
    "author": {
      "username": "charlidamelio",
      "followers": 152400000
    },
    "engagement": {
      "likes": 12400000000,
      "engagement_rate": 0.087
    },
    "metadata": {
      "language": "en",
      "content_category": "lifestyle"
    }
  }
}
+ 69개 플랫폼
자주 묻는 질문

자주 묻는 질문

API, 요금제, 기능에 대한 질문과 답변입니다.

문의하기
Share of Voice API는 뭔가요?
GET /v1/prism/share-of-voice는 브랜드 2~5개를 넣으면 순위가 매겨진 보이스 점유율 표 하나를 돌려드려요. 각 브랜드의 점유율은 실제 플랫폼별 수치, 즉 웹 언급량과 소셜 참여를 합쳐 참여도로 가중해 계산해요. 브랜드 간 경쟁 점유율을 내주는 엔드포인트는 이거 하나예요.
점유율은 어떻게 계산되나요?
브랜드마다 웹 점유율(전체 언급량 대비)과 소셜 점유율(전체 참여 대비)을 구하고, 기본 5대5로 합쳐 sov_pct를 내요. 이 값은 브랜드 세트 안에서 합이 약 1.0이 돼요. 가중치와 잡음 구간은 methodology_version에 박아 둬서 결과를 그대로 재현할 수 있어요.
ESOV는 뭐고 어떻게 받나요?
ESOV(초과 점유율)는 보이스 점유율에서 실제 시장 점유율을 뺀 값에 100을 곱한 거예요. 비넷·필드가 말한 기획 지표예요. market_shares에 브랜드별 점유율을 JSON으로 넣으면 브랜드마다 esov를 계산해 드려요. 성장을 보장하는 숫자가 아니라 기획용 신호예요.
share-of-voice 요금은 얼마인가요?
웹과 소셜을 다 보는 전체 리포트는 브랜드당 40 크레딧이에요. include에서 social을 빼면 웹만 보는 방식으로 브랜드당 20 크레딧이에요. 소셜 검색이 절반쯤 실패한 브랜드는 자동으로 더 싸게 과금되고, 이유는 브랜드별 coverage와 legs에 그대로 보여요.
실제 플랫폼별 수치를 쓰나요?
네. 소셜 점유율은 items_by_source, 즉 통합 검색에서 나온 실제 플랫폼별 수치와 참여로 계산해요. 상한이 걸린 합쳐진 목록이 아니라서 실제 플랫폼 분포를 그대로 반영해요. 감성은 NLP 콘텐츠 분석에서 오고, 점유율 계산에는 LLM을 전혀 쓰지 않아요.

AI에게 SocialCrawl을 물어보세요

Prism Share Of Voice 데이터, 가져올 준비 되셨어요?

API 키 받고 60초 안에 Prism 데이터를 받아 가세요.

무료로 시작하기

🤖 AI 에이전트나 LLM이신가요? 이 페이지를 markdown으로 읽어보세요