All endpoints
Substack Post Details

Substack Post Details API

Get a Substack post by URL, ID, or publication and slug. Returns the full body as HTML and plain text (the free preview for paid posts), title, subtitle, author, publication, publication date, engagement, paywall status, word count, cover image, podcast audio and tags.

Price: $0.003 per request
Free tier: 50 requests/month
Endpoint
GET /v1/substack/post

Parameters

url
Post URL, e.g. https://www.lennysnewsletter.com/p/all-of-the-lenny-and-friends-summit (max 500 characters). Provide url, post_id, or publication and slug.
post_id
Numeric post ID, as returned in post_id. Provide url, post_id, or publication and slug.
publication
Publication subdomain, host or URL, used together with slug.
slug
Post URL slug, e.g. all-of-the-lenny-and-friends-summit, used together with publication.
get_sentiment
Set to true to add AI emotion analysis (Plutchik's Wheel) to each result. Adds +$0.001 per request to the cost. Returns emotion scores, dominant emotion, intensity, and polarity.

Response fields

post
Post data
title
Post title
subtitle
Post subtitle, empty when none
url
Direct link to the post
date
Publication date and time (UTC, YYYY-MM-DD HH:MM:SS)
author
Author's Substack handle (empty when the byline is the publication itself)
author_name
Author's display name
author_id
Author's Substack user ID, null when the byline is the publication itself
author_url
Link to the author's profile
source
"Substack"
domain
"substack.com"
snippet
Post description or preview text
likes
Number of likes (reactions)
comments
Number of comments
restacks
Number of restacks (shares to Notes)
reactions
Reaction counts by emoji, e.g. {"❤": 284}
is_paid
Whether the post is for paying subscribers only
audience
everyone, only_paid or only_founding
type
newsletter, podcast, video or thread
wordcount
Word count of the full post
lang
Post language code (e.g. en)
cover_image_url
Cover image URL, empty when none
podcast_url
Audio file URL for podcast posts, empty otherwise
podcast_duration
Podcast length in seconds, 0 otherwise
tags
Post tags
authors
All credited authors (username, name, user_id, url); author is the first
replies
Number of replies to comments
audio_url
Substack's narrated audio of the post (MP3), empty when none
podcast_image_url
Episode artwork for podcast posts, empty otherwise
video_duration
Video length in seconds for video posts, 0 otherwise
publication
Publication name
publication_id
Publication ID (pass it as publication_id to the publication endpoints)
publication_url
Publication home URL
slug
Post URL slug
post_id
Post ID (pass it as post_id to the post endpoints)
body_html
Full post HTML for free posts; the free preview Substack shows non-subscribers for paid posts
body_text
Plain text of body_html
body_is_preview
Whether body_html is the paywall preview rather than the full post
updated_at
Last edit date and time (UTC)
previous_post_slug
Slug of the previous post on the publication, empty when none
next_post_slug
Slug of the next post on the publication, empty when none
publication_details
The publication (publication_id, name, subdomain, url, logo_url)
sentiment
Emotion analysis results. Only present when get_sentiment=true. Returns null if analysis fails.
emotions
Plutchik emotion scores (0-100) for: joy, trust, fear, surprise, sadness, disgust, anger, anticipation.
dominant_emotion
The emotion with the highest score.
emotional_intensity
Overall emotional intensity on a scale of 0-10.
polarity
Overall sentiment polarity: positive, negative, or neutral.

Example Request

curl "https://apidirect.io/v1/substack/post?url=https%3A%2F%2Fwww.lennysnewsletter.com%2Fp%2Fall-of-the-lenny-and-friends-summit"   -H "X-API-Key: YOUR_API_KEY"

Example Response

{
  "post": {
    "audience": "everyone",
    "audio_url": "",
    "author": "lenny",
    "author_id": "1849774",
    "author_name": "Lenny Rachitsky",
    "author_url": "https://substack.com/@lenny",
    "authors": [
      {
        "name": "Lenny Rachitsky",
        "url": "https://substack.com/@lenny",
        "user_id": "1849774",
        "username": "lenny"
      }
    ],
    "body_html": "<p><em>👋 Hey there, I’m Lenny. Each week, I share deeply researched product, growth, and career advice. For more: <a href=\"https://www.lennysjobs.com/\">Lenny…",
    "body_is_preview": false,
    "body_text": "👋 Hey there, I’m Lenny. Each week, I share deeply researched product, growth, and career advice. For more: Lenny’s Jobs | Lennybot | Become an AI-Native Buil…",
    "comments": 7,
    "cover_image_url": "https://substack-post-media.s3.amazonaws.com/public/images/9fed347c-0e02-4190-a590-1236719b99de_9213x6142.jpeg",
    "date": "2026-09-29 13:15:57",
    "domain": "substack.com",
    "is_paid": false,
    "lang": "en",
    "likes": 285,
    "next_post_slug": "",
    "podcast_duration": 0,
    "podcast_image_url": "",
    "podcast_url": "",
    "post_id": "215694124",
    "previous_post_slug": "",
    "publication": "Lenny's Newsletter",
    "publication_details": {
      "logo_url": "https://substack-post-media.s3.amazonaws.com/public/images/441213db-4824-4e48-9d28-a3a18952cbfc_592x592.png",
      "name": "Lenny's Newsletter",
      "publication_id": "10845",
      "subdomain": "lenny",
      "url": "https://www.lennysnewsletter.com"
    },
    "publication_id": "10845",
    "publication_url": "https://www.lennysnewsletter.com",
    "reactions": {
      "❤": 285
    },
    "replies": 0,
    "restacks": 5,
    "slug": "all-of-the-lenny-and-friends-summit",
    "snippet": "Plus, some reflections and takeaways from the day",
    "source": "Substack",
    "subtitle": "Plus, some reflections and takeaways from the day",
    "tags": [],
    "title": "All of the Lenny & Friends Summit talks are now online!",
    "type": "newsletter",
    "updated_at": "2026-09-29 16:23:45",
    "url": "https://www.lennysnewsletter.com/p/all-of-the-lenny-and-friends-summit",
    "video_duration": 0,
    "wordcount": 1276
  }
}

Frequently asked questions

Do I get the full text of paid posts?

No. For posts behind the paywall, body_html holds the free preview Substack shows non-subscribers and body_is_preview is true. Free posts return the complete body.

What forms of identifier work?

The post URL on the publication's own domain, an open.substack.com or substack.com/home/post/p-ID app link, the numeric post_id, or publication plus slug.

How does pricing work?

You only pay for successful requests. The Substack Post Details API costs $0.003 per request. There are no monthly fees or commitments. You get 50 free requests per endpoint every month.

Do I need a credit card to start?

No. You can sign up and use the free tier (50 requests/endpoint/month) without adding a payment method. You only need to add a card when you want to exceed the free tier.

Are there rate limits?

Yes, there's a concurrency limit of 10 simultaneous requests per endpoint per user. If you need more, just get in touch.

Start using the Substack Post Details API

Get your API key and start making requests in minutes. 50 requests/month free every month.

Get API Key