API para Substack: Posts
Colete posts de qualquer publicação do Substack pela URL dela, ou passe a URL de um único post (…/p/slug) para obter só aquele artigo. Retorna título, subtítulo, data de publicação, status de paywall, contagem de palavras, engajamento (reações, comentários, restacks), perfil do autor, detalhes da publicação, o corpo completo do artigo em texto, HTML e Markdown, e threads de comentários opcionais.
US$ 2,62/mil resultados, pague por requisição, sem assinatura.
Why roadmaps are guesses
Sep · Priya Nakamura
The three-question standup
A shorter standup that actually surfaces risk
PaidSep · Priya Nakamura
Ask me anything: hiring your first PM
Reader questions from last week's thread
Sep · Priya Nakamura
Clearheaded
Recommendations
{"postId": "148302911","title": "Why roadmaps are guesses","url": "https://www.clearheaded.blog/p/why-roadmaps-are-guesses","slug": "why-roadmaps-are-guesses","postType": "newsletter","createdUtc": 1758585600,"wordcount": 2140,"authorName": "Priya Nakamura",... 22 campos a mais}
Preços
Preços do endpoint Posts da API para Substack
Teste
Obtenha Posts do Substack em uma só requisição
Este exemplo mostra 58 de 69 campos. Ver todos os campos
{
"found": true,
"data": {
"items": [
{
"postId": "148302911",
"title": "Why roadmaps are guesses",
"url": "https://www.clearheaded.blog/p/why-roadmaps-are-guesses",
"slug": "why-roadmaps-are-guesses",
"postType": "newsletter",
"createdUtc": 1758585600,
"wordcount": 2140,
"authorName": "Priya Nakamura",
"authorHandle": "priyanakamura",
"contentStatus": "full",
"text": "Every roadmap I have shipped was a guess with a deadline attached.",
"publication": {
"id": "pub_5521",
"name": "Clearheaded",
"url": "https://www.clearheaded.blog",
"subdomain": "clearheaded",
"customDomain": "www.clearheaded.blog",
"description": "Notes on building things without lying to yourself.",
"image": "https://substackcdn.com/image/fetch/clearheaded/logo.png",
"language": "en",
"paymentsEnabled": true,
"subscriberCount": 38400
},
"comments": [
{
"commentId": "c_88213",
"text": "This matches every planning meeting I have sat through for a decade.",
"createdUtc": 1758600000,
"authorName": "Devon Okafor",
"authorHandle": "devonokafor",
"authorUrl": "https://substack.com/@devonokafor",
"authorImage": "https://substackcdn.com/image/fetch/clearheaded/devon-avatar.png",
"reactionCount": 44,
"restackCount": 2,
"isPinned": true,
"isAuthor": false,
"replies": [
{
"commentId": "c_88240",
"text": "Glad it landed. Curious how your team names the guess out loud.",
"createdUtc": 1758603600,
"authorName": "Priya Nakamura",
"authorHandle": "priyanakamura",
"authorUrl": "https://www.clearheaded.blog/people/priya-nakamura",
"authorImage": "https://substackcdn.com/image/fetch/clearheaded/priya-avatar.png",
"reactionCount": 12,
"restackCount": 0,
"isPinned": false,
"isAuthor": true
}
]
}
]
},
{
"postId": "148190442",
"title": "The three-question standup",
"url": "https://www.clearheaded.blog/p/the-three-question-standup",
"slug": "the-three-question-standup",
"subtitle": "",
"description": "A shorter standup that actually surfaces risk",
"postType": "newsletter",
"createdUtc": 1757980800,
"isPaid": true,
"language": "en",
"wordcount": 1420,
"reactionCount": 501,
"commentCount": 29,
"replyCount": 6,
"restackCount": 18,
"authorName": "Priya Nakamura",
"authorHandle": "priyanakamura",
"authorUrl": "https://www.clearheaded.blog/people/priya-nakamura",
"contentStatus": "preview_only",
"text": "Most standups answer the same three questions badly. Here is a version that takes six minutes and actually works...",
"publication": {
"id": "pub_5521",
"name": "Clearheaded",
"url": "https://www.clearheaded.blog",
"subdomain": "clearheaded"
},
"comments": []
},
{
"postId": "148075310",
"title": "Ask me anything: hiring your first PM",
"url": "https://www.clearheaded.blog/p/ask-me-anything-hiring-your-first-pm",
"slug": "ask-me-anything-hiring-your-first-pm",
"subtitle": "Reader questions from last week's thread",
"description": "Reader questions from last week's thread",
"postType": "thread",
"createdUtc": 1757376000,
"isPaid": false,
"language": "en",
"wordcount": 640,
"reactionCount": 203,
"commentCount": 41,
"replyCount": 9,
"restackCount": 5,
"authorName": "Priya Nakamura",
"authorHandle": "priyanakamura",
"authorUrl": "https://www.clearheaded.blog/people/priya-nakamura",
"contentStatus": "metadata_only",
"publication": {
"id": "pub_5521",
"name": "Clearheaded",
"url": "https://www.clearheaded.blog",
"subdomain": "clearheaded"
},
"comments": []
}
]
}
}Referência completa de parâmetros e resposta - todos os campos, tipos e exemplos deste endpoint.
Referência
Uma requisição, um formato de resposta.
Cada campo que você envia e cada campo que você recebe, cada um com um exemplo real.
Última verificação em 2026-11-14 · disponibilidade e latência medidas em 30d
Corpo da requisição
JSON, enviado via POST para este endpoint.
- urlstring
https://www.clearheaded.blog
A URL ou o domínio próprio de uma publicação do Substack, para obter seus posts recentes (ex.: https://www.astralcodexten.com), OU a URL de um único post, para obter só aquele artigo com o conteúdo completo (ex.: https://www.astralcodexten.com/p/your-book-review).
- contentTypeenum
Restringe a um único tipo de post, ou 'all' (ex.: newsletter).
- endDatestring
Retorna apenas posts publicados nesta data ou antes dela, no formato YYYY-MM-DD (ex.: 2024-12-31). Aplicado dentro dos 'limit' posts mais recentes analisados.
- includeCommentsboolean
Inclui as threads de comentários públicos e suas respostas diretas em cada post (ex.: true).
- includeContentboolean
true
Inclui o corpo completo do artigo em texto, HTML e Markdown. Defina como false para obter só metadados, o que é mais rápido (ex.: false).
- limitinteger
3
Número máximo de posts recentes a retornar quando for informada a URL de uma publicação (1-100, padrão 25); ignorado para a URL de um único post, que sempre retorna aquele post. A cobrança é por post retornado, então um limite menor custa menos.
- maxCommentsinteger
Máximo de comentários coletados por post quando 'includeComments' for true (0-500, padrão 20). Não custa nada a mais (ex.: 50).
- minCommentsinteger
Retorna apenas posts com pelo menos este número de comentários (ex.: 10).
- minReactionsinteger
Retorna apenas posts com pelo menos este número de reações (ex.: 100).
- minWordCountinteger
Retorna apenas posts com pelo menos este número de palavras, o que filtra notas curtas e anúncios (ex.: 1000).
- onlyFreeboolean
Retorna apenas posts gratuitos (sem paywall) (ex.: true).
- startDatestring
Retorna apenas posts publicados nesta data ou depois dela, no formato YYYY-MM-DD (ex.: 2024-01-01). Aplicado dentro dos 'limit' posts mais recentes analisados, então aumente 'limit' para alcançar períodos mais antigos.
Resposta
JSON, um valor de exemplo por campo.
Post records: title, subtitle, URL, publish date, paywall status, word count, engagement (reactions, comments, restacks), author profile, publication details, the article body as text, HTML and Markdown, and comment threads when requested. Populated whenever the provider has data for the entity.
- authorBiostring
Author bio as shown on their Substack profile.
- authorHandlestring
priyanakamura
Substack handle of the post author. Populated whenever the provider has data for the entity.
- authorImagestring
Profile photo URL of the post author.
- authorNamestring
Priya Nakamura
Display name of the post author. Populated whenever the provider has data for the entity.
- authorUrlstring
Substack profile URL of the post author.
- commentCountinteger
Number of top-level comments on the post.
- contentStatusstring
full
How much of the article body this record carries: 'full' for the whole article, 'preview_only' for the public excerpt of a paywalled post, 'metadata_only' when no body was requested or available, or 'failed' when extraction failed. Read this before trusting 'text', 'html', or 'markdown'. Populated whenever the provider has data for the entity.
- createdUtcnumber
1758585600
UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds. Populated whenever the provider has data for the entity.
- descriptionstring
Short post description, usually the subtitle or an excerpt.
- hasVoiceoverboolean
Whether the post carries a narrated audio version.
- htmlstring
Article body as HTML. Present when 'includeContent' is true and 'contentStatus' is 'full' or 'preview_only'.
- imagestring
Cover image URL.
- isPaidboolean
Whether the post is behind a paywall.
- languagestring
Two-letter language code of the post.
- markdownstring
Article body as Markdown. Present when 'includeContent' is true and 'contentStatus' is 'full' or 'preview_only'.
- podcastUrlstring
Audio URL for a podcast post or a narrated voiceover, when the post has one.
- postIdstring
148302911
Substack post identifier. Populated whenever the provider has data for the entity.
- postTypestring
newsletter
Post type (newsletter, podcast, or thread). Populated whenever the provider has data for the entity.
- reactionCountinteger
Number of reactions (likes) on the post.
- replyCountinteger
Number of replies to comments on the post.
- restackCountinteger
Number of times the post was restacked.
- slugstring
why-roadmaps-are-guesses
Post slug, the last path segment of the post URL. Populated whenever the provider has data for the entity.
- subtitlestring
Post subtitle or deck.
- textstring
Every roadmap I have shipped was a guess with a deadline attached.
Article body as plain text. Present when 'includeContent' is true and 'contentStatus' is 'full' or 'preview_only'.
- titlestring
Why roadmaps are guesses
Post title. Populated whenever the provider has data for the entity.
- updatedUtcnumber
UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.
- urlstring
https://www.clearheaded.blog/p/why-roadmaps-are-guesses
Canonical post URL. Populated whenever the provider has data for the entity.
- wordcountinteger
2140
Approximate word count of the article.
Top-level comment threads on the post, each with its direct replies. Empty unless 'includeComments' is true. Replies nested more than one level deep are not returned.
- authorHandlestring
devonokafor
Substack handle of the comment author.
- authorImagestring
https://substackcdn.com/image/fetch/clearheaded/devon-avatar.png
Profile photo URL of the comment author.
- authorNamestring
Devon Okafor
Display name of the comment author.
- authorUrlstring
https://substack.com/@devonokafor
Substack profile URL of the comment author.
- commentIdstring
c_88213
Substack comment identifier.
- createdUtcnumber
1758600000
UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.
- editedUtcnumber
UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.
- isAuthorboolean
false
Whether the comment was written by the post author.
- isPinnedboolean
true
Whether the comment is pinned by the publication.
- reactionCountinteger
44
Number of reactions on the comment.
- restackCountinteger
2
Number of times the comment was restacked.
- textstring
This matches every planning meeting I have sat through for a decade.
Comment body text.
Direct replies to this comment.
- authorHandlestring
priyanakamura
Substack handle of the reply author.
- authorImagestring
https://substackcdn.com/image/fetch/clearheaded/priya-avatar.png
Profile photo URL of the reply author.
- authorNamestring
Priya Nakamura
Display name of the reply author.
- authorUrlstring
https://www.clearheaded.blog/people/priya-nakamura
Substack profile URL of the reply author.
- commentIdstring
c_88240
Substack comment identifier.
- createdUtcnumber
1758603600
UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.
- editedUtcnumber
UTC epoch timestamp in seconds (Unix time). Multiply by 1000 for a JS Date in milliseconds.
- isAuthorboolean
true
Whether the reply was written by the post author.
- isPinnedboolean
false
Whether the reply is pinned by the publication.
- reactionCountinteger
12
Number of reactions on the reply.
- restackCountinteger
0
Number of times the reply was restacked.
- textstring
Glad it landed. Curious how your team names the guess out loud.
Reply body text.
The publication the post belongs to.
- customDomainstring
www.clearheaded.blog
Custom domain the publication is served on, when it has one.
- descriptionstring
Notes on building things without lying to yourself.
Publication tagline or hero text.
- idstring
pub_5521
Substack publication identifier.
- imagestring
https://substackcdn.com/image/fetch/clearheaded/logo.png
Publication logo URL.
- languagestring
en
Two-letter language code of the publication.
- namestring
Clearheaded
Publication name.
- paymentsEnabledboolean
true
Whether the publication sells paid subscriptions.
- subdomainstring
clearheaded
Publication subdomain on substack.com.
- subscriberCountinteger
38400
Subscriber count, when the publication publishes it.
- urlstring
https://www.clearheaded.blog
Publication home URL.
- foundboolean
true
Whether any posts were found for the request.
- reason"not_found"
Present only when `found` is false, and says why there is no result. `not_found`: the source states the target does not exist, or returned nothing for it. A `found: false` answer is a successful call, not an error, and `costUsd` is what it actually cost.
Dúvidas frequentes
Sobre o endpoint Posts da API para Substack
O endpoint Posts da AnyAPI para Substack retorna dados de Substack em JSON normalizado com uma chamada POST para /v1/run/substack.posts. Colete posts de qualquer publicação do Substack pela URL dela, ou passe a URL de um único post (…/p/slug) para obter só aquele artigo. Retorna título, subtítulo, data de publicação, status de paywall, contagem de palavras, engajamento (reações, comentários, restacks), perfil do autor, detalhes da publicação, o corpo completo do artigo em texto, HTML e Markdown, e threads de comentários opcionais. A AnyAPI retorna um schema normalizado, seja qual for a fonte que atende. Custa US$ 2,62 por mil resultados, e nunca mais de US$ 0,265 por requisição, em dólares, sem assinatura e sem mínimo mensal. Nos últimos 30 dias, 100,0% das chamadas ao endpoint Posts da API para Substack feitas pela AnyAPI tiveram sucesso, com tempo de resposta mediano de 3,0 segundos, em 458 chamadas medidas.