Insight Social
GET /v1/substack/posts

Substack Posts API

Returns a publication’s recent posts, or one post: title, full text and Markdown, author, reactions, comments, restacks, word count and whether it is paid.

10–120 credits, metered · single call · failed calls free · 10 free calls to start

curl "https://api.insightsocial.app/v1/substack/posts?url=https%3A%2F%2Fwww.astralcodexten.com" \
-H "x-api-key: $INSIGHTSOCIAL_API_KEY"
200 OKJSON
{
"success": true,
"platform": "substack",
"endpoint": "/v1/substack/posts",
"schema_version": "2",
"data": {
"items": [
{
"post": {
"id": "<string>",
"url": "<string | null>",
"kind": "<string | null>",
"content": {
"text": "<string | null>",
"media_urls": "<array | null>",
"thumbnail_url": "<string | null>",
"duration_seconds": "<number | null>"
},
"author": {
"id": "<string | null>",
"username": "<string | null>",
"display_name": "<string | null>",
"avatar_url": "<string | null>",
"verified": "<boolean | null>"
},
"engagement": {
"views": "<integer | null>",
"likes": "<integer | null>",
"comments": "<integer | null>",
"shares": "<integer | null>",
"saves": "<integer | null>"
},
"flags": {
"nsfw": "<boolean | null>",
"spoiler": "<boolean | null>",
"pinned": "<boolean | null>",
"deleted": "<boolean>",
"likes_hidden": "<boolean | null>",
"comments_hidden": "<boolean | null>",
"shares_hidden": "<boolean | null>",
"views_hidden": "<boolean | null>",
"saves_hidden": "<boolean | null>"
},
"published_at": "<string | null>",
"language": "<string | null>",
"ext": "<object | null>"
}
}
]
},
"unavailable": [],
"credits_used": "<integer>"
}

When to use it

Use it with a publication URL (or custom domain) for its archive, or a /p/ post URL for one post.

Parameters

Query parameters for GET /v1/substack/posts. Send your key in the x-api-key header.

NameRequiredDescription
urlYesA Substack publication URL or custom domain, or one post URL (…/p/slug).
limitNoMost recent posts to read, 1 to 100. Default 25. Billed per post returned.
start_dateNoOnly posts published on or after this date (YYYY-MM-DD). Applied to the limit most recent posts, so raise limit to reach further back.
end_dateNoOnly posts published on or before this date (YYYY-MM-DD). Applied to the limit most recent posts, so raise limit to reach further back.
only_freeNotrue for free (non-paywalled) posts only.
content_typeNoOnly one post type. Default all.
min_commentsNoOnly posts with at least this many comments.
min_reactionsNoOnly posts with at least this many reactions.
min_word_countNoOnly posts with at least this many words.
include_contentNoInclude the article body (text and Markdown). Default true; false is faster.

Response fields

The same unified schema every platform returns, so code written for Substack works on the other eight. A field the platform did not provide is null and listed in unavailable.

FieldTypeNotes
idstringAn identifier, always a string. Never parse it as a number: several platforms use ids above 2^53.
urlstring | null
kindstring | nullThe format of the post. Format words only, never a platform name. short = short-form vertical video (a reel, a TikTok, a YouTube Short).
content.textstring | null
content.media_urlsarray | null
content.thumbnail_urlstring | null
content.duration_secondsnumber | null
author.idstring | null
author.usernamestring | null
author.display_namestring | null
author.avatar_urlstring | null
author.verifiedboolean | null
engagement.viewsinteger | nullA count. null when the platform does not expose it; 0 only when it is really zero.
engagement.likesinteger | nullA count. null when the platform does not expose it; 0 only when it is really zero.
engagement.commentsinteger | nullA count. null when the platform does not expose it; 0 only when it is really zero.
engagement.sharesinteger | nullA count. null when the platform does not expose it; 0 only when it is really zero.
engagement.savesinteger | nullA count. null when the platform does not expose it; 0 only when it is really zero.
flags.nsfwboolean | null
flags.spoilerboolean | null
flags.pinnedboolean | null
flags.deletedboolean
flags.likes_hiddenboolean | null
flags.comments_hiddenboolean | null
flags.shares_hiddenboolean | null
flags.views_hiddenboolean | null
flags.saves_hiddenboolean | null
published_atstring | nullISO-8601 timestamp in UTC, ending in Z.
languagestring | nullThe content's language as the platform states it, e.g. en, pt-BR. Detected languages come later (§7.1).
extobject | nullPlatform-specific fields, snake_case.

Every field, error and example is in the Substack Posts API reference.

How much does the Substack Posts API cost?

Metered: 10–120 credits a call. The ceiling is reserved when the call starts and you are charged what it actually read.

  • Failed calls are free

    A call that errors or finds nothing costs 0 credits.

  • Know the price first

    Add dry_run=1 and the response quotes the call without making it. Nothing is charged.

  • One balance

    API calls and Chrome extension exports share the same credits, on the free plan too.

Substack Posts API: frequently asked questions

Send GET /v1/substack/posts with the url parameter and your key in the x-api-key header. Returns a publication’s recent posts, or one post: title, full text and Markdown, author, reactions, comments, restacks, word count and whether it is paid.

More Substack endpoints

    All Substack API endpoints