Two calls to get a key, then one to use it. The whole thing works from a terminal,
so an agent can drive it while you read the code out of your own inbox.
curl -X POST -H "Content-Type: application/json" \
"https://api.socialsearchapi.com/v1/auth/request-code" -d '{"email":"[email protected]"}'
# ...read the 6-digit code from your email...
curl -X POST -H "Content-Type: application/json" \
"https://api.socialsearchapi.com/v1/auth/verify" -d '{"email":"[email protected]","otp":"123456"}'
That returns a trial_key good for 5 calls on any
platform. Export it and go:
It comes back like this (real response, captured 2026-07-25):
{
"success": true,
"platform": "hackernews",
"data": {
"total": 16736,
"items": [
{
"id": "46990729",
"platform": "hackernews",
"type": "post",
"title": "An AI agent published a hit piece on me",
"text": "Previously: AI agent opens a PR write a blogpost to shames the maintainer who closes it - https://news.ycombinator.co...",
"url": "https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/",
"author": "scottshambaugh",
"created_at": "2026-02-12T16:23:24Z",
"metrics": {
"comments": 951,
"score": 2346
},
"extra": {
"hn_url": "https://news.ycombinator.com/item?id=46990729",
"created_at_raw": "2026-02-12T16:23:24Z"
}
}
]
},
"credits_used": 1
}
That's the whole interface. Change hackernews to
reddit, x, tiktok —
same envelope, same item fields, different platform.
Get a key — email and a 6-digit code, 5 free calls, no card.
Authentication
Send your key in the x-api-key header on every request.
There is no anonymous access — a call without a key is a 401.
All examples below assumeexport SS_KEY=your_key.
Issued the first time an email is verified. 5 calls, any endpoint, no credits. Deliberately disposable — it is revoked automatically when the account first pays, so it is safe for an agent to hold in a terminal or a log.
live
Issued on payment. One per account, rotatable. Never returned by this API and never emailed — it is shown only in the dashboard, so it cannot leak into an agent's context. See /v1/keys/current.
Agents: mint yourself a trial key with the two calls in the
Quickstart. When your user needs their permanent key, call
POST /v1/auth/browser-link and open the returned
dashboard_url in their browser — it signs them in and shows the key so they
can paste it into .env themselves. Never ask a user to paste a live key
back to you.
Response schema
Every list endpoint returns the same envelope. Items always carry
text or title, url,
author and created_at, plus that platform's own
metrics. When a fallback provider serves the call, served_by names it.
Errors use one shape too, and carry a fix field written for
whoever — or whatever — is reading it.
{
"success": false,
"endpoint": "/v1/x/search",
"error": {
"type": "INSUFFICIENT_CREDITS",
"status": 402,
"message": "Not enough credits for this call.",
"fix": "Top up at https://socialsearchapi.com/dashboard",
"docs_url": "https://socialsearchapi.com/docs#errors"
},
"credits_used": 0,
"request_id": "req-..."
}
status
error.type
what to do
401
UNAUTHORIZED
Missing, unknown, rotated or revoked key. There is no anonymous tier. Note a trial key is revoked when the account converts to paid.
402
INSUFFICIENT_CREDITS
Balance is too low for this endpoint's cost. Top up; nothing is queued and nothing is deleted.
402
TRIAL_EXHAUSTED
This email's 5 trial calls are used up. Buy credits — the live key appears in the dashboard.
400
BAD_REQUEST
The request was understood but rejected — the message says why.
422
—
A required parameter is missing or the wrong type. FastAPI's body names the field.
424
ALL_SOURCES_FAILED / UPSTREAM_ERROR
Every provider for that platform failed. You are not charged. Retry, or use another platform.
503
SOURCE_BLOCKED
The source is temporarily blocking us. You are not charged. Retry shortly — retries usually clear it.
501
NOT_CONFIGURED
That upstream isn't configured on this deployment. Tell us at [email protected].
Credits & limits
Every endpoint card below shows its cost. Credits are deducted on success only —
a failed call, including one where we burned a fallback attempt, costs you nothing. A trial key is
metered in calls instead: 5 successful calls total, any endpoint. Rate limit is 20
requests per second per key. Full price table on the
pricing page.
Platforms
Reddit
GET/v1/reddit/search1 credit · trial ok
Full-text search across Reddit. Primary path is a native old.reddit scrape over a residential proxy; if it is blocked or empty we fail over to a backup provider automatically and `served_by` names whichever one answered.
One query, both forums, merged into a single ranked list in the shared item schema. Pricing is honest about partial results: if a source fails you are charged pro-rata for the sources that answered (the `sources` block in the response shows exactly which), and a response where every source failed costs nothing.
Fans the query out across every live platform and merges the results. Costs more because it is many upstream calls in one request — and only for what serves: partial responses are charged pro-rata for the sources that answered (`sources` in the response), and a total failure costs nothing.
Step 1 of sign-in. Same call whether the address is new or returning —
there is no separate signup. Works from a web form or from a terminal, so an
agent can drive it while the user reads the code out of their own inbox.
Authenticated with any of the caller's own API keys. Lets an agent open an authenticated dashboard tab for its user without ever handling the live key itself.
Requires an x-session header from /v1/auth/session. Deliberately NOT reachable with an API key, so a terminal agent cannot read it. Keys are hashed at rest: the plaintext is returned exactly once — on the first visit after paying, or right after a rotate.
Called by the /pay/success page when the buyer returns from PayPal. Safe to repeat: fulfillment is exactly-once. The webhook and a server-side reconciliation loop are the backups, so credits arrive even if the browser never comes back.