Access the Lemlist API with managed OAuth authentication. Manage campaigns, leads, activities, schedules, sequences, and unsubscribes for sales automation and cold outreach.
# List campaigns
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/lemlist/api/campaigns')
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/lemlist/api/{resource}
Maton proxies requests to api.lemlist.com/api 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 Lemlist OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=lemlist&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': 'lemlist'}).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-12T02:00:53.023887Z",
"last_updated_time": "2026-02-12T02:01:45.284131Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "lemlist",
"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 Lemlist 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/lemlist/api/campaigns')
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 /lemlist/api/team
Returns team information including user IDs and settings.
GET /lemlist/api/team/credits
Returns remaining credits balance.
GET /lemlist/api/team/senders
Returns all team members and their associated campaigns.
GET /lemlist/api/campaigns
POST /lemlist/api/campaigns
Content-Type: application/json
{
"name": "My Campaign"
}
Creates a new campaign with an empty sequence and default schedule automatically added.
GET /lemlist/api/campaigns/{campaignId}
PATCH /lemlist/api/campaigns/{campaignId}
Content-Type: application/json
{
"name": "Updated Campaign Name"
}
POST /lemlist/api/campaigns/{campaignId}/pause
Pauses a running campaign.
GET /lemlist/api/campaigns/{campaignId}/sequences
Returns all sequences and steps for a campaign.
GET /lemlist/api/campaigns/{campaignId}/schedules
Returns all schedules associated with a campaign.
POST /lemlist/api/campaigns/{campaignId}/leads
Content-Type: application/json
{
"email": "lead@example.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Inc"
}
Creates a new lead and adds it to the campaign. If the lead already exists, it will be inserted into the campaign.
GET /lemlist/api/leads/{email}
PATCH /lemlist/api/campaigns/{campaignId}/leads/{email}
Content-Type: application/json
{
"firstName": "Jane",
"lastName": "Smith"
}
DELETE /lemlist/api/campaigns/{campaignId}/leads/{email}
GET /lemlist/api/activities
Returns the history of campaign activities (last 100 activities).
Query parameters:
campaignId - Filter by campaigntype - Filter by activity type (emailsSent, emailsOpened, emailsClicked, etc.)GET /lemlist/api/schedules
Returns all schedules with pagination.
Response:
{
"schedules": [...],
"pagination": {
"totalRecords": 10,
"currentPage": 1,
"nextPage": 2,
"totalPage": 2
}
}
POST /lemlist/api/schedules
Content-Type: application/json
{
"name": "Business Hours",
"timezone": "America/New_York",
"start": "09:00",
"end": "17:00",
"weekdays": [1, 2, 3, 4, 5]
}
Weekdays: 0 = Sunday, 1 = Monday, ..., 6 = Saturday
GET /lemlist/api/schedules/{scheduleId}
PATCH /lemlist/api/schedules/{scheduleId}
Content-Type: application/json
{
"name": "Updated Schedule",
"start": "08:00",
"end": "18:00"
}
DELETE /lemlist/api/schedules/{scheduleId}
GET /lemlist/api/companies
Returns companies with pagination.
Response:
{
"data": [...],
"total": 100
}
GET /lemlist/api/unsubscribes
Returns all unsubscribed emails and domains.
POST /lemlist/api/unsubscribes
Content-Type: application/json
{
"email": "unsubscribe@example.com"
}
Can also add domains by using a domain value.
GET /lemlist/api/inbox/labels
Returns all labels available to the team.
Lemlist uses page-based pagination with different formats depending on the endpoint:
Schedules format:
{
"schedules": [...],
"pagination": {
"totalRecords": 100,
"currentPage": 1,
"nextPage": 2,
"totalPage": 10
}
}
Companies format:
{
"data": [...],
"total": 100
}
const response = await fetch(
'https://api.maton.ai/lemlist/api/campaigns',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const campaigns = await response.json();
console.log(campaigns);
import os
import requests
response = requests.get(
'https://api.maton.ai/lemlist/api/campaigns',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
campaigns = response.json()
for campaign in campaigns:
print(f"{campaign['name']}: {campaign['_id']}")
import os
import requests
headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
base_url = 'https://api.maton.ai/lemlist/api'
# Create campaign
campaign_response = requests.post(
f'{base_url}/campaigns',
headers=headers,
json={'name': 'Q1 Outreach'}
)
campaign = campaign_response.json()
print(f"Created campaign: {campaign['_id']}")
# Add lead to campaign
lead_response = requests.post(
f'{base_url}/campaigns/{campaign["_id"]}/leads',
headers=headers,
json={
'email': 'prospect@example.com',
'firstName': 'John',
'lastName': 'Doe',
'companyName': 'Acme Corp'
}
)
lead = lead_response.json()
print(f"Added lead: {lead['_id']}")
cam_lea_skd_seq_tea_usr_curl -g when URLs contain brackets to disable glob parsingjq, environment variables may not expand correctly. Use Python examples instead.| Operation | Limit |
|---|---|
| ----------- | ------- |
| API calls | 20 per 2 seconds per API key |
When rate limited, implement exponential backoff for retries.
| Status | Meaning |
|---|---|
| -------- | --------- |
| 400 | Bad request or missing Lemlist connection |
| 401 | Invalid or missing Maton API key |
| 404 | Resource not found |
| 405 | Method not allowed |
| 422 | Validation error |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Lemlist 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
lemlist. For example:https://api.maton.ai/lemlist/api/campaignshttps://api.maton.ai/api/campaigns共 2 个版本