Skip to content
scrapeatlas.Dashboard

Get a Substack publication’s posts

Try in Playground

Retrieve a publication’s post archive with titles, authors, publication times, engagement and media metadata. Choose newest or top sorting and continue with the returned offset.

GET/v1/substack/postsx-api-key
x-api-keystringrequiredheader

Your ScrapeAtlas customer key. Create one on /account/ and set SCRAPEATLAS_API_KEY.

Query parameters
4
urlstringrequiredquery

Required HTTPS Substack publication URL, up to 1,024 characters. Tracking parameters are removed.

max 1024 chars

Examplehttps://example.substack.com/
limitstringquery

Requested page size; input is optional, 1–100, default 20. The response echoes the requested size.

Example20
offsetstringquery

Optional result offset, 0–10,000; default 0. The response echoes the requested offset.

Example0
sortenumquery

Optional new (default) or top sorting.

one of: new, top

Examplenew
Response fields
92
requestIdstring

Request correlation UUID.

Source request attempts, decoded bytes and elapsed milliseconds.

accounting.upstreamRequestsinteger

Number of upstream request attempts.

≥ 0

accounting.responseBytesinteger

Decoded source bytes read during this request.

≥ 0

accounting.durationMsnumber

Elapsed request time in milliseconds.

≥ 0

successboolean

True when usable data is returned; inspect status and coverage.

statusenum

success or partial for usable data; failed or challenged for a failure response.

one of: success, partial

sourceUrlstring

Canonical public URL for the requested publication, post or writer.

absolute HTTPS URL

fetchedAtstring

UTC retrieval timestamp.

Result coverage and extraction warnings.

coverage.sourcestring

Public Substack web data.

coverage.completeboolean

Whether the returned result has no reported omissions.

coverage.warningsstring[]

Warnings that explain partial results or missing fields.

coverage.orderenumoptional

Reported result order: source_order or ranked.

one of: source_order, ranked

Post archive records in the requested order.

up to 100 items

posts.idinteger

Numeric post ID.

0 – 9007199254740991

posts.publication_idinteger

Owning publication’s numeric ID.

0 – 9007199254740991

posts.slugstring

Post URL slug.

posts.titlestring

Post title.

posts.subtitlestringnullable

Post subtitle.

posts.typestringnullable

Post type as reported by Substack.

posts.audiencestringnullable

Post audience label.

posts.canonical_urlstringnullable

Canonical post URL.

posts.post_datestringnullable

Publication timestamp.

posts.updated_atstringnullable

Post update timestamp.

posts.descriptionstringnullable

Post summary.

posts.body_htmlstringnullable

Published article HTML.

posts.truncated_body_textstringnullable

Published plain-text excerpt.

posts.cover_imagestringnullable

Post cover image URL.

posts.wordcountintegernullable

Source-reported article word count.

posts.languagestringnullable

Post language code.

posts.reaction_countintegernullable

Post reaction count.

posts.reactionsobject

Reaction counts keyed by reaction type.

posts.restacksintegernullable

Post restack count.

posts.comment_countintegernullable

Post comment count.

posts.child_comment_countintegernullable

Nested comment count reported for the post.

posts.podcast_urlstringnullable

Published podcast audio URL.

posts.podcast_durationnumbernullable

Source-reported podcast duration.

posts.podcast_art_urlstringnullable

Podcast artwork URL.

posts.video_upload_idstringnullable

Published video upload identifier.

posts.podcast_upload_idstringnullable

Published podcast upload identifier.

posts.voiceover_upload_idstringnullable

Published voiceover upload identifier.

posts.write_comment_permissionsstringnullable

Published comment-permission label.

posts.section_idintegernullable

Publication section ID.

posts.section_namestringnullable

Publication section name.

posts.section_slugstringnullable

Publication section slug.

posts.previous_post_slugstringnullable

Previous post slug when published.

posts.next_post_slugstringnullable

Next post slug when published.

posts.is_geoblockedbooleannullable

Published geoblocking flag.

posts.is_publishedbooleannullable

Published-state flag.

Public author bylines.

up to 100 items

posts.publishedBylines.idinteger

Numeric author ID.

0 – 9007199254740991

posts.publishedBylines.namestringnullable

Public author name.

posts.publishedBylines.handlestringnullable

Public author handle.

posts.publishedBylines.photo_urlstringnullable

Author profile image URL.

posts.publishedBylines.biostringnullable

Public author biography.

posts.publishedBylines.twitter_screen_namestringnullable

Published X username.

posts.publishedBylines.is_guestbooleannullable

Whether the byline is a guest author.

posts.publishedBylines.bestseller_tierintegernullable

Author bestseller tier.

Post tags.

up to 100 items

posts.postTags.idstring | integernullable

Source tag identifier, a string or number.

posts.postTags.namestringnullable

Tag name.

posts.postTags.slugstringnullable

Tag URL slug.

Published audio and video metadata.

up to 100 items

posts.media.typeenum

Media type: video, podcast, podcast_preview, voiceover or audio.

one of: video, podcast, podcast_preview, voiceover, audio

posts.media.urlstringnullable

Published media URL.

posts.media.durationnumbernullable

Source-reported media duration.

posts.media.thumbnailstringnullable

Published preview image URL.

posts.media.uploadIdstringnullable

Published media upload identifier.

posts.media.namestringnullable

Published media name.

posts.media.media_typestringnullable

Source-reported media type.

posts.media.statestringnullable

Published media processing state.

posts.media.created_atstringnullable

Media creation timestamp.

posts.media.uploaded_atstringnullable

Media upload timestamp.

posts.media.widthintegernullable

Media width in pixels.

posts.media.heightintegernullable

Media height in pixels.

posts.media.thumbnail_idintegernullable

Source thumbnail identifier.

posts.media.is_muxbooleannullable

Whether the source marks this as streaming media.

posts.media.mux_playback_idstringnullable

Published streaming playback identifier.

posts.media.mux_preview_playback_idstringnullable

Published streaming preview playback identifier.

posts.media.extractedAudioUploadIdstringnullable

Published extracted-audio upload identifier.

Published transcript and caption link metadata.

posts.media.transcription.transcript_urlstringnullable

Published transcript URL.

posts.media.transcription.cdn_urlstringnullable

Published transcript CDN URL.

posts.media.transcription.cdn_unaligned_urlstringnullable

Published unaligned transcript URL.

Published caption tracks and temporary access URLs.

up to 100 items

posts.media.transcription.signed_captions.languagestringnullable

Caption language code.

posts.media.transcription.signed_captions.urlstringnullable

Published caption-track URL.

posts.media.transcription.signed_captions.originalbooleannullable

Whether Substack labels this as the original caption track.

offsetinteger

Optional result offset, 0–10,000; default 0. The response echoes the requested offset.

≥ 0

limitinteger

Requested page size; input is optional, 1–100, default 20. The response echoes the requested size.

≥ 0

nextOffsetintegernullable

Offset for another page, or null when no next offset is reported.

HTTP 200 returns the success variant. Check status: partial means usable data with warnings, and failed or challenged requests carry a failure object described in Errors & responses.

Error codes
15
HTTPfailure.codeMeaning
400invalid_requestMissing, duplicated, invalid or unsupported request parameters.
401unauthorizedMissing or invalid service API key.
404not_foundThe requested publication, post or profile was not found.
422restricted_pageThe requested content requires additional access.
422unsupported_pageThe source did not provide the expected record.
502upstream_challengedThe source challenged the request.
502upstream_rate_limitedThe source rate limited the request.
502upstream_errorA source request failed.
502response_too_largeSource data exceeded the response byte limit.
502payload_too_complexSource data exceeded the traversal depth or node limit.
502unsafe_redirectThe source returned an unexpected redirect.
502request_limitThe request exhausted its source-attempt budget.
503busyAll worker request slots are in use.
504timeoutThe request exceeded its deadline.
200partialUsable data was returned with coverage warnings.