# SocialRouter

> One API and MCP server to find leads, track competitors, listen for signals across LinkedIn, Instagram, Reddit, TikTok and more. Pay per record, no lock-in.

SocialRouter is a routing layer over multiple social-data providers. You send a request to a single endpoint; SocialRouter routes it to a compatible provider, moves to the next one if that provider errors or rate-limits, and returns the same response shape whichever one fulfilled it. Reachable over HTTP, from the TypeScript SDK, or from an agent through the MCP server.

## Why SocialRouter

- **One integration for every provider.** One endpoint per service, one response shape across every network and provider. You write your parsing once.
- **Failover inside the call.** When a provider errors or rate-limits, the next compatible one picks up the same request. Nothing to retry on your side.
- **You stay in control.** Let SocialRouter pick the provider, pin one in the request, or register your own provider key and be invoiced by that provider directly.
- **Billed per record returned.** No subscription and no minimum. A failed attempt returns no records and costs nothing.

## Key numbers

- 61 services
- 12 networks covered
- 3 providers integrated

## Networks

LinkedIn, Google Maps, YouTube, Reddit, Instagram, Facebook, TikTok, Pinterest, Bluesky, X, Snapchat, Apollo

## Providers

- **Apify** — Versatile scraping platform with broad social media coverage. 23 services.
- **Bright Data** — Enterprise-grade data collection with high volume capacity. 40 services.
- **Apollo** —  6 services.

## When to use SocialRouter

Reach for it when a job needs public data that lives on a social network and there is no first-party access to it:

- **Find people or companies** — search profiles or posts on a network, then read who wrote or engaged with them.
- **Watch an account or a competitor** — pull a profile's posts, comments, followers or reviews on a schedule.
- **Listen for a signal** — read a subreddit, a keyword search or a hashtag and hand the records to whatever decides what matters.
- **Enrich a record you already hold** — start from a profile URL, a domain or a company name and get the entity behind it.

It is the wrong tool for: data behind a login you own (the platform's own API is first-party and cheaper), anything you need as a live stream (every call is a request/response run that returns records), and any use the source platform's terms forbid.

## How an agent should call it

1. **Read the catalogue first**, `GET https://api.socialrouter.io/v1/services` — no key needed. It names every service, the field its input goes in (`urls`, `queries` or `identifiers`), its typed options, its offers and the price per record. Pick the service from there rather than guessing an endpoint.
2. **Run it** with the API key in `Authorization: Bearer <key>`. One endpoint per service, `POST /v1/extract/{platform}/{service}` for a network or `/v1/enrich/{entity}/{service}` for a person or a company.
3. **Read `served_by`** to know which offer ran, and `status` to know whether it completed. Errors carry a machine-readable `error.code` and a corrective `error.message`; a 402 means the account is out of credits, a 429 means a limit was hit, and both are account states an agent cannot fix by retrying faster.

## How it works

1. **Get an API key.** Sign up with GitHub or Google. No credit card.
2. **Call one endpoint per service**, `POST /v1/extract/{platform}/{service}` (or `/v1/enrich/{entity}/{service}`). SocialRouter handles offer selection, failover and normalization.

   ```
   POST /v1/extract/linkedin/post.likes
   {
     "urls": ["linkedin.com/posts/..."]
   }
   ```

   `provider` is optional and pins one offer (`source/name`, e.g. `apify/apimaestro`). Pinning disables failover.
3. **Read a normalized response.** The shape does not depend on which offer ran — `served_by` names the one that did.

   ```
   {
     "status": "completed",
     "platform": "linkedin",
     "service": "post.likes",
     "served_by": "apify/apimaestro",
     "data": [
       { "name": "Sarah Chen", "title": "VP of Sales" }
     ]
   }
   ```

## Developer resources

- [OpenAPI 3.1 spec](https://api.socialrouter.io/v1/openapi.json) — every endpoint, typed request and response schemas, one operationId per service
- [MCP server, Streamable HTTP](https://mcp.socialrouter.io/mcp) — point an MCP host at this URL; `npx @socialrouter/mcp` is the same tools over stdio
- [TypeScript SDK](https://www.npmjs.com/package/@socialrouter/sdk) — `npm i @socialrouter/sdk`
- [CLI](https://www.npmjs.com/package/@socialrouter/cli) — `npx @socialrouter/cli`
- [Docs](https://docs.socialrouter.io) — API reference, SDK, CLI and MCP guides
- [API keys](https://www.socialrouter.io/dashboard/keys) — self-serve, created in the dashboard, no sales call and no credit card
- [Playground](https://www.socialrouter.io/dashboard/playground) — run any service from the browser before wiring it up

## Key pages

- [Home](https://www.socialrouter.io/)
- [Services](https://www.socialrouter.io/services) — every service, its providers and its price per record
- [Compare](https://www.socialrouter.io/compare) — providers side by side
- [Docs](https://docs.socialrouter.io) — API reference, SDK, CLI and MCP guides
