Instantly.ai API via curl. Use this skill for cold email outreach automation, managing campaigns, leads, and email accounts.
/plugin marketplace add vm0-ai/api0/plugin install api0@api0This skill inherits all available tools. When active, it can use any tool Claude has access to.
Use the Instantly API via direct curl calls to automate cold email outreach, manage campaigns, leads, and sending accounts.
Official docs:
https://developer.instantly.ai/
Use this skill when you need to:
export INSTANTLY_API_KEY="your-api-key"
Create API keys with specific permissions:
campaigns:read, campaigns:create, campaigns:updateleads:read, leads:create, leads:update, leads:deletelead_lists:read, lead_lists:createanalytics:readall:all (full access)Important: When using
$VARin a command that pipes to another command, wrap the command containing$VARinbash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"' | jq .
All examples below assume you have INSTANTLY_API_KEY set.
The base URL for API V2 is:
https://api.instantly.ai/api/v2Authentication uses Bearer token in the Authorization header.
Get all campaigns:
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '.items[] | {id, name, status}
With filters:
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns?status=ACTIVE&limit=10" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '.items[] | {id, name}
Status values: ACTIVE, PAUSED, COMPLETED, DRAFTED
Get campaign details by ID:
CAMPAIGN_ID="your-campaign-id"
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns/${CAMPAIGN_ID}" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '{id, name, status, daily_limit}
Create a new campaign (requires campaign_schedule):
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{
"name": "My New Campaign",
"daily_limit": 50,
"campaign_schedule": {
"timezone": "America/New_York",
"days": {
"monday": [{"start": "09:00", "end": "17:00"}],
"tuesday": [{"start": "09:00", "end": "17:00"}],
"wednesday": [{"start": "09:00", "end": "17:00"}],
"thursday": [{"start": "09:00", "end": "17:00"}],
"friday": [{"start": "09:00", "end": "17:00"}]
}
}
}'"'"' | jq .'
Control campaign status:
CAMPAIGN_ID="your-campaign-id"
# Pause campaign
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns/${CAMPAIGN_ID}/pause" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq .
# Activate campaign
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns/${CAMPAIGN_ID}/activate" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq .
List leads (POST endpoint due to complex filters):
bash -c 'curl -s "https://api.instantly.ai/api/v2/leads/list" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{"limit": 10}'"'"'' | jq '.items[] | {id, email, first_name, last_name}
Filter by campaign:
bash -c 'curl -s "https://api.instantly.ai/api/v2/leads/list" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{
"campaign_id": "your-campaign-id",
"limit": 20
}'"'"' | jq '"'"'.items[] | {email, status}'"'"''
Add a single lead:
bash -c 'curl -s "https://api.instantly.ai/api/v2/leads" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{
"email": "john@example.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "Acme Corp",
"campaign_id": "your-campaign-id"
}'"'"' | jq .'
With custom variables:
bash -c 'curl -s "https://api.instantly.ai/api/v2/leads" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{
"email": "jane@example.com",
"first_name": "Jane",
"campaign_id": "your-campaign-id",
"custom_variables": {
"role": "CTO",
"industry": "SaaS"
}
}'"'"' | jq .'
Get lead by ID:
LEAD_ID="your-lead-id"
bash -c 'curl -s "https://api.instantly.ai/api/v2/leads/${LEAD_ID}" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq .
Update lead information:
LEAD_ID="your-lead-id"
bash -c 'curl -s "https://api.instantly.ai/api/v2/leads/${LEAD_ID}" -X PATCH -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{
"first_name": "Updated Name",
"custom_variables": {
"notes": "High priority"
}
}'"'"' | jq .'
Get all lead lists:
bash -c 'curl -s "https://api.instantly.ai/api/v2/lead-lists" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '.items[] | {id, name}
Create a new lead list:
bash -c 'curl -s "https://api.instantly.ai/api/v2/lead-lists" -X POST -H "Authorization: Bearer ${INSTANTLY_API_KEY}" -H "Content-Type: application/json" -d '"'"'{
"name": "Q1 Prospects"
}'"'"' | jq .'
Get connected sending accounts:
bash -c 'curl -s "https://api.instantly.ai/api/v2/accounts" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '.items[] | {email, status, warmup_status}
Verify your API key is valid:
bash -c 'curl -s "https://api.instantly.ai/api/v2/api-keys" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '.items[0] | {name, scopes}
List endpoints support pagination:
# First page
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns?limit=10" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq '{items: .items | length, next_starting_after: .next_starting_after}
# Next page
bash -c 'curl -s "https://api.instantly.ai/api/v2/campaigns?limit=10&starting_after=CURSOR" -H "Authorization: Bearer ${INSTANTLY_API_KEY}"' | jq .
Authorization: Bearer header