Access the Mailchimp Marketing API with managed OAuth authentication. Manage audiences, campaigns, templates, automations, reports, and subscribers for email marketing.
Reference
Get All Lists
GET /mailchimp/3.0/listsQuery parameters:
count- Number of records to return (default 10, max 1000)offset- Number of records to skip (for pagination)fields- Comma-separated list of fields to includeexclude_fields- Comma-separated list of fields to exclude
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists?count=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"lists": [
{
"id": "abc123def4",
"name": "Newsletter Subscribers",
"contact": {
"company": "Acme Corp",
"address1": "123 Main St"
},
"stats": {
"member_count": 5000,
"unsubscribe_count": 100,
"open_rate": 0.25
}
}
],
"total_items": 1
}Get a List
GET /mailchimp/3.0/lists/{list_id}Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists/abc123def4')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCreate a List
POST /mailchimp/3.0/lists
Content-Type: application/json
{
"name": "Newsletter",
"contact": {
"company": "Acme Corp",
"address1": "123 Main St",
"city": "New York",
"state": "NY",
"zip": "10001",
"country": "US"
},
"permission_reminder": "You signed up for our newsletter",
"campaign_defaults": {
"from_name": "Acme Corp",
"from_email": "newsletter@acme.com",
"subject": "",
"language": "en"
},
"email_type_option": true
}Update a List
PATCH /mailchimp/3.0/lists/{list_id}Delete a List
DELETE /mailchimp/3.0/lists/{list_id}Get List Members
GET /mailchimp/3.0/lists/{list_id}/membersQuery parameters:
status- Filter by subscription status (subscribed, unsubscribed, cleaned, pending, transactional)count- Number of records to returnoffset- Number of records to skip
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists/abc123def4/members?status=subscribed&count=50')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"members": [
{
"id": "f4b7c8d9e0",
"email_address": "john@example.com",
"status": "subscribed",
"merge_fields": {
"FNAME": "John",
"LNAME": "Doe"
},
"tags": [
{"id": 1, "name": "VIP"}
]
}
],
"total_items": 500
}Get a Member
GET /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}The subscriber_hash is the MD5 hash of the lowercase email address.
Example:
# For email "john@example.com", subscriber_hash = md5("john@example.com")
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists/abc123def4/members/b4c9a0d1e2f3g4h5')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFAdd a Member
POST /mailchimp/3.0/lists/{list_id}/members
Content-Type: application/json
{
"email_address": "newuser@example.com",
"status": "subscribed",
"merge_fields": {
"FNAME": "Jane",
"LNAME": "Smith"
},
"tags": ["Newsletter", "Premium"]
}Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'email_address': 'newuser@example.com', 'status': 'subscribed', 'merge_fields': {'FNAME': 'Jane', 'LNAME': 'Smith'}}).encode()
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists/abc123def4/members', 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))
EOFUpdate a Member
PATCH /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'merge_fields': {'FNAME': 'Jane', 'LNAME': 'Doe'}}).encode()
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists/abc123def4/members/b4c9a0d1e2f3g4h5', data=data, method='PATCH')
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))
EOFAdd or Update a Member (Upsert)
PUT /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}
Content-Type: application/json
{
"email_address": "user@example.com",
"status_if_new": "subscribed",
"merge_fields": {
"FNAME": "Jane",
"LNAME": "Smith"
}
}Creates a new member or updates an existing one based on the email hash. Use status_if_new to set the status when creating a new member.
Delete a Member
Archives a member (can be re-added later):
DELETE /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}Returns 204 No Content on success.
To permanently delete (GDPR compliant):
POST /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}/actions/delete-permanentGet Member Tags
GET /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}/tagsAdd or Remove Tags
POST /mailchimp/3.0/lists/{list_id}/members/{subscriber_hash}/tags
Content-Type: application/json
{
"tags": [
{"name": "VIP", "status": "active"},
{"name": "Old Tag", "status": "inactive"}
]
}Returns 204 No Content on success.
Get Segments
GET /mailchimp/3.0/lists/{list_id}/segmentsExample:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/lists/abc123def4/segments')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCreate a Segment
POST /mailchimp/3.0/lists/{list_id}/segments
Content-Type: application/json
{
"name": "Active Subscribers",
"options": {
"match": "all",
"conditions": [
{
"condition_type": "EmailActivity",
"field": "opened",
"op": "date_within",
"value": "30"
}
]
}
}Update a Segment
PATCH /mailchimp/3.0/lists/{list_id}/segments/{segment_id}Get Segment Members
GET /mailchimp/3.0/lists/{list_id}/segments/{segment_id}/membersDelete a Segment
DELETE /mailchimp/3.0/lists/{list_id}/segments/{segment_id}Returns 204 No Content on success.
Get All Campaigns
GET /mailchimp/3.0/campaignsQuery parameters:
type- Campaign type (regular, plaintext, absplit, rss, variate)status- Campaign status (save, paused, schedule, sending, sent)list_id- Filter by list IDcount- Number of records to returnoffset- Number of records to skip
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/campaigns?status=sent&count=20')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"campaigns": [
{
"id": "campaign123",
"type": "regular",
"status": "sent",
"settings": {
"subject_line": "Monthly Newsletter",
"from_name": "Acme Corp"
},
"send_time": "2025-02-01T10:00:00Z",
"report_summary": {
"opens": 1500,
"clicks": 300,
"open_rate": 0.30,
"click_rate": 0.06
}
}
],
"total_items": 50
}Get a Campaign
GET /mailchimp/3.0/campaigns/{campaign_id}Create a Campaign
POST /mailchimp/3.0/campaigns
Content-Type: application/json
{
"type": "regular",
"recipients": {
"list_id": "abc123def4"
},
"settings": {
"subject_line": "Your Monthly Update",
"from_name": "Acme Corp",
"reply_to": "hello@acme.com"
}
}Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'type': 'regular', 'recipients': {'list_id': 'abc123def4'}, 'settings': {'subject_line': 'February Newsletter', 'from_name': 'Acme Corp', 'reply_to': 'newsletter@acme.com'}}).encode()
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/campaigns', 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))
EOFUpdate a Campaign
PATCH /mailchimp/3.0/campaigns/{campaign_id}Delete a Campaign
DELETE /mailchimp/3.0/campaigns/{campaign_id}Returns 204 No Content on success.
Get Campaign Content
GET /mailchimp/3.0/campaigns/{campaign_id}/contentSet Campaign Content
PUT /mailchimp/3.0/campaigns/{campaign_id}/content
Content-Type: application/json
{
"html": "<html><body><h1>Hello!</h1><p>Newsletter content here.</p></body></html>",
"plain_text": "Hello! Newsletter content here."
}Or use a template:
PUT /mailchimp/3.0/campaigns/{campaign_id}/content
Content-Type: application/json
{
"template": {
"id": 12345,
"sections": {
"body": "<p>Custom content for the template section</p>"
}
}
}Get Campaign Send Checklist
Check if a campaign is ready to send:
GET /mailchimp/3.0/campaigns/{campaign_id}/send-checklistSend a Campaign
POST /mailchimp/3.0/campaigns/{campaign_id}/actions/sendSchedule a Campaign
POST /mailchimp/3.0/campaigns/{campaign_id}/actions/schedule
Content-Type: application/json
{
"schedule_time": "2025-03-01T10:00:00+00:00"
}Cancel a Scheduled Campaign
POST /mailchimp/3.0/campaigns/{campaign_id}/actions/cancel-sendGet All Templates
GET /mailchimp/3.0/templatesQuery parameters:
type- Template type (user, base, gallery)count- Number of records to returnoffset- Number of records to skip
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/templates?type=user')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFGet a Template
GET /mailchimp/3.0/templates/{template_id}Get Template Default Content
GET /mailchimp/3.0/templates/{template_id}/default-contentCreate a Template
POST /mailchimp/3.0/templates
Content-Type: application/json
{
"name": "Newsletter Template",
"html": "<html><body mc:edit=\"body\"><h1>Title</h1><p>Content here</p></body></html>"
}Update a Template
PATCH /mailchimp/3.0/templates/{template_id}Delete a Template
DELETE /mailchimp/3.0/templates/{template_id}Returns 204 No Content on success.
Get All Automations
GET /mailchimp/3.0/automationsExample:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/automations')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFGet an Automation
GET /mailchimp/3.0/automations/{workflow_id}Start an Automation
POST /mailchimp/3.0/automations/{workflow_id}/actions/start-all-emailsPause an Automation
POST /mailchimp/3.0/automations/{workflow_id}/actions/pause-all-emailsGet Automation Emails
GET /mailchimp/3.0/automations/{workflow_id}/emailsAdd Subscriber to Automation Queue
Manually add a subscriber to an automation workflow:
POST /mailchimp/3.0/automations/{workflow_id}/emails/{workflow_email_id}/queue
Content-Type: application/json
{
"email_address": "subscriber@example.com"
}Get Campaign Reports
GET /mailchimp/3.0/reportsQuery parameters:
count- Number of records to returnoffset- Number of records to skiptype- Campaign type
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/mailchimp/3.0/reports?count=20')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"reports": [
{
"id": "campaign123",
"campaign_title": "Monthly Newsletter",
"emails_sent": 5000,
"opens": {
"opens_total": 1500,
"unique_opens": 1200,
"open_rate": 0.24
},
"clicks": {
"clicks_total": 450,
"unique_clicks": 300,
"click_rate": 0.06
},
"unsubscribed": 10,
"bounce_rate": 0.02
}
]
}Get Campaign Report
GET /mailchimp/3.0/reports/{campaign_id}Get Campaign Open Details
GET /mailchimp/3.0/reports/{campaign_id}/open-detailsGet Campaign Click Details
GET /mailchimp/3.0/reports/{campaign_id}/click-detailsGet List Activity
GET /mailchimp/3.0/lists/{list_id}/activityReturns recent daily aggregated activity stats (unsubscribes, signups, opens, clicks) for up to 180 days.
Create Batch Operation
POST /mailchimp/3.0/batches
Content-Type: application/json
{
"operations": [
{
"method": "POST",
"path": "/lists/abc123def4/members",
"body": "{\"email_address\":\"user1@example.com\",\"status\":\"subscribed\"}"
},
{
"method": "POST",
"path": "/lists/abc123def4/members",
"body": "{\"email_address\":\"user2@example.com\",\"status\":\"subscribed\"}"
}
]
}Get Batch Status
GET /mailchimp/3.0/batches/{batch_id}List All Batches
GET /mailchimp/3.0/batchesDelete a Batch
DELETE /mailchimp/3.0/batches/{batch_id}Returns 204 No Content on success.