Viral Score
Know whether a Reddit title or an X post will land before it goes live
One route scores both networks. With network: "reddit", reddit-pooled-v1 scores one to three titles for a subreddit: each title's chance of reaching that subreddit's top 10% of the month, what helps and hurts, the rules and the first-post penalty. With network: "x" (or no network), x-viral-v1 scores an X post draft from 0 to 100 with nine signals and two ways to improve it. Both answer at once.
Reddit: reddit-pooled-v1
| Status | Live |
|---|---|
| Endpoints | POST /api/v1/viral-score |
| MCP tools | predict_viral_score |
| Scopes | viral:score |
| Price | $0.01 per title |
| Limits | 20 requests a minute and 1,000 requests a day per workspace |
curl -s https://app.makesmores.com/api/v1/viral-score \
-H "Authorization: Bearer $SMORE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"network": "reddit",
"subreddit": "running",
"titles": [
"First half marathon: easy miles got me under 2 hours",
"How I paced my first half marathon"
],
"post_type": "text",
"account": "established"
}'
| Field | Rules |
|---|---|
network | reddit |
subreddit | Required, 2 to 24 characters, with or without r/ |
titles | Required, 1 to 3 titles of 1 to 300 characters. Each title is billed |
body | Optional, up to 40,000 characters |
post_type | text (default), image, video or link |
flair | Optional, up to 64 characters |
account | established (default) or first_post, to see the first-post penalty |
The answer:
| Field | Meaning |
|---|---|
variants | One per title: title, p_top10 (0 to 1), lift (that chance as a multiple of the subreddit's base rate), pct (percentile) and rank |
subreddit | name, tracked, base_rate, eligible_posts and flairs |
helps, hurts | Each {label, detail}: what moved the score |
rules | The posted rules with how often each is enforced (enforced, approx when estimated) and a status of ok, warn or unknown for this post |
automod_held | Share of posts the subreddit's automoderator held, or null |
new_account | The first-post penalty, or null when S'more has no account facts for the subreddit |
wins | Formats that reach the top 10% more often |
scored_at | When it was scored |
The score is stored for your workspace. The same Reddit branch is what the Reddit writers run on every option.
X: x-viral-v1
| Status | Live |
|---|---|
| Endpoints | POST /api/v1/viral-score |
| MCP tools | predict_viral_score |
| Scopes | viral:score |
| Price | $0.05 per post |
| Limits | 10 requests a minute and 250 requests a day per workspace |
curl -s https://app.makesmores.com/api/v1/viral-score \
-H "Authorization: Bearer $SMORE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"network": "x",
"post": "We opened our public API today. One key, every product, over REST and MCP.",
"audience": "Developers who build agents"
}'
| Field | Rules |
|---|---|
network | x, or leave it out |
post | Required, 1 to 4,000 bytes of UTF-8 |
audience | Optional, up to 300 bytes |
The answer:
| Field | Meaning |
|---|---|
score | 0 to 100 |
label | The score in words |
replyBait | none, possible or likely |
signals | Nine signals, each {id, score, label} |
improve | Two suggestions, each {signal, message} |
model | x-viral-v1 |
xAlgorithmGuideRevision | The revision of the ranking guide the rubric follows |
disclaimer | The score is S'more's estimate from a public ranking guide; X does not make it |
MCP
predict_viral_score takes the same fields. Without network it scores an X post; with network: "reddit" it scores titles.
Billing
A Reddit call deducts one item per title you send and refunds any title it could not score. An X call is one post. A call that fails is refunded in full.
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Fields mixed between networks, a missing post or titles, or lengths out of range |
| 409 | reddit_signals_off | The Reddit branch is switched off for now |
| 422 | invalid_subreddit, subreddit_unavailable | S'more cannot score that subreddit |
| 429 | rate_limited | Over the per-minute or per-day limit |
| 503 | scoring_busy, scoring_unavailable | Try again shortly |
See examples and the guide Score a post before it goes live.