Substack API endpoint
Returns every public Substack category, with the category id required by /substack/category. Ids span two spaces: 32 categories use a numeric id and one uses the string id `podcast`. Both are accepted by /substack/category.
/substack/categoriesTakes no parameters.
Returns every public Substack category. The id of each row is the value
/api/v1/substack/category and /api/v1/substack/leaderboard require.
Two things about this value space matter:
4,
96, 76739, ...); two use string ids, podcast and bestseller. Do
not assume a numeric id.in_category_listing — accepted by /api/v1/substack/category.
False only for bestseller, which is a cross-category leaderboard
rather than a browsable category.in_leaderboard — accepted by /api/v1/substack/leaderboard. True
for every row.| Field | Filled in, of 35 checked | Values in the sample |
|---|---|---|
| id | 35 | |
| slug | 35 | |
| name | 35 | |
| emoji | 34 | |
| in_category_listing | 35 | true in 34 of 35 |
| in_leaderboard | 35 | true in 35 of 35 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/substack/categories" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"categories": [
{
"id": "96",
"slug": "culture",
"name": "Culture",
"emoji": "🎭️",
"in_category_listing": true,
"in_leaderboard": true
},
{
"id": "podcast",
"slug": "podcast",
"name": "Podcast",
"emoji": "🎙",
"in_category_listing": true,
"in_leaderboard": true
},
{
"id": "bestseller",
"slug": "bestseller",
"name": "Bestsellers",
"in_category_listing": false,
"in_leaderboard": true
}
]
},
"msg": "success"
}Request schema
No body schema
Response schema
#/definitions/substack.categoriesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | substack.CategoriesResult | No | ||||
| data.categories | array | No | ||||
| data.categories[].emoji | string | No | 🕹 | |||
| data.categories[].id | string | No | 4 | |||
| data.categories[].in_category_listing | boolean | No | InCategoryListing is false for the one id the category listing rejects ("bestseller", which exists only as a leaderboard). | |||
| data.categories[].in_leaderboard | boolean | No | InLeaderboard is true when /substack/leaderboard accepts this id. | |||
| data.categories[].name | string | No | Technology | |||
| data.categories[].slug | string | No | technology | |||
| msg | string | No | success |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/substack/categories" \
-H "x-api-key: $CRAWLORA_API_KEY"