API de Substack

API de Substack: Publicaciones

Obtén las publicaciones de cualquier sitio de Substack por su URL, o pasa la URL de una sola publicación (…/p/slug) para obtener solo ese artículo. Devuelve título, subtítulo, fecha de publicación, estado del muro de pago, número de palabras, interacción (reacciones, comentarios, restacks), perfil del autor, detalles del sitio, el cuerpo completo del artículo como texto, HTML y Markdown, y, de forma opcional, los hilos de comentarios.

US$2.62/1k resultados, pagas por solicitud, sin suscripción.

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

Lo que devolvió la APIitems[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 más
}
Disponibilidad
100.00%
30d · 458 llamadas
Solicitudes
458
30d · semanal, últimas 12 sem.
Respuesta
3.0s
mediana · 30d

Pruébalo

Obtén Publicaciones de Substack en una sola solicitud

Abrir en
Respuesta de ejemplo
Las ejecuciones gratis devuelven solo los primeros 3 resultados. Agrega fondos a una clave para obtener la respuesta completa.

Este ejemplo muestra 58 de 69 campos. Ver todos los 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": []
      }
    ]
  }
}

Referencia completa de parámetros y respuesta: cada campo, tipo y ejemplo de este endpoint.

Referencia

Una solicitud, un formato de respuesta.

Cada campo que envías y cada campo que recibes, cada uno con un ejemplo real.

Verificado por última vez el 2026-11-14 · disponibilidad y latencia medidas en 30d

Cuerpo de la solicitud

JSON, enviado por POST a este endpoint.

  • urlstring

    https://www.clearheaded.blog

    La URL o el dominio personalizado de un sitio de Substack para obtener sus publicaciones recientes (p. ej. https://www.astralcodexten.com), O la URL de una sola publicación para obtener solo ese artículo con el contenido completo (p. ej. https://www.astralcodexten.com/p/your-book-review).

  • contentTypeenum

    Restringe a un solo tipo de publicación, o 'all' (p. ej. newsletter).

  • endDatestring

    Solo devuelve publicaciones publicadas en esta fecha o antes, con el formato YYYY-MM-DD (p. ej. 2024-12-31). Se aplica dentro de las 'limit' publicaciones más recientes analizadas.

  • includeCommentsboolean

    Incluye los hilos de comentarios públicos y sus respuestas directas en cada publicación (p. ej. true).

  • includeContentboolean

    true

    Incluye el cuerpo completo del artículo como texto, HTML y Markdown. Usa false para obtener solo metadatos, que es más rápido (p. ej. false).

  • limitinteger

    3

    Cantidad máxima de publicaciones recientes que se devuelven cuando se da la URL de un sitio de Substack (1-100, predeterminado 25); se ignora con la URL de una sola publicación, que siempre devuelve esa publicación. Se cobra por cada publicación devuelta, así que un límite más bajo cuesta menos.

  • maxCommentsinteger

    Cantidad máxima de comentarios recopilados por publicación cuando 'includeComments' es true (0-500, predeterminado 20). No tiene costo adicional (p. ej. 50).

  • minCommentsinteger

    Solo devuelve publicaciones con al menos esta cantidad de comentarios (p. ej. 10).

  • minReactionsinteger

    Solo devuelve publicaciones con al menos esta cantidad de reacciones (p. ej. 100).

  • minWordCountinteger

    Solo devuelve publicaciones con al menos esta cantidad de palabras, lo que filtra notas y anuncios cortos (p. ej. 1000).

  • onlyFreeboolean

    Devuelve solo publicaciones gratuitas (sin muro de pago) (p. ej. true).

  • startDatestring

    Solo devuelve publicaciones publicadas en esta fecha o después, con el formato YYYY-MM-DD (p. ej. 2024-01-01). Se aplica dentro de las 'limit' publicaciones más recientes analizadas, así que aumenta 'limit' para llegar a rangos de fechas más antiguos.

Envías. Un cuerpo JSON pequeño. Los valores que se muestran son ejemplos para reemplazar por los tuyos.

Respuesta

JSON, un valor de ejemplo 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.

Recibes. Campos con nombre y tipo, con el mismo formato sin importar qué fuente responda.

Preguntas frecuentes

Acerca del endpoint Publicaciones de la API de Substack

El endpoint Publicaciones de AnyAPI para Substack devuelve datos de Substack como JSON normalizado con una sola llamada POST a /v1/run/substack.posts. Obtén las publicaciones de cualquier sitio de Substack por su URL, o pasa la URL de una sola publicación (…/p/slug) para obtener solo ese artículo. Devuelve título, subtítulo, fecha de publicación, estado del muro de pago, número de palabras, interacción (reacciones, comentarios, restacks), perfil del autor, detalles del sitio, el cuerpo completo del artículo como texto, HTML y Markdown, y, de forma opcional, los hilos de comentarios. AnyAPI devuelve un único esquema normalizado sin importar qué fuente atienda la solicitud. Cuesta US$2.62 por cada 1,000 resultados, y nunca más de US$0.265 por una sola solicitud, en dólares estadounidenses, sin suscripción y sin mínimo mensual. En los últimos 30 días, el 100.0% de las llamadas al endpoint Publicaciones de la API de Substack a través de AnyAPI tuvo éxito, con un tiempo de respuesta mediano de 3.0 segundos en 458 llamadas medidas.

Cuesta US$2.62 por cada 1,000 resultados, y nunca más de US$0.265 por una sola solicitud, en dólares estadounidenses, sin suscripción y sin mínimo mensual. Agregas fondos a una billetera en dólares y cada llamada descuenta de ella. Algunas solicitudes fallidas pagadas con la billetera generan cargos de procesamiento que trasladamos al costo, sin margen; la respuesta de error muestra el monto cobrado.

Obtén las publicaciones de cualquier sitio de Substack por su URL, o pasa la URL de una sola publicación (…/p/slug) para obtener solo ese artículo. Devuelve título, subtítulo, fecha de publicación, estado del muro de pago, número de palabras, interacción (reacciones, comentarios, restacks), perfil del autor, detalles del sitio, el cuerpo completo del artículo como texto, HTML y Markdown, y, de forma opcional, los hilos de comentarios. La respuesta es JSON normalizado con el mismo envoltorio que devuelve cada endpoint de AnyAPI, así que procesar un segundo endpoint es solo cambiar la URL.

En los últimos 30 días, el 100.0% de las llamadas al endpoint Publicaciones de la API de Substack a través de AnyAPI tuvo éxito, con un tiempo de respuesta mediano de 3.0 segundos en 458 llamadas medidas. Estas son mediciones propias de AnyAPI sobre el tráfico que pasa por el gateway, recalculadas continuamente, no un objetivo de nivel de servicio publicado.

Sí. Una cuenta nueva de AnyAPI empieza con US$0.10 de saldo gratis, sin tarjeta.

Envía una solicitud POST a https://api.getanyapi.com/v1/run/substack.posts con tu clave de AnyAPI en un encabezado "Authorization: Bearer" y la entrada como cuerpo JSON. La misma clave y la misma billetera sirven para todos los endpoints de AnyAPI.

No. Agregas dólares a un solo saldo prepagado de AnyAPI y cada solicitud descuenta de él. No hay plan mensual ni mínimo, y el mismo saldo paga todos los endpoints de AnyAPI.

Sí. Instala @getanyapi/sdk desde npm para TypeScript o getanyapi desde pip para Python. Ambos llaman a todos los endpoints de AnyAPI con la misma clave, y también sirve cualquier cliente HTTP.

Sí. Un agente puede conectarse al servidor MCP de AnyAPI en https://api.getanyapi.com/mcp, o crear su propia clave de prueba gratis con un solo POST sin autenticar a https://api.getanyapi.com/agent/signup y llamar a este endpoint por HTTP.