Access the MailerLite API with managed OAuth authentication. Manage subscribers, groups, campaigns, automations, forms, fields, segments, and webhooks.
# List subscribers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailerlite/api/subscribers?limit=10')
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/mailerlite/{native-api-path}
Maton proxies requests to connect.mailerlite.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 MailerLite OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=mailerlite&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': 'mailerlite'}).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": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "mailerlite",
"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 MailerLite 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/mailerlite/api/subscribers')
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.
GET /mailerlite/api/subscribers
Query parameters:
filter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junklimit - Results per page (default: 25)cursor - Pagination cursorinclude - Include related data: groupsGET /mailerlite/api/subscribers/{subscriber_id_or_email}
POST /mailerlite/api/subscribers
Content-Type: application/json
{
"email": "subscriber@example.com",
"fields": {
"name": "John Doe",
"company": "Acme Inc"
},
"groups": ["12345678901234567"],
"status": "active"
}
Returns 201 for new subscribers, 200 for updates.
PUT /mailerlite/api/subscribers/{subscriber_id}
Content-Type: application/json
{
"fields": {
"name": "Jane Doe"
},
"status": "active"
}
DELETE /mailerlite/api/subscribers/{subscriber_id}
GET /mailerlite/api/subscribers/{subscriber_id}/activity-log
Query parameters:
filter[log_name] - Filter by activity type: campaign_send, automation_email_sent, email_open, link_click, email_bounce, spam_complaint, unsubscribedlimit - Results per page (default: 100)page - Page number (starts from 1)POST /mailerlite/api/subscribers/{subscriber_id}/forget
GET /mailerlite/api/groups
Query parameters:
limit - Results per pagepage - Page number (starts from 1)filter[name] - Filter by name (partial match)sort - Sort by: name, total, open_rate, click_rate, created_at (prepend - for descending)POST /mailerlite/api/groups
Content-Type: application/json
{
"name": "Newsletter Subscribers"
}
PUT /mailerlite/api/groups/{group_id}
Content-Type: application/json
{
"name": "Updated Group Name"
}
DELETE /mailerlite/api/groups/{group_id}
GET /mailerlite/api/groups/{group_id}/subscribers
Query parameters:
filter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junklimit - Results per page (1-1000, default: 50)cursor - Pagination cursorPOST /mailerlite/api/subscribers/{subscriber_id}/groups/{group_id}
DELETE /mailerlite/api/subscribers/{subscriber_id}/groups/{group_id}
GET /mailerlite/api/campaigns
Query parameters:
filter[status] - Filter by status: sent, draft, readyfilter[type] - Filter by type: regular, ab, resend, rsslimit - Results per page: 10, 25, 50, or 100 (default: 25)page - Page number (starts from 1)GET /mailerlite/api/campaigns/{campaign_id}
POST /mailerlite/api/campaigns
Content-Type: application/json
{
"name": "My Newsletter",
"type": "regular",
"emails": [
{
"subject": "Weekly Update",
"from_name": "Newsletter",
"from": "newsletter@example.com"
}
],
"groups": ["12345678901234567"]
}
PUT /mailerlite/api/campaigns/{campaign_id}
Content-Type: application/json
{
"name": "Updated Campaign Name",
"emails": [
{
"subject": "New Subject Line",
"from_name": "Newsletter",
"from": "newsletter@example.com"
}
]
}
Note: Only draft campaigns can be updated.
POST /mailerlite/api/campaigns/{campaign_id}/schedule
Content-Type: application/json
{
"delivery": "instant"
}
For scheduled delivery:
{
"delivery": "scheduled",
"schedule": {
"date": "2026-03-15",
"hours": "10",
"minutes": "30"
}
}
POST /mailerlite/api/campaigns/{campaign_id}/cancel
Reverts a ready campaign to draft status.
DELETE /mailerlite/api/campaigns/{campaign_id}
GET /mailerlite/api/campaigns/{campaign_id}/reports/subscriber-activity
Query parameters:
filter[type] - Filter by activity: opened, unopened, clicked, unsubscribed, forwarded, hardbounced, softbounced, junkfilter[search] - Search by emaillimit - Results per page (10, 25, 50, or 100)page - Page number (starts from 1)GET /mailerlite/api/automations
Query parameters:
filter[enabled] - Filter by status: true or falsefilter[name] - Filter by namefilter[group] - Filter by group IDpage - Page number (starts from 1)limit - Results per page (default: 10)GET /mailerlite/api/automations/{automation_id}
POST /mailerlite/api/automations
Content-Type: application/json
{
"name": "Welcome Series"
}
Creates a draft automation.
GET /mailerlite/api/automations/{automation_id}/activity
Query parameters:
filter[status] - Required: completed, active, canceled, failedfilter[date_from] - Start date (Y-m-d)filter[date_to] - End date (Y-m-d)filter[search] - Search by emailpage - Page number (starts from 1)limit - Results per page (default: 10)DELETE /mailerlite/api/automations/{automation_id}
GET /mailerlite/api/fields
Query parameters:
limit - Results per page (max 100)page - Page number (starts from 1)filter[keyword] - Filter by keyword (partial match)filter[type] - Filter by type: text, number, datesort - Sort by: name, type (prepend - for descending)POST /mailerlite/api/fields
Content-Type: application/json
{
"name": "Company",
"type": "text"
}
PUT /mailerlite/api/fields/{field_id}
Content-Type: application/json
{
"name": "Organization"
}
DELETE /mailerlite/api/fields/{field_id}
GET /mailerlite/api/segments
Query parameters:
limit - Results per page (max 250)page - Page number (starts from 1)GET /mailerlite/api/segments/{segment_id}/subscribers
Query parameters:
filter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junklimit - Results per pagecursor - Pagination cursorPUT /mailerlite/api/segments/{segment_id}
Content-Type: application/json
{
"name": "High Engagement Subscribers"
}
DELETE /mailerlite/api/segments/{segment_id}
GET /mailerlite/api/forms/{type}
Path parameters:
type - Form type: popup, embedded, promotionQuery parameters:
limit - Results per pagepage - Page number (starts from 1)filter[name] - Filter by name (partial match)sort - Sort by: created_at, name, conversions_count, opens_count, visitors, conversion_rate, last_registration_at (prepend - for descending)GET /mailerlite/api/forms/{form_id}
PUT /mailerlite/api/forms/{form_id}
Content-Type: application/json
{
"name": "Newsletter Signup"
}
DELETE /mailerlite/api/forms/{form_id}
GET /mailerlite/api/forms/{form_id}/subscribers
Query parameters:
filter[status] - Filter by status: active, unsubscribed, unconfirmed, bounced, junklimit - Results per page (default: 25)cursor - Pagination cursorGET /mailerlite/api/webhooks
GET /mailerlite/api/webhooks/{webhook_id}
POST /mailerlite/api/webhooks
Content-Type: application/json
{
"name": "Subscriber Updates",
"events": ["subscriber.created", "subscriber.updated"],
"url": "https://example.com/webhook"
}
PUT /mailerlite/api/webhooks/{webhook_id}
Content-Type: application/json
{
"name": "Updated Webhook",
"enabled": true
}
DELETE /mailerlite/api/webhooks/{webhook_id}
MailerLite uses cursor-based pagination for most endpoints and page-based pagination for some.
GET /mailerlite/api/subscribers?limit=25&cursor=eyJpZCI6MTIzNDU2fQ
Response includes pagination links:
{
"data": [...],
"links": {
"first": "https://connect.mailerlite.com/api/subscribers?cursor=...",
"last": null,
"prev": null,
"next": "https://connect.mailerlite.com/api/subscribers?cursor=eyJpZCI6MTIzNDU2fQ"
},
"meta": {
"path": "https://connect.mailerlite.com/api/subscribers",
"per_page": 25,
"next_cursor": "eyJpZCI6MTIzNDU2fQ",
"prev_cursor": null
}
}
GET /mailerlite/api/groups?limit=25&page=2
Response includes page metadata:
{
"data": [...],
"meta": {
"current_page": 2,
"from": 26,
"last_page": 4,
"per_page": 25,
"to": 50,
"total": 100
}
}
const response = await fetch(
'https://api.maton.ai/mailerlite/api/subscribers?limit=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/mailerlite/api/subscribers',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'limit': 10}
)
data = response.json()
import os
import requests
response = requests.post(
'https://api.maton.ai/mailerlite/api/subscribers',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
},
json={
'email': 'newuser@example.com',
'fields': {'name': 'John Doe'},
'status': 'active'
}
)
data = response.json()
X-Version: YYYY-MM-DD headercurl -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 | Missing MailerLite connection |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden - insufficient permissions |
| 404 | Resource not found |
| 422 | Validation error |
| 429 | Rate limited (120 req/min) |
| 4xx/5xx | Passthrough error from MailerLite API |
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
mailerlite. For example:https://api.maton.ai/mailerlite/api/subscribershttps://api.maton.ai/api/subscribers共 2 个版本