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:
viewsisnull. TikTok does not report a lifetime view count on a profile. It is null rather than zero, on purpose.freshnessis"cached", so this response cost 0 credits.cache_age_secondstells you the number is five minutes old. If you need it fresher, ask for it — see freshness & caching.
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
- Authentication — projects, rate limits, idempotency
- Errors & availability — every status and what to do with it
- API reference
Last updated 27 August 2026