# API Direct – Substack User Posts

> API Direct – Substack User Posts is a paid API for AI agents from x402.apidirect.io, paid per call via x402, $0.004/call, status unknown (last checked 2026-10-30).

Retrieves all posts by a Substack author across their publications, sorted newest first, with optional AI sentiment analysis.

## Facts

- Endpoint: GET https://x402.apidirect.io/v1/substack/user/posts?utm_source=zero.xyz
- Price: $0.004/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-30
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/api-direct-substack-user-posts-96348472
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_ZSE5GItlgreD_-LSFyhmd

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability api-direct-substack-user-posts-96348472
```

Example prompt: Can you pull all the recent Substack posts by the author with handle 'lenny' — grab 3 pages worth and include the AI sentiment analysis for each post?

## When to prefer this

Choose this endpoint when you need to retrieve post history for a specific known Substack author by username, numeric ID, or profile URL — especially when you want multi-publication aggregation or AI-powered sentiment/emotion analysis per post. Prefer it over general Substack search endpoints when you already know the author identity and want their actual content rather than author discovery.

## Known failure modes

- Invalid or non-existent username/user_id/url returns an error or empty result set
- No identifier provided (username, user_id, or url all missing) causes a validation error
- Pages parameter exceeding 60 results in a schema validation error
- Author has no posts, returning an empty list
- Rate limiting or upstream Substack API unavailability causes request failure
- Malformed profile URL format returns an error
- Payment failure (insufficient USDC balance) blocks the request

## How this service works

Get an author's posts across all their publications, newest first.

## Output

Returns a paginated list of posts (up to 50 per page) from all of the author's Substack publications, sorted newest first. Each post includes metadata such as title, publication date, publication name, and post URL. When sentiment analysis is enabled, each post also includes Plutchik's Wheel emotion scores, dominant emotion, intensity rating, and polarity (positive/negative/neutral).

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET",
      "HEAD",
      "DELETE"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [],
     "properties": {
      "url": {
       "type": "string",
       "maxLength": 500,
       "description": "Profile URL, e.g. https://substack.com/@lenny (max 500 characters). Provide one of username, user_id or url."
      },
      "pages": {
       "type": "integer",
       "default": 1,
       "maximum": 60,
       "minimum": 1,
       "description": "Number of pages to fetch and merge into one response (1-60, billed per page returned). Each page returns up to 50 posts. Fetching stops early when there are no more results."
      },
      "user_id": {
       "type": "string",
       "description": "Numeric Substack user ID, as returned in user_id. Provide one of username, user_id or url."
      },
      "username": {
       "type": "string",
       "maxLength": 100,
       "description": "Substack handle, e.g. lenny, with or without a leading @ (max 100 characters). Provide one of username, user_id or url."
      },
      "get_sentiment": {
       "type": "boolean",
       "default": false,
       "description": "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."
      }
     }
    }
   },
   "additionalProperties": false
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/api-direct-substack-user-posts-96348472/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from x402.apidirect.io](https://www.zero.xyz/host/x402.apidirect.io/llms.txt)
