SubReply

Endpoints

Scrape Reddit posts

Scrapes Reddit posts and scores them for relevance with AI. Free in credits — you only pay at generation time.

POST/api/v1/scrapeFree

The endpoint runs exactly the product's scan pipeline: search across the requested subreddits, deduplication, freshness filter (30 days), then AI scoring of every remaining post. Nothing is stored on our side — you get the scored posts and you do what you want with them.

Parameters

Request body (application/json)

ParameterTypeRequiredDescription
subredditsstring[]RequiredSubreddits to search, in r/name form. Between 1 and 5.
keywordsstring[]RequiredSearch keywords. Between 1 and 10. They serve both as the Reddit query and as context for the scoring.
product_descriptionstringOptionalDescription of your product. It lifts relevance sharply: it is what tells the scoring which problem you solve. 500 characters at most.
target_languagefr | enOptionalTarget language of the posts. A strict filter when set; when absent, no language filter is applied.
limitnumberOptionalNumber of posts returned, an integer from 1 to 25. Posts come back sorted by descending score.Default: 10

product_description changes everything

Without it the scoring falls back on your keywords as its only context — a far thinner basis, so a mechanically harsher selection. One sentence is enough: « Lead management SaaS for small French businesses ».

Example

cURL
curl -s -X POST https://subreply.io/api/v1/scrape \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sr_live_VOTRE_CLE_API" \
  -d '{
    "subreddits": ["r/startupfrance", "r/entrepreneur_libre"],
    "keywords": ["trouver clients", "prospection", "acquisition"],
    "product_description": "SaaS de gestion de leads pour TPE/PME françaises",
    "target_language": "fr",
    "limit": 5
  }'

Response fields

FieldTypeDescription
posts[].reddit_post_idstringReddit identifier of the post (without the t3_ prefix).
posts[].urlstringPermalink of the post. This is the URL the two other endpoints take.
posts[].scorenumberOverall relevance, from 0 to 1.
posts[].product_fitnumberHow well the post matches the problem your product solves, from 0 to 1.
posts[].is_potential_customerbooleanThe author is a potential customer (rather than a competitor or a peer).
posts[].customer_intentstringNature of the buying signal (see below).
posts[].created_utcnumberPublication date, Unix timestamp in seconds.
meta.scrapednumberPosts retrieved after deduplication.
meta.scorednumberPosts that actually went through scoring.
meta.returnednumberPosts returned, after limit is applied.

Understanding the scoring

Two different questions are asked of every post, and a post has to pass both to come back.

score

Overall relevance of the post to your search, from 0 to 1. It is the sort key of the response. In practice, above 0.7 a post deserves a comment, below 0.5 it is rarely worth acting on.

product_fit

Does the post talk about the problem your product solves? This score deliberately ignores who the author is: a consultant describing your problem perfectly will have a high product_fit and an is_potential_customer of false.

is_potential_customer

Can the author become a customer? false for a competitor, a peer selling the same service or someone merely curious. This is the field that stops you from prospecting people in your own trade.

customer_intent

Nature of the buying signal, from warmest to coldest:

  • recherche active — the author is looking for a solution right now. The best possible moment to reply.
  • frustration — they are living with the problem without looking for a tool yet.
  • curiosité — they are informing themselves, with no urgency.
  • aucun — no customer signal at all.

An empty array is an honest answer

A posts: [] with a meta.scored above 0 means posts existed but none matched your target. That is not a bug: it is the filter doing its job. Widen the keywords or the subreddits rather than re-running the same call.

What comes next

Keep the posts above 0.7 with is_potential_customer: true, then pass their url and their title to the generation endpoint. Only at that step are credits charged.