Developer API
A REST API over our full database of tracked subreddits — search, filter by Claim Score, pull posting-time recommendations, and more. JSON over HTTPS, no SDK required.
Introduction
The base URL for every endpoint is https://subrift.org/api/v1. All requests and responses are JSON over HTTPS.
Our advantage
The Subrift API is built around one insight Reoogle doesn't have: the Claim Score. Every subreddit in our database carries a 0–100 score combining mod inactivity, member activity, and community size — so you can filter not just by “inactive mods” but by actual opportunity quality. Use min_claim_score=70 to get only communities worth your time.
Authentication
Every endpoint except GET /categories requires an API key, passed as a Bearer token. Keys are prefixed sub_live_ and are only available on the Monthly and Lifetime plans — generate one from your dashboard. The full key is shown once at creation time; only its hash is stored, so if you lose it you'll need to revoke it and generate a new one.
Authorization: Bearer sub_live_a1b2c3d4e5f6...Rate Limiting
Every response includes headers showing your current usage against both limits, so you can back off before hitting a 429.
| Header | Description | |
|---|---|---|
| X-RateLimit-Limit | Requests allowed per minute (60). | |
| X-RateLimit-Remaining | Requests left in the current minute. | |
| X-RateLimit-Reset | Unix timestamp when the per-minute window resets. | |
| X-RateLimit-Daily-Limit | Requests allowed per day (1,000). | |
| X-RateLimit-Daily-Remaining | Requests left today. |
Check your current usage anytime at GET /me/usage.
Errors
Failed requests return a consistent shape with an HTTP status code and a short machine-readable code:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded: 60 requests per minute."
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | Malformed or unsupported query parameter. |
| 401 | unauthorized | Missing or invalid API key. |
| 403 | forbidden | Valid key, but your plan doesn't include API access. |
| 404 | not_found | The requested subreddit isn't in the database. |
| 429 | rate_limited | You've hit the per-minute or per-day request limit. |
| 500 | internal_error | Something went wrong on our end. |
/subredditsSearch and filter the full tracked database. Combine any of the parameters below freely.
| Parameter | Type | Description |
|---|---|---|
| search | string | Partial match on name or description. |
| niche | string | Exact match on niche/category. |
| min_members | integer | Minimum subscriber count. |
| max_members | integer | Maximum subscriber count. |
| inactive_mods | boolean | true = only subreddits with 60+ days of mod inactivity. |
| claimable | boolean | true = only subreddits with claim_score >= 70. |
| min_claim_score | integer | Minimum Claim Score, 0–100. |
| min_posts_per_day | integer | Minimum posts per day. |
| lang | string | Defaults to "en" — currently the only supported value. |
| sort_by | string | claim_score | members | mod_inactive_days | posts_per_day |
| order | string | asc | desc (default desc) |
| page | integer | Page number, default 1. |
| per_page | integer | Results per page, max 100, default 25. |
Response
{
"data": [
{
"id": 1,
"name": "digitalnomad",
"members": 482000,
"niche": "Lifestyle",
"mod_inactive_days": 2,
"claim_score": 91,
"claim_tier": "Prime",
"member_activity": "Very High",
"posts_per_day": 18,
"topic_tags": ["remote work", "travel", "freelance"],
"description": "Community for digital nomads and remote workers worldwide.",
"last_checked": "2026-07-01T00:00:00Z"
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 15000,
"total_pages": 600
}
}Example request
curl "https://subrift.org/api/v1/subreddits?min_claim_score=70&sort_by=claim_score&order=desc" \
-H "Authorization: Bearer sub_live_YOUR_KEY"/subreddits/claimableShortcut for the most common query: subreddits with a Claim Score of 70 or higher, mod inactivity confirmed. Accepts the same parameters as GET /subreddits, minus claimable and min_claim_score, which are fixed.
| Parameter | Type | Description |
|---|---|---|
| search | string | Partial match on name or description. |
| niche | string | Exact match on niche/category. |
| min_members | integer | Minimum subscriber count. |
| max_members | integer | Maximum subscriber count. |
| inactive_mods | boolean | true = only subreddits with 60+ days of mod inactivity. |
| min_posts_per_day | integer | Minimum posts per day. |
| lang | string | Defaults to "en" — currently the only supported value. |
| sort_by | string | claim_score | members | mod_inactive_days | posts_per_day |
| order | string | asc | desc (default desc) |
| page | integer | Page number, default 1. |
| per_page | integer | Results per page, max 100, default 25. |
Response
{
"data": [ /* same shape as GET /subreddits */ ],
"pagination": { "page": 1, "per_page": 25, "total": 312, "total_pages": 13 },
"filters_applied": { "min_claim_score": 70 }
}Example request
curl "https://subrift.org/api/v1/subreddits/claimable?niche=Technology" \
-H "Authorization: Bearer sub_live_YOUR_KEY"/subreddits/{name}Full detail for one subreddit by name. Matching is case-insensitive.
| Parameter | Type | Description |
|---|---|---|
| name | string (path) | The subreddit name, without r/. |
Response
{
"id": 1,
"name": "digitalnomad",
"members": 482000,
"niche": "Lifestyle",
"mod_inactive_days": 2,
"claim_score": 91,
"claim_tier": "Prime",
"member_activity": "Very High",
"posts_per_day": 18,
"topic_tags": ["remote work", "travel", "freelance"],
"description": "Community for digital nomads and remote workers worldwide.",
"last_checked": "2026-07-01T00:00:00Z"
}Example request
curl "https://subrift.org/api/v1/subreddits/digitalnomad" \
-H "Authorization: Bearer sub_live_YOUR_KEY"/subreddits/{name}/activityAggregate activity by day of week and hour of day (UTC), plus the top 5 recommended posting windows.
| Parameter | Type | Description |
|---|---|---|
| name | string (path) | The subreddit name, without r/. |
Response
{
"subreddit": "digitalnomad",
"best_times": [
{ "day": "thursday", "utc_hour": 19, "score": 39 },
{ "day": "friday", "utc_hour": 20, "score": 38 },
{ "day": "wednesday", "utc_hour": 19, "score": 37 },
{ "day": "tuesday", "utc_hour": 18, "score": 35 },
{ "day": "monday", "utc_hour": 19, "score": 34 }
],
"heatmap": [
{ "day": "monday", "utc_hour": 0, "score": 12 }
/* ... 168 entries total — 7 days × 24 hours */
]
}Example request
curl "https://subrift.org/api/v1/subreddits/digitalnomad/activity" \
-H "Authorization: Bearer sub_live_YOUR_KEY"/categoriesAll niches tracked in the database along with how many subreddits fall under each.
Response
{
"data": [
{ "niche": "Technology", "count": 1240 },
{ "niche": "Finance", "count": 980 },
{ "niche": "Lifestyle", "count": 760 }
]
}Example request
curl "https://subrift.org/api/v1/categories"/me/usageCurrent usage for the calling API key against both the per-minute and per-day limits. Like any other endpoint, calling this counts as one request.
Response
{
"key_name": "Production",
"limits": {
"per_minute": { "limit": 60, "used": 3, "resets_at": "2026-07-13T18:41:00Z" },
"per_day": { "limit": 1000, "used": 48, "resets_at": "2026-07-14T00:00:00Z" }
}
}Example request
curl "https://subrift.org/api/v1/me/usage" \
-H "Authorization: Bearer sub_live_YOUR_KEY"Webhooks
We're building webhook support so you can get notified the moment a subreddit crosses your Claim Score threshold, instead of polling for it.
Versioning
The current API is versioned at /api/v1. Breaking changes will always ship under a new version prefix (/api/v2, etc.) rather than changing v1's behavior out from under you — existing integrations keep working indefinitely.