Coding with AI?
Connect your agent to our MCP and let it integrate any endpoint for you in one shot.
Substack User Profile
Get a Substack author’s full profile by handle, user ID or profile URL. Returns display name, bio, follower count, subscriber badge, bestseller tier, the publications they write for, profile links, X handle and leaderboard placement and the publications they subscribe to.
Endpoint
GET /v1/substack/user
Price: $0.003 per request Free tier: 50 requests/month
Provide exactly one of username, user_id or url.
Parameters
| Parameter | Required | Description |
|---|---|---|
username |
One required | Substack handle, e.g. lenny, with or without a leading @ (max 100 characters). Provide one of username, user_id or url. |
user_id |
One required | Numeric Substack user ID, as returned in user_id. Provide one of username, user_id or url. |
url |
One required | Profile URL, e.g. https://substack.com/@lenny (max 500 characters). Provide one of username, user_id or url. |
Response Fields
| Field | Type | Description |
|---|---|---|
user |
object | Profile data |
user.username |
string | Substack handle |
user.full_name |
string | Display name |
user.user_id |
string | User ID (pass it as user_id to the user endpoints) |
user.biography |
string | Profile bio |
user.profile_pic_url |
string | Profile picture URL |
user.follower_count |
integer | Number of followers |
user.subscriber_count |
integer | Rounded subscriber count of the primary publication, 0 when not shown |
user.subscriber_count_label |
string | The displayed subscriber badge, e.g. 1.2M+ |
user.bestseller_tier |
integer | Bestseller badge tier: 0, 100, 1000 or 10000 |
user.is_bestseller |
boolean | Whether the author carries a bestseller badge |
user.paid_subscriber_band |
string | Paid subscriber band of the primary publication, e.g. Tens of thousands, empty when not shown |
user.paid_subscriber_floor |
integer | Lower bound of the paid band (100, 1000, 10000), 0 when none |
user.primary_publication |
object/null | The author’s main publication (publication_id, name, subdomain, url, logo_url) |
user.date_joined |
string | Profile creation date and time (UTC) |
user.url |
string | Link to the profile |
user.publications |
array | Publications the author writes for (publication_id, name, subdomain, url, logo_url, role) |
user.links |
array | Links on the profile (type, label, url) |
user.twitter_handle |
string | Connected X handle, empty when none |
user.leaderboard |
object/null | Leaderboard placement (category, category_id, rank, board), or null |
user.subscriptions_count |
integer | Number of publications the author publicly subscribes to |
user.slug |
string | Profile slug, as in substack.com/profile/<id>-<slug> |
user.recommendation_count |
integer | Number of publications the author’s primary publication recommends |
user.has_guest_posts |
boolean | Whether the author has guest posts on other publications |
user.subscriptions |
array | The publications the author publicly subscribes to (publication_id, name, subdomain, url, logo_url, plan) |
user.subscriptions[].plan |
string | free, paid or comp (a complimentary paid subscription) |
user.has_posts |
boolean | Whether the author has published posts |
Example Request
cURL
curl "https://apidirect.io/v1/substack/user?username=lenny" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests
response = requests.get(
"https://apidirect.io/v1/substack/user",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"username": "lenny"}
)
print(response.json())
Example Response
{
"user": {
"bestseller_tier": 10000,
"biography": "Writing • Angel investing • Advising",
"date_joined": "2021-05-01 23:55:21",
"follower_count": 1383966,
"full_name": "Lenny Rachitsky",
"has_guest_posts": true,
"has_posts": true,
"is_bestseller": true,
"leaderboard": {
"board": "paid",
"category": "Business",
"category_id": 62,
"rank": 1
},
"links": [
{
"label": "",
"type": "twitter",
"url": "https://x.com/lennysan"
}
],
"paid_subscriber_band": "Tens of thousands",
"paid_subscriber_floor": 10000,
"primary_publication": {
"logo_url": "https://substack-post-media.s3.amazonaws.com/public/images/441213db-4824-4e48-9d28-a3a18952cbfc_592x592.png",
"name": "Lenny's Newsletter",
"publication_id": "10845",
"subdomain": "lenny",
"url": "https://www.lennysnewsletter.com"
},
"profile_pic_url": "https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/afba5161-65bb-4d99-8d6b-cce660917fa1_1540x1540.png",
"publications": [
{
"logo_url": "https://substack-post-media.s3.amazonaws.com/public/images/441213db-4824-4e48-9d28-a3a18952cbfc_592x592.png",
"name": "Lenny's Newsletter",
"publication_id": "10845",
"role": "admin",
"subdomain": "lenny",
"url": "https://www.lennysnewsletter.com"
}
],
"recommendation_count": 11,
"slug": "lenny-rachitsky",
"subscriber_count": 1200000,
"subscriber_count_label": "1.2M+",
"subscriptions": [
{
"logo_url": "https://substack-post-media.s3.amazonaws.com/public/images/cc7ca458-37ff-4275-a738-d25e07f498c2_1280x1280.png",
"name": "@jasmine’s substack",
"plan": "paid",
"publication_id": "6027",
"subdomain": "jasmine",
"url": "https://jasmi.news"
}
],
"subscriptions_count": 109,
"twitter_handle": "lennysan",
"url": "https://substack.com/@lenny",
"user_id": "1849774",
"username": "lenny"
}
}