Substack API endpoint
Returns one page of a user's public activity: the notes they wrote, posts they published, and items they liked, replied to, or restacked. types is an optional comma-separated filter accepting `note`, `post`, `like`, `replies` and `restack`; omit it for the default mixed feed. Each item's kind is the upstream's own finer-grained label, so filtering on `restack` returns both `comment_restack` and `post_restack` items. Pagination is cursor-based.
/substack/user/activityuser_id: required numeric user id, as returned by
/api/v1/substack/user.types: optional comma-separated filter. Allowed values: note,
post, like, replies, restack. Omit for the default mixed feed.cursor: optional opaque cursor from a previous response's
next_cursor.Returns one page of a user's public activity — the notes they wrote, posts they published, and items they liked, replied to, or restacked. This is the data behind the Notes/Likes/Replies tabs on a Substack profile.
kind is finer-grained than typesEach item's kind is the upstream's own label, which is more specific than
the filter that selected it:
types value | kind values returned |
|---|---|
note | note |
post | post |
like | note_like |
replies | note, comment |
restack | comment_restack, post_restack |
An item carries note, post, or both, matching its kind. Notes are in the
same shape as substack-note and posts as
substack-publication-posts.
Multiple values may be combined (types=note,post). An unrecognized value
is rejected with an invalid-parameter error rather than passed upstream —
the upstream itself returns an empty feed for an unknown value, which
would otherwise read as "this user has no activity".
Pagination is cursor-based; page sizes are small and variable.
| Field | Filled in, of 12 checked | Values in the sample |
|---|---|---|
| kind | 12 | |
| timestamp | 12 | 2026-05-11 to 2026-10-13 |
| note | 12 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| user_id | integer | Yes | Numeric user id from the user endpoint | 49731969 | |
| types | string | No | Comma-separated activity kinds: note, post, like, replies, restack | note,post | |
| cursor | string | No | Opaque cursor from a previous response's next_cursor | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/substack/user/activity?user_id=49731969" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"user_id": 49731969,
"types": [
"note"
],
"next_cursor": "eyJiZWZvcmVfdGltZXN0YW1wIjoi...",
"has_more": true,
"items": [
{
"kind": "note",
"timestamp": "2026-09-02T10:14:33.120Z",
"note": {
"id": 321037621,
"body": "A note the user wrote.",
"author_handle": "kittyunderhill",
"url": "https://substack.com/@kittyunderhill/note/c-321037621",
"reaction_count": 18,
"is_ai_generated": false
}
}
]
},
"msg": "success"
}Request schema
No body schema
Response schema
#/definitions/substack.userActivityResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | substack.UserActivityResult | No | ||||
| data.has_more | boolean | No | ||||
| data.items | array | No | ||||
| data.items[].kind | string | No | comment_restack | |||
| data.items[].note | substack.Note | No | Note record, 21 fields: attached_post, author_bestseller_tier, author_handle, author_id, author_name, author_photo_url, author_url, body, edited_at, id, is_ai_generated, language and 6 more. Described under Get one public Substack Note API. | |||
| data.items[].post | substack.Post | No | Post record, 13 fields: audience, comment_count, cover_image_url, description, id, paywalled, published_at, reaction_count, slug, subtitle, title, type and 1 more. Described under Substack Search API. | |||
| data.items[].timestamp | string | No | ||||
| data.next_cursor | string | No | ||||
| data.types | array | No | ||||
| data.user_id | integer | No | 49731969 | |||
| msg | string | No | success |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/substack/user/activity?user_id=49731969" \
-H "x-api-key: $CRAWLORA_API_KEY"