Quickstart

Get an API key and make your first successful call. Around five minutes, no card required.

1. Get a key

Key issuance is not open yet. The flow below is how it will work; the rest of this page is accurate against the v1 contract and worth reading now.

Sign up and create a key from the dashboard. The secret is shown once at creation and never again — we store only a hash of it, so we cannot recover it for you. Copy it somewhere safe; if you lose it, revoke it and issue another.

Keys look like sv_live_ followed by a random string. The free tier includes 1,000 credits and needs no card.

2. Make a call

Send any supported profile URL to /v1/profile.

curl https://api.sourcevine.io/v1/profile \
  -H "Authorization: Bearer $SOURCEVINE_API_KEY" \
  --data-urlencode "url=https://www.tiktok.com/@atlas.makes" -G
import os, httpx

r = httpx.get(
    "https://api.sourcevine.io/v1/profile",
    headers={"Authorization": f"Bearer {os.environ['SOURCEVINE_API_KEY']}"},
    params={"url": "https://www.tiktok.com/@atlas.makes"},
)
r.raise_for_status()
print(r.json()["metrics"]["followers"])
const r = await fetch(
  "https://api.sourcevine.io/v1/profile?url=" +
    encodeURIComponent("https://www.tiktok.com/@atlas.makes"),
  { headers: { Authorization: `Bearer ${process.env.SOURCEVINE_API_KEY}` } },
);
const profile = await r.json();

3. Read the response

{
  "id": "sd_prof_3f9a2c81b4e07d15",
  "platform": "tiktok",
  "resource_type": "profile",
  "platform_resource_id": "7042118893001",
  "username": "atlas.makes",
  "display_name": "Atlas Makes",
  "verified": true,
  "url": "https://www.tiktok.com/@atlas.makes",
  "metrics": {
    "followers": 482300,
    "following": 214,
    "posts": 618,
    "likes": 9140000,
    "views": null
  },
  "availability": { "status": "available", "reason": null },
  "source_timestamp": "2026-08-27T09:41:02Z",
  "fetched_at": "2026-08-27T09:41:44Z",
  "cache_age_seconds": 312,
  "freshness": "cached"
}

Three things worth noticing straight away:

4. Handle the cases that are not success

A profile can be missing, private, or temporarily unreachable. Those are different situations and you should treat them differently:

data = r.json()
status = data["availability"]["status"]

if status == "available":
    followers = data["metrics"]["followers"]
elif status in ("not_found", "private"):
    pass          # a fact about the world — do not retry
else:
    pass          # transient — retry with backoff

Never retry a not_found or private across platforms or providers. It is a fact, not a failure, and retrying only spends time.

Next

Last updated 27 August 2026