API Explorer / Create lead
Instantly tool instantly-api-leads-post on looot: input fields, $0 per call, output shape, and code to run it with curl, JavaScript or Python.
Write action: this adds a lead to the user’s connected Instantly account, which can start sending emails to them. Confirm the details with the user before calling. Requires one of the following scopes: leads:create, leads:all, all:create, all:all Not enforced by Instantly’s own schema as required, but in practice campaign and email are needed to create a usable lead.
- Tool id:
instantly-api-leads-post - Provider: Instantly
- Job: Add outreach lead (
outreach.lead.add) - Price: $0 per call. A call that fails at the provider costs $0.
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
assigned_to |
string | no | ID of the user assigned to the lead. Example: “01a0abd0-46e2-7acf-aedc-3e5f392e083f” |
blocklist_id |
string | no | The ID of the blocklist to check for the lead. |
campaign |
string | no | Campaign ID associated with the lead. Example: “01a0abd0-46e2-7acf-aedc-3e58827a8d11” |
company_name |
string | no | Company name of the lead. |
custom_variables |
object | no | Custom variables can include any metadata about the lead that is relevant to the campaign, the campaign will be updated to allow all the other leads in the campaign to have the same custom variables. The custom variables will be added to the lead payload field |
email |
string | no | Email address of the lead. |
first_name |
string | no | First name of the lead. |
job_title |
string | no | Job title of the lead. Example: “Head of Growth” |
last_name |
string | no | Last name of the lead. |
list_id |
string | no | List ID associated with the lead. |
lt_interest_status |
number | no | Lead interest status. It can be either a static value (check below), or a custom status interest value. Example: 1 |
personalization |
string | no | Personalization of the lead. Example: “Hello, how are you?” |
phone |
string | no | Phone number of the lead. |
pl_value_lead |
string | no | Potential value of the lead. Example: “High” |
skip_if_in_campaign |
boolean | no | Whether to skip if the lead is already in the campaign. Example: true |
skip_if_in_list |
boolean | no | Whether to skip if the lead is already in the list. Example: true |
skip_if_in_workspace |
boolean | no | Whether to skip if the lead is already in the workspace. Example: true |
verify_leads_for_lead_finder |
boolean | no | Whether to verify the leads for the lead finder. Example: true |
verify_leads_on_import |
boolean | no | Whether to verify the leads on import. Example: true |
website |
string | no | Website of the lead. Example: “https://example.com” |
Output
The run’s result holds the provider’s answer. Signed in, looot inspect instantly-api-leads-post prints its fields.
Run it
Every call needs your API token in LOOOT_TOKEN; Sign in shows how to get one. Each run also needs a new idempotency key, so a retry never pays twice. With wait: 30 the answer comes back inline when the run ends within 30 seconds. Otherwise you get the running run back: poll GET /v1/runs/<runId>.
Example input with placeholder values:
curl -X POST "https://api.looot.ai/v1/runs" \
-H "Authorization: Bearer $LOOOT_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"endpointId":"instantly-api-leads-post","input":{"email":"jane.doe@example.com","phone":"+15555550100","list_id":"<list_id>","website":"https://example.com","campaign":"01a0abd0-46e2-7acf-aedc-3e58827a8d11","job_title":"Head of Growth","last_name":"Doe","first_name":"Jane","assigned_to":"01a0abd0-46e2-7acf-aedc-3e5f392e083f","blocklist_id":"<blocklist_id>","company_name":"Example Inc","pl_value_lead":"High","personalization":"Hello, how are you?","skip_if_in_list":true,"lt_interest_status":1,"skip_if_in_campaign":true,"skip_if_in_workspace":true,"verify_leads_on_import":true,"verify_leads_for_lead_finder":true},"wait":30}'const response = await fetch("https://api.looot.ai/v1/runs", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LOOOT_TOKEN}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
endpointId: "instantly-api-leads-post",
input: {
email: "jane.doe@example.com",
phone: "+15555550100",
list_id: "<list_id>",
website: "https://example.com",
campaign: "01a0abd0-46e2-7acf-aedc-3e58827a8d11",
job_title: "Head of Growth",
last_name: "Doe",
first_name: "Jane",
assigned_to: "01a0abd0-46e2-7acf-aedc-3e5f392e083f",
blocklist_id: "<blocklist_id>",
company_name: "Example Inc",
pl_value_lead: "High",
personalization: "Hello, how are you?",
skip_if_in_list: true,
lt_interest_status: 1,
skip_if_in_campaign: true,
skip_if_in_workspace: true,
verify_leads_on_import: true,
verify_leads_for_lead_finder: true,
},
wait: 30,
}),
});
const run = await response.json();
console.log(run.status, run.result);import os
import uuid
import requests
response = requests.post(
"https://api.looot.ai/v1/runs",
headers={
"Authorization": f"Bearer {os.environ['LOOOT_TOKEN']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"endpointId": "instantly-api-leads-post",
"input": {
"email": "jane.doe@example.com",
"phone": "+15555550100",
"list_id": "<list_id>",
"website": "https://example.com",
"campaign": "01a0abd0-46e2-7acf-aedc-3e58827a8d11",
"job_title": "Head of Growth",
"last_name": "Doe",
"first_name": "Jane",
"assigned_to": "01a0abd0-46e2-7acf-aedc-3e5f392e083f",
"blocklist_id": "<blocklist_id>",
"company_name": "Example Inc",
"pl_value_lead": "High",
"personalization": "Hello, how are you?",
"skip_if_in_list": True,
"lt_interest_status": 1,
"skip_if_in_campaign": True,
"skip_if_in_workspace": True,
"verify_leads_on_import": True,
"verify_leads_for_lead_finder": True,
},
"wait": 30,
},
timeout=90,
)
run = response.json()
print(run["status"], run.get("result"))To let looot pick among every provider of this job instead, send job:outreach.lead.add as endpointId; see the job page.