Substack API endpoint
Returns every selectable tab for one surface. The two surfaces expose different tab sets: `feed` has 34 tabs (the main feed, the bestseller feed, and one per category) and `explore` has 33. Each row's id and type must be passed together to the matching feed endpoint, which rejects a tab whose type does not match.
/substack/notes/tabssurface: optional surface whose tabs to list. Allowed values: feed,
explore. Defaults to feed.Returns every selectable tab for one surface. This is the discovery
endpoint for both /api/v1/substack/notes
(surface=feed) and /api/v1/substack/explore
(surface=explore).
The two surfaces expose different tab sets — 34 for feed and 33 for
explore — so list the surface you actually intend to call.
surface | Tabs |
|---|---|
feed | for-you (base), bestseller (secondary), 32 category tabs |
explore | explore (base), 32 category tabs |
id and type must be passed together to the matching feed endpoint —
it rejects a tab whose type does not match. Category tab ids are numeric
category ids.
Allowed type values in the response: base, secondary, category.
| Field | Filled in, of 34 checked |
|---|---|
| id | 34 |
| name | 34 |
| type | 34 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| surface | string | No | Which surface's tabs to list Allowed values: feed, explore. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/substack/notes/tabs?surface=feed" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"surface": "feed",
"tabs": [
{
"id": "for-you",
"name": "For you",
"type": "base"
},
{
"id": "bestseller",
"name": "New Bestsellers",
"type": "secondary"
},
{
"id": "4",
"name": "Technology",
"type": "category"
}
]
},
"msg": "success"
}Request schema
No body schema
Response schema
#/definitions/substack.notesFeedTabsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | substack.NotesFeedTabsResult | No | ||||
| data.surface | string | No | feed | |||
| data.tabs | array | No | ||||
| data.tabs[].id | string | No | for-you | |||
| data.tabs[].name | string | No | For you | |||
| data.tabs[].type | string | No | base | |||
| 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/notes/tabs?surface=feed" \
-H "x-api-key: $CRAWLORA_API_KEY"