Install
openclaw skills install beehiivbeehiiv API integration with managed OAuth. Manage newsletter publications, subscriptions, posts, custom fields, segments, and automations. Use this skill when users want to manage newsletter subscribers, create posts, organize segments, or integrate with beehiiv publications. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
openclaw skills install beehiivAccess 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