SocialToAIStart freeConsole

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.

RESThttps://api.socialtoai.com/v1/<action>
MCPhttps://mcp.socialtoai.com/mcp

The 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:

Terminal
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:

Response200 OK2 credits
{  "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/mcp
codex mcp add socialtoai --url https://mcp.socialtoai.com/mcp

Then 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.

PartWhat it tells you
request_id, action, platform, statusWhat was called, and whether it worked.
itemsThe results. Every kind of item uses the same field names on every platform.
unavailableThe fields this platform cannot give. They are null in every item.
pageWhile has_more is true, send cursor back for the next page.
billingWhat 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.

CodeHTTPWhat happened, and what to doCharged
invalid_params400A parameter is missing or wrong.Nothing ran. Correct it using fix in the response.Retry: NoNo
unauthorized401The key is missing, wrong, expired or suspended.Send a current key in a header. reason says which case it is.Retry: NoNo
insufficient_balance402Not enough credits for this call.Nothing ran. Buy credits, then send it again.Retry: NoNo
not_found200 / 404The 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: NoAt price, where the source charges
daily_limit_reached429A daily limit is reached.Nothing ran. The limit is on the key or the account and starts again at resets_at.Retry: NoNo
rate_limited429Too many calls per second for this key, or too many running at once.Wait for Retry-After, then send it again.Retry: YesNo
temporarily_unavailable200 / 503This call is paused for now.The status page says why. Try again later.Retry: YesNo
invalid_target200The link or ID does not point at a valid target.Check the value named in fix.param.Retry: NoAt price, where the source charges
upstream_error200No 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: DependsNo
timeout200No 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: NoNo

Errors has every code with its cases.

Next steps

Last updated: