Endpoints
API & webhooks
API reference
The OmniLead REST API gives Agency workspaces programmatic access to search, reveals, leads, pipelines, sequences, suppressions, credits, exports and webhooks. Every contact field comes with its source. Authenticate with a bearer API key; send JSON; receive JSON. This page is generated from the OpenAPI 3.1.0 spec, so it always matches what the API does. The API is available on the Agency plan.
- Base URL
https://omni.cloudgens.net/api/v1- Authentication
Authorization: Bearer ol_live_…- Version
OmniLead-Version: 2026-09-28- Rate limit
- 120 requests per minute per key
New to the API? Start with Authentication, Errors and Webhooks.
Search
Search the four lenses and reveal contacts. These are the only calls that spend credits.
/search1 credit per pageRuns a search in one lens and returns one page of 25 results. Each page costs 1 credit on a live key. Contact details are masked; call POST /reveals with a result's entity_id to see them. Filters use the same keys as the filter panel in the app, passed as filters[key]=value (repeat the key for several values).
Query parameters
lensstringrequiredWhich lens to search.
One of
leads,investors,researchers,grants.qstringFree-text query: names, topics, domains, programs.
Up to 200 characters.
filters[key]string mapLens filters. Leads:
industry,country,size,title. Investors:stage,sector,type,check_min,check_max,state. Researchers:region,country,institution,min_works,recency. Grants:agency,program,mechanism,deadline_before.pageintegerPage number, 1–40.
Default
1.Min 1, max 40.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
One page of results.
Show response attributesHide response attributes
objectstringrequiredAlways
search_results.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.querystringrequiredThe query you sent.
pageintegerrequiredPage number returned.
Min 1.
per_pageintegerrequiredResults per page. Always 25.
has_morebooleanrequiredWhether another page exists.
credits_chargedintegerrequiredCredits charged for this page: 1 on a live key, 0 on a test key.
livemodebooleanrequiredfalsewhen called with a test key.dataarray of SearchHitrequiredResults for this page. Contact details are masked until revealed.
Show child attributesHide child attributes
entity_idstringrequiredID to pass to
POST /reveals, prefixedent_.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.namestringrequiredOrganization, grant program or person name.
person_namestring | nullContact person, when the hit is an organization with a known contact.
titlestring | nullRole of the contact person.
organizationstring | nullOrganization, fund, institution or agency.
locationstring | nullCity, region and country.
email_maskedstring | nullrequiredMasked email, e.g.
d•••••@harborpoint.example.nullif no email is known yet.email_statusstring | nullVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.phone_maskedstring | nullMasked phone number.
revealedbooleanrequiredWhether this workspace already revealed this entity. Revealing again is free.
match_scoreinteger | nullInvestors lens: fit against your opportunity profile.
nullelsewhere.Min 0, max 100.
detailsobjectrequiredLens-specific fields: stages, sectors and check size for investors; topics, works count and ORCID for researchers; agency, amount and deadline for grants.
sourcesarray of SourcerequiredWhere each shown value came from.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 402insufficient_credits The workspace doesn't have enough credits for a search page or reveal. Nothing was charged.
- 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/search \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'lens=investors' \
--data-urlencode 'q=fintech' \
--data-urlencode 'filters[stage]=seed' \
--data-urlencode 'filters[sector]=software'const params = new URLSearchParams({ lens: "investors", q: "fintech", "filters[stage]": "seed", "filters[sector]": "software" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/search?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/search",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"lens": "investors",
"q": "fintech",
"filters[stage]": "seed",
"filters[sector]": "software",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "search_results",
"lens": "investors",
"query": "fintech",
"page": 1,
"per_page": 25,
"has_more": true,
"credits_charged": 1,
"livemode": true,
"data": [
{
"entity_id": "ent_inv_3Jd8Kq",
"lens": "investors",
"name": "Harbor Point Ventures",
"title": "Managing Partner",
"person_name": "Daniel Okafor",
"organization": "Harbor Point Ventures",
"location": "Boston, MA, US",
"email_masked": "d•••••@harborpoint.example",
"email_status": "valid",
"phone_masked": null,
"revealed": false,
"match_score": 82,
"details": {
"stages": [
"seed",
"series-a"
],
"sectors": [
"software",
"fintech"
],
"check_size_usd": {
"min": 250000,
"max": 1500000
},
"last_filing_at": "2026-08-21"
},
"sources": [
{
"field": "organization",
"value": "Harbor Point Ventures",
"source_url": "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000000000&type=D",
"provider": "sec_edgar",
"fetched_at": "2026-09-02T06:00:12Z"
}
]
}
]
}/reveals1 creditChanges dataReveals the email and phone for a search result, verifies the email, and saves the result as a lead. Costs 1 credit. Revealing an entity this workspace already revealed is free. If no verifiable contact is found, the credit is refunded and status is no_contact_found.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
entity_idstringrequiredThe
entity_idfrom a search result.
Returns 200
Already revealed. Returned free of charge. 201: The revealed contact.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
rev_.objectstringrequiredAlways
reveal.entity_idstringrequiredThe entity you revealed.
lead_idstring | nullrequiredThe lead created or updated in your CRM.
nullfor test-key dry runs.statusstringrequiredrevealed: details returned.no_contact_found: nothing verifiable was found and the credit was refunded.dry_run: test key, nothing charged.One of
revealed,no_contact_found,dry_run.emailstring | nullrequiredRevealed email.
email_statusstring | nullVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullRevealed phone number in E.164.
credits_chargedintegerrequiredNet credits charged: 1 for a first reveal, 0 for a repeat, a refund or a dry run.
Min 0, max 1.
already_revealedbooleanrequiredtruewhen this workspace had already revealed the entity. Repeat reveals are free.livemodebooleanrequiredfalsewhen called with a test key.sourcesarray of SourcerequiredWhere each revealed value was found.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
created_atstring (date-time)requiredWhen the reveal happened.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 402insufficient_credits The workspace doesn't have enough credits for a search page or reveal. Nothing was charged.
- 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/reveals \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"entity_id": "ent_inv_3Jd8Kq"
}'const res = await fetch("https://omni.cloudgens.net/api/v1/reveals", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
entity_id: "ent_inv_3Jd8Kq",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/reveals",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"entity_id": "ent_inv_3Jd8Kq",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "rev_6Nq1xT8bWm",
"object": "reveal",
"entity_id": "ent_inv_3Jd8Kq",
"lead_id": "lead_5Zr4kP7cNe",
"status": "revealed",
"email": "daniel@harborpoint.example",
"email_status": "valid",
"email_confidence": 94,
"phone": null,
"credits_charged": 0,
"already_revealed": true,
"livemode": true,
"sources": [
{
"field": "email",
"value": "daniel@harborpoint.example",
"source_url": "https://harborpoint.example/team",
"provider": "crawler",
"fetched_at": "2026-09-28T09:41:07Z"
}
],
"created_at": "2026-09-28T09:41:08Z"
}Leads
People and organizations in your CRM, each with provenance.
/leadsLists leads in the workspace, newest first. Filter by lens, tag, pipeline stage or update time.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.lensstringOnly leads from this lens.
One of
leads,investors,researchers,grants.tagstringOnly leads with this tag name.
stage_idstringOnly leads in this stage.
qstringMatch name, email or company.
updated_sincestring (date-time)Only leads changed after this time.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of leads.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of LeadrequiredLeads on this page.
Show child attributesHide child attributes
idstringrequiredread-onlyUnique ID, prefixed
lead_.objectstringrequiredAlways
lead.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.first_namestring | nullFirst name.
last_namestring | nullLast name.
full_namestringrequiredDisplay name. For organizations (funds, grant programs) this is the organization name.
titlestring | nullJob title or role.
emailstring | nullrequiredEmail address.
nulluntil revealed.email_statusstring | nullrequiredVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullPhone number in E.164 format.
websitestring (uri) | nullWebsite URL.
company_idstring | nullLinked company ID, prefixed
co_.company_namestring | nullCompany or organization name.
countrystring | nullISO 3166-1 alpha-2 country code. Drives per-country sending rules.
revealedbooleanrequiredWhether contact details have been revealed in this workspace.
lawful_basisstringrequiredGDPR lawful basis recorded for this lead.
One of
legitimate_interest,consent,contract.owner_idstring | nullWorkspace member who owns the lead.
tagsarray of stringsrequiredTag names.
stageobject (StageRef) | nullrequiredThe lead's current pipeline stage, or
nullif the lead isn't in a pipeline.Show child attributesHide child attributes
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID.
namestringrequiredStage name.
custom_fieldsobjectCustom field values keyed by field key.
created_atstring (date-time)requiredWhen the lead was created.
updated_atstring (date-time)requiredWhen the lead last changed.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/leads \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25' \
--data-urlencode 'q=northwind'const params = new URLSearchParams({ limit: "25", q: "northwind" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/leads?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/leads",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
"q": "northwind",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"lens": "leads",
"first_name": "Maya",
"last_name": "Lindqvist",
"full_name": "Maya Lindqvist",
"title": "Head of Operations",
"email": "maya@northwind.example",
"email_status": "valid",
"email_confidence": 96,
"phone": "+442071838750",
"website": "https://northwind.example",
"company_id": "co_4Tn8wQ2pLs",
"company_name": "Northwind Logistics",
"country": "GB",
"revealed": true,
"lawful_basis": "legitimate_interest",
"owner_id": "usr_2Pk9sX1aVe",
"tags": [
"q4-outreach"
],
"stage": {
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Qualified01",
"name": "Qualified"
},
"custom_fields": {
"fleet_size": "120"
},
"created_at": "2026-09-12T08:15:40Z",
"updated_at": "2026-09-20T14:02:11Z"
}
],
"has_more": true,
"next_cursor": "lead_7Hq2mR9xKd"
}/leadsChanges dataAdds a lead you found yourself. No credits are charged. The email is checked against your suppression list and the global opt-out list; suppressed addresses are saved but can't be enrolled. Send source_url so the lead has provenance.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
lensstringThe lens the record came from.
One of
leads,investors,researchers,grants.Default"leads".first_namestringFirst name.
Up to 120 characters.
last_namestringLast name.
Up to 120 characters.
full_namestringRequired when first and last name are empty, e.g. for an organization.
Up to 240 characters.
titlestringJob title.
Up to 200 characters.
emailstring (email)Email address. Checked against your suppression list.
phonestringPhone number. Normalized to E.164.
websitestring (uri)Website URL.
company_namestringCompany name. Matched to an existing company by domain, or created.
company_domainstringCompany domain, e.g.
northwind.example.countrystringISO 3166-1 alpha-2 country code.
Up to 2 characters.
lawful_basisstringGDPR lawful basis.
One of
legitimate_interest,consent,contract.Default"legitimate_interest".source_urlstring (uri)Where you found this person. Stored as provenance with provider
api.tagsarray of stringsTag names. Missing tags are created.
Up to 20 items.
custom_fieldsobjectValues keyed by custom field key.
Returns 201
The created lead.
Show response attributesHide response attributes
idstringrequiredread-onlyUnique ID, prefixed
lead_.objectstringrequiredAlways
lead.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.first_namestring | nullFirst name.
last_namestring | nullLast name.
full_namestringrequiredDisplay name. For organizations (funds, grant programs) this is the organization name.
titlestring | nullJob title or role.
emailstring | nullrequiredEmail address.
nulluntil revealed.email_statusstring | nullrequiredVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullPhone number in E.164 format.
websitestring (uri) | nullWebsite URL.
company_idstring | nullLinked company ID, prefixed
co_.company_namestring | nullCompany or organization name.
countrystring | nullISO 3166-1 alpha-2 country code. Drives per-country sending rules.
revealedbooleanrequiredWhether contact details have been revealed in this workspace.
lawful_basisstringrequiredGDPR lawful basis recorded for this lead.
One of
legitimate_interest,consent,contract.owner_idstring | nullWorkspace member who owns the lead.
tagsarray of stringsrequiredTag names.
stageobject (StageRef) | nullrequiredThe lead's current pipeline stage, or
nullif the lead isn't in a pipeline.Show child attributesHide child attributes
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID.
namestringrequiredStage name.
custom_fieldsobjectCustom field values keyed by field key.
created_atstring (date-time)requiredWhen the lead was created.
updated_atstring (date-time)requiredWhen the lead last changed.
sourcesarray of SourcerequiredProvenance for every stored field.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/leads \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Maya",
"last_name": "Lindqvist",
"email": "maya@northwind.example",
"title": "Head of Operations",
"company_name": "Northwind Logistics",
"company_domain": "northwind.example",
"country": "GB",
"source_url": "https://northwind.example/team",
"tags": [
"q4-outreach"
]
}'const res = await fetch("https://omni.cloudgens.net/api/v1/leads", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
first_name: "Maya",
last_name: "Lindqvist",
email: "maya@northwind.example",
title: "Head of Operations",
company_name: "Northwind Logistics",
company_domain: "northwind.example",
country: "GB",
source_url: "https://northwind.example/team",
tags: ["q4-outreach"],
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/leads",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"first_name": "Maya",
"last_name": "Lindqvist",
"email": "maya@northwind.example",
"title": "Head of Operations",
"company_name": "Northwind Logistics",
"company_domain": "northwind.example",
"country": "GB",
"source_url": "https://northwind.example/team",
"tags": ["q4-outreach"],
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"lens": "leads",
"first_name": "Maya",
"last_name": "Lindqvist",
"full_name": "Maya Lindqvist",
"title": "Head of Operations",
"email": "maya@northwind.example",
"email_status": "valid",
"email_confidence": 96,
"phone": "+442071838750",
"website": "https://northwind.example",
"company_id": "co_4Tn8wQ2pLs",
"company_name": "Northwind Logistics",
"country": "GB",
"revealed": true,
"lawful_basis": "legitimate_interest",
"owner_id": "usr_2Pk9sX1aVe",
"tags": [
"q4-outreach"
],
"stage": {
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Qualified01",
"name": "Qualified"
},
"custom_fields": {
"fleet_size": "120"
},
"created_at": "2026-09-12T08:15:40Z",
"updated_at": "2026-09-20T14:02:11Z",
"sources": [
{
"field": "email",
"value": "maya@northwind.example",
"source_url": "https://northwind.example/team",
"provider": "crawler",
"fetched_at": "2026-09-12T08:14:03Z"
},
{
"field": "title",
"value": "Head of Operations",
"source_url": "https://northwind.example/team",
"provider": "crawler",
"fetched_at": "2026-09-12T08:14:03Z"
}
]
}/leads/{id}Returns one lead with sources[]: the source URL, provider and fetch date behind every stored field.
Path parameters
idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
The lead.
Show response attributesHide response attributes
idstringrequiredread-onlyUnique ID, prefixed
lead_.objectstringrequiredAlways
lead.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.first_namestring | nullFirst name.
last_namestring | nullLast name.
full_namestringrequiredDisplay name. For organizations (funds, grant programs) this is the organization name.
titlestring | nullJob title or role.
emailstring | nullrequiredEmail address.
nulluntil revealed.email_statusstring | nullrequiredVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullPhone number in E.164 format.
websitestring (uri) | nullWebsite URL.
company_idstring | nullLinked company ID, prefixed
co_.company_namestring | nullCompany or organization name.
countrystring | nullISO 3166-1 alpha-2 country code. Drives per-country sending rules.
revealedbooleanrequiredWhether contact details have been revealed in this workspace.
lawful_basisstringrequiredGDPR lawful basis recorded for this lead.
One of
legitimate_interest,consent,contract.owner_idstring | nullWorkspace member who owns the lead.
tagsarray of stringsrequiredTag names.
stageobject (StageRef) | nullrequiredThe lead's current pipeline stage, or
nullif the lead isn't in a pipeline.Show child attributesHide child attributes
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID.
namestringrequiredStage name.
custom_fieldsobjectCustom field values keyed by field key.
created_atstring (date-time)requiredWhen the lead was created.
updated_atstring (date-time)requiredWhen the lead last changed.
sourcesarray of SourcerequiredProvenance for every stored field.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd", {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"lens": "leads",
"first_name": "Maya",
"last_name": "Lindqvist",
"full_name": "Maya Lindqvist",
"title": "Head of Operations",
"email": "maya@northwind.example",
"email_status": "valid",
"email_confidence": 96,
"phone": "+442071838750",
"website": "https://northwind.example",
"company_id": "co_4Tn8wQ2pLs",
"company_name": "Northwind Logistics",
"country": "GB",
"revealed": true,
"lawful_basis": "legitimate_interest",
"owner_id": "usr_2Pk9sX1aVe",
"tags": [
"q4-outreach"
],
"stage": {
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Qualified01",
"name": "Qualified"
},
"custom_fields": {
"fleet_size": "120"
},
"created_at": "2026-09-12T08:15:40Z",
"updated_at": "2026-09-20T14:02:11Z",
"sources": [
{
"field": "email",
"value": "maya@northwind.example",
"source_url": "https://northwind.example/team",
"provider": "crawler",
"fetched_at": "2026-09-12T08:14:03Z"
},
{
"field": "title",
"value": "Head of Operations",
"source_url": "https://northwind.example/team",
"provider": "crawler",
"fetched_at": "2026-09-12T08:14:03Z"
}
]
}/leads/{id}Changes dataChanges the fields you send and leaves the rest. Emits lead.updated.
Path parameters
idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Request body
first_namestringFirst name.
last_namestringLast name.
titlestringJob title.
phonestring | nullPhone number, or
nullto clear.websitestring | nullWebsite URL, or
nullto clear.countrystring | nullISO country code, or
nullto clear.lawful_basisstringGDPR lawful basis.
One of
legitimate_interest,consent,contract.owner_idstring | nullMember ID to assign, or
nullto unassign.custom_fieldsobjectValues to set.
nullclears a field.
Returns 200
The updated lead.
Show response attributesHide response attributes
idstringrequiredread-onlyUnique ID, prefixed
lead_.objectstringrequiredAlways
lead.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.first_namestring | nullFirst name.
last_namestring | nullLast name.
full_namestringrequiredDisplay name. For organizations (funds, grant programs) this is the organization name.
titlestring | nullJob title or role.
emailstring | nullrequiredEmail address.
nulluntil revealed.email_statusstring | nullrequiredVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullPhone number in E.164 format.
websitestring (uri) | nullWebsite URL.
company_idstring | nullLinked company ID, prefixed
co_.company_namestring | nullCompany or organization name.
countrystring | nullISO 3166-1 alpha-2 country code. Drives per-country sending rules.
revealedbooleanrequiredWhether contact details have been revealed in this workspace.
lawful_basisstringrequiredGDPR lawful basis recorded for this lead.
One of
legitimate_interest,consent,contract.owner_idstring | nullWorkspace member who owns the lead.
tagsarray of stringsrequiredTag names.
stageobject (StageRef) | nullrequiredThe lead's current pipeline stage, or
nullif the lead isn't in a pipeline.Show child attributesHide child attributes
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID.
namestringrequiredStage name.
custom_fieldsobjectCustom field values keyed by field key.
created_atstring (date-time)requiredWhen the lead was created.
updated_atstring (date-time)requiredWhen the lead last changed.
sourcesarray of SourcerequiredProvenance for every stored field.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X PATCH https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Content-Type: application/json" \
-d '{
"title": "COO",
"custom_fields": {
"fleet_size": "140"
}
}'const res = await fetch("https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "COO",
custom_fields: {
fleet_size: "140",
},
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.patch(
"https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
json={
"title": "COO",
"custom_fields": {
"fleet_size": "140",
},
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"lens": "leads",
"first_name": "Maya",
"last_name": "Lindqvist",
"full_name": "Maya Lindqvist",
"title": "COO",
"email": "maya@northwind.example",
"email_status": "valid",
"email_confidence": 96,
"phone": "+442071838750",
"website": "https://northwind.example",
"company_id": "co_4Tn8wQ2pLs",
"company_name": "Northwind Logistics",
"country": "GB",
"revealed": true,
"lawful_basis": "legitimate_interest",
"owner_id": "usr_2Pk9sX1aVe",
"tags": [
"q4-outreach"
],
"stage": {
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Qualified01",
"name": "Qualified"
},
"custom_fields": {
"fleet_size": "140"
},
"created_at": "2026-09-12T08:15:40Z",
"updated_at": "2026-09-20T14:02:11Z",
"sources": [
{
"field": "email",
"value": "maya@northwind.example",
"source_url": "https://northwind.example/team",
"provider": "crawler",
"fetched_at": "2026-09-12T08:14:03Z"
},
{
"field": "title",
"value": "Head of Operations",
"source_url": "https://northwind.example/team",
"provider": "crawler",
"fetched_at": "2026-09-12T08:14:03Z"
}
]
}/leads/{id}Changes dataPermanently deletes the lead, its notes, tasks and enrollments. Active sequences stop for this lead. To stop contacting someone but keep a record, add a suppression instead.
Path parameters
idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
Deleted.
Show response attributesHide response attributes
idstringrequiredID of the deleted object.
objectstringrequiredType of the deleted object.
deletedbooleanrequiredAlways
true.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X DELETE https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.delete(
"https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"deleted": true
}Companies
Companies linked to your leads.
/companiesLists companies linked to leads in your workspace.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.qstringMatch name or domain.
countrystringISO country code.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of companies.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of CompanyrequiredCompanies on this page.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
co_.objectstringrequiredAlways
company.namestringrequiredCompany name.
domainstring | nullrequiredPrimary domain.
industrystring | nullIndustry key.
sizestring | nullEmployee range.
One of
1-10,11-50,51-200,201-500,501-1000,1001+.countrystring | nullISO country code.
citystring | nullCity.
descriptionstring | nullShort description from the company's own site.
lead_countintegerrequiredLeads linked to this company in your workspace.
sourcesarray of SourcerequiredProvenance for the company fields.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
created_atstring (date-time)requiredWhen the company was created.
updated_atstring (date-time)requiredWhen the company last changed.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/companies \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25' \
--data-urlencode 'q=northwind'const params = new URLSearchParams({ limit: "25", q: "northwind" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/companies?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/companies",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
"q": "northwind",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "co_4Tn8wQ2pLs",
"object": "company",
"name": "Northwind Logistics",
"domain": "northwind.example",
"industry": "logistics",
"size": "51-200",
"country": "GB",
"city": "London",
"description": "Freight forwarding and warehousing for UK retailers.",
"lead_count": 3,
"sources": [
{
"field": "domain",
"value": "northwind.example",
"source_url": "https://northwind.example",
"provider": "crawler",
"fetched_at": "2026-09-12T08:13:51Z"
}
],
"created_at": "2026-09-12T08:13:51Z",
"updated_at": "2026-09-12T08:15:40Z"
}
],
"has_more": false,
"next_cursor": null
}/companies/{id}Returns one company with provenance for its fields.
Path parameters
idstringrequiredCompany ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
The company.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
co_.objectstringrequiredAlways
company.namestringrequiredCompany name.
domainstring | nullrequiredPrimary domain.
industrystring | nullIndustry key.
sizestring | nullEmployee range.
One of
1-10,11-50,51-200,201-500,501-1000,1001+.countrystring | nullISO country code.
citystring | nullCity.
descriptionstring | nullShort description from the company's own site.
lead_countintegerrequiredLeads linked to this company in your workspace.
sourcesarray of SourcerequiredProvenance for the company fields.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
created_atstring (date-time)requiredWhen the company was created.
updated_atstring (date-time)requiredWhen the company last changed.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl https://omni.cloudgens.net/api/v1/companies/co_4Tn8wQ2pLs \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/companies/co_4Tn8wQ2pLs", {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/companies/co_4Tn8wQ2pLs",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "co_4Tn8wQ2pLs",
"object": "company",
"name": "Northwind Logistics",
"domain": "northwind.example",
"industry": "logistics",
"size": "51-200",
"country": "GB",
"city": "London",
"description": "Freight forwarding and warehousing for UK retailers.",
"lead_count": 3,
"sources": [
{
"field": "domain",
"value": "northwind.example",
"source_url": "https://northwind.example",
"provider": "crawler",
"fetched_at": "2026-09-12T08:13:51Z"
}
],
"created_at": "2026-09-12T08:13:51Z",
"updated_at": "2026-09-12T08:15:40Z"
}Pipelines
Pipelines, stages and moving leads between them.
/pipelinesLists every pipeline with its stages in order. Use the stage IDs with PUT /leads/{id}/stage.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
All pipelines.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of PipelinerequiredPipelines.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
pl_.objectstringrequiredAlways
pipeline.namestringrequiredPipeline name.
lensstring | nullLens the pipeline template was made for, if any.
One of
leads,investors,researchers,grants.is_defaultbooleanrequiredWhether new leads land in this pipeline.
stagesarray of StagerequiredStages in order.
Show child attributesHide child attributes
idstringrequiredStage ID, prefixed
st_.namestringrequiredStage name.
positionintegerrequiredZero-based order in the pipeline.
kindstringrequiredwonandloststages close the deal.One of
open,won,lost.
created_atstring (date-time)requiredWhen the pipeline was created.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl https://omni.cloudgens.net/api/v1/pipelines \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/pipelines", {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/pipelines",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "pl_9Wc3nB6tYr",
"object": "pipeline",
"name": "Sales",
"lens": "leads",
"is_default": true,
"stages": [
{
"id": "st_New000001",
"name": "New",
"position": 0,
"kind": "open"
},
{
"id": "st_Contacted1",
"name": "Contacted",
"position": 1,
"kind": "open"
},
{
"id": "st_Replied001",
"name": "Replied",
"position": 2,
"kind": "open"
},
{
"id": "st_Qualified01",
"name": "Qualified",
"position": 3,
"kind": "open"
},
{
"id": "st_Won0000001",
"name": "Won",
"position": 4,
"kind": "won"
},
{
"id": "st_Lost000001",
"name": "Lost",
"position": 5,
"kind": "lost"
}
],
"created_at": "2026-08-30T10:00:00Z"
}
],
"has_more": false,
"next_cursor": null
}/leads/{id}/stageChanges dataPuts the lead in the given pipeline stage, adding it to the pipeline if needed. Emits lead.stage_changed.
Path parameters
idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Request body
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID in that pipeline.
Returns 200
The new stage.
Show response attributesHide response attributes
objectstringrequiredAlways
lead_stage.lead_idstringrequiredLead ID.
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredNew stage ID.
previous_stage_idstring | nullrequiredStage before the move, or
nullif the lead wasn't in this pipeline.changed_atstring (date-time)requiredWhen the move happened.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X PUT https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/stage \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Content-Type: application/json" \
-d '{
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Won0000001"
}'const res = await fetch("https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/stage", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Content-Type": "application/json",
},
body: JSON.stringify({
pipeline_id: "pl_9Wc3nB6tYr",
stage_id: "st_Won0000001",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.put(
"https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/stage",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
json={
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Won0000001",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "lead_stage",
"lead_id": "lead_7Hq2mR9xKd",
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Won0000001",
"previous_stage_id": "st_Qualified01",
"changed_at": "2026-09-28T10:40:00Z"
}/tagsLists every tag in the workspace with its lead count.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of tags.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of TagrequiredTags.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
tag_.objectstringrequiredAlways
tag.namestringrequiredTag name, unique in the workspace.
colorstringrequiredDisplay color.
One of
gray,blue,green,amber,red,violet.lead_countintegerrequiredLeads with this tag.
created_atstring (date-time)requiredWhen the tag was created.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/tags \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25'const params = new URLSearchParams({ limit: "25" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/tags?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/tags",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "tag_3Fs8vK1mQa",
"object": "tag",
"name": "q4-outreach",
"color": "blue",
"lead_count": 42,
"created_at": "2026-09-01T09:00:00Z"
}
],
"has_more": false,
"next_cursor": null
}/leads/{id}/tagsChanges dataAdds tags to a lead. Tags that don't exist yet are created. Adding a tag the lead already has does nothing.
Path parameters
idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
tagsarray of stringsrequiredTag names to add. Missing tags are created.
At least 1 item, up to 20 items.
Returns 200
The lead's tags.
Show response attributesHide response attributes
objectstringrequiredAlways
lead_tags.lead_idstringrequiredLead ID.
tagsarray of stringsrequiredAll tags on the lead after the change.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/tags \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"tags": [
"q4-outreach",
"warm"
]
}'const res = await fetch("https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/tags", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
tags: ["q4-outreach", "warm"],
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/tags",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"tags": ["q4-outreach", "warm"],
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "lead_tags",
"lead_id": "lead_7Hq2mR9xKd",
"tags": [
"q4-outreach",
"warm"
]
}Notes & tasks
Timeline notes and follow-up tasks.
/leads/{id}/notesChanges dataAdds a note to the lead's timeline.
Path parameters
idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
bodystringrequiredNote text. Plain text or Markdown.
Up to 10000 characters.
Returns 201
The note.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
note_.objectstringrequiredAlways
note.lead_idstringrequiredLead ID.
bodystringrequiredNote text.
author_idstring | nullrequiredMember who wrote it.
nullfor notes created with an API key.created_atstring (date-time)requiredWhen the note was created.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/notes \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"body": "Asked for pricing for 3 seats. Follow up after their board meeting on Oct 6."
}'const res = await fetch("https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/notes", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
body: "Asked for pricing for 3 seats. Follow up after their board meeting on Oct 6.",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/leads/lead_7Hq2mR9xKd/notes",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"body": "Asked for pricing for 3 seats. Follow up after their board meeting on Oct 6.",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "note_8Lp2dW5rTy",
"object": "note",
"lead_id": "lead_7Hq2mR9xKd",
"body": "Asked for pricing for 3 seats. Follow up after their board meeting on Oct 6.",
"author_id": null,
"created_at": "2026-09-28T10:12:44Z"
}/tasksLists tasks, soonest due first.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.statusstringFilter by status.
One of
open,done.lead_idstringOnly tasks for this lead.
due_beforestring (date-time)Only tasks due before this time.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of tasks.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of TaskrequiredTasks.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
task_.objectstringrequiredAlways
task.titlestringrequiredWhat needs doing.
lead_idstring | nullrequiredRelated lead, if any.
assignee_idstring | nullrequiredMember responsible.
statusstringrequiredTask status.
One of
open,done.due_atstring (date-time) | nullrequiredDue date and time.
completed_atstring (date-time) | nullrequiredWhen the task was marked done.
created_atstring (date-time)requiredWhen the task was created.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/tasks \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25'const params = new URLSearchParams({ limit: "25" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/tasks?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/tasks",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "task_1Vb7nH3kZe",
"object": "task",
"title": "Send pricing to Maya",
"lead_id": "lead_7Hq2mR9xKd",
"assignee_id": "usr_2Pk9sX1aVe",
"status": "open",
"due_at": "2026-10-06T09:00:00Z",
"completed_at": null,
"created_at": "2026-09-28T10:13:02Z"
}
],
"has_more": false,
"next_cursor": null
}/tasksChanges dataCreates a task, optionally linked to a lead. Tasks with a due date show on the assignee's home screen.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
titlestringrequiredWhat needs doing.
Up to 300 characters.
lead_idstringRelated lead.
assignee_idstringMember to assign. Defaults to the workspace owner.
due_atstring (date-time)Due date and time.
Returns 201
The task.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
task_.objectstringrequiredAlways
task.titlestringrequiredWhat needs doing.
lead_idstring | nullrequiredRelated lead, if any.
assignee_idstring | nullrequiredMember responsible.
statusstringrequiredTask status.
One of
open,done.due_atstring (date-time) | nullrequiredDue date and time.
completed_atstring (date-time) | nullrequiredWhen the task was marked done.
created_atstring (date-time)requiredWhen the task was created.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/tasks \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Send pricing to Maya",
"lead_id": "lead_7Hq2mR9xKd",
"due_at": "2026-10-06T09:00:00Z"
}'const res = await fetch("https://omni.cloudgens.net/api/v1/tasks", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Send pricing to Maya",
lead_id: "lead_7Hq2mR9xKd",
due_at: "2026-10-06T09:00:00Z",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/tasks",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"title": "Send pricing to Maya",
"lead_id": "lead_7Hq2mR9xKd",
"due_at": "2026-10-06T09:00:00Z",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "task_1Vb7nH3kZe",
"object": "task",
"title": "Send pricing to Maya",
"lead_id": "lead_7Hq2mR9xKd",
"assignee_id": "usr_2Pk9sX1aVe",
"status": "open",
"due_at": "2026-10-06T09:00:00Z",
"completed_at": null,
"created_at": "2026-09-28T10:13:02Z"
}/tasks/{id}Changes dataChanges a task. Set status to done to complete it.
Path parameters
idstringrequiredTask ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Request body
titlestringWhat needs doing.
statusstringSet to
doneto complete the task.One of
open,done.due_atstring (date-time) | nullDue date, or
nullto clear.assignee_idstring | nullMember to assign, or
nullto unassign.
Returns 200
The task.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
task_.objectstringrequiredAlways
task.titlestringrequiredWhat needs doing.
lead_idstring | nullrequiredRelated lead, if any.
assignee_idstring | nullrequiredMember responsible.
statusstringrequiredTask status.
One of
open,done.due_atstring (date-time) | nullrequiredDue date and time.
completed_atstring (date-time) | nullrequiredWhen the task was marked done.
created_atstring (date-time)requiredWhen the task was created.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X PATCH https://omni.cloudgens.net/api/v1/tasks/task_1Vb7nH3kZe \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Content-Type: application/json" \
-d '{
"status": "done"
}'const res = await fetch("https://omni.cloudgens.net/api/v1/tasks/task_1Vb7nH3kZe", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Content-Type": "application/json",
},
body: JSON.stringify({
status: "done",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.patch(
"https://omni.cloudgens.net/api/v1/tasks/task_1Vb7nH3kZe",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
json={
"status": "done",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "task_1Vb7nH3kZe",
"object": "task",
"title": "Send pricing to Maya",
"lead_id": "lead_7Hq2mR9xKd",
"assignee_id": "usr_2Pk9sX1aVe",
"status": "done",
"due_at": "2026-10-06T09:00:00Z",
"completed_at": "2026-10-06T08:12:00Z",
"created_at": "2026-09-28T10:13:02Z"
}Sequences
Read sequences and manage who is enrolled.
/sequencesLists sequences with their steps and stats. Sequences are created and launched in the app, where the pre-launch checklist runs.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.statusstringFilter by status.
One of
draft,active,paused,completed.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of sequences.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of SequencerequiredSequences.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
seq_.objectstringrequiredAlways
sequence.namestringrequiredSequence name.
lensstring | nullLens template it was built from, if any.
One of
leads,investors,researchers,grants.statusstringrequiredSequence status. Only
activesequences send.One of
draft,active,paused,completed.mailbox_idsarray of stringsrequiredMailboxes it rotates through.
business_days_onlybooleanrequiredWhether waits count business days only.
stepsarray of SequenceSteprequiredSteps in order.
Show child attributesHide child attributes
positionintegerrequired1-based order.
typestringrequiredStep type.
One of
email,wait.subjectstring | nullrequiredSubject line with merge tags, for email steps.
wait_daysinteger | nullrequiredDays to wait, for wait steps.
statsobjectrequiredShow child attributesHide child attributes
enrolledintegerrequiredLeads ever enrolled.
activeintegerrequiredLeads still in progress.
sentintegerrequiredEmails sent.
repliedintegerrequiredLeads who replied.
bouncedintegerrequiredHard bounces.
unsubscribedintegerrequiredUnsubscribes.
created_atstring (date-time)requiredWhen the sequence was created.
launched_atstring (date-time) | nullrequiredWhen it was first launched.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/sequences \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25'const params = new URLSearchParams({ limit: "25" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/sequences?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/sequences",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "seq_5Kd9wP2xLm",
"object": "sequence",
"name": "Seed round — first touch",
"lens": "investors",
"status": "active",
"mailbox_ids": [
"mbx_8Tq3rN6yHs"
],
"business_days_only": true,
"steps": [
{
"position": 1,
"type": "email",
"subject": "{{company|Our}} seed round",
"wait_days": null
},
{
"position": 2,
"type": "wait",
"subject": null,
"wait_days": 3
},
{
"position": 3,
"type": "email",
"subject": "Re: {{company|Our}} seed round",
"wait_days": null
}
],
"stats": {
"enrolled": 64,
"active": 38,
"sent": 102,
"replied": 9,
"bounced": 1,
"unsubscribed": 0
},
"created_at": "2026-09-10T15:20:00Z",
"launched_at": "2026-09-11T08:00:00Z"
}
],
"has_more": false,
"next_cursor": null
}/sequences/{id}Returns one sequence with its steps and stats.
Path parameters
idstringrequiredSequence ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
The sequence.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
seq_.objectstringrequiredAlways
sequence.namestringrequiredSequence name.
lensstring | nullLens template it was built from, if any.
One of
leads,investors,researchers,grants.statusstringrequiredSequence status. Only
activesequences send.One of
draft,active,paused,completed.mailbox_idsarray of stringsrequiredMailboxes it rotates through.
business_days_onlybooleanrequiredWhether waits count business days only.
stepsarray of SequenceSteprequiredSteps in order.
Show child attributesHide child attributes
positionintegerrequired1-based order.
typestringrequiredStep type.
One of
email,wait.subjectstring | nullrequiredSubject line with merge tags, for email steps.
wait_daysinteger | nullrequiredDays to wait, for wait steps.
statsobjectrequiredShow child attributesHide child attributes
enrolledintegerrequiredLeads ever enrolled.
activeintegerrequiredLeads still in progress.
sentintegerrequiredEmails sent.
repliedintegerrequiredLeads who replied.
bouncedintegerrequiredHard bounces.
unsubscribedintegerrequiredUnsubscribes.
created_atstring (date-time)requiredWhen the sequence was created.
launched_atstring (date-time) | nullrequiredWhen it was first launched.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm", {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "seq_5Kd9wP2xLm",
"object": "sequence",
"name": "Seed round — first touch",
"lens": "investors",
"status": "active",
"mailbox_ids": [
"mbx_8Tq3rN6yHs"
],
"business_days_only": true,
"steps": [
{
"position": 1,
"type": "email",
"subject": "{{company|Our}} seed round",
"wait_days": null
},
{
"position": 2,
"type": "wait",
"subject": null,
"wait_days": 3
},
{
"position": 3,
"type": "email",
"subject": "Re: {{company|Our}} seed round",
"wait_days": null
}
],
"stats": {
"enrolled": 64,
"active": 38,
"sent": 102,
"replied": 9,
"bounced": 1,
"unsubscribed": 0
},
"created_at": "2026-09-10T15:20:00Z",
"launched_at": "2026-09-11T08:00:00Z"
}/sequences/{id}/enrollmentsChanges dataAdds leads to a sequence. Each lead is checked the same way as in the app: suppressed addresses, invalid emails, leads already enrolled and recipients blocked by your country sending rules are skipped with a reason. On a test key nothing is enrolled; the response shows what would happen.
Path parameters
idstringrequiredSequence ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
lead_idsarray of stringsrequiredLeads to enroll. Up to 500 per request.
At least 1 item, up to 500 items.
Returns 201
Enrolled and skipped leads.
Show response attributesHide response attributes
objectstringrequiredAlways
enrollment_result.livemodebooleanrequiredfalsefor a test-key dry run: nothing was enrolled.enrolledarray of EnrollmentrequiredLeads enrolled by this request.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
enr_.objectstringrequiredAlways
enrollment.sequence_idstringrequiredSequence ID.
lead_idstringrequiredLead ID.
statusstringrequiredEnrollment status.
One of
active,paused,completed,stopped.current_stepintegerrequiredPosition of the next step to run.
next_send_atstring (date-time) | nullrequiredWhen the next email is scheduled.
enrolled_atstring (date-time)requiredWhen the lead was enrolled.
stopped_atstring (date-time) | nullrequiredWhen it stopped.
stop_reasonstring | nullrequiredWhy it stopped.
One of
replied,bounced,unsubscribed,removed,suppressed.
skippedarray of objectsrequiredLeads not enrolled, with the reason.
Show child attributesHide child attributes
lead_idstringrequiredLead ID.
reasonstringrequiredWhy it was skipped.
One of
already_enrolled,suppressed,no_email,email_invalid,country_blocked,not_found.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm/enrollments \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"lead_ids": [
"lead_7Hq2mR9xKd",
"lead_5Zr4kP7cNe"
]
}'const res = await fetch("https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm/enrollments", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
lead_ids: ["lead_7Hq2mR9xKd", "lead_5Zr4kP7cNe"],
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm/enrollments",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"lead_ids": ["lead_7Hq2mR9xKd", "lead_5Zr4kP7cNe"],
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "enrollment_result",
"livemode": true,
"enrolled": [
{
"id": "enr_2Mx6qT9vBc",
"object": "enrollment",
"sequence_id": "seq_5Kd9wP2xLm",
"lead_id": "lead_7Hq2mR9xKd",
"status": "active",
"current_step": 1,
"next_send_at": "2026-09-29T08:30:00Z",
"enrolled_at": "2026-09-28T10:20:00Z",
"stopped_at": null,
"stop_reason": null
}
],
"skipped": [
{
"lead_id": "lead_5Zr4kP7cNe",
"reason": "suppressed"
}
]
}/sequences/{id}/enrollments/{lead_id}Changes dataStops the sequence for one lead. No further steps are sent. The lead stays in your CRM.
Path parameters
idstringrequiredSequence ID.
lead_idstringrequiredLead ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
The stopped enrollment.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
enr_.objectstringrequiredAlways
enrollment.sequence_idstringrequiredSequence ID.
lead_idstringrequiredLead ID.
statusstringrequiredEnrollment status.
One of
active,paused,completed,stopped.current_stepintegerrequiredPosition of the next step to run.
next_send_atstring (date-time) | nullrequiredWhen the next email is scheduled.
enrolled_atstring (date-time)requiredWhen the lead was enrolled.
stopped_atstring (date-time) | nullrequiredWhen it stopped.
stop_reasonstring | nullrequiredWhy it stopped.
One of
replied,bounced,unsubscribed,removed,suppressed.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X DELETE https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm/enrollments/lead_7Hq2mR9xKd \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm/enrollments/lead_7Hq2mR9xKd", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.delete(
"https://omni.cloudgens.net/api/v1/sequences/seq_5Kd9wP2xLm/enrollments/lead_7Hq2mR9xKd",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "enr_2Mx6qT9vBc",
"object": "enrollment",
"sequence_id": "seq_5Kd9wP2xLm",
"lead_id": "lead_7Hq2mR9xKd",
"status": "stopped",
"current_step": 1,
"next_send_at": null,
"enrolled_at": "2026-09-28T10:20:00Z",
"stopped_at": "2026-09-28T10:45:00Z",
"stop_reason": "removed"
}Suppressions
Addresses and domains that are never emailed.
/suppressionsLists addresses and domains that will never be emailed from this workspace, including global opt-outs.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.typestringFilter by type.
One of
email,domain.qstringMatch the address or domain.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of suppressions.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of SuppressionrequiredSuppressions.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
sup_.objectstringrequiredAlways
suppression.typestringrequiredWhat is suppressed.
One of
email,domain.valuestringrequiredThe email address or domain.
reasonstringrequiredWhy it was added.
One of
unsubscribe,bounce,complaint,opt_out,manual.scopestringrequiredworkspaceentries are yours.globalentries come from the public opt-out portal and apply to every workspace.One of
workspace,global.created_atstring (date-time)requiredWhen it was added.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/suppressions \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25' \
--data-urlencode 'q=acme.example'const params = new URLSearchParams({ limit: "25", q: "acme.example" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/suppressions?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/suppressions",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
"q": "acme.example",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "sup_4Rk8mZ1nWd",
"object": "suppression",
"type": "email",
"value": "no-contact@acme.example",
"reason": "manual",
"scope": "workspace",
"created_at": "2026-09-28T10:25:00Z"
}
],
"has_more": false,
"next_cursor": null
}/suppressionsChanges dataAdds an email or domain to the workspace suppression list. Takes effect immediately: queued emails to it are cancelled and active enrollments stop. Emits unsubscribe.created when reason is unsubscribe.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
emailstring (email)Email address to suppress. Send exactly one of
emailordomain.domainstringDomain to suppress, e.g.
acme.example. Blocks every address at that domain.reasonstringWhy you're adding it.
One of
unsubscribe,complaint,manual.Default"manual".
Returns 201
The suppression.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
sup_.objectstringrequiredAlways
suppression.typestringrequiredWhat is suppressed.
One of
email,domain.valuestringrequiredThe email address or domain.
reasonstringrequiredWhy it was added.
One of
unsubscribe,bounce,complaint,opt_out,manual.scopestringrequiredworkspaceentries are yours.globalentries come from the public opt-out portal and apply to every workspace.One of
workspace,global.created_atstring (date-time)requiredWhen it was added.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/suppressions \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"email": "no-contact@acme.example",
"reason": "manual"
}'const res = await fetch("https://omni.cloudgens.net/api/v1/suppressions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
email: "no-contact@acme.example",
reason: "manual",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/suppressions",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"email": "no-contact@acme.example",
"reason": "manual",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "sup_4Rk8mZ1nWd",
"object": "suppression",
"type": "email",
"value": "no-contact@acme.example",
"reason": "manual",
"scope": "workspace",
"created_at": "2026-09-28T10:25:00Z"
}/creditsReturns plan and pack balances and the 20 most recent ledger entries. Plan credits are used before pack credits.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
The balance.
Show response attributesHide response attributes
objectstringrequiredAlways
credit_balance.planstringrequiredCurrent plan.
One of
free,starter,growth,agency.balanceobjectrequiredShow child attributesHide child attributes
planintegerrequiredPlan credits left this period. Used first; reset at renewal.
packintegerrequiredCredit-pack credits. Never expire; used after plan credits.
totalintegerrequiredplan + pack.
period_ends_atstring (date-time) | nullrequiredWhen plan credits renew.
ledgerarray of LedgerEntryrequiredThe 20 most recent ledger entries, newest first.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
cl_.typestringrequiredLedger entry type.
One of
grant,purchase,consume,refund,expire.amountintegerrequiredSigned amount. Negative for consumption and expiry.
reasonstringrequiredWhat caused it, e.g.
search_page,reveal,reveal_failed,plan_renewal,pack_2000.refstring | nullrequiredRelated object ID, e.g. a reveal or Stripe invoice.
poolstringrequiredWhich balance it affected.
One of
plan,pack.created_atstring (date-time)requiredWhen it was recorded.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl https://omni.cloudgens.net/api/v1/credits \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/credits", {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/credits",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "credit_balance",
"plan": "agency",
"balance": {
"plan": 18240,
"pack": 2000,
"total": 20240
},
"period_ends_at": "2026-10-14T00:00:00Z",
"ledger": [
{
"id": "cl_9Hn2kV5rXe",
"type": "consume",
"amount": -1,
"reason": "reveal",
"ref": "rev_6Nq1xT8bWm",
"pool": "plan",
"created_at": "2026-09-28T09:41:08Z"
},
{
"id": "cl_7Bq4mS1tYa",
"type": "refund",
"amount": 1,
"reason": "reveal_failed",
"ref": "rev_3Cw8pL2nQz",
"pool": "plan",
"created_at": "2026-09-28T09:38:51Z"
},
{
"id": "cl_5Dx1nR8wKp",
"type": "purchase",
"amount": 2000,
"reason": "pack_2000",
"ref": "cs_test_a1b2c3",
"pool": "pack",
"created_at": "2026-09-20T12:00:00Z"
},
{
"id": "cl_3Ft6vH9mLs",
"type": "grant",
"amount": 20000,
"reason": "plan_renewal",
"ref": "in_1Q2w3E4r",
"pool": "plan",
"created_at": "2026-09-14T00:00:05Z"
}
]
}Webhooks
Endpoints that receive signed event notifications.
/webhook_endpointsLists endpoints that receive events. Secrets are never returned here.
Query parameters
limitintegerObjects per page, 1–100.
Default
25.Min 1, max 100.starting_afterstringCursor from the previous page's
next_cursor.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
A page of endpoints.
Show response attributesHide response attributes
objectstringrequiredAlways
list.dataarray of WebhookEndpointrequiredEndpoints.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
we_.objectstringrequiredAlways
webhook_endpoint.urlstring (uri)requiredHTTPS URL that receives events.
descriptionstring | nullrequiredYour label.
eventsarray of stringsrequiredSubscribed event types.
*means all.statusstringrequireddisabledendpoints receive nothing.One of
enabled,disabled.created_atstring (date-time)requiredWhen it was created.
has_morebooleanrequiredWhether another page exists after this one.
next_cursorstring | nullrequiredPass as
starting_afterto fetch the next page.nullon the last page.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -G https://omni.cloudgens.net/api/v1/webhook_endpoints \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
--data-urlencode 'limit=25'const params = new URLSearchParams({ limit: "25" });
const res = await fetch(`https://omni.cloudgens.net/api/v1/webhook_endpoints?${params}`, {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/webhook_endpoints",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
params={
"limit": "25",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"object": "list",
"data": [
{
"id": "we_6Gp3tX8kNr",
"object": "webhook_endpoint",
"url": "https://hooks.example.com/omnilead",
"description": "CRM sync",
"events": [
"lead.created",
"lead.stage_changed",
"email.replied"
],
"status": "enabled",
"created_at": "2026-09-28T10:30:00Z"
}
],
"has_more": false,
"next_cursor": null
}/webhook_endpointsChanges dataRegisters an HTTPS URL for events. The response includes the signing secret once. Store it; you can't retrieve it again.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
urlstring (uri)requiredHTTPS URL that receives events.
eventsarray of stringsrequiredEvent types to send, or
["*"]for all.At least 1 item.
descriptionstringYour label.
Up to 200 characters.
Returns 201
The endpoint and its secret.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
we_.objectstringrequiredAlways
webhook_endpoint.urlstring (uri)requiredHTTPS URL that receives events.
descriptionstring | nullrequiredYour label.
eventsarray of stringsrequiredSubscribed event types.
*means all.statusstringrequireddisabledendpoints receive nothing.One of
enabled,disabled.created_atstring (date-time)requiredWhen it was created.
secretstringrequiredSigning secret, prefixed
whsec_. Returned only once, at creation.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/webhook_endpoints \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.example.com/omnilead",
"events": [
"lead.created",
"lead.stage_changed",
"email.replied"
],
"description": "CRM sync"
}'const res = await fetch("https://omni.cloudgens.net/api/v1/webhook_endpoints", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://hooks.example.com/omnilead",
events: ["lead.created", "lead.stage_changed", "email.replied"],
description: "CRM sync",
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/webhook_endpoints",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"url": "https://hooks.example.com/omnilead",
"events": ["lead.created", "lead.stage_changed", "email.replied"],
"description": "CRM sync",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "we_6Gp3tX8kNr",
"object": "webhook_endpoint",
"url": "https://hooks.example.com/omnilead",
"description": "CRM sync",
"events": [
"lead.created",
"lead.stage_changed",
"email.replied"
],
"status": "enabled",
"created_at": "2026-09-28T10:30:00Z",
"secret": "whsec_9f8e7d6c5b4a39281706f5e4d3c2b1a0"
}/webhook_endpoints/{id}Changes dataStops deliveries to the endpoint immediately. Deliveries already in retry are dropped.
Path parameters
idstringrequiredEndpoint ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
Deleted.
Show response attributesHide response attributes
idstringrequiredID of the deleted object.
objectstringrequiredType of the deleted object.
deletedbooleanrequiredAlways
true.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X DELETE https://omni.cloudgens.net/api/v1/webhook_endpoints/we_6Gp3tX8kNr \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/webhook_endpoints/we_6Gp3tX8kNr", {
method: "DELETE",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.delete(
"https://omni.cloudgens.net/api/v1/webhook_endpoints/we_6Gp3tX8kNr",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "we_6Gp3tX8kNr",
"object": "webhook_endpoint",
"deleted": true
}Exports
Background CSV and JSON exports.
/exportsChanges dataStarts a background export of leads as CSV or JSON. Poll GET /exports/{id} until status is completed, then download from download_url. Only revealed contact fields are exported. Exports are recorded in the audit log.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Idempotency-KeystringA unique value (a UUID works) that makes a POST safe to retry. Replays within 24 hours return the original response.
Up to 255 characters.
Request body
formatstringrequiredFile format.
One of
csv,json.filterobject (ExportFilter)All fields optional. An empty filter exports every lead.
Show child attributesHide child attributes
lensstringThe lens the record came from.
One of
leads,investors,researchers,grants.tagstringOnly leads with this tag.
pipeline_idstringOnly leads in this pipeline.
stage_idstringOnly leads in this stage.
list_idstringOnly leads in this list.
updated_sincestring (date-time)Only leads changed after this time.
Returns 202
The export job was queued.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
exp_.objectstringrequiredAlways
export.statusstringrequiredJob status.
One of
queued,processing,completed,failed.formatstringrequiredFile format.
One of
csv,json.filterobject (ExportFilter)requiredAll fields optional. An empty filter exports every lead.
Show child attributesHide child attributes
lensstringThe lens the record came from.
One of
leads,investors,researchers,grants.tagstringOnly leads with this tag.
pipeline_idstringOnly leads in this pipeline.
stage_idstringOnly leads in this stage.
list_idstringOnly leads in this list.
updated_sincestring (date-time)Only leads changed after this time.
row_countinteger | nullrequiredRows in the file, once completed.
download_urlstring (uri) | nullrequiredSigned download URL, once completed. Valid for 24 hours.
expires_atstring (date-time) | nullrequiredWhen
download_urlstops working.created_atstring (date-time)requiredWhen the job was created.
completed_atstring (date-time) | nullrequiredWhen the file was ready.
Errors
- 400invalid_request A parameter is missing, has the wrong type or fails validation.
error.paramnames the field. - 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 409conflict The request conflicts with current state, for example a duplicate email or an
Idempotency-Keyreused with a different body. - 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl -X POST https://omni.cloudgens.net/api/v1/exports \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"format": "csv",
"filter": {
"lens": "investors",
"tag": "seed-round"
}
}'const res = await fetch("https://omni.cloudgens.net/api/v1/exports", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
format: "csv",
filter: {
lens: "investors",
tag: "seed-round",
},
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import uuid
import requests
resp = requests.post(
"https://omni.cloudgens.net/api/v1/exports",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"format": "csv",
"filter": {
"lens": "investors",
"tag": "seed-round",
},
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "exp_8Wn2cK5vHt",
"object": "export",
"status": "queued",
"format": "csv",
"filter": {
"lens": "investors",
"tag": "seed-round"
},
"row_count": null,
"download_url": null,
"expires_at": null,
"created_at": "2026-09-28T10:32:00Z",
"completed_at": null
}/exports/{id}Returns the export job. download_url is set once status is completed and works for 24 hours.
Path parameters
idstringrequiredExport ID.
Headers
OmniLead-Versionstring (date)API version. Defaults to the version pinned on your key. Current: 2026-09-28.
Returns 200
The export.
Show response attributesHide response attributes
idstringrequiredUnique ID, prefixed
exp_.objectstringrequiredAlways
export.statusstringrequiredJob status.
One of
queued,processing,completed,failed.formatstringrequiredFile format.
One of
csv,json.filterobject (ExportFilter)requiredAll fields optional. An empty filter exports every lead.
Show child attributesHide child attributes
lensstringThe lens the record came from.
One of
leads,investors,researchers,grants.tagstringOnly leads with this tag.
pipeline_idstringOnly leads in this pipeline.
stage_idstringOnly leads in this stage.
list_idstringOnly leads in this list.
updated_sincestring (date-time)Only leads changed after this time.
row_countinteger | nullrequiredRows in the file, once completed.
download_urlstring (uri) | nullrequiredSigned download URL, once completed. Valid for 24 hours.
expires_atstring (date-time) | nullrequiredWhen
download_urlstops working.created_atstring (date-time)requiredWhen the job was created.
completed_atstring (date-time) | nullrequiredWhen the file was ready.
Errors
- 401authentication_failed The
Authorizationheader is missing, malformed, or the key was revoked. - 403permission_denied The workspace's plan doesn't include the API, or the lens you asked for isn't on your plan.
- 404not_found No object with that ID exists in this workspace.
- 429rate_limited More than 120 requests in one minute with this key.
- 500internal_error Something failed on our side. The request may be retried safely with the same
Idempotency-Key.
curl https://omni.cloudgens.net/api/v1/exports/exp_8Wn2cK5vHt \
-H "Authorization: Bearer $OMNILEAD_API_KEY" \
-H "OmniLead-Version: 2026-09-28"const res = await fetch("https://omni.cloudgens.net/api/v1/exports/exp_8Wn2cK5vHt", {
headers: {
Authorization: `Bearer ${process.env.OMNILEAD_API_KEY}`,
"OmniLead-Version": "2026-09-28",
},
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import os
import requests
resp = requests.get(
"https://omni.cloudgens.net/api/v1/exports/exp_8Wn2cK5vHt",
headers={
"Authorization": f"Bearer {os.environ['OMNILEAD_API_KEY']}",
"OmniLead-Version": "2026-09-28",
},
timeout=30,
)
resp.raise_for_status()
data = resp.json(){
"id": "exp_8Wn2cK5vHt",
"object": "export",
"status": "completed",
"format": "csv",
"filter": {
"lens": "investors",
"tag": "seed-round"
},
"row_count": 212,
"download_url": "https://omni.cloudgens.net/api/v1/exports/exp_8Wn2cK5vHt/download?sig=3b1f0c",
"expires_at": "2026-09-29T10:33:10Z",
"created_at": "2026-09-28T10:32:00Z",
"completed_at": "2026-09-28T10:33:10Z"
}Webhook events
OmniLead sends these events as signed POST requests to your webhook endpoints. Each delivery is an event envelope; data.object holds the object below. See Receive webhooks for signature verification and retries.
Sent when a lead is added by a reveal, an import, the app or the API.
data.object Lead
Show attributesHide attributes
idstringrequiredread-onlyUnique ID, prefixed
lead_.objectstringrequiredAlways
lead.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.first_namestring | nullFirst name.
last_namestring | nullLast name.
full_namestringrequiredDisplay name. For organizations (funds, grant programs) this is the organization name.
titlestring | nullJob title or role.
emailstring | nullrequiredEmail address.
nulluntil revealed.email_statusstring | nullrequiredVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullPhone number in E.164 format.
websitestring (uri) | nullWebsite URL.
company_idstring | nullLinked company ID, prefixed
co_.company_namestring | nullCompany or organization name.
countrystring | nullISO 3166-1 alpha-2 country code. Drives per-country sending rules.
revealedbooleanrequiredWhether contact details have been revealed in this workspace.
lawful_basisstringrequiredGDPR lawful basis recorded for this lead.
One of
legitimate_interest,consent,contract.owner_idstring | nullWorkspace member who owns the lead.
tagsarray of stringsrequiredTag names.
stageobject (StageRef) | nullrequiredThe lead's current pipeline stage, or
nullif the lead isn't in a pipeline.Show child attributesHide child attributes
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID.
namestringrequiredStage name.
custom_fieldsobjectCustom field values keyed by field key.
created_atstring (date-time)requiredWhen the lead was created.
updated_atstring (date-time)requiredWhen the lead last changed.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "lead.created",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"lens": "leads",
"first_name": "Maya",
"last_name": "Lindqvist",
"full_name": "Maya Lindqvist",
"title": "Head of Operations",
"email": "maya@northwind.example",
"email_status": "valid",
"email_confidence": 96,
"phone": "+442071838750",
"website": "https://northwind.example",
"company_id": "co_4Tn8wQ2pLs",
"company_name": "Northwind Logistics",
"country": "GB",
"revealed": true,
"lawful_basis": "legitimate_interest",
"owner_id": "usr_2Pk9sX1aVe",
"tags": [
"q4-outreach"
],
"stage": {
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Qualified01",
"name": "Qualified"
},
"custom_fields": {
"fleet_size": "120"
},
"created_at": "2026-09-12T08:15:40Z",
"updated_at": "2026-09-20T14:02:11Z"
}
}
}Sent when lead fields change. previous_attributes holds the old values of changed fields.
data.object Lead
Show attributesHide attributes
idstringrequiredread-onlyUnique ID, prefixed
lead_.objectstringrequiredAlways
lead.lensstringrequiredThe lens the record came from.
One of
leads,investors,researchers,grants.first_namestring | nullFirst name.
last_namestring | nullLast name.
full_namestringrequiredDisplay name. For organizations (funds, grant programs) this is the organization name.
titlestring | nullJob title or role.
emailstring | nullrequiredEmail address.
nulluntil revealed.email_statusstring | nullrequiredVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullPhone number in E.164 format.
websitestring (uri) | nullWebsite URL.
company_idstring | nullLinked company ID, prefixed
co_.company_namestring | nullCompany or organization name.
countrystring | nullISO 3166-1 alpha-2 country code. Drives per-country sending rules.
revealedbooleanrequiredWhether contact details have been revealed in this workspace.
lawful_basisstringrequiredGDPR lawful basis recorded for this lead.
One of
legitimate_interest,consent,contract.owner_idstring | nullWorkspace member who owns the lead.
tagsarray of stringsrequiredTag names.
stageobject (StageRef) | nullrequiredThe lead's current pipeline stage, or
nullif the lead isn't in a pipeline.Show child attributesHide child attributes
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredStage ID.
namestringrequiredStage name.
custom_fieldsobjectCustom field values keyed by field key.
created_atstring (date-time)requiredWhen the lead was created.
updated_atstring (date-time)requiredWhen the lead last changed.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "lead.updated",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "lead_7Hq2mR9xKd",
"object": "lead",
"lens": "leads",
"first_name": "Maya",
"last_name": "Lindqvist",
"full_name": "Maya Lindqvist",
"title": "COO",
"email": "maya@northwind.example",
"email_status": "valid",
"email_confidence": 96,
"phone": "+442071838750",
"website": "https://northwind.example",
"company_id": "co_4Tn8wQ2pLs",
"company_name": "Northwind Logistics",
"country": "GB",
"revealed": true,
"lawful_basis": "legitimate_interest",
"owner_id": "usr_2Pk9sX1aVe",
"tags": [
"q4-outreach"
],
"stage": {
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Qualified01",
"name": "Qualified"
},
"custom_fields": {
"fleet_size": "120"
},
"created_at": "2026-09-12T08:15:40Z",
"updated_at": "2026-09-20T14:02:11Z"
},
"previous_attributes": {
"title": "Head of Operations"
}
}
}Sent when a lead moves to another pipeline stage, from the kanban, a reply, or the API.
data.object LeadStage
Show attributesHide attributes
objectstringrequiredAlways
lead_stage.lead_idstringrequiredLead ID.
pipeline_idstringrequiredPipeline ID.
stage_idstringrequiredNew stage ID.
previous_stage_idstring | nullrequiredStage before the move, or
nullif the lead wasn't in this pipeline.changed_atstring (date-time)requiredWhen the move happened.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "lead.stage_changed",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"object": "lead_stage",
"lead_id": "lead_7Hq2mR9xKd",
"pipeline_id": "pl_9Wc3nB6tYr",
"stage_id": "st_Replied001",
"previous_stage_id": "st_Contacted1",
"changed_at": "2026-09-30T11:02:00Z"
}
}
}Sent after every reveal, including refunded ones with status: no_contact_found.
data.object Reveal
Show attributesHide attributes
idstringrequiredUnique ID, prefixed
rev_.objectstringrequiredAlways
reveal.entity_idstringrequiredThe entity you revealed.
lead_idstring | nullrequiredThe lead created or updated in your CRM.
nullfor test-key dry runs.statusstringrequiredrevealed: details returned.no_contact_found: nothing verifiable was found and the credit was refunded.dry_run: test key, nothing charged.One of
revealed,no_contact_found,dry_run.emailstring | nullrequiredRevealed email.
email_statusstring | nullVerification result.
nulluntil the email is revealed and checked.One of
valid,invalid,catch_all,risky,unknown.email_confidenceinteger | nullVerification confidence, 0–100.
Min 0, max 100.
phonestring | nullRevealed phone number in E.164.
credits_chargedintegerrequiredNet credits charged: 1 for a first reveal, 0 for a repeat, a refund or a dry run.
Min 0, max 1.
already_revealedbooleanrequiredtruewhen this workspace had already revealed the entity. Repeat reveals are free.livemodebooleanrequiredfalsewhen called with a test key.sourcesarray of SourcerequiredWhere each revealed value was found.
Show child attributesHide child attributes
fieldstringrequiredWhich field this source backs, e.g.
email,title,organization.valuestringrequiredThe value as found at the source.
source_urlstring (uri)requiredPublic URL where the value was found.
providerstringrequiredProvider that fetched it.
One of
crawler,sec_edgar,openalex,orcid,crossref,nih_reporter,nsf_awards,grants_gov,google_places,serpapi,opencorporates,import,api,manual.fetched_atstring (date-time)requiredWhen the value was fetched from the source.
created_atstring (date-time)requiredWhen the reveal happened.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "reveal.completed",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "rev_6Nq1xT8bWm",
"object": "reveal",
"entity_id": "ent_inv_3Jd8Kq",
"lead_id": "lead_5Zr4kP7cNe",
"status": "revealed",
"email": "daniel@harborpoint.example",
"email_status": "valid",
"email_confidence": 94,
"phone": null,
"credits_charged": 1,
"already_revealed": false,
"livemode": true,
"sources": [
{
"field": "email",
"value": "daniel@harborpoint.example",
"source_url": "https://harborpoint.example/team",
"provider": "crawler",
"fetched_at": "2026-09-28T09:41:07Z"
}
],
"created_at": "2026-09-28T09:41:08Z"
}
}
}Sent when a sequence step or inbox reply leaves a mailbox.
data.object EmailMessage
Show attributesHide attributes
idstringrequiredUnique ID, prefixed
msg_.lead_idstringrequiredLead ID.
sequence_idstring | nullrequiredSequence that sent it, if any.
mailbox_idstringrequiredMailbox used.
directionstringrequiredDirection.
One of
outbound,inbound.fromstringrequiredFrom address.
tostringrequiredTo address.
subjectstringrequiredSubject.
snippetstringrequiredFirst 200 characters of the plain-text body.
sent_atstring (date-time)requiredWhen it was sent or received.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "email.sent",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "msg_3Qw8eR2tYu",
"lead_id": "lead_7Hq2mR9xKd",
"sequence_id": "seq_5Kd9wP2xLm",
"mailbox_id": "mbx_8Tq3rN6yHs",
"direction": "outbound",
"from": "sam@yourcompany.example",
"to": "maya@northwind.example",
"subject": "Northwind's Q4 shipping volume",
"snippet": "Hi Maya, I noticed Northwind added a Leeds warehouse this month…",
"sent_at": "2026-09-29T08:30:04Z"
}
}
}Sent when a reply is detected. The lead's sequence stops and it moves to Replied. Out-of-office replies don't trigger this event.
data.object EmailMessage
Show attributesHide attributes
idstringrequiredUnique ID, prefixed
msg_.lead_idstringrequiredLead ID.
sequence_idstring | nullrequiredSequence that sent it, if any.
mailbox_idstringrequiredMailbox used.
directionstringrequiredDirection.
One of
outbound,inbound.fromstringrequiredFrom address.
tostringrequiredTo address.
subjectstringrequiredSubject.
snippetstringrequiredFirst 200 characters of the plain-text body.
sent_atstring (date-time)requiredWhen it was sent or received.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "email.replied",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "msg_7Yu2iO5pAs",
"lead_id": "lead_7Hq2mR9xKd",
"sequence_id": "seq_5Kd9wP2xLm",
"mailbox_id": "mbx_8Tq3rN6yHs",
"direction": "inbound",
"from": "maya@northwind.example",
"to": "sam@yourcompany.example",
"subject": "Re: Northwind's Q4 shipping volume",
"snippet": "Thanks Sam, happy to talk next week. Tuesday works.",
"sent_at": "2026-09-30T11:01:48Z"
}
}
}Sent on a hard bounce. The address is marked invalid and suppressed. Five percent bounces pauses the sequence.
data.object EmailMessage
Show attributesHide attributes
idstringrequiredUnique ID, prefixed
msg_.lead_idstringrequiredLead ID.
sequence_idstring | nullrequiredSequence that sent it, if any.
mailbox_idstringrequiredMailbox used.
directionstringrequiredDirection.
One of
outbound,inbound.fromstringrequiredFrom address.
tostringrequiredTo address.
subjectstringrequiredSubject.
snippetstringrequiredFirst 200 characters of the plain-text body.
sent_atstring (date-time)requiredWhen it was sent or received.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "email.bounced",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "msg_1Df4gH7jKl",
"lead_id": "lead_7Hq2mR9xKd",
"sequence_id": "seq_5Kd9wP2xLm",
"mailbox_id": "mbx_8Tq3rN6yHs",
"direction": "outbound",
"from": "sam@yourcompany.example",
"to": "maya@northwind.example",
"subject": "Northwind's Q4 shipping volume",
"snippet": "550 5.1.1 The email account that you tried to reach does not exist.",
"sent_at": "2026-09-29T08:30:04Z"
}
}
}Sent when a lead reaches the end of a sequence without replying.
data.object Enrollment
Show attributesHide attributes
idstringrequiredUnique ID, prefixed
enr_.objectstringrequiredAlways
enrollment.sequence_idstringrequiredSequence ID.
lead_idstringrequiredLead ID.
statusstringrequiredEnrollment status.
One of
active,paused,completed,stopped.current_stepintegerrequiredPosition of the next step to run.
next_send_atstring (date-time) | nullrequiredWhen the next email is scheduled.
enrolled_atstring (date-time)requiredWhen the lead was enrolled.
stopped_atstring (date-time) | nullrequiredWhen it stopped.
stop_reasonstring | nullrequiredWhy it stopped.
One of
replied,bounced,unsubscribed,removed,suppressed.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "sequence.completed",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "enr_2Mx6qT9vBc",
"object": "enrollment",
"sequence_id": "seq_5Kd9wP2xLm",
"lead_id": "lead_7Hq2mR9xKd",
"status": "completed",
"current_step": 3,
"next_send_at": null,
"enrolled_at": "2026-09-28T10:20:00Z",
"stopped_at": "2026-10-09T08:30:00Z",
"stop_reason": null
}
}
}Sent when a recipient unsubscribes by one-click header, footer link or reply, or opts out through the public portal.
data.object Suppression
Show attributesHide attributes
idstringrequiredUnique ID, prefixed
sup_.objectstringrequiredAlways
suppression.typestringrequiredWhat is suppressed.
One of
email,domain.valuestringrequiredThe email address or domain.
reasonstringrequiredWhy it was added.
One of
unsubscribe,bounce,complaint,opt_out,manual.scopestringrequiredworkspaceentries are yours.globalentries come from the public opt-out portal and apply to every workspace.One of
workspace,global.created_atstring (date-time)requiredWhen it was added.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "unsubscribe.created",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"id": "sup_4Rk8mZ1nWd",
"object": "suppression",
"type": "email",
"value": "maya@northwind.example",
"reason": "unsubscribe",
"scope": "workspace",
"created_at": "2026-09-28T10:25:00Z"
}
}
}Sent once per period when the total balance drops below 10% of the plan's monthly credits.
data.object CreditBalance
Show attributesHide attributes
objectstringrequiredAlways
credit_balance.planstringrequiredCurrent plan.
One of
free,starter,growth,agency.balanceobjectrequiredShow child attributesHide child attributes
planintegerrequiredPlan credits left this period. Used first; reset at renewal.
packintegerrequiredCredit-pack credits. Never expire; used after plan credits.
totalintegerrequiredplan + pack.
period_ends_atstring (date-time) | nullrequiredWhen plan credits renew.
ledgerarray of LedgerEntryrequiredThe 20 most recent ledger entries, newest first.
Show child attributesHide child attributes
idstringrequiredUnique ID, prefixed
cl_.typestringrequiredLedger entry type.
One of
grant,purchase,consume,refund,expire.amountintegerrequiredSigned amount. Negative for consumption and expiry.
reasonstringrequiredWhat caused it, e.g.
search_page,reveal,reveal_failed,plan_renewal,pack_2000.refstring | nullrequiredRelated object ID, e.g. a reveal or Stripe invoice.
poolstringrequiredWhich balance it affected.
One of
plan,pack.created_atstring (date-time)requiredWhen it was recorded.
{
"id": "evt_1Sx9fK3mQz",
"object": "event",
"type": "credits.low",
"api_version": "2026-09-28",
"created": "2026-09-30T11:02:01Z",
"workspace_id": "ws_1Aa2Bb3Cc4",
"livemode": true,
"data": {
"object": {
"object": "credit_balance",
"plan": "agency",
"balance": {
"plan": 1700,
"pack": 0,
"total": 1700
},
"period_ends_at": "2026-10-14T00:00:00Z",
"ledger": []
}
}
}