Reddit API endpoint
Scans a Reddit search page for people actively asking for a product or service, scores each post 0-10 for buying intent, and returns them ranked highest-first with the signals that fired. Self-promotion, hiring posts, freelancer service adverts, revenue-milestone posts, duplicate reposts, and Title Case article headlines are filtered out before scoring. A deterministic prefilter always runs; when `classifier` resolves to `llm` the surviving candidates are additionally refined in one batched model call. A `503` with a `Retry-After` header means Reddit is temporarily throttling the request; wait that many seconds and retry. The lead-response fields and credit weights are preserved regardless of the underlying Reddit data source.
/reddit/leadsQuery parameters: q is required and describes what you offer in plain language. subreddit is optional and restricts the search to one community. sort is optional and must be one of relevance, hot, new, top, or comments; it defaults to relevance. time is optional and must be one of hour, day, week, month, year, or all; it defaults to month. limit is the maximum number of leads returned, defaults to 25, and clamps to 100. min_score is the minimum buying-intent score to return, must be between 0 and 10, and defaults to 4. classifier is optional and must be one of auto, heuristic, or llm; it defaults to auto.
How scoring works: one search page of up to 100 posts is scanned per request. A deterministic prefilter always runs first. It disqualifies self-promotion, hiring posts, freelancer service adverts ([for hire], [OFFER]), revenue-milestone posts, duplicate reposts of the same title, and Title Case article headlines, then scores the survivors additively across six independent signals: explicit-ask, solution-seeking, budget, switching, manual-toil, and urgency. Buying intent is scored rather than assigned as a single exclusive label, because a post is very often a question and a lead at the same time. When classifier resolves to llm, the prefiltered candidates (up to 40) are refined in a single batched, schema-constrained model call that returns a score and a short reason for each. The prefilter is what keeps that model call roughly constant in cost per request rather than proportional to the size of the search page.
Relevance vs intent: the deterministic scorer measures whether someone is asking for something, not whether it is what you sell. Topical relevance in heuristic mode comes entirely from the Reddit search query, so keep sort on its relevance default and pass a specific q; a broad q with sort=new will return posts that read as asks but do not match your offering. The model pass is given your q and scores fit as well as intent, which is the main reason to prefer it.
Classifier modes: auto uses the model when a provider is configured, and falls back to the deterministic scorer when it is not — or when the provider call fails, in which case the response sets degraded: true so you can tell why the scores look heuristic. heuristic never calls a model. llm requires a working provider: it returns 500 when none is configured and 503 when the provider call fails, rather than silently degrading.
Credit weight: 25, matching /api/v1/extract, because the default path includes a model call. Requests sent with classifier=heuristic are charged 3.
Notable response behavior: a missing q, an invalid sort, time, or classifier value, or a min_score outside 0-10 returns 400. Reddit block pages, malformed upstream responses, and transport failures return 503. When Reddit rate limits the request, the response is 503 with a Retry-After header giving the number of seconds to wait; back off for that long and retry rather than treating the endpoint as unavailable. A model-provider failure returns 503. An empty leads array with populated stats is a valid success: it means the corpus genuinely contained no buying-intent posts above min_score, which is common in vendor-heavy or content-marketing-heavy communities. The stats object reports scanned, prefiltered, classified, and returned so the funnel is auditable.
Provider configuration: the model pass resolves its base URL from REDDIT_LEADS_LLM_BASE, then the shared OPENAI_API_BASE, OPENAI_BASE_URL, or OPENAI_API_BASE_URL, then https://api.openai.com/v1. It also reads REDDIT_LEADS_LLM_MODEL (defaults to gpt-5.4) and REDDIT_LEADS_LLM_KEY (falls back to OPENAI_API_KEY). Set REDDIT_LEADS_LLM_BASE to route this endpoint to a different provider than the rest of the deployment.
Lead search uses the same internal Redlib fallback when its native Reddit search fails. The lead response keeps its existing fields, funnel stats and credit weights; it does not add a public source field. Temporary provider, authentication, rate-limit and parser failures return 503. Provider selection is server configuration.
| Field | Filled in, of 1 checked | Values in the sample |
|---|---|---|
| score | 1 | 4 |
| signals | 1 | median 1 entry |
| title | 1 | |
| subreddit | 1 | |
| author | 1 | |
| permalink | 1 | reddit.com |
| created | 1 | 2026-09-30 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | What you offer, in plain language | crm for small teams | |
| subreddit | string | No | Restrict the search to a subreddit name, without r/ | ||
| sort | string | No | Sort: relevance, hot, new, top, or comments Allowed values: relevance, hot, new, top, comments. | ||
| time | string | No | Time window: hour, day, week, month, year, or all Allowed values: hour, day, week, month, year, all. | ||
| limit | integer | No | 25 and clamps to 100 | Maximum leads returned, defaults to 25 and clamps to 100 | |
| min_score | integer | No | 4 | Minimum buying-intent score to return, 0-10, defaults to 4 | |
| classifier | string | No | Classifier: auto uses the model when configured, heuristic skips it, llm requires it Allowed values: auto, heuristic, llm. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/reddit/leads?q=crm+for+small+teams&sort=relevance&time=hour&limit=10&classifier=auto" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "crm for small teams",
"subreddit": "smallbusiness",
"classifier": "llm",
"model": "gpt-5.4",
"min_score": 4,
"leads": [
{
"score": 9,
"signals": [
{
"id": "explicit-ask",
"label": "asking for a tool"
},
{
"id": "budget",
"label": "budget or paying"
}
],
"reason": "states a budget and asks for options",
"title": "Looking for a CRM for a 3-person team, budget ~$50/mo",
"subreddit": "smallbusiness",
"author": "someuser",
"permalink": "https://www.reddit.com/r/smallbusiness/comments/1abcxyz/",
"comment_count": 12,
"post_score": 20,
"created": "2026-08-01T00:00:00Z"
}
],
"stats": {
"scanned": 100,
"prefiltered": 88,
"classified": 12,
"returned": 9
}
}
}Request schema
No body schema
Response schema
#/definitions/reddit.leadsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | redditleads.Response | No | ||||
| data.classifier | string | No | llm | |||
| data.degraded | boolean | No | false | |||
| data.leads | array | No | ||||
| data.leads[].author | string | No | someuser | |||
| data.leads[].comment_count | integer | No | 12 | |||
| data.leads[].created | string | No | 2026-08-01T00:00:00Z | |||
| data.leads[].permalink | string | No | https://www.reddit.com/r/smallbusiness/comments/1abcxyz/ | |||
| data.leads[].post_score | integer | No | 20 | |||
| data.leads[].reason | string | No | Asking for a CRM and states a monthly budget. | |||
| data.leads[].score | integer | No | 9 | |||
| data.leads[].signals | array | No | ||||
| data.leads[].signals[].id | string | No | explicit-ask | |||
| data.leads[].signals[].label | string | No | asking for a tool | |||
| data.leads[].subreddit | string | No | smallbusiness | |||
| data.leads[].title | string | No | Looking for a CRM for a 3-person team, budget ~$50/mo | |||
| data.min_score | integer | No | 4 | |||
| data.model | string | No | gpt-5.4 | |||
| data.query | string | No | crm for small teams | |||
| data.stats | redditleads.Stats | No | ||||
| data.stats.classified | integer | No | 12 | |||
| data.stats.prefiltered | integer | No | 88 | |||
| data.stats.returned | integer | No | 9 | |||
| data.stats.scanned | integer | No | 100 | |||
| data.subreddit | string | No | smallbusiness | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/reddit/leads?q=crm+for+small+teams&sort=relevance&time=hour&limit=10&classifier=auto" \
-H "x-api-key: $CRAWLORA_API_KEY"