Smartlead API skill

Smartlead API endpoint reference and patterns.

by growthenginenowoslawski·MIT license·★ 736 Stars on the repo·GitHub ↗

Use now

Files of Smartlead API

growthenginenowoslawski/main1 file shown
SKILL.md
Show the full text208 lines

Smartlead API Reference

Authentication

All requests use query parameter auth: ?api_key={SMARTLEAD_API_KEY}

Environment variable: $SMARTLEAD_API_KEY

Base URL: https://server.smartlead.ai/api/v1

Rate Limiting

  • Standard plan: 2,000 req/min (33 req/sec)
  • Higher plans: 3,000 req/min (50 req/sec)
  • Retry on 429 and 5xx with exponential backoff
  • For bulk operations, use p-limit or PQueue with 8-15 concurrency

CLI Quick Reference

The smartlead CLI (@smartlead/cli) wraps all API endpoints. Use it for quick lookups:

# Campaigns
smartlead campaigns list
smartlead campaigns get <id>
smartlead campaigns create --name "Campaign Name"

# Leads
smartlead leads list --campaign-id <id>
smartlead leads add --campaign-id <id> --file leads.csv

# Email accounts
smartlead email-accounts list
smartlead email-accounts get <id>

# Analytics
smartlead analytics campaign <id>
smartlead analytics overall

# Master inbox
smartlead inbox replies

API Endpoints

Campaigns
GET  /campaigns/{id}                    — Fetch campaign by ID
POST /campaigns/create                  — Create new campaign
POST /campaigns/{id}/status             — Update status (START, PAUSED, STOP)
     Body: { "status": "START" }
Campaign Email Accounts
GET    /campaigns/{id}/email-accounts   — List accounts assigned to campaign
POST   /campaigns/{id}/email-accounts   — Add accounts to campaign
       Body: { "email_account_ids": [1, 2, 3] }
DELETE /campaigns/{id}/email-accounts   — Remove accounts from campaign
Campaign Sequences
GET  /campaigns/{id}/sequences          — Fetch sequences
POST /campaigns/{id}/sequences          — Save/update sequences
     Body: { "sequences": [{ "seq_number": 1, "seq_delay_details": { "delay_in_days": 0 }, "subject": "...", "email_body": "..." }] }

A/B/C Variants — use seq_variants array inside each sequence:

{
  "sequences": [{
    "seq_number": 1,
    "seq_delay_details": { "delay_in_days": 0 },
    "seq_variants": [
      { "variant_label": "A", "subject": "Subject A", "email_body": "<div>Body A</div>" },
      { "variant_label": "B", "subject": "Subject B", "email_body": "<div>Body B</div>" },
      { "variant_label": "C", "subject": "Subject C", "email_body": "<div>Body C</div>" }
    ]
  }]
}

Note: Do NOT include distribution field — SmartLead splits evenly automatically.

Email body order: content → PS unsub line → %signature% (signature always last)

Campaign Settings & Schedule
POST /campaigns/{id}/settings           — Update settings
     Body: { "track_settings": [...], "stop_lead_settings": "..." }

POST /campaigns/{id}/schedule           — Update schedule
     Body: { "timezone": "US/Eastern", "days_of_the_week": [1,2,3,4,5], "start_hour": "08:00", "end_hour": "17:00", "min_time_btw_emails": 8, "max_new_leads_per_day": 30 }
Leads
GET  /leads/?api_key={key}&email={email}
     — Lookup lead by email address

POST /campaigns/{id}/leads
     — Add leads to campaign (batch up to 100)
     Body: { "lead_list": [{ "email": "...", "first_name": "...", "last_name": "...", "company_name": "...", "custom_fields": { "field1": "value1" } }] }
Analytics
GET /analytics/day-wise-overall-stats
    ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
    — Day-by-day metrics (sent, opened, clicked, replied, bounced)

GET /analytics/day-wise-positive-reply-stats
    ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
    — Day-by-day positive reply counts

GET /analytics/overall-stats-v2
    ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
    — Overall campaign metrics for date range

GET /analytics/campaign/list
    ?api_key={key}
    — List all campaigns with summary stats

GET /campaigns/{id}/analytics
    ?api_key={key}
    — Analytics for specific campaign

GET /campaigns/{id}/analytics-by-date
    ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
    — Campaign analytics for specific date range (sent_count, reply_count)
Email Accounts (Global)
GET  /email-accounts
     ?api_key={key}&offset=0&limit=100
     — List all email accounts (paginated)

GET  /email-accounts/{id}
     ?api_key={key}
     — Get specific email account

POST /email-accounts/save
     — Create/update email account (SMTP details, warmup, etc.)
Master Inbox
POST /master-inbox/inbox-replies
     Body: { "api_key": "...", "offset": 0, "limit": 50, "message_type": "RECEIVED" }
     — Fetch inbox replies with filtering and pagination

Sub-Client / Custom API Key Pattern

  • Normal sub-clients: Pass ?api_key={MAIN_KEY}&client_id={CLIENT_ID} on all requests
  • Custom API key clients: Use the client's own API key directly, no client_id param

TypeScript Pattern

const SMARTLEAD_API = "https://server.smartlead.ai/api/v1";
const API_KEY = process.env.SMARTLEAD_API_KEY;

// GET example
const res = await fetch(`${SMARTLEAD_API}/campaigns/${campaignId}?api_key=${API_KEY}`);
const campaign = await res.json();

// POST example (add leads)
const res = await fetch(`${SMARTLEAD_API}/campaigns/${campaignId}/leads?api_key=${API_KEY}`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ lead_list: leads.slice(0, 100) }),
});

Performance tip: cache the email-accounts list

If you hit /email-accounts more than a few times per script, paginate once at the start and keep the result in memory. Smartlead's pagination returns 100 per page — for accounts with thousands of inboxes, a full walk takes 30+ seconds.

For persistent caching across scripts, write the list to a local JSON file and refresh on a timer (e.g. every hour). The /smartlead-inbox-manager skill has scripts that implement this pattern.


What to do next

This is a reference skill — no direct next step. Used by all skills that interact with Smartlead (/smartlead-inbox-manager, /smartlead-campaign-upload-public, /email-deliverability-audit, /positive-reply-scoring, /deliverability-incident-response, etc.).

Return to the skill that sent you here.

  • Every skill that touches Smartlead uses this reference.
1---
2name: smartlead-api
3description: Smartlead API endpoint reference and patterns. Use for any Smartlead campaign, lead, email account, analytics, or inbox operation. Covers auth, rate limiting, and all commonly used endpoints.
4user_invocable: false
5---
6 
7# Smartlead API Reference
8 
9## Authentication
10 
11All requests use query parameter auth: `?api_key={SMARTLEAD_API_KEY}`
12 
13Environment variable: `$SMARTLEAD_API_KEY`
14 
15Base URL: `https://server.smartlead.ai/api/v1`
16 
17## Rate Limiting
18 
19- **Standard plan:** 2,000 req/min (33 req/sec)
20- **Higher plans:** 3,000 req/min (50 req/sec)
21- Retry on 429 and 5xx with exponential backoff
22- For bulk operations, use `p-limit` or `PQueue` with 8-15 concurrency
23 
24## CLI Quick Reference
25 
26The `smartlead` CLI (`@smartlead/cli`) wraps all API endpoints. Use it for quick lookups:
27 
28```bash
29# Campaigns
30smartlead campaigns list
31smartlead campaigns get <id>
32smartlead campaigns create --name "Campaign Name"
33 
34# Leads
35smartlead leads list --campaign-id <id>
36smartlead leads add --campaign-id <id> --file leads.csv
37 
38# Email accounts
39smartlead email-accounts list
40smartlead email-accounts get <id>
41 
42# Analytics
43smartlead analytics campaign <id>
44smartlead analytics overall
45 
46# Master inbox
47smartlead inbox replies
48```
49 
50## API Endpoints
51 
52### Campaigns
53 
54```
55GET /campaigns/{id} — Fetch campaign by ID
56POST /campaigns/create — Create new campaign
57POST /campaigns/{id}/status — Update status (START, PAUSED, STOP)
58 Body: { "status": "START" }
59```
60 
61### Campaign Email Accounts
62 
63```
64GET /campaigns/{id}/email-accounts — List accounts assigned to campaign
65POST /campaigns/{id}/email-accounts — Add accounts to campaign
66 Body: { "email_account_ids": [1, 2, 3] }
67DELETE /campaigns/{id}/email-accounts — Remove accounts from campaign
68```
69 
70### Campaign Sequences
71 
72```
73GET /campaigns/{id}/sequences — Fetch sequences
74POST /campaigns/{id}/sequences — Save/update sequences
75 Body: { "sequences": [{ "seq_number": 1, "seq_delay_details": { "delay_in_days": 0 }, "subject": "...", "email_body": "..." }] }
76```
77 
78**A/B/C Variants** — use `seq_variants` array inside each sequence:
79```json
80{
81 "sequences": [{
82 "seq_number": 1,
83 "seq_delay_details": { "delay_in_days": 0 },
84 "seq_variants": [
85 { "variant_label": "A", "subject": "Subject A", "email_body": "<div>Body A</div>" },
86 { "variant_label": "B", "subject": "Subject B", "email_body": "<div>Body B</div>" },
87 { "variant_label": "C", "subject": "Subject C", "email_body": "<div>Body C</div>" }
88 ]
89 }]
90}
91```
92Note: Do NOT include `distribution` field — SmartLead splits evenly automatically.
93 
94**Email body order:** content → PS unsub line → `%signature%` (signature always last)
95 
96### Campaign Settings & Schedule
97 
98```
99POST /campaigns/{id}/settings — Update settings
100 Body: { "track_settings": [...], "stop_lead_settings": "..." }
101 
102POST /campaigns/{id}/schedule — Update schedule
103 Body: { "timezone": "US/Eastern", "days_of_the_week": [1,2,3,4,5], "start_hour": "08:00", "end_hour": "17:00", "min_time_btw_emails": 8, "max_new_leads_per_day": 30 }
104```
105 
106### Leads
107 
108```
109GET /leads/?api_key={key}&email={email}
110 — Lookup lead by email address
111 
112POST /campaigns/{id}/leads
113 — Add leads to campaign (batch up to 100)
114 Body: { "lead_list": [{ "email": "...", "first_name": "...", "last_name": "...", "company_name": "...", "custom_fields": { "field1": "value1" } }] }
115```
116 
117### Analytics
118 
119```
120GET /analytics/day-wise-overall-stats
121 ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
122 — Day-by-day metrics (sent, opened, clicked, replied, bounced)
123 
124GET /analytics/day-wise-positive-reply-stats
125 ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
126 — Day-by-day positive reply counts
127 
128GET /analytics/overall-stats-v2
129 ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
130 — Overall campaign metrics for date range
131 
132GET /analytics/campaign/list
133 ?api_key={key}
134 — List all campaigns with summary stats
135 
136GET /campaigns/{id}/analytics
137 ?api_key={key}
138 — Analytics for specific campaign
139 
140GET /campaigns/{id}/analytics-by-date
141 ?api_key={key}&start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
142 — Campaign analytics for specific date range (sent_count, reply_count)
143```
144 
145### Email Accounts (Global)
146 
147```
148GET /email-accounts
149 ?api_key={key}&offset=0&limit=100
150 — List all email accounts (paginated)
151 
152GET /email-accounts/{id}
153 ?api_key={key}
154 — Get specific email account
155 
156POST /email-accounts/save
157 — Create/update email account (SMTP details, warmup, etc.)
158```
159 
160### Master Inbox
161 
162```
163POST /master-inbox/inbox-replies
164 Body: { "api_key": "...", "offset": 0, "limit": 50, "message_type": "RECEIVED" }
165 — Fetch inbox replies with filtering and pagination
166```
167 
168## Sub-Client / Custom API Key Pattern
169 
170- **Normal sub-clients:** Pass `?api_key={MAIN_KEY}&client_id={CLIENT_ID}` on all requests
171- **Custom API key clients:** Use the client's own API key directly, no `client_id` param
172 
173## TypeScript Pattern
174 
175```typescript
176const SMARTLEAD_API = "https://server.smartlead.ai/api/v1";
177const API_KEY = process.env.SMARTLEAD_API_KEY;
178 
179// GET example
180const res = await fetch(`${SMARTLEAD_API}/campaigns/${campaignId}?api_key=${API_KEY}`);
181const campaign = await res.json();
182 
183// POST example (add leads)
184const res = await fetch(`${SMARTLEAD_API}/campaigns/${campaignId}/leads?api_key=${API_KEY}`, {
185 method: "POST",
186 headers: { "Content-Type": "application/json" },
187 body: JSON.stringify({ lead_list: leads.slice(0, 100) }),
188});
189```
190 
191## Performance tip: cache the email-accounts list
192 
193If you hit `/email-accounts` more than a few times per script, paginate once at the start and keep the result in memory. Smartlead's pagination returns 100 per page — for accounts with thousands of inboxes, a full walk takes 30+ seconds.
194 
195For persistent caching across scripts, write the list to a local JSON file and refresh on a timer (e.g. every hour). The `/smartlead-inbox-manager` skill has scripts that implement this pattern.
196 
197---
198 
199## What to do next
200 
201This is a reference skill — no direct next step. Used by all skills that interact with Smartlead (`/smartlead-inbox-manager`, `/smartlead-campaign-upload-public`, `/email-deliverability-audit`, `/positive-reply-scoring`, `/deliverability-incident-response`, etc.).
202 
203Return to the skill that sent you here.
204 
205## Related skills
206 
207- Every skill that touches Smartlead uses this reference.
208 

Discussion

Alternatives

API and interface designGuides stable API and interface design. Use when designing APIs, module boundaries, or any public interface. Use when creating REST or GraphQL endpoints, defining type contracts between modules, or establishing boundaries between frontend and backend.Coding · MITContext7Pulls up-to-date, version-specific library docs and code examples into the prompt so the AI stops inventing old APIs.Coding · MITContext7 Documentation LookupFetch up-to-date documentation and code examples for any library, framework, SDK, CLI tool, or cloud service. Use whenever the user asks about a specific library — even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot — because training data may not reflect recent API changes or version updates. Always use for: API syntax questions, configuration options, version migration issues, "how do I" questions mentioning a library name, debugging that involves library-specific behavior, setup instructions, and CLI tool usage. Use even when you think you know the answer. Do not rely on training data for API details, signatures, or configuration options — they are frequently out of date. Prefer this over web search for library documentation.Coding · MITAdaptyv Bio Foundry APIHow to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit protein sequences for experimental characterization. Also trigger when code imports `adaptyv`, `adaptyv_sdk`, or `FoundryClient`, or references `foundry-api-public.adaptyvbio.com`.Science · MIT