Substack API endpoint
Returns one public post with the extended metadata the archive listing omits, including word count, every credited byline, and podcast audio details where the post has them. Post bodies are not returned.
/substack/postpublication: required publication subdomain (semianalysis) or custom
domain (www.thefp.com).slug: required post slug — the trailing path segment of the post URL.
For https://newsletter.semianalysis.com/p/koreas-trillion-dollar-sovereign
the slug is koreas-trillion-dollar-sovereign.Returns one public post with the extended metadata
/api/v1/substack/publication/posts omits: wordcount, every credited
bylines[] entry, and podcast audio fields where the post has them.
Post bodies are not returned. paywalled is derived from audience:
true for anything other than everyone.
| Field | Filled in, of 4 checked | Values in the sample |
|---|---|---|
| id | 4 | |
| name | 4 | |
| handle | 4 | |
| url | 4 | substack.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| publication | string | Yes | Publication subdomain or custom domain | semianalysis | |
| slug | string | Yes | Post slug, the trailing path segment of the post URL | koreas-trillion-dollar-sovereign | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/substack/post?publication=semianalysis&slug=koreas-trillion-dollar-sovereign" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"id": 213613469,
"title": "Korea's Trillion-Dollar Sovereign AI Investment",
"slug": "koreas-trillion-dollar-sovereign",
"url": "https://newsletter.semianalysis.com/p/koreas-trillion-dollar-sovereign",
"type": "newsletter",
"audience": "only_paid",
"published_at": "2026-09-01T20:14:32.560Z",
"paywalled": true,
"comment_count": 1,
"reaction_count": 164,
"wordcount": 3953,
"bylines": [
{
"id": 134996999,
"name": "Max Kan",
"handle": "maxkan",
"url": "https://substack.com/@maxkan"
}
]
},
"msg": "success"
}Request schema
No body schema
Response schema
#/definitions/substack.postResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | substack.PostDetail | No | ||||
| data.audience | string | No | everyone | |||
| data.bylines | array | No | ||||
| data.bylines[].handle | string | No | ||||
| data.bylines[].id | integer | No | 134996999 | |||
| data.bylines[].name | string | No | Max Kan | |||
| data.bylines[].url | string | No | ||||
| data.comment_count | integer | No | ||||
| data.cover_image_url | string | No | ||||
| data.description | string | No | ||||
| data.id | integer | No | 213613469 | |||
| data.paywalled | boolean | No | ||||
| data.podcast_duration_seconds | integer | No | ||||
| data.podcast_url | string | No | ||||
| data.published_at | string | No | ||||
| data.reaction_count | integer | No | ||||
| data.slug | string | No | ||||
| data.subtitle | string | No | ||||
| data.title | string | No | ||||
| data.type | string | No | newsletter | |||
| data.url | string | No | ||||
| data.wordcount | integer | No | 3953 | |||
| msg | string | No | success |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/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/post?publication=semianalysis&slug=koreas-trillion-dollar-sovereign" \
-H "x-api-key: $CRAWLORA_API_KEY"