API Explorer / List leads
Instantly tool instantly-api-leads-list on looot: input fields, $0 per call, output shape, and code to run it with curl, JavaScript or Python.
This endpoint is a POST endpoint, instead of GET - a deviation from the REST APIs standards we’re following because of the complex arguments it accepts, which would be too hard to express through query parameters. Results are ordered by each lead’s id field in ascending order (or by contact when distinct_contacts is true) so clients can paginate chronologically by reusing the cursor returned in next_starting_after. Leads created on or after October 15, 2025 respect this chronological ordering; older records may appear out of sequence when sorted by ID. Requires one of the following scopes: leads:read, leads:all, all:read, all:all Every field is optional; an empty body lists all leads visible to the workspace.
- Tool id:
instantly-api-leads-list - Provider: Instantly
- Job: List outreach lead (
outreach.lead.list) - Price: $0 per call. A call that fails at the provider costs $0.
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
campaign |
string | no | Campaign ID to filter leads. Example: “01a0abd0-8b15-7c60-831e-17bdca89a00f” |
contacts |
array | no | Array of emails the leads needs to have |
distinct_contacts |
boolean | no | Whether to return distinct contacts. Example: true |
enrichment_status |
number | no | Enrichment status to filter leads. Example: 1 |
esg_code |
string | no | ESG code to filter leads. Example: “1” |
excluded_ids |
array | no | Array of lead IDs to exclude |
filter |
string | no | Filter criteria for leads. For custom lead labels, use the interest_status field. Example: “FILTER_VAL_CONTACTED” |
ids |
array | no | Array of lead IDs to include |
in_campaign |
boolean | no | Whether the lead is in a campaign. Example: true |
in_list |
boolean | no | Whether the lead is in a list. Example: true |
is_website_visitor |
boolean | no | Whether the lead is a website visitor. Example: true |
limit |
integer | no | The number of items to return. Example: 10 |
list_id |
string | no | List ID to filter leads. |
organization_user_ids |
array | no | Array of organization user IDs to filter leads |
queries |
array | no | |
search |
string | no | Search term matched against the lead’s email and profile fields (first and last name, company, job title, and similar). Matches whole words, and the beginning of a field’s value, “smith” finds “John Smith”, “mith” does not. Provide campaign or list_id to also match inside values. Newly created or updated leads can take a few seconds to become searchable. Example: “John Doe” |
smart_view_id |
string | no | Smart view ID to filter leads. |
starting_after |
string | no | Forward pagination cursor. When distinct_contacts is false, provide the id value from the last lead of the previous page; when true, provide the lead’s email. Example: “01a0abd0-9ab5-7c0d-b00a-f00a1adddcc4” |
Output
The run’s result holds the provider’s answer. Signed in, looot inspect instantly-api-leads-list 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-list","input":{"limit":10,"filter":"FILTER_VAL_CONTACTED","search":"John Doe","in_list":true,"list_id":"<list_id>","campaign":"01a0abd0-8b15-7c60-831e-17bdca89a00f","esg_code":"1","in_campaign":true,"smart_view_id":"<smart_view_id>","starting_after":"01a0abd0-9ab5-7c0d-b00a-f00a1adddcc4","distinct_contacts":true,"enrichment_status":1,"is_website_visitor":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-list",
input: {
limit: 10,
filter: "FILTER_VAL_CONTACTED",
search: "John Doe",
in_list: true,
list_id: "<list_id>",
campaign: "01a0abd0-8b15-7c60-831e-17bdca89a00f",
esg_code: "1",
in_campaign: true,
smart_view_id: "<smart_view_id>",
starting_after: "01a0abd0-9ab5-7c0d-b00a-f00a1adddcc4",
distinct_contacts: true,
enrichment_status: 1,
is_website_visitor: 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-list",
"input": {
"limit": 10,
"filter": "FILTER_VAL_CONTACTED",
"search": "John Doe",
"in_list": True,
"list_id": "<list_id>",
"campaign": "01a0abd0-8b15-7c60-831e-17bdca89a00f",
"esg_code": "1",
"in_campaign": True,
"smart_view_id": "<smart_view_id>",
"starting_after": "01a0abd0-9ab5-7c0d-b00a-f00a1adddcc4",
"distinct_contacts": True,
"enrichment_status": 1,
"is_website_visitor": 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.list as endpointId; see the job page.