Try it
Run a live social media request
One real call, no signup and no key. Pick a platform tab and read the parsed result beside the raw JSON.
The box carries four tabs. TikTok is in preview, so its tab answers the standard unavailable message rather than a profile — that is the correct behaviour for an endpoint that is not served yet, not a fault in the box.
Endpoints & Pricing
Four Platforms, One API Key
Every rate below is per 1,000 calls, and a call is one request — not one row in the list it returns.
YouTube
/api/social/youtube/searchfor video, channel and playlist search- Video records with view, like and comment counts
- Channel records with subscriber and video totals
- Filters for type, duration, order, country and safe search
- No daily cap, no application and no audit
/api/social/instagram/profilereturns the public profile record- Followers, following, post count and verification flags
include_postsadds the recent grid at the same price- Per-post engagement available as a priced add-on
- No Facebook developer account and no app review
/api/linkedin/profilereturns best-effort public basics/api/linkedin/jobsreturns a page of about 10 jobs- Company pages with employee count, industry, HQ and founding year
- Activity, job detail and a name-to-profile lookup
- No login, no session cookie and no account of yours
TikTok
/api/tiktok/profilereturns the creator record/api/tiktok/videoreturns one video with its stats- Hashtag, keyword and music lists are priced as enriched calls
- One enriched call returns a whole list for one charge
- Not live yet — these are target rates until launch
The full rate card — live endpoints
| Endpoint | What one call returns | Default | Growth | Scale |
|---|---|---|---|---|
YouTube search — /api/social/youtube/search |
One ranked list of videos, channels or playlists | $0.20 | $0.02 | $0.01 |
YouTube video — /api/social/youtube/video |
One video record with its statistics | $0.20 | $0.02 | $0.01 |
YouTube channel — /api/social/youtube/channel |
One channel record with its totals | $0.20 | $0.02 | $0.01 |
YouTube playlist — /api/social/youtube/playlist |
One playlist and the items in it | $0.20 | $0.02 | $0.01 |
Instagram profile — /api/social/instagram/profile |
One public profile record | $0.40 | $0.36 | $0.28 |
| Instagram profile + recent posts | The same profile plus whatever the grid renders, normally about 12 — same call, same price | $0.40 | $0.36 | $0.28 |
| Instagram profile + post details | Adds the individual post pages and the engagement rate averaged from them | $4.00 | $3.60 | $2.80 |
LinkedIn profile — /api/linkedin/profile |
One public profile, best-effort by design | $0.50 | $0.45 | $0.35 |
LinkedIn full profile — /api/linkedin/profile/full |
The same record on a soft deadline, handing back what it built | $1.00 | $0.90 | $0.70 |
LinkedIn company — /api/linkedin/company |
One company page with firmographics | $1.00 | $0.90 | $0.70 |
LinkedIn jobs — /api/linkedin/jobs |
One page of about 10 job postings | $0.50 | $0.45 | $0.35 |
LinkedIn job — /api/linkedin/job |
One job posting in full | $0.50 | $0.45 | $0.35 |
LinkedIn activity — /api/linkedin/posts |
Activity at the default limit=10; deeper calls scale with the limit |
$1.00 | $0.90 | $0.70 |
LinkedIn lookup — /api/linkedin/search |
A name resolved to a public profile URL | $1.00 | $0.90 | $0.70 |
Read the ladder, not just the first column. The two tier discounts are not the same size. YouTube sits in the aggressive core band, where Growth is 10× off and Scale 20× off — $0.20 becomes $0.02 and then $0.01. Instagram, LinkedIn and TikTok take the standard band: 10% off at Growth and 30% off at Scale. That is the arithmetic behind every “from” price quoted on this page, and both tiers are unlocked by a single deposit — $100 for Growth, $500 for Scale — that is one-time, permanent and never downgrades. There is no monthly commitment anywhere in our pricing. Free to start on eligible endpoints, with the allowance shared across them.
TikTok rate card — target rates, not served yet
TikTok rate card
| TikTok call | What it is | Default | Growth | Scale |
|---|---|---|---|---|
| Basic — profile or single video | One record, no field groups requested | $0.10 | $0.09 | $0.07 |
Enriched at the default limit=30 |
Any include_* field group, or a hashtag, keyword or music list |
$3.00 | $2.70 | $2.10 |
Enriched at limit=180 |
The synchronous depth cap — 2.5× the advertised rate, and the cheapest per item. The two rows below are billed to less depth | $7.50 | $6.75 | $5.25 |
include_following at limit=180 |
Billed to a depth of 50 — you are never billed for depth a list cannot return | $3.60 | $3.24 | $2.52 |
include_related at limit=180 |
Billed to the default depth of 30, whatever limit you pass |
$3.00 | $2.70 | $2.10 |
Media surcharge — include_media |
Charged on top of the call it rides on, never instead of it | +$10.00 | +$9.00 | +$7.00 |
| Worked example: one video with media | $0.10 base + $10.00 media. Never free-tier eligible | $10.10 | $9.09 | $7.07 |
Two TikTok rules worth reading before you budget. First, depth is priced: an enriched call bills $3.00/1K × (0.7 + 0.01 × limit), so the advertised $3.00 is the price at the default limit=30 and limit=180 bills $7.50 — 2.5× the advertised rate. Deeper costs more in total and less per item: $0.100 per 1,000 items at limit=30, falling to $0.042 at limit=180. Two groups are billed to less depth than you ask for — include_following is billed to a depth of 50 and include_related to the default depth of 30, so at limit=180 they bill $3.60 and $3.00 rather than $7.50 — because you are never billed for depth a list cannot return. Second, include_media is a surcharge, not a product. It is added to the call rather than replacing it, so a basic video with media is $0.10 + $10.00 = $10.10 per 1,000 at Default, and the depth and field-group multipliers apply to the base half — an enriched video with one extra group at limit=180 plus media is $3.00 × 1.2 × 2.5 + $10.00 = $19.00 per 1,000. Media calls are never free-tier eligible.
Quick Start
One Key, One Header, Four Platforms
Same host, same header, same JSON envelope everywhere. Moving from YouTube to LinkedIn is a change of path and one parameter.
# YouTube: one search call returns a whole ranked list for one charge curl "https://apiserpent.com/api/social/youtube/search?q=rust+async+tutorial&type=video&num=20" \ -H "X-API-Key: YOUR_API_KEY" # Instagram: the recent grid rides along in the SAME call at the SAME price curl "https://apiserpent.com/api/social/instagram/profile?username=natgeo&include_posts=true" \ -H "X-API-Key: YOUR_API_KEY" # LinkedIn: one jobs call is one page of ~10 postings, billed once curl "https://apiserpent.com/api/linkedin/jobs?keywords=platform+engineer&location=Berlin" \ -H "X-API-Key: YOUR_API_KEY" # TikTok: creator profiles, videos, hashtags, search and music lists. curl "https://apiserpent.com/api/tiktok/profile?username=nasa" \ -H "X-API-Key: YOUR_API_KEY"
import requests BASE = "https://apiserpent.com" HEAD = {"X-API-Key": "YOUR_API_KEY"} def social(path, **params): r = requests.get(f"{BASE}{path}", params=params, headers=HEAD, timeout=60) r.raise_for_status() return r.json() # A creator across two platforms, in two calls and four lines. yt = social("/api/social/youtube/channel", channelId="UCsXVk37bltHxD1rDPwtNM8Q") ig = social("/api/social/instagram/profile", username="kurzgesagt", include_posts="true") print(yt["subscriberCount"], ig["followersCount"], len(ig["recentPosts"])) # A hiring signal: one page of ~10 jobs is ONE billed call, not ten. jobs = social("/api/linkedin/jobs", keywords="machine learning", location="London") for j in jobs["jobs"]: print(j["job_title"], "@", j["company_name"], "-", j["job_posted_date"])
const BASE = "https://apiserpent.com"; const HEAD = { "X-API-Key": process.env.SERPENT_KEY }; async function get(path, params) { const url = new URL(path, BASE); Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v)); const res = await fetch(url, { headers: HEAD }); if (!res.ok) throw new Error(`${path} -> ${res.status}`); return res.json(); } // One handle, two networks. Each call is billed once, whatever it returns. const [ig, li] = await Promise.all([ get("/api/social/instagram/profile", { username: "github" }), get("/api/linkedin/company", { company: "github" }) ]); console.log(ig.followersCount, li.employee_count, li.hq?.city);
Data Fields
What Each Platform Hands Back
Named JSON fields, not HTML you have to select against. Every key is always present, so an absent value arrives as null or an empty list.
YouTube
- results[].position, .id, .type
- results[].title, .description
- results[].channelId, .channelTitle
- results[].publishedAt, .thumbnail, .url
- totalResults, nextPageToken, prevPageToken
- viewCount, likeCount, commentCount
- engagementRate, tags[], categoryId
- duration, durationFormatted, durationSeconds
- isShort
- channelUrl, customUrl, country, keywords
- banner
- username, fullName, biography
- profilePicUrl, externalUrl
- followersCount, followingCount, postsCount
- isVerified, isPrivate, accountType
- followerFollowingRatio
- recentPosts[].shortcode, .permalink
- recentPosts[].thumbnailUrl, .mediaType
- engagementRate, postsSampled
- avgLikesPerPost, avgCommentsPerPost
- lastPostDate, daysSinceLastPost, isActive
- full_name, first_name, last_name
- headline, occupation, summary
- location.city / .state / .country
- current_company.name / .title
- experiences[], education[], skills[]
- follower_count, connections
- flags.open_to_work / .hiring / .verified
- employee_count, company_size, founded_year
- industry, specialities[], hq.city, website
- job_id, job_url, apply_link, job_title
- job_posted_date, seniority_level
TikTok
- username, user_id, nickname
- biography, bio_link, profile_url
- avatar.thumb / .medium / .large
- verified, private_account, is_organization
- region, language, created_at
- stats (followers, likes, videos)
- video_id, video_url, description
- author, music.title, music.duration
- stats.play_count, digg_count, share_count
- hashtags[], mentions[], labels[]
- items[], result_count, total_count
Why social data
What is social media API data, and why teams use it
Three of these four platforms gate their official API behind an application, an audit or a review. The fourth’s reference API shut down in 2025.
Google gives YouTube quota away, and will not sell you more
Google’s own documentation, checked 2026-09-08, sets a default allocation of 100 search.list calls a day, 100 uploads a day, and 10,000 units a day pooled across everything else. That is roughly 3,000 free searches a month, hard-capped.
The 101st search of the day is not for sale. There is no rate, no billing path and no SKU — the only route past the cap is an audit and quota extension form, a compliance audit, a periodic re-audit form afterwards, an appeals form if you fail, and a change-of-control form if the company is acquired. We sell that 101st search for $0.0002.
Meta gates any Instagram account you do not own
Meta’s own developer documentation, checked 2026-09-08, is explicit: reading an Instagram professional account you do not own requires Advanced Access, and Advanced Access requires App Review and Business Verification. Business Discovery returns nothing at all for age-gated accounts, and nothing for personal accounts.
That is a review cycle and a verified business entity before the first row of data. Our Instagram endpoint needs a Serpent key and a username, and the recent post grid rides along in the same call at the same price as the profile alone.
The reference LinkedIn API closed on 4 July 2025
Proxycurl — for years the default answer to “which LinkedIn API should I use” — shut down on 4 July 2025, announced in its founder’s own farewell post on nubela.co, following LinkedIn’s January 2025 federal lawsuit. Anyone who built on it has had to migrate.
Of the replacements, several want something from you first: one widely used Apify actor asks for your own LinkedIn session cookies and warns on its own store page that 300–400 profiles a day will flag that account. We use no cookie and no account of yours.
The billing unit decides the bill, not the headline rate
We bill per call. A YouTube search returning 50 rows is one charge. A LinkedIn jobs call returning a page of about 10 postings is one charge. An Instagram profile with its recent grid is one charge. A TikTok list call returns the whole list for one charge.
Several rivals bill per row. Apify’s official Instagram scraper counts every result as one item, so a profile plus 12 posts is 13 billable items — which is how a $2.70 per 1,000 rate becomes $35.10 per 1,000 bundles. Normalise the unit before you compare any two rates on this page.
Comparison
Every Vendor’s Lowest Published Rate
Lowest against lowest, with what each plan costs to reach it. Where a rival is cheaper than us, the row says so.
YouTube
| Provider | Unit charged | Cost per 1,000 | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| Google’s official YouTube API | quota units | Not for sale at any price | No rate, no billing path, no SKU. Extra quota needs a compliance audit and a form. | 100 searches/day + 10,000 units/day |
| Serpent (ours) | per call, whole list | $0.01/1K calls | One $500 deposit, once. No monthly plan. | Free to start |
| ScrapingDog YouTube | per request, 5 credits | $0.136/1K requests | $30,000/month plan | 200 credits |
Apify streamers/youtube-scraper |
per video | $2.40/1K videos | Apify’s published “from” rate, and the lowest they print. Their actor FAQ quotes a higher figure for the same actor, so the page contradicts itself — we use the lower one. A cheaper Diamond rate exists but Apify publishes no price for that tier. | $5 credit/month |
| Bright Data | per record | $1.30/1K records | Scale plan at $499/month | 5,000 records/month |
| SerpApi | per search | $1.96/1K searches | $106,050/month | 250/month |
| Provider | Unit charged | Cost per 1,000 | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| HasData | one request = profile + latest 12 posts | $0.69/1K bundles | $208/month, recurring. Their $0.99 rate needs $99/month. | 100 lookups/month |
| Serpent (ours) | one call = profile + its recent grid | $0.28/1K bundles | One $500 deposit, once. No monthly plan. | Free to start |
| HikerAPI | per request; pagination billed separately | $0.60/1K requests — about $1.20/1K bundles | A balance threshold they do not publish; permanent once reached. | 100 free requests |
Apify apidojo/instagram-scraper |
per post | $0.47/1K posts — about $5.64/1K bundles | A higher Apify plan | 5 runs/month, 10 items/run |
| Bright Data | per record — “record” is not defined on their page | $1.30/1K records | Scale plan at $499/month | 5,000 records/month |
Apify apify/instagram-scraper |
per item — a post, reel, comment or profile | $1.50/1K items — $19.50/1K bundles | Apify Business at $999/month. Its entry rate is $2.70/1K items, or $35.10/1K bundles. | $5 credit |
No rate in this table goes below ours. HasData’s $0.69 is the closest on a genuine like-for-like — one HasData request also returns a profile with about 12 posts — but it costs $208 every month against our one-time $500 deposit, and their $0.99 plan is $99 a month. HikerAPI’s $0.60 volume rate is a per-request price, and they do not publish the balance threshold that unlocks it, so a profile with its posts is at least two requests.
| Provider | Unit charged | Cost per 1,000 | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| Serpent (ours) — jobs | per job (one call is a page of about 10) | $0.035/1K jobs | One $500 deposit, once. $0.05/1K jobs at Default, before any deposit. | Free to start |
| Serpent (ours) — profiles | per profile | $0.35/1K profiles | One $500 deposit, once. No monthly plan. | Free to start |
| Bright Data Datasets | bulk file, not a live lookup | about $0.50/1K records | A monthly-refresh subscription delivered to S3, Snowflake or SFTP. It cannot answer “fetch this profile now”. | — |
| Coresignal — jobs | per job record | $0.50/1K jobs | $5,000/month Elite plan | Trial credits |
| ScrapingDog | per profile request, 50 credits (100 if protected, per their profile page) | $1.36/1K profiles | $30,000/month plan. Entry is $10.00/1K on the $40/month LITE plan. | 200 credits |
| Bright Data Profiles | per record = one profile | $1.30/1K profiles | Scale plan at $499/month. Their per-job rate is the same $1.30–$1.50. | 5,000 records/month |
Apify harvestapi/linkedin-profile-scraper |
per profile, no cookies | $4.00/1K profiles | No subscription needed. $10.00/1K with email search. | $5 credit/month |
Apify apimaestro/linkedin-jobs-scraper-api |
per job | $5.00/1K jobs | No subscription needed | $5 credit |
| Coresignal — profiles | 10 credits per profile | $5.00/1K profiles | $5,000/month Elite plan. Entry is $196.00/1K on the $49/month Mini plan. | 7-day trial |
Per job, the gap is 10× to 100× — and the reason is the unit. A jobs call returns a page of about 10 postings and is billed once, where Bright Data, Apify and Coresignal each bill per job. The only genuinely cheaper LinkedIn data we can find is Bright Data’s Datasets marketplace at roughly $0.50 per 1,000, and that is a bulk file on a monthly-refresh subscription rather than a live lookup, so it answers a different question. One figure we deliberately leave out: ScrapingDog does not publish how many jobs one of their job requests returns, so their per-job rate cannot be derived, and we will not print a number they have not published. Their profile credit cost is also stated two different ways on two of their own pages — the row above uses their profile landing page.
TikTok
| Provider | Unit charged | Cost per 1,000 | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| EnsembleData | per post, from a daily unit bucket with no roll-over | about $0.047/1K posts | $1,400/month, and only if you spend the full daily allowance every single day. Its entry plan works out at about $0.111/1K posts. | 50 units/day |
| Serpent (ours) — enriched, per item | per item, one list per call | $0.042/1K items | Default tier at limit=180. $0.100/1K items at the default limit=30. |
Free to start |
| ScrapingDog | per request, 5 credits | $0.136/1K requests | $30,000/month plan. Entry is $1.00/1K on the $40/month LITE plan. | 200 credits |
Apify xmolodtsov/tiktok-search-scraper |
per post | $0.20/1K posts | Gold, on Apify’s $999/month Business plan. $0.30/1K on the free tier. A cheaper Diamond rate exists but Apify publishes no price for that tier. | $5 credit |
| Serpent (ours) — profiles | per profile | $0.35/1K profiles | One $500 deposit, once. $0.50/1K at Default, before any deposit. | Free to start |
| Bright Data | per record | $1.30/1K records | Scale plan at $499/month | 5,000 records/month |
Apify get-leads/all-in-one-tiktok-scraper |
per profile | $1.50/1K profiles | Gold or above, on Business at $999/month | $5 credit |
Apify clockworks/tiktok-scraper |
per post | $1.70/1K posts | Gold, on Apify’s $999/month Business plan. $3.70/1K entry. A cheaper Diamond rate exists but Apify publishes no price for that tier. | $5 credit |
The honest TikTok margin is 2× to 4.8×, not 37×. Most comparisons cite Apify’s dearest TikTok actor at $3.70 per 1,000 and claim an enormous win. Its cheapest actor is xmolodtsov at $0.30 per 1,000 posts on the free tier and $0.20 on Apify’s $999-a-month Business plan, so that is the number to beat: our $0.100 per 1,000 items at the default depth beats its free-tier rate threefold and its lowest published rate twofold, and at limit=180 our $0.042 beats that rate 4.8×. Apify’s two cheaper discount tiers, Platinum and Diamond, sit on no published plan — both are contact sales only (checked 2026-09-16). One vendor beats us — EnsembleData’s Platinum plan at about $0.047 per 1,000 posts — for $1,400 a month, and only if the full daily allowance is burned every day, because the bucket resets at 00:00 UTC and does not roll over. We have deliberately left media out of this table: Apify’s video-download add-on is cheaper than our media surcharge, but we have not confirmed that their download and our include_media deliver the same artefact, and we will not publish a comparison we cannot show is like-for-like.
Use cases
What Teams Actually Pull Social Data For
Four jobs that account for most of the traffic on these endpoints, and the parameters each one needs.
Creator vetting before you pay for a campaign
An Instagram profile with include_post_details returns engagementRate, avgLikesPerPost, avgCommentsPerPost and postsSampled — the numbers a follower count hides. Pair it with the same creator’s YouTube channel record for a second, independent audience signal.
Two calls per creator. On Scale that is $2.80 and $0.01 per 1,000, so vetting a 5,000-name list costs about $14 rather than a seat licence.
Hiring and growth signals from job postings
One /api/linkedin/jobs call is a page of about 10 postings with title, company, location, posted date, seniority and employment type. Poll a keyword and location weekly and the diff is a hiring trend: which teams are growing, in which cities, at what level.
Because a page is one billed call, a 200-company watchlist is 200 calls a week, not 2,000 — about $0.07 a week at Scale. Add /api/linkedin/company for headcount and industry.
Competitive content tracking on video
A YouTube search call returns a whole ranked list for one charge, so tracking twenty competitor keywords daily is twenty calls, not twenty times the number of rows. Video records add view, like and comment counts plus engagementRate and an isShort flag.
Store publishedAt and the counts on each run and you have a velocity series — which formats are gaining, and how fast — without a platform quota to manage.
Lead enrichment inside your own CRM
A name or a company domain becomes a structured record: /api/linkedin/search resolves a name to a public profile, /api/linkedin/profile returns the best-effort basics, and /api/linkedin/company adds employee_count, industry, founding year and HQ.
Every field is typed and always present, so an absent value is null rather than a missing key — your enrichment job never throws on a sparse profile, it just writes fewer columns.
FAQ
Social Media API Questions
X-API-Key header and that is the whole authentication story across all four platforms. You also never supply a login, a session cookie or an account of your own on any of them.
position, id, title, description, channelId, channelTitle, publishedAt, thumbnail and url, plus totalResults and page tokens, and takes filters for type, duration, order, country and safe search. A video record adds viewCount, likeCount, commentCount, engagementRate, tags[], categoryId, an ISO 8601 duration with formatted and seconds variants, and an isShort flag. A channel record carries subscriber, video and view totals, description, customUrl, country, keywords, thumbnail and banner. A playlist call lists its items.
username, fullName, biography, profilePicUrl, followersCount, followingCount, postsCount, isVerified, isPrivate, accountType and externalUrl. Adding include_posts returns the recent post grid — whatever the logged-out profile page renders, normally about 12 — in the same call, at the same price as the profile alone, with no cap of our own. Engagement rate is not in the base call: engagementRate, avgLikesPerPost, avgCommentsPerPost and postsSampled require include_post_details, which opens the individual post pages and is priced separately at $4.00 / $3.60 / $2.80 per 1,000.
employee_count as a number, the published size band, founded year, specialities, HQ and locations, website and logo. One jobs call returns a page of about 10 jobs with job_id, apply_link, title, company, location, posted date, description, seniority and employment type — so a jobs feed is one billed call, not ten. No LinkedIn login, cookie or account of yours is used.
/api/tiktok/* is live and answers on the same key as the other three platforms, and the TikTok tab in the try-it box runs a real call. A basic profile or video call is $0.10 / $0.09 / $0.07 per 1,000. An enriched call — any include_* field group, or a hashtag, keyword or music list — is $3.00 per 1,000 at the default limit=30 and scales with depth by $3.00 × (0.7 + 0.01 × limit), so limit=180 bills $7.50, which is 2.5× the advertised rate. Per item that is $0.100 per 1,000 at limit=30, falling to $0.042 at limit=180. Two groups are billed to less depth than you ask for: include_following is billed to a depth of 50 and include_related to the default depth of 30, so at limit=180 they bill $3.60 and $3.00 rather than $7.50 — you are never billed for depth a list cannot return. include_media is a surcharge charged on top of the call, not instead of it: a basic video call with media is $0.10 + $10.00 = $10.10 per 1,000 at Default, $9.09 at Growth and $7.07 at Scale, and it is never free-tier eligible.
Start pulling social media data
Free to start on eligible endpoints, with the allowance shared across them. No card, no subscription, no monthly plan. YouTube data from $0.01/1K calls.
Try for Free

