exepal_
exepal / tools / social-media-analytics-api

Who is winning on social, in one call.

Pass up to five accounts, any mix of Instagram, TikTok, YouTube and Bluesky, and get their numbers side by side with the leader on each metric and a one-line summary. For one account over time, the history endpoint returns every snapshot Exepal has with the change in followers and engagement.

What you get back

  • Per account: followers, engagement rate, average likes, comments and views, posts per week, days since last post, tier and 30-day growth
  • Leaders on followers, engagement rate, average views and posting cadence, and rankings by followers and engagement
  • A plain-language summary an agent can pass straight to a user
  • History: dated snapshots of followers, posts and engagement, total and weekly change, 30-day growth
  • Bluesky profile analytics for $0.002, including reposts and quotes

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/compare \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_KEY" \
  -d '{"profiles":[{"platform":"instagram","handle":"nike"},{"platform":"instagram","handle":"adidas"}]}'

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/compare", {
  method: "POST",
  headers: { "Content-Type": "application/json", Authorization: "Bearer YOUR_KEY" },
  body: JSON.stringify({
    "profiles": [
      {
        "platform": "instagram",
        "handle": "nike"
      },
      {
        "platform": "instagram",
        "handle": "adidas"
      }
    ]
  }),
});
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/compare",
    headers={"Authorization": "Bearer YOUR_KEY"},
    json={
        "profiles": [
            {
                "platform": "instagram",
                "handle": "nike"
            },
            {
                "platform": "instagram",
                "handle": "adidas"
            }
        ]
    },
    timeout=120,
)
print(r.json())

Add Exepal once and your assistant can call social_compare 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/compare", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "profiles": [
      {
        "platform": "instagram",
        "handle": "nike"
      },
      {
        "platform": "instagram",
        "handle": "adidas"
      }
    ]
  }),
});

MCP tool names: social_compare, social_history, social_bluesky.

Questions

Where does the history come from?
Exepal keeps a snapshot every time an account is looked up (at most one a day) and snapshots South Asian Instagram creators in its index every week. An account with no snapshots yet returns an error and is not charged; look it up once to start its history.
What if one account can't be fetched?
It is listed with an error and the others are still compared. The call fails and is not charged only when no account can be fetched.
How fresh is the data?
Up to 72 hours old by default (6 hours for Bluesky); pass maxAgeHours to choose.

Related tools