API para Substack

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.

Clearheaded
clearheaded.blog
ClearheadedSubscribe
HomeArchiveAbout

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

Type your email…Subscribe

Recommendations

O que a API retornouitems[0]
{
"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
}
Disponibilidade
100,00%
30d · 458 chamadas
Requisições
458
30d · semanal, últimas 12 sem.
Resposta
3,0s
mediana · 30d

Teste

Obtenha Posts do Substack em uma só requisição

Abrir em
Obter chave grátis
Resposta de exemplo
Execuções grátis retornam só os primeiros 3 resultados. Recarregue uma chave para receber a resposta completa.

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.

Você envia. Um corpo JSON pequeno. Os valores mostrados são exemplos para você trocar pelos seus.

Resposta

JSON, um valor de exemplo por campo.

each itemdata.items[]

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.

each commentdata.items[].comments[]

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.

each replydata.items[].comments[].replies[]

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.

publicationdata.items[].publication

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.

top level
  • 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.

Você recebe. Campos nomeados e tipados, no mesmo formato, seja qual for a fonte que responder.

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.

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. Você recarrega uma carteira em dólares e cada chamada desconta dela. Algumas requisições pagas pela carteira que falham geram cobranças de processamento, que repassamos pelo custo, sem margem; a resposta de erro mostra o valor cobrado.

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 resposta é JSON normalizado, com o mesmo envelope que todo endpoint da AnyAPI retorna, então processar um segundo endpoint é só trocar a URL, e nada mais.

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. Estas são medições da própria AnyAPI sobre o tráfego que passa pelo gateway, recalculadas continuamente, e não uma meta de nível de serviço publicada.

Sim. Uma conta nova da AnyAPI começa com US$ 0,10 de saldo grátis, sem cartão.

Envie uma requisição POST para https://api.getanyapi.com/v1/run/substack.posts com sua chave da AnyAPI em um cabeçalho "Authorization: Bearer" e a entrada como corpo JSON. A mesma chave e a mesma carteira funcionam em todos os endpoints da AnyAPI.

Não. Você adiciona dólares a um único saldo pré-pago da AnyAPI e cada requisição desconta dele. Não há plano mensal nem mínimo, e o mesmo saldo paga todos os endpoints da AnyAPI.

Sim. Instale @getanyapi/sdk pelo npm para TypeScript ou getanyapi pelo pip para Python. Os dois chamam todos os endpoints da AnyAPI com a mesma chave, e qualquer cliente HTTP também funciona.

Sim. Um agente pode se conectar ao servidor MCP da AnyAPI em https://api.getanyapi.com/mcp, ou criar a própria chave de teste grátis com um único POST sem autenticação para https://api.getanyapi.com/agent/signup e chamar este endpoint por HTTP.