All endpoints
Substack User Posts

Substack User Posts API

Get an author's posts across all their publications, newest first. Returns post title, publication, publication date, engagement, paywall status, word count and tags. Supports fetching multiple pages in a single API call.

Price: $0.003 per page
Free tier: 50 requests/month
Endpoint
GET /v1/substack/user/posts

Parameters

username
Substack handle, e.g. lenny, with or without a leading @ (max 100 characters). Provide one of username, user_id or url.
user_id
Numeric Substack user ID, as returned in user_id. Provide one of username, user_id or url.
url
Profile URL, e.g. https://substack.com/@lenny (max 500 characters). Provide one of username, user_id or url.
pages
Number of pages to fetch, 1-60 (default: 1). Each page returns up to 50 posts; you are billed per page returned.
get_sentiment
Set to true to add AI emotion analysis (Plutchik's Wheel) to each result. Adds +$0.001 per page to the cost. Returns emotion scores, dominant emotion, intensity, and polarity.

Response fields

posts
Array of the author's posts, newest first
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)
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.
username
The author's handle
user_id
The author's user ID
pages
Number of pages returned
count
Number of posts returned

Example Request

curl "https://apidirect.io/v1/substack/user/posts?username=lenny&pages=1"   -H "X-API-Key: YOUR_API_KEY"

Example Response

{
  "count": 100,
  "pages": 2,
  "posts": [
    {
      "audience": "only_paid",
      "audio_url": "",
      "author": "kiyani",
      "author_id": "3667529",
      "author_name": "Kiyani",
      "author_url": "https://substack.com/@kiyani",
      "authors": [
        {
          "name": "Kiyani",
          "url": "https://substack.com/@kiyani",
          "user_id": "3667529",
          "username": "kiyani"
        }
      ],
      "comments": 0,
      "cover_image_url": "https://substackcdn.com/image/fetch/$s_!KxHU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F…",
      "date": "2026-10-10 13:01:38",
      "domain": "substack.com",
      "is_paid": true,
      "lang": "en",
      "likes": 10,
      "podcast_duration": 0,
      "podcast_image_url": "",
      "podcast_url": "",
      "post_id": "219527894",
      "publication": "Lenny's Newsletter",
      "publication_id": "10845",
      "publication_url": "https://www.lennysnewsletter.com",
      "reactions": {
        "❤": 10
      },
      "replies": 0,
      "restacks": 0,
      "slug": "community-wisdom-community-wisdom",
      "snippet": "Community Wisdom 301",
      "source": "Substack",
      "subtitle": "Community Wisdom 301",
      "tags": [],
      "title": "🧠 Community Wisdom: Community Wisdom Top Contributors Summer Class 2026 + ML recommendation systems, getting back into product after being fired, deciding wh…",
      "type": "newsletter",
      "url": "https://www.lennysnewsletter.com/p/community-wisdom-community-wisdom",
      "video_duration": 0,
      "wordcount": 8056
    }
  ],
  "user_id": "1849774",
  "username": "lenny"
}

Frequently asked questions

Does this include guest posts?

Yes. It returns every post the author is credited on, across every publication they write for; publication and publication_url say where each one lives.

How does pricing work?

You only pay for successful requests. The Substack User Posts API costs $0.003 per page. 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 User Posts API

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

Get API Key