Access the beehiiv API with managed OAuth authentication. Manage newsletter publications, subscriptions, posts, custom fields, segments, tiers, and automations.
# List publications
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/beehiiv/v2/publications')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/beehiiv/{native-api-path}
Maton proxies requests to api.beehiiv.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your beehiiv OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=beehiiv&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'beehiiv'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-11T00:25:10.464852Z",
"last_updated_time": "2026-02-11T00:27:00.816431Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "beehiiv",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple beehiiv connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/beehiiv/v2/publications')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
All beehiiv API endpoints follow this pattern:
/beehiiv/v2/{resource}
GET /beehiiv/v2/publications
Query Parameters:
| Parameter | Description |
|---|---|
| ----------- | ------------- |
limit | Results per page (1-100, default: 10) |
page | Page number (default: 1) |
expand[] | Expand with: stats, stat_active_subscriptions, stat_average_open_rate, etc. |
order_by | Sort by: created or name |
direction | Sort direction: asc or desc |
Response:
{
"data": [
{
"id": "pub_c6c521e4-91ac-4c14-8a52-06987b7e32f2",
"name": "My Newsletter",
"organization_name": "My Organization",
"referral_program_enabled": true,
"created": 1770767522
}
],
"page": 1,
"limit": 10,
"total_results": 1,
"total_pages": 1
}
GET /beehiiv/v2/publications/{publication_id}
GET /beehiiv/v2/publications/{publication_id}/subscriptions
Query Parameters:
| Parameter | Description |
|---|---|
| ----------- | ------------- |
limit | Results per page (1-100, default: 10) |
cursor | Cursor for pagination (recommended) |
page | Page number (deprecated, max 100 pages) |
email | Filter by exact email (case-insensitive) |
status | Filter: validating, invalid, pending, active, inactive, all |
tier | Filter: free, premium, all |
expand[] | Expand with: stats, custom_fields, referrals |
order_by | Sort field (default: created) |
direction | Sort direction: asc or desc |
Response:
{
"data": [
{
"id": "sub_c27d9640-f418-43a8-a0f9-528c20a05002",
"email": "subscriber@example.com",
"status": "active",
"created": 1770767524,
"subscription_tier": "free",
"subscription_premium_tier_names": [],
"utm_source": "direct",
"utm_medium": "",
"utm_channel": "website",
"utm_campaign": "",
"referring_site": "",
"referral_code": "gBZbSVal1X",
"stripe_customer_id": ""
}
],
"limit": 10,
"has_more": false,
"next_cursor": null
}
GET /beehiiv/v2/publications/{publication_id}/subscriptions/{subscription_id}
Query Parameters:
| Parameter | Description |
|---|---|
| ----------- | ------------- |
expand[] | Expand with: stats, custom_fields, referrals, tags |
GET /beehiiv/v2/publications/{publication_id}/subscriptions/by_email/{email}
POST /beehiiv/v2/publications/{publication_id}/subscriptions
Content-Type: application/json
{
"email": "newsubscriber@example.com",
"utm_source": "api",
"send_welcome_email": false,
"reactivate_existing": false
}
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| ------- | ------ | ---------- | ------------- |
email | string | Yes | Subscriber email address |
reactivate_existing | boolean | No | Reactivate if previously unsubscribed |
send_welcome_email | boolean | No | Send welcome email |
utm_source | string | No | UTM source for tracking |
utm_medium | string | No | UTM medium |
referring_site | string | No | Referral code of referring subscriber |
custom_fields | object | No | Custom field values (fields must exist) |
double_opt_override | string | No | on or off to override double opt-in |
tier | string | No | Subscription tier |
premium_tier_names | array | No | Premium tier names to assign |
PATCH /beehiiv/v2/publications/{publication_id}/subscriptions/{subscription_id}
Content-Type: application/json
{
"utm_source": "updated-source",
"custom_fields": [
{"name": "First Name", "value": "John"}
]
}
DELETE /beehiiv/v2/publications/{publication_id}/subscriptions/{subscription_id}
GET /beehiiv/v2/publications/{publication_id}/posts
Query Parameters:
| Parameter | Description |
|---|---|
| ----------- | ------------- |
limit | Results per page (1-100, default: 10) |
page | Page number |
status | Filter by status |
expand[] | Expand with additional data |
Response:
{
"data": [],
"page": 1,
"limit": 10,
"total_results": 0,
"total_pages": 0
}
GET /beehiiv/v2/publications/{publication_id}/posts/{post_id}
DELETE /beehiiv/v2/publications/{publication_id}/posts/{post_id}
GET /beehiiv/v2/publications/{publication_id}/custom_fields
Response:
{
"data": [
{
"id": "95c9653f-a1cf-45f0-a140-97feef19057b",
"kind": "string",
"display": "Last Name",
"created": 1770767523
},
{
"id": "4cfe081e-c89b-4da5-9c1a-52a4fb8ba69e",
"kind": "string",
"display": "First Name",
"created": 1770767523
}
],
"page": 1,
"limit": 10,
"total_results": 2,
"total_pages": 1
}
Field Kinds: string, integer, boolean, date, datetime, list, double
POST /beehiiv/v2/publications/{publication_id}/custom_fields
Content-Type: application/json
{
"display": "Company",
"kind": "string"
}
PATCH /beehiiv/v2/publications/{publication_id}/custom_fields/{custom_field_id}
Content-Type: application/json
{
"display": "Company Name"
}
DELETE /beehiiv/v2/publications/{publication_id}/custom_fields/{custom_field_id}
GET /beehiiv/v2/publications/{publication_id}/segments
Response:
{
"data": [],
"page": 1,
"limit": 10,
"total_results": 0,
"total_pages": 0
}
GET /beehiiv/v2/publications/{publication_id}/segments/{segment_id}
DELETE /beehiiv/v2/publications/{publication_id}/segments/{segment_id}
GET /beehiiv/v2/publications/{publication_id}/tiers
GET /beehiiv/v2/publications/{publication_id}/tiers/{tier_id}
POST /beehiiv/v2/publications/{publication_id}/tiers
Content-Type: application/json
{
"name": "Premium",
"description": "Premium tier with exclusive content"
}
PATCH /beehiiv/v2/publications/{publication_id}/tiers/{tier_id}
Content-Type: application/json
{
"name": "Updated Tier Name"
}
GET /beehiiv/v2/publications/{publication_id}/automations
GET /beehiiv/v2/publications/{publication_id}/automations/{automation_id}
GET /beehiiv/v2/publications/{publication_id}/referral_program
beehiiv supports two pagination methods:
GET /beehiiv/v2/publications/{publication_id}/subscriptions?limit=10&cursor={next_cursor}
Response includes:
{
"data": [...],
"limit": 10,
"has_more": true,
"next_cursor": "eyJ0aW1lc3RhbXAiOiIyMDI0LTA3LTAyVDE3OjMwOjAwLjAwMDAwMFoifQ=="
}
Use the next_cursor value for subsequent requests.
GET /beehiiv/v2/publications?page=2&limit=10
Response includes:
{
"data": [...],
"page": 2,
"limit": 10,
"total_results": 50,
"total_pages": 5
}
Note: Page-based pagination is limited to 100 pages maximum.
const response = await fetch(
'https://api.maton.ai/beehiiv/v2/publications',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.data);
import os
import requests
response = requests.get(
'https://api.maton.ai/beehiiv/v2/publications',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()
for pub in data['data']:
print(f"{pub['id']}: {pub['name']}")
pub_sub_curl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| -------- | --------- |
| 400 | Bad request or invalid parameters |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden - insufficient permissions or plan limitation |
| 404 | Resource not found |
| 429 | Rate limited |
| 500 | Internal server error |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
beehiiv. For example:https://api.maton.ai/beehiiv/v2/publicationshttps://api.maton.ai/v2/publications共 2 个版本