Install
openclaw skills install lemlistLemlist API integration with managed OAuth. Sales automation and cold outreach platform. Use this skill when users want to manage campaigns, leads, activities, schedules, or unsubscribes in Lemlist. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
openclaw skills install lemlistAccess 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