POST /v1/resolve
Profile or post
Paste a TikTok, Instagram or YouTube URL and get normalized JSON for profiles, posts and delivery checks — with freshness metadata, and no contact data.
Try a profile or a post URL from the demo set.
Not in the demo set
The public demo runs on a small curated set, so it stays free and predictable. A key resolves any supported URL.
Sign up for a keyGet started
resolve takes any supported URL and tells you what it is.profile, profile/posts and post do the obvious thing.
curl https://api.sourcevine.io/v1/profile \
-H "Authorization: Bearer sv_live_…" \
--data-urlencode "url=https://www.tiktok.com/@atlas.makes" -Gimport 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"},
)
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 { metrics } = await r.json();Platforms
We would rather cover three platforms with a response you can rely on than list ten and have half of them return partial data. Each card says what isnot there as plainly as what is.
Profiles · Videos · Photo posts
Comments, search, livestream
Profile likes are lifetime totals. Profile views are not reported.
Field coverage →Profiles · Posts · Reels
Stories, private accounts, DMs
Shares and saves are not reported on posts.
Field coverage →Channels · Videos · Shorts
Transcripts, comments, Shorts analytics
Following count is not reported. Channel views are lifetime totals.
Field coverage →One schema
Same keys, same types, same place. Where a platform does not report a metric you get an explicit null — never a zero standing in for "unknown", and never a TikTok view quietly equated with an Instagram view.
| followers | 482,300 |
| following | 214 |
| posts | 618 |
| likes | 9,140,000 |
| views | null |
| followers | 128,940 |
| following | 892 |
| posts | 1,204 |
| likes | null |
| views | null |
| followers | 1,042,000 |
| following | null |
| posts | 287 |
| likes | null |
| views | 214,800,000 |
Integrate once. Adding a platform later does not change your parsing code.
Operations
Credits are charged per operation, so a simple lookup does not subsidise a heavy one. Every operation is priced and published — no quote, no sales call to find out.
Profile or post
Profile + metrics
Post page + cursor
Post + metrics
| Operation | Returns | Class | TikTok | YouTube | Cache hit | ||
|---|---|---|---|---|---|---|---|
| POST /v1/resolve | Profile or post | basic | 1 | 1 | 1 | 0 credits | Docs → |
| GET /v1/profile | Profile + metrics | basic | 1 | 2 | 1 | 0 credits | Docs → |
| GET /v1/profile/posts | Post page + cursor | list | 2 | 3 | 2 | 0 credits | Docs → |
| GET /v1/post | Post + metrics | basic | 1 | 2 | 1 | 0 credits | Docs → |
Credits are per live request, and they are not the same on every platform — some upstreams cost us more, and the table says so rather than averaging it. Every response carries freshness, fetched_at andcache_age_seconds, so you always know which column you paid for.
Estimate
Cache hits are free, so your spend depends on how much of your traffic is repeat lookups. Move the hit rate and watch what happens.
An estimate, not a quote. Cache hit rate depends on how much your traffic overlaps — it is not guaranteed, and we would rather show you the lever than promise a number.
The job
For agencies, SMM operators and creator-tool builders: a single reading answers nothing. Delivery only exists as the difference between two of them, taken at times you can point to — which is exactly whatsource_timestamp and fetched_at are for.
1 Aug 2026 to 27 Aug 2026
1 Aug 2026 to 27 Aug 2026
1 Aug 2026 to 27 Aug 2026
| Metric | Before1 Aug 2026 | After27 Aug 2026 | Change |
|---|---|---|---|
| Profile followers | 128,940 | 131,204 | +2,264 ▲ 1.8% |
| Post views | 412,000 | 498,120 | +86,120 ▲ 20.9% |
| Post likes | 34,180 | 41,260 | +7,080 ▲ 20.7% |
Two calls, one schema, both timestamped. The delta is arithmetic you do — we do not compute it for you, because a number without the two readings behind it is not evidence.
Freshness & cache
If we already hold a recent copy of what you asked for, you get it forzero credits. You are billed for live fetches, not for asking twice.
freshness: "cached"Served from a recent copy. Free. This is the default, and for most workloads it is most of your traffic.
freshness: "fresh"Fetched live from the source. Billed at the operation's credit cost.
Every response also carries source_timestamp,fetched_at and cache_age_seconds, so you always know how old a number is. We do not claim real-time, because we cannot prove it.
Your account
Usage by operation, live versus cached, and every request in a log you can export. Credits in, credits avoided — no guessing at the invoice.
| 14:02:11 | GET /v1/profile | tiktok | cached | 0 |
| 14:02:09 | GET /v1/post | youtube | fresh | 1 |
| 14:01:55 | GET /v1/profile/posts | fresh | 2 | |
| 14:01:48 | POST /v1/resolve | tiktok | cached | 0 |
| 14:01:31 | GET /v1/profile | cached | 0 |
Privacy
Public metrics are what we return. Contact details are not fetched, not stored and not returned — which costs us fields some providers sell as a feature. That is the trade, made on purpose.
Raw upstream payloads are never written to disk. Responses are assembled from an explicit field allowlist, so a field we did not choose to expose cannot appear by accident.
Pricing
Credits are charged per operation — simple lookups cost less than list and derived calls. Cache hits are free on every plan.
Enough to finish an integration, not a toy.
$2.53 per 1,000 credits.
$1.96 per 1,000 credits.
Production workloads above 25,000 credits a month are priced per account so the rate matches your actual operation mix. Tell us what you are building and what volume you expect.
Documentation
Key to first response.
Read →Keys, projects, rate limits, idempotency.
Read →Every field, and what is deliberately absent.
Read →What costs what, and what is never charged.
Read →How old your data is, and how to force newer.
Read →Which failures are facts, which to retry.
Read →FAQ
Publicly visible profile and post information from TikTok, Instagram and YouTube, retrieved through upstream data providers and normalized into a single schema. Nothing behind a login, nothing from a private account, and no contact details at any point.
Credits are charged per operation. A simple profile or post lookup costs one; list operations such as recent posts cost two; heavier derived operations cost more. A cache hit costs zero. You are billed for live fetches, so repeated checks on the same resource are cheap.
Every response carries source_timestamp, fetched_at and cache_age_seconds, so you can see exactly how old a figure is. Cached results are served within a short window that varies by resource type; you can force a live fetch when you need one. We do not advertise real-time, because upstream behaviour does not let us prove it.
Creator bios routinely contain email addresses, phone numbers and messenger handles. Returning them would mean storing contact details for people who never dealt with us, so the field is excluded from the schema entirely rather than filtered after the fact.
You get a typed availability status — not_found, private or unavailable — rather than an ambiguous error, and you are not charged. Our upstream bills us for those lookups; that cost is ours, not yours.
Requests keep working and bill as overage at a higher per-credit rate — nothing gets cut off mid-run. Set a balance alert at a threshold you choose, or turn on automatic top-up so it never comes up.
Within the acceptable use policy. Building profiles of private individuals, contact enrichment, and redistributing bulk personal data are not permitted. The product is scoped to public metrics for business and campaign use.
Coverage expands where upstream reliability supports it. We would rather do three platforms consistently than list ten and have half of them return partial data — so we announce a platform when the normalized response for it is stable.
The free tier is sized to finish a real integration, not to tease one. No card required.