AI Genie outreach
AI Genie plans and sends personalised, multi-step outreach to people you already have — or to people it generates for you. Unlike a campaign, which sends one template to everyone, Genie writes per-recipient messages and can run on a recurring cadence.
Genie sends are routed through leadx-ms-unified-chat, so replies land in the same inbox as everything else.
:::info Requires Gemini in your plan
Every Genie entry point checks features.app.gemini and returns GeminiNotAvailableInPlan_400 without it.
:::
Two ways to start a run
From an existing audience
The common case — reach out to contacts or leads you already hold.
curl -X POST https://api.leadx.in/api/key/protected/genie/from-contacts \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{
"segments": ["665a..."],
"tags": ["665b..."],
"prompt": "Introduce our analytics tier and ask for a 15-minute call",
"tone": "friendly",
"enrichmentEnabled": true,
"draft": true
}'
| Field | Type | Notes |
|---|---|---|
contactIds, leadIds, segments, tags, categories | string[] | Any mix. They union into one run. |
prompt | string | The goal. Optional here — omitted, Genie plans from your company profile and catalogue. |
tone | string | Free text, e.g. friendly, formal. |
aiType | string | Default gemini. |
enrichmentEnabled | boolean | Enrich first, hold outreach until enrichment reports back. |
draft | boolean | Create messages for approval instead of sending. |
customChannels | object | Restrict which connected apps this run may send from. Validated against apps you actually own. |
Generating a new audience
curl -X POST https://api.leadx.in/api/key/protected/genie \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{
"prompt": "Series-B fintech companies in India needing lead analytics",
"count": 25,
"industry": "Financial Services",
"recurring": true,
"intervalMs": 604800000,
"draft": true
}'
| Field | Notes |
|---|---|
prompt | Required here — PromptRequired_400 without it. |
count | Leads to generate. Maximum 50 (MaximumLeadsExceeded_400). Default 25. |
industry, additionalFilters | Narrow the search. |
recurring + intervalMs | Repeat the run. Minimum interval 60000 ms. |
campaign | Treat the run as a campaign-style send. |
whitelistedCustom + customWhitelistedDomains | Restrict sourcing to specific domains. |
outreachCadence | Multi-step follow-up timing. |
intervalMs is a plain millisecond gap — one week is 604800000.
Size the audience first
curl -X POST https://api.leadx.in/api/key/protected/genie/audience-preview \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{ "segments": ["665a..."], "tags": ["665b..."] }'
Returns the resolved contact count for a selection before you commit to it.
Draft mode and approvals
With draft: true, Genie writes messages but sends nothing until approved. This is the safe way to introduce Genie to a live list.
Per message:
| Method | Endpoint | Purpose |
|---|---|---|
POST | /genie/send-jobs/:sendJobId/approve | Approve and send one message. |
POST | /genie/send-jobs/:sendJobId/draft | Revert one back to draft. |
Per lead:
| Method | Endpoint | Purpose |
|---|---|---|
GET | /genie/leads/:leadId/pending-approvals | Everything awaiting approval for a lead. |
GET | /genie/leads/:leadId/send-counts | Counts for the lead's bulk bar — accurate, unlike the paginated feed. |
POST | /genie/leads/:leadId/approve-all | Approve everything for this lead. |
POST | /genie/leads/:leadId/draft-all | Revert everything for this lead. |
Per run:
| Method | Endpoint | Purpose |
|---|---|---|
POST | /genie/:schedulerId/approve-all | Approve the whole run. |
POST | /genie/:schedulerId/draft-all | Revert the whole run. |
:::warning Lead-scoped and run-scoped bulk actions are different
/genie/leads/:leadId/approve-all covers one lead. /genie/:schedulerId/approve-all covers an entire campaign. The paths are similar; the blast radius is not.
:::
Managing runs
| Method | Endpoint | Purpose |
|---|---|---|
GET | /genie | List runs. |
GET | /genie/:schedulerId | Run detail. |
DELETE | /genie/:schedulerId | Delete a run. |
POST | /genie/:schedulerId/cancel | Cancel an in-flight run. |
POST | /genie/:schedulerId/stop-recurring | Stop future repeats, leave the current run alone. |
POST | /genie/:schedulerId/resume-recurring | Resume repeats. |
POST | /genie/:schedulerId/retry-failed | Retry failures. |
GET | /genie/templates/:templateId | Preview the content behind a step. |
Company-wide settings
curl https://api.leadx.in/api/key/protected/genie/settings -H "apikey: $KEY"
curl -X PUT https://api.leadx.in/api/key/protected/genie/settings \
-H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{ "...": "..." }'
These set the default channels and behaviour for runs that don't send a customChannels override.
Genie vs. campaigns
| Campaign | Genie | |
|---|---|---|
| Message | One template for everyone | Written per recipient |
| Audience | Segments / tags / categories / contacts | Same, plus AI-generated leads |
| Cadence | Schedule + time window | Multi-step outreach, optionally recurring |
| Approval | Test send | Full draft-and-approve workflow |
| Service | ms-send-manager | ms-unified-chat |
| Plan gate | Campaign allowance | Requires Gemini |