How did that post do? One link in, every number out.
Give it the link to one Instagram post or reel, or one TikTok video, and get its public numbers: likes, comments, views, shares and saves, plus the caption, hashtags, mentions, posting date, length, sound and who posted it, with engagement rates worked out for you.
What you get back
- Likes, comments, views (plays), shares and saves (TikTok)
- Caption, hashtags, mentions, date, duration, music and location
- Author handle and name; on TikTok also followers and verified
- viewEngagementRate ((likes + comments + shares) / views) and engagementRate against followers where known
- source and fetchedAt; repeat lookups within maxAgeHours are served from cache
Call it from your code or agent
Same input and the same JSON answer everywhere. You're only charged when the call succeeds.
Your key gives 20 free calls a day on this tool, then uses prepaid credit. No key yet? Send X-Exepal-Trial: 1 instead, or get one free at exepal.com/key.
curl -X POST https://api.exepal.com/v1/social/stats \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_KEY" \
-d '{"url":"https://www.tiktok.com/@khaby.lame/video/7300000000000000000"}'Your key gives 20 free calls a day on this tool, then uses prepaid credit. No key yet? Send X-Exepal-Trial: 1 instead, or get one free at exepal.com/key.
const res = await fetch("https://api.exepal.com/v1/social/stats", {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: "Bearer YOUR_KEY" },
body: JSON.stringify({
"url": "https://www.tiktok.com/@khaby.lame/video/7300000000000000000"
}),
});
const data = await res.json();Your key gives 20 free calls a day on this tool, then uses prepaid credit. No key yet? Send X-Exepal-Trial: 1 instead, or get one free at exepal.com/key.
import requests
r = requests.post(
"https://api.exepal.com/v1/social/stats",
headers={"Authorization": "Bearer YOUR_KEY"},
json={
"url": "https://www.tiktok.com/@khaby.lame/video/7300000000000000000"
},
timeout=120,
)
print(r.json())Add Exepal once and your assistant can call social_stats by itself. More clients on the integrate page.
# Claude Code
claude mcp add --transport http exepal "https://api.exepal.com/mcp?key=YOUR_KEY"
# Cursor, Windsurf, Claude Desktop and most clients (mcp.json)
{
"mcpServers": {
"exepal": { "url": "https://api.exepal.com/mcp?key=YOUR_KEY" }
}
}No key at all: an agent with a wallet pays per call in USDC on Base. npm i @x402/fetch @x402/evm viem. How x402 works.
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";
const pay = wrapFetchWithPaymentFromConfig(fetch, {
schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(privateKeyToAccount(process.env.WALLET_KEY)) }],
});
const res = await pay("https://api.exepal.com/v1/social/stats", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"url": "https://www.tiktok.com/@khaby.lame/video/7300000000000000000"
}),
});Questions
- Can it read private posts?
- No. Public posts only. A private or removed post returns an error and you are not charged.
- Why are likes sometimes null?
- Instagram lets owners hide like counts. When they do, likes is null rather than a made-up number.
- How is this cheaper than a scraper?
- Scraper platforms bill per result and need an account and a plan. Here one post is one call for half a cent, paid as you go.