Substack API endpoint
Returns one page of Substack's Explore surface. Explore is a feed of heterogeneous modules rather than a flat list, so each page returns the modules it contains and every module names its own type. Known module types are `trendingTopicsExplore` (trending topics and suggested searches), `trendingPostsExplore`, `newBestsellersExplore`, `videoSuggestionsExplore`, `categoryLeaderboard`, `comment` (a single Note) and `post` (a single post). Only the collections a module actually carries are populated. Pagination is cursor-based; early pages are curated shelves and later pages are individual Notes and posts.
/substack/exploretab: optional Explore tab id, from the tabs endpoint called with
surface=explore. Defaults to explore.type: optional tab type. Allowed values: base, secondary,
category. Defaults to base.cursor: optional opaque cursor from a previous response's
next_cursor.type | Carries |
|---|---|
trendingTopicsExplore | topics — trending topics and suggested searches |
trendingPostsExplore | posts + publications |
newBestsellersExplore | profiles + publications + category |
videoSuggestionsExplore | notes (video notes) |
categoryLeaderboard | publications + profiles + category |
comment | notes — a single Note |
post | posts — a single post |
In topics, featured: true marks the one headline topic; the rest are
suggested searches. source describes where a suggestion came from (for
example search_history).
Cursor-based, and the content changes character as you page: early pages are
curated shelves (trending topics, then trending posts and bestsellers) and
later pages become individual Notes and posts. Page sizes are small and
variable — rely on next_cursor, not a fixed size.
| Field | Filled in, of 1 checked | Values in the sample |
|---|---|---|
| type | 1 | |
| topics | 1 | median 4 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| tab | string | No | Explore tab id from the tabs endpoint with surface=explore | explore | |
| type | string | No | Tab type Allowed values: base, secondary, category. | ||
| cursor | string | No | Opaque cursor from a previous response's next_cursor | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/substack/explore?type=base" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"tab": "explore",
"type": "base",
"next_cursor": "1",
"has_more": true,
"modules": [
{
"type": "trendingTopicsExplore",
"topics": [
{
"query": "Trump campaign rhetoric 2026",
"description": "Coverage of campaign messaging",
"source": "search_history",
"alternate_queries": [
"david"
],
"featured": true
}
]
}
]
},
"msg": "success"
}Request schema
No body schema
Response schema
#/definitions/substack.exploreResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | substack.ExploreResult | No | ||||
| data.has_more | boolean | No | ||||
| data.modules | array | No | ||||
| data.modules[].category_id | string | No | ||||
| data.modules[].category_name | string | No | ||||
| data.modules[].notes | array | No | Note record, 21 fields: attached_post, author_bestseller_tier, author_handle, author_id, author_name, author_photo_url, author_url, body, edited_at, id, is_ai_generated, language and 6 more. Described under Get one public Substack Note API. | |||
| data.modules[].posts | array | No | Post record, 13 fields: audience, comment_count, cover_image_url, description, id, paywalled, published_at, reaction_count, slug, subtitle, title, type and 1 more. Described under Substack Search API. | |||
| data.modules[].profiles | array | No | User record, 32 fields: bestseller_tier, bio, handle, id, name, photo_url, profile_set_up_at, publications, slug, subscribers, subscriptions, url. Described under Get a public Substack writer profile API. | |||
| data.modules[].publications | array | No | PublicationListItem record, 55 fields: author_handle, author_id, author_name, custom_domain, explicit, hero_text, id, language, logo_url, name, payments_enabled, subdomain and 3 more. Described under Substack Search API. | |||
| data.modules[].title | string | No | Trending posts | |||
| data.modules[].topics | array | No | ||||
| data.modules[].topics[].alternate_queries | array | No | ||||
| data.modules[].topics[].category | string | No | ||||
| data.modules[].topics[].description | string | No | ||||
| data.modules[].topics[].featured | boolean | No | ||||
| data.modules[].topics[].first_trending_at | string | No | ||||
| data.modules[].topics[].id | string | No | ||||
| data.modules[].topics[].query | string | No | Trump campaign rhetoric 2026 | |||
| data.modules[].topics[].source | string | No | search_history | |||
| data.modules[].topics[].url | string | No | ||||
| data.modules[].type | string | No | trendingPostsExplore | Type is the upstream module kind. Known values: trendingTopicsExplore, trendingPostsExplore, newBestsellersExplore, videoSuggestionsExplore, categoryLeaderboard, comment, post. | ||
| data.next_cursor | string | No | ||||
| data.tab | string | No | explore | |||
| data.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/explore?type=base" \
-H "x-api-key: $CRAWLORA_API_KEY"