✓ Verified 💻 Development ✓ Enhanced Data

Lemlist Official

Official Lemlist API integration for sales automation and multichannel outreach.

Rating
4 (183 reviews)
Downloads
4,012 downloads
Version
1.0.0

Overview

Official Lemlist API integration for sales automation and multichannel outreach.

Complete Documentation

View Source →

Lemlist

Interact with the Lemlist API to manage campaigns, leads, sequences, schedules, activities, inbox, webhooks, unsubscribes, exports, and enrichment.

Full endpoint reference: references/api-endpoints.md Official API docs: https://developer.lemlist.com/api-reference

Setup

1. Get API key

  • Log in to Lemlist
  • Go to Settings > Integrations > API Keys
  • Create a new key — copy immediately, shown only once

2. Configure in OpenClaw

Add to ~/.openclaw/openclaw.json:

json
{
  "skills": {
    "entries": {
      "lemlist": {
        "apiKey": "your-lemlist-api-key"
      }
    }
  }
}

Alternative explicit format:

json
{
  "skills": {
    "entries": {
      "lemlist": {
        "env": {
          "LEMLIST_API_KEY": "your-lemlist-api-key"
        }
      }
    }
  }
}

3. Verify

Run: Get my Lemlist team info

Docker sandbox

Forward the key explicitly:

json
{
  "agents": {
    "defaults": {
      "sandbox": {
        "docker": {
          "env": ["LEMLIST_API_KEY"]
        }
      }
    }
  }
}

Authentication

Base URL: https://api.lemlist.com/api

Basic Auth with empty username (colon before key is mandatory):

text
Authorization: Basic base64(:LEMLIST_API_KEY)

Python Helper

Use this pattern for all API calls:

python
import urllib.request, os, json, base64

API_KEY = os.environ["LEMLIST_API_KEY"]
AUTH = base64.b64encode(f":{API_KEY}".encode()).decode()
BASE = "https://api.lemlist.com/api"

def api(path, method="GET", data=None):
    body = json.dumps(data).encode() if data else None
    req = urllib.request.Request(f"{BASE}{path}", data=body, method=method)
    req.add_header("Authorization", f"Basic {AUTH}")
    req.add_header("User-Agent", "OpenClaw/1.0")
    if data:
        req.add_header("Content-Type", "application/json")
    return json.load(urllib.request.urlopen(req))

Endpoint Summary

DomainKey endpoints
TeamGET /team, /team/members, /team/credits, /team/senders
CampaignsGET/POST /campaigns, PATCH /campaigns/:id, POST pause/start
SequencesGET /campaigns/:id/sequences, POST/PATCH/DELETE steps
Leads (campaign)GET/POST/PATCH/DELETE /campaigns/:id/leads/:idOrEmail
Leads (global)GET /leads, POST pause/start/interested/notinterested
Lead variablesPOST/PATCH/DELETE /leads/:id/variables
ActivitiesGET /activities (filter: campaignId, type)
SchedulesCRUD /schedules, POST /campaigns/:id/schedules
UnsubscribesGET /unsubscribes, POST/DELETE /unsubscribes/:value
WebhooksGET/POST/DELETE /hooks (max 200/team)
InboxGET /inbox, POST email/linkedin/whatsapp/sms
Inbox labelsCRUD /inbox/labels, assign via /conversations/labels/:contactId
CompaniesGET /companies, /companies/:id/notes
ContactsGET /contacts, /contacts/:idOrEmail
ExportsGET /campaigns/:id/export (sync), /export/start (async)
EnrichmentPOST /leads/:id/enrich, GET /enrich/:id, POST /enrich (batch)
TasksGET/POST/PATCH /tasks, POST /tasks/ignore
LemwarmPOST start/pause, GET/PATCH settings via /lemwarm/:mailboxId
For request/response details, read references/api-endpoints.md.

Pagination

Params: offset (default 0), limit (max 100), page (1-based, overrides offset).

Paginated responses include pagination: { totalRecords, currentPage, nextPage, totalPage }. Some older endpoints return a plain array.

ID Prefixes

cam_ campaign, lea_ lead, skd_ schedule, seq_ sequence, tea_ team, usr_ user.

Gotchas

  • User-Agent required — set User-Agent: OpenClaw/1.0, Python's default UA is blocked by Cloudflare (403)
  • Basic Auth format — empty username mandatory: base64(":key"), not base64("key")
  • No campaign deletion — only pause via API
  • Email encoding@%40 in URL path params
  • Webhook auto-deletion — 404/410 response silently removes the webhook
  • No rate limiting — the public API does not throttle
  • Variable deletionDELETE /leads/:id/variables deletes vars, not the lead
  • Sync vs async export/export returns CSV directly, /export/start + poll for large volumes
  • Limits — 100 items/page, 200 webhooks/team, 100 API keys/team

Installation

Terminal bash

openclaw install lemlist-official
    
Copied!

💻Code Examples

}

.txt
### 3. Verify

Run: `Get my Lemlist team info`

### Docker sandbox

Forward the key explicitly:

}

.txt
## Authentication

Base URL: `https://api.lemlist.com/api`

Basic Auth with **empty username** (colon before key is mandatory):

Authorization: Basic base64(:LEMLIST_API_KEY)

authorization-basic-base64lemlistapikey.txt
## Python Helper

Use this pattern for all API calls:
example.json
{
  "skills": {
    "entries": {
      "lemlist": {
        "apiKey": "your-lemlist-api-key"
      }
    }
  }
}
example.json
{
  "skills": {
    "entries": {
      "lemlist": {
        "env": {
          "LEMLIST_API_KEY": "your-lemlist-api-key"
        }
      }
    }
  }
}
example.json
{
  "agents": {
    "defaults": {
      "sandbox": {
        "docker": {
          "env": ["LEMLIST_API_KEY"]
        }
      }
    }
  }
}
example.py
import urllib.request, os, json, base64

API_KEY = os.environ["LEMLIST_API_KEY"]
AUTH = base64.b64encode(f":{API_KEY}".encode()).decode()
BASE = "https://api.lemlist.com/api"

def api(path, method="GET", data=None):
    body = json.dumps(data).encode() if data else None
    req = urllib.request.Request(f"{BASE}{path}", data=body, method=method)
    req.add_header("Authorization", f"Basic {AUTH}")
    req.add_header("User-Agent", "OpenClaw/1.0")
    if data:
        req.add_header("Content-Type", "application/json")
    return json.load(urllib.request.urlopen(req))

Tags

#web_and-frontend-development #api #automation #integration

Quick Info

Category Development
Model Claude 3.5
Complexity Multi-Agent
Author micktaiwan
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install lemlist-official