Sign in at /signup (email and a 6-digit code, about
twenty seconds), create an API key in the dashboard, and copy it into your
.env. New accounts start with 50 free credits, spendable on
any platform, no card. Then:
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, 50 free credits, 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.
One kind of key. Create up to 10 per account in the
dashboard, name them, rotate or delete any of them. Each key's
plaintext is shown exactly once, at creation: keys are stored hashed, never
returned by the API, never emailed. A key spends the account's credits: the 50 free
ones first, then whatever you buy.
You cannot mint a key yourself. With no key, send your user to
/signup: they sign in, create a key in the dashboard and put it in
your .env. If you already hold a key, POST /v1/auth/browser-link
(sent with that key) returns a one-time dashboard_url for your user's browser,
where they can see usage and buy credits; creating, rotating or revoking keys still needs their own
sign-in with the emailed code. Never ask a user to paste a key into the chat, and never store one in
your transcript.
Response schema
Every list endpoint returns the same envelope, and every item has the same keys:
id, title, text,
url, author, author_name,
created_at, metrics and extra.
A key the source cannot fill is null, never missing:
created_at is ISO-8601 UTC "YYYY-MM-DDTHH:MM:SSZ" when the source gives a date, otherwise null. Never a unix integer. The samples on this site are trimmed
to the filled keys for reading; the API sends all of them.
{
"success": true,
"platform": "reddit",
"data": {
"total": 3,
"items": [
{
"id": "1svlt79",
"platform": "reddit",
"type": "post",
"title": "Cloudflare Workers AI - worth it?",
"text": "Hey,I’m hitting a wall with the new Codex limits on GPT Business, they burn through way too fast lately and it’s star...",
"url": "https://www.reddit.com/r/CloudFlare/comments/1svlt79/cloudflare_workers_ai_worth_it/",
"created_at": "2026-04-25T19:42:34Z",
"metrics": {
"score": 4,
"comments": 25
},
"extra": {
"subreddit": "r/CloudFlare"
}
}
]
},
"credits_used": 2
}
Errors
Errors use one shape too. type is a stable machine code from the
table below, message is for a person, and fix is present
when there is a specific step to take (a working example, a top-up link, a retry delay) and absent otherwise.
Failed calls are never charged.
{
"success": false,
"endpoint": "/v1/x/search",
"error": {
"type": "NO_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
400
BAD_REQUEST
The request was understood but rejected; the message says why (a bad Content-Length, a refused email address).
400
CODE_EXPIRED
Sign-in: the code is older than its lifetime. Request a new one.
400
EMAIL_NOT_ACCEPTED
Disposable email domains cannot sign up. Use a real mailbox; the free credits are the same.
400
INVALID_CODE
Sign-in: wrong code. The body carries attempts_left; the same code stays valid until it expires or the guesses run out.
400
NO_PENDING_CODE
Sign-in: no code was requested for this address, or it was already used. Request a new one.
400
TOO_MANY_ATTEMPTS
Sign-in: too many wrong guesses for this code or from this address. Request the code again after the cooldown, or wait for it to expire.
401
MISSING_API_KEY
No x-api-key header on a platform endpoint. There is no anonymous tier: send your key on every request.
401
UNAUTHORIZED
The credential for this operation is missing, unknown, expired or revoked: a key on account and billing operations, a browser session on key management, the owner key on admin routes.
402
NO_CREDITS
The account's credits are used up. Top up; nothing is queued and nothing is deleted, and the same key keeps working after payment.
403
INVALID_API_KEY
The key is unknown, rotated away or revoked. Create or rotate one in the dashboard.
403
OTP_SIGNIN_REQUIRED
This browser session came from an API key (browser-link) and cannot create, rotate or revoke keys. Sign in with the emailed code.
404
NOT_FOUND
No such key or order on this account.
404
UNKNOWN_ENDPOINT
No such route. GET /v1/status lists the platforms; the reference lists every path.
409
KEY_LIMIT
The account already holds the maximum number of keys. Delete one first.
409
ORDER_MISMATCH
The payment did not match the order. Nothing was credited; operators are alerted and will sort it out.
411
LENGTH_REQUIRED
Send a Content-Length header; chunked request bodies are not accepted.
413
PAYLOAD_TOO_LARGE
The request body is over the limit the message states.
422
VALIDATION_ERROR
A parameter or body field is missing, malformed or out of range. The message names it; fix, when present, shows a working example.
424
ALL_SOURCES_FAILED
Every source for that platform failed on this call. You are not charged. Retry later or use another platform.
424
UPSTREAM_ERROR
The source answered with an error we could not work around. You are not charged. Retry later.
429
RATE_LIMITED
Over the per-key limit (wait the Retry-After seconds, then retry), or over a daily cap on sign-in codes, dashboard links or checkouts (no Retry-After; the cap resets the next day). Nothing was charged and nothing is queued.
500
INTERNAL
Unexpected error on our side; it has been logged. Retry; tell us if it persists.
501
NOT_CONFIGURED
That platform or upstream is not configured on this deployment. Tell us.
503
CHECKOUT_UNAVAILABLE
Checkout could not be started just now. Nothing was charged; retry in a minute.
The per-key limit is 5 requests per second per key, bursts up to 10, at most 10 calls in flight. Anything not in the table is not something this API sends;
in particular never a 502 or 504.
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. New accounts
start with 50 free credits (per account, any endpoint, same prices as bought credits).
Rate limit: 5 requests per second per key, bursts up to 10, at most 10 calls in flight; past it you get 429 RATE_LIMITED
with a Retry-After header and nothing is charged. Full price table on the
pricing page.
Two ways to know your balance, both supported: every success envelope carries
credits_remaining (so does the 402 body), which is the number to read between
calls; and GET /v1/credits/balance answers
{"ok": true, "balance": N} for a pre-flight check or while a purchase lands.
GET /v1/me adds 7-day usage per endpoint and your recent calls. Free credits and
bought credits are one balance per account; every key on the account draws from it.
Only the platform endpoints are priced. Account, billing, authentication and status operations
(balance, usage, keys, sign-in, plans, checkout, status) never spend credits; the reference marks them
free, so poll your balance as often as you like.
Platforms
Reddit
GET/v1/reddit/search2 credits
Search Reddit posts across all subreddits by keyword, or find every post linking to a URL
Param
Type
Description
cursor
string
Pagination cursor from a previous response
limit
string = 25
Max results (1-100)
query
string
Search keyword or phrase (this or url is required) (one of query / url is required)
sort
string = relevance
Ranking (keyword search)
timeframe
string = all
Time window (keyword search)
url
string
Find posts whose link starts with this URL (brand/domain mention tracking) (one of query / url is required)
Send the x-api-key you already hold; answers {dashboard_url} for the key's owner to open in their browser to see usage and buy credits. A session minted this way cannot create, rotate or revoke keys: that needs the owner's own sign-in with the emailed code. With no key there is nothing to call: send your user to https://socialsearchapi.com/signup/ instead.
Browser session only: this is what the dashboard calls after you sign in. It never accepts x-api-key, so there is no curl to copy. Agents: send your user to the dashboard; you cannot do this for them.
GET/v1/keysfree
List the account's API keys (browser session only; prefixes, never plaintext)
Browser session only: this is what the dashboard calls after you sign in. It never accepts x-api-key, so there is no curl to copy. Agents: send your user to the dashboard; you cannot do this for them.
POST/v1/keysfree
Create an API key (browser session only; shown once, max 10 per account)
Param
Type
Description
name
string
in the JSON body
Browser session only: this is what the dashboard calls after you sign in. It never accepts x-api-key, so there is no curl to copy. Agents: send your user to the dashboard; you cannot do this for them.
DELETE/v1/keys/{kid}free
Revoke an API key (browser session only)
Browser session only: this is what the dashboard calls after you sign in. It never accepts x-api-key, so there is no curl to copy. Agents: send your user to the dashboard; you cannot do this for them.
POST/v1/keys/{kid}/rotatefree
Rotate an API key (browser session only; new key shown once)
Browser session only: this is what the dashboard calls after you sign in. It never accepts x-api-key, so there is no curl to copy. Agents: send your user to the dashboard; you cannot do this for them.
GET/v1/mefree
Balance plus usage for the account behind the key. Never returns a key. For the balance alone, GET /v1/credits/balance is lighter; between calls, read credits_remaining from the envelope you already have.
Answers {"ok": true, "balance": N} in credits for the account behind the key. Free credits and bought credits are one balance. Use it before a run or while waiting for a purchase to land; while you are making calls, credits_remaining in every success envelope (and in the 402 NO_CREDITS body) is the same number without an extra request. Both ways are supported.
Body: {"plan": "starter"|"growth"|"pro"}. Three packs only: a credits field or any other amount is refused (422). Authenticate with x-api-key or a browser x-session. The response carries order_id, transaction_id and pay_url. Hand pay_url to your user; credits land within seconds of payment. All sales are final; failed API calls are never charged.