Quickstart
SocialToAI is an API and MCP server that lets AI tools read publicly visible social media content (posts, comments, profiles and trends) from 18 platforms, including TikTok, Instagram, X (Twitter), Reddit, YouTube, Xiaohongshu (RedNote), Douyin, Weibo. It is billed in prepaid credits, and failed calls are free.
Get a key, make one call, connect your AI. Everything on this page runs on the 100 free credits you get when you sign up.
https://api.socialtoai.com/v1/<action>https://mcp.socialtoai.com/mcpThe facts
- Platforms (18)
- TikTok, Instagram, X (Twitter), Reddit, YouTube, Facebook, LinkedIn, Threads, Telegram, Pinterest, Xiaohongshu (RedNote), Douyin, Weibo, WeChat Articles, Bilibili, Zhihu, Kuaishou, WeChat Channels
- Ad libraries (2)
- Meta Ad Library, Google Ads Transparency
- Actions (6)
- search, trending, detail, comments, user_profile, user_posts, plus a catalog of platform-specific interfaces (find / call)
- Tools (7)
- Brand buzz, Comment analysis, Account snapshot, Find creators, Creator profile, Bulk link data, Viral finder
- API
- https://api.socialtoai.com/v1 · MCP (Streamable HTTP): https://mcp.socialtoai.com/mcp · Auth: sign-in (OAuth) in ChatGPT, Claude, Claude Code, Codex and Cursor; an API key in a header for scripts and servers
- No key needed for
- capabilities, find, OpenAPI
- Price
- $10 = 3,000 credits · $50 = 20,000 · $200 = 100,000 · any amount from $10 to $2,000
- Per call
- most calls cost 2 credits (range 1–102); from $0.002 per call
- Free
- 100 credits on sign-up, no card. Credits never expire. No subscription. No refunds.
- Charged
- successful calls, including a search that ran and found nothing, and a lookup of something that is not there where the platform's source charges for it (the answer says so). Not charged: failed calls.
- Limits
- 5 requests per second per key; 20 per second after the first purchase
- Payment
- card or Alipay, priced in USD
- Data
- content and account information publicly visible on the platform; commenters are anonymised
- Updated
- 2026-11-01 · price version pv_29229c6acba5
Get a key
Sign in with Google, or with your email: we send a one-time code. There is no password to set. A new account starts with 100 credits and needs no card.
In the console, open API keys and create a key. It starts with stai_live_ and is shown once, so copy it right away. Then keep it in an environment variable:
export SOCIALTOAI_API_KEY="<YOUR_API_KEY>"Make your first call
Every action is one POST to https://api.socialtoai.com/v1/<action> with a JSON body. This one is /v1/search: find posts by keyword: text, author, likes, comment count and publish time, on Reddit.
curl https://api.socialtoai.com/v1/search \ -H "Authorization: Bearer $SOCIALTOAI_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "platform": "reddit", "query": "saturn rings" }'import osimport uuidimport requestsresponse = requests.post( "https://api.socialtoai.com/v1/search", headers={ "Authorization": f"Bearer {os.environ['SOCIALTOAI_API_KEY']}", # A new key for each request; the same one again retries it without paying twice. "Idempotency-Key": str(uuid.uuid4()), }, json={ "platform": "reddit", "query": "saturn rings", },)print(response.json())You get this back:
{ "request_id": "req_00000000-0000-4000-8000-000000000001", "schema_version": "v1", "fetched_at": "2026-10-12T18:43:12.000Z", "action": "search", "platform": "reddit", "status": "ok", "items": [ { "platform": "reddit", "id": "…", "ref": "…", "approx": [], "type": "content", "url": "https://example.com/…", "format": "image", "title": "…", "text": null, "published_at": "2024-11-22T01:25:15.633Z", "author": { "id": "…", "username": "…", "name": null, "verified": null, "followers": null }, "metrics": { "likes": null, "comments": 213, "shares": null, "collects": null, "views": null, "reposts": null }, "images": ["https://example.com/…"], "hashtags": null, "is_pinned": false } ], "unavailable": ["author.name", "author.verified", "author.followers", "metrics.shares", "metrics.collects", "metrics.views", "metrics.reposts", "hashtags"], "page": { "has_more": true, "cursor": "cur_…", "cursor_expires_at": "2026-10-12T19:13:12.000Z" }, "warnings": [], "applied_params": { "query": "saturn rings" }, "cost_credits": 2, "billing": { "cost_credits": 2, "balance_credits": 98, "today_spend_credits": 2, "daily_limit_credits": null, "daily_remaining_credits": null, "display": "This call: 2 credits (≈ $0.0067). Balance: 98 credits (≈ $0.33)." }, "replayed": false}Sample data: names, links and text are replaced by placeholders.
Connect your AI over MCP
If you work in an AI client, you do not have to write requests at all. Add an MCP server in your AI with this address: https://mcp.socialtoai.com/mcp. If a sign-in page opens, sign in with your email and press Allow. If your tool asks for a key instead, put the key you just made in a header: Authorization: Bearer <YOUR_API_KEY>.
In a terminal, run the command. In Claude Code, then in Claude Code type /mcp, pick socialtoai and sign in:
claude mcp add --transport http socialtoai https://mcp.socialtoai.com/mcpcodex mcp add socialtoai --url https://mcp.socialtoai.com/mcpThen ask in plain words. Your AI picks the call and tells you what it cost. Step-by-step for your client.
Understand the response shape
Every platform and every action answers in the same shape. Learn these parts once and you can read all 18 platforms plus 2 ad libraries. What a platform does not provide comes back as null.
| Part | What it tells you |
|---|---|
request_id, action, platform, status | What was called, and whether it worked. |
items | The results. Every kind of item uses the same field names on every platform. |
unavailable | The fields this platform cannot give. They are null in every item. |
page | While has_more is true, send cursor back for the next page. |
billing | What this call cost and your balance after it, in credits. |
Response format lists every field of the envelope and of each kind of item.
Errors and what is not charged
Failed calls are free. A call that ran is charged, even if it found nothing; a few interfaces also charge for looking up something that does not exist, and the answer then carries charged: true. A request we refuse before it runs gets an HTTP error status. Trouble on the platform's side still comes back as HTTP 200, with status and error in the body and cost_credits of 0. Every error carries request_id and fix, which says how to correct the call.
| Code | HTTP | What happened, and what to do | Charged |
|---|---|---|---|
invalid_params | 400 | A parameter is missing or wrong.Nothing ran. Correct it using fix in the response.Retry: No | No |
unauthorized | 401 | The key is missing, wrong, expired or suspended.Send a current key in a header. reason says which case it is.Retry: No | No |
insufficient_balance | 402 | Not enough credits for this call.Nothing ran. Buy credits, then send it again.Retry: No | No |
not_found | 200 / 404 | The post or account does not exist, is private or was deleted; why says which when the platform tells, and platform_says gives its own words. Where the platform's source charges for the lookup, the call is charged its price and the error says charged: true.Nothing to retry. An unknown path also answers with this code.Retry: No | At price, where the source charges |
daily_limit_reached | 429 | A daily limit is reached.Nothing ran. The limit is on the key or the account and starts again at resets_at.Retry: No | No |
rate_limited | 429 | Too many calls per second for this key, or too many running at once.Wait for Retry-After, then send it again.Retry: Yes | No |
temporarily_unavailable | 200 / 503 | This call is paused for now.The status page says why. Try again later.Retry: Yes | No |
invalid_target | 200 | The link or ID does not point at a valid target.Check the value named in fix.param.Retry: No | At price, where the source charges |
upstream_error | 200 | No result came from the platform this time; it was already tried up to three times on our side.When retryable is true, send it once more after retry_after_seconds. If the same request fails again, the content itself most likely cannot be had: change the input.Retry: Depends | No |
timeout | 200 | No result in time, and we cannot tell whether it ran. We cover the cost.We never retry on our own (X-Should-Retry: false). Send a new request if you still need it.Retry: No | No |
Errors has every code with its cases.
Next steps
Last updated: