Social media scraping APIWatches with webhooks
Any public profile, post or ad.
One request, one schema.Most APIs tell you what a number is.
This one tells you when it changed.
Creators, posts, comments, transcripts and ads, returned as one unified schema. A failed or empty request costs nothing.Watch a creator, a hashtag, or an ad account and take a webhook when something moves.
1,000 credits, once · no card · or try a free tool
curl -G ${API}/v1/tiktok/video \
-H "x-api-key: ${KEY}" \
-d url=7318842019283746306{
"platform": "tiktok",
"id": "7318842019283746306",
"type": "video",
"authorHandle": "zachking",
"viewCount": 12480221,
"likeCount": 1842003,
"commentCount": 9241,
"shareCount": 44018,
"publishedAt": "2026-08-14T09:12:44.000Z"
}- 15:02:09TT@clip.9c14views—
- 14:57:09IG@voguefollowers—
- 14:52:09YT@fireshipviews—
- 14:47:09TT@clip.7f2aviewssent
- 14:42:09FBad:Ridgeactive adssent
- 14:37:09YT@veritasiumsubs—
- 14:32:09IG@nasaposts—
- 14:27:09TT@zachkingfollowers—
- 14:22:09YT@mkbhdviewssent
- 206 endpoints · 37 platforms
- failures cost 0
- empty results cost 0
- cache hits cost 0
Every platform
206 endpoints, 7 record types.
Ordered by what is answering right now, not by catalogue size. Each tile links to that platform's endpoints in the API reference.
Social
- Facebook22ad · post · event
- YouTube17video · search · channel
- GitHub10user · activity · followers
- Spotify7album · track · artist
- Instagram19post · search · profile
- LinkedIn8ad · post · company
- Apple Music4album · track · artist
- Pinterest4pin · board · search
- TikTok32live · song · video
- Reddit9post · user · search
- X / Twitter6tweet · profile · community
- Threads5post · search · profile
- Twitch4clip · profile · userVideos
- Bluesky3post · profile · userPosts
- Kwai3post · profile · userPosts
- SoundCloud3track · artist · artistTracks
- Telegram3post · channel · channelPosts
- Rumble5video · search · comments
- Snapchat3profile · spotlight · spotlightComments
- Kick1clip
- Truth Social3post · profile · userPosts
Commerce, search and property
What is verifiedThe billing contract
Eight promises, each with a test that fails if we break it
These are not positioning lines. They are numbered clauses in the specification, and the execution pipeline enforces them in a fixed order: validate, preflight, cache, charge, run, settle.
| Ref | Promise | What that means in practice |
|---|---|---|
| P1 | You are never charged for a failed request. | Upstream blocks, timeouts, rate limits, not-founds, schema drift, and our own internal errors all refund in full before the error reaches you. |
| P2 | You are never charged for an empty result. | A profile with no posts, a video with no captions, a search with no hits: you still get a 200, and creditsCharged reads 0. |
| P3 | Cache hits cost 0 credits. | Pass cache_max_age=7d to say how stale you will tolerate. A hit never invokes a scraper and never bills. |
| P4 | An invalid API key is an auth error, not a billing error. | A wrong key returns 401. A 402 always means the key is valid and the balance is not. The two are never confused. |
| P5 | Every endpoint's price is machine-readable. | x-credit-cost sits on every operation in openapi.json, so an agent can compute spend from the spec alone. |
| P6 | A balance can never go negative. | Charges are a conditional database update. Run a thousand concurrent requests against a balance of one and exactly one succeeds. |
| P7 | Per-tenant cache isolation is standard. | Not an enterprise upsell. Turn it on and your team reads and writes only its own scope, permanently. |
| P8 | Hard daily spend caps. | Set a ceiling in credits per UTC day. Requests past it fail with 429 before any charge is taken, not after. |
One schema
7 objects. Every platform.
Everyone else in this category returns whatever shape the platform happened to give them, so every customer writes an adapter per platform. There are 7 record types here (Creator, Post, Transcript, Comment, Ad, Product, PropertyListing), and a platform maps onto one of them or it does not ship. Read the two payloads below: different platforms, identical field names, identical types. The untouched upstream response is always available under raw.
GET /v1/tiktok/video
{
"platform": "tiktok",
"id": "7318842019283746306",
"type": "video",
"authorHandle": "zachking",
"viewCount": 12480221,
"likeCount": 1842003,
"commentCount": 9241,
"shareCount": 44018,
"publishedAt": "2026-08-14T09:12:44.000Z"
}GET /v1/youtube/video
{
"platform": "youtube",
"id": "8XkPqR2nLvE",
"type": "short",
"authorHandle": "mrbeast",
"viewCount": 12480221,
"likeCount": 1842003,
"commentCount": 9241,
"shareCount": null,
"publishedAt": "2026-08-14T09:12:44.000Z"
}Null is not zero. A platform that does not expose share counts returns null. A post with no shares returns 0. Conflating those two silently corrupts every average built on top of them.
Nothing is lost. Pass include_raw=true and the original payload comes back beside the normalised one, byte for byte.
Write the integration once. Adding a platform to your product stops being an adapter and starts being a string in a query parameter.
Async by default
No thirty-second ceiling to design around
Every scrape is a job. The synchronous endpoints are a convenience wrapper that waits for a fast one, never the other way round. A full-channel transcript pull just runs until it is finished.
curl -X POST ${API}/v1/subscriptions \
-H "x-api-key: ${KEY}" \
-H "content-type: application/json" \
-d '{
"endpoint": "youtube.channelVideos",
"params": { "handle": "@mrbeast" },
"webhook_url": "https://you.example/hooks/social"
}'We poll on your behalf and call your webhook when the data actually moves. Watch the endpoint whose result changes for the thing you care about: a video list changes when they upload, a profile changes when they rename. Signed deliveries and retries. A delivery that exhausts its retries is logged, not queued for later, so treat your endpoint being up as part of the contract.
curl -X POST ${API}/v1/jobs/batch \
-H "x-api-key: ${KEY}" \
-H "content-type: application/json" \
-d '{
"endpoint": "youtube.transcript",
"targets": ["8XkPqR2nLvE", "dQw4w9WgXcQ", "... up to 500"]
}'
# 202 Accepted, no 30-second ceiling. Poll or take the webhookFailed and empty targets are refunded automatically as the batch runs, so a job that half-fails bills for exactly the half that worked.
Free tools
Use the API without signing up for anything
Every tool below runs against the same endpoints you would call in production, with the same schema. No account, no email, no watermark on the output.
YouTube transcript extractor
Paste a video URL, get plain text, timestamped text, or an SRT file.
runs on /v1/youtube/transcript
YouTube channel viewer
Look up subscribers, total views, links, and recent uploads for any channel.
runs on /v1/youtube/channel
YouTube video analyzer
Views, likes, engagement rate, hashtags, and metadata for any video or Short.
runs on /v1/youtube/video
Bulk YouTube transcript extractor
Paste a channel or a list of URLs and download every transcript at once.
runs on /v1/youtube/transcript
For agents
Point a model at these files and it can use the API
Pricing, billing rules, error semantics and every operation are machine-readable at stable URLs. An agent can work out what a call will cost before it makes it. Or skip the HTTP layer and use the MCP server, the CLI, or the skill.
Read the surface
Run it
Remote MCP over HTTP, with the same auth and same execute() pipeline as the REST surface, so billing and caching cannot drift between them.
Both pre-fill the server and leave x-api-key as YOUR_KEY. Neither editor can prompt for a secret during install, so paste your own before the first call.
claude mcp add --transport http truescrape \
https://api.truescrape.com/mcp \
--header "x-api-key: YOUR_KEY"
# Cursor and VS Code, configured for you:
truescrape agent add cursor
truescrape agent add vscodeQuestions
What people ask first
- Do you charge for failed requests?
- No. A failed request costs nothing, whatever the cause: an upstream block, a timeout, a rate limit, a not-found, or a bug on our side. An empty result costs nothing either, because the target genuinely having no data is an answer. Cache hits are free.
- Is there a subscription?
- No. Credits are bought once and never expire, and the free grant is a one-time 1,000 credits with no card required. Every endpoint is available on every plan, including the free one — there is no feature gating by tier.
- Do you scrape private or logged-in data?
- No. TrueScrape reads public, logged-out data only. No authenticated scraping, no cookies, no logged-in sessions, and public Pages rather than personal profiles. If a request would require signing in, we do not serve it.
- How do I find out when a creator posts?
- Create a watch on a target and point a webhook at your endpoint. TrueScrape checks it on your schedule, compares the content rather than the raw payload, and calls your webhook only when something actually changed. Each check is billed like a normal request, so a failed or empty check is refunded.
- What happens if a job takes longer than a request timeout?
- Submit it as an async job instead. Jobs have no timeout ceiling, batches take up to 500 targets in one call, and you collect the result when it is ready. Nothing needs to complete inside a single HTTP request.
- What does the data look like across different platforms?
- One schema. A creator, a post, a comment and a transcript have the same shape whether they came from YouTube, TikTok, Instagram or anywhere else, and the untouched upstream payload is still there in the raw field if you need it.
Stop polling. Start subscribing.
Start with a free tool to see the data quality, then take a key and point a webhook at it. There is nothing to cancel and nothing expires.