Webhooks
Monial POSTs JSON to your HTTPS endpoint when a new signal is captured. There are three destinations:
- Organization webhook — every new signal
- List webhook — only signals that match a saved list
- Keyword webhook — only signals captured by that keyword scraper
Set the organization URL in Settings. Set a list URL when you create or edit a list in the console, or via POST /api/v1/lists. Set a keyword URL when you create or edit a keyword, or via POST /api/v1/keywords.
This is inbound to your server. Clay, Heyreach, Instantly, and Smartlead are outbound push destinations — see POST /api/v1/lists/:id/push-to-platform.
Organization webhook
Stored on your organization as webhookUrl. When new signals are ingested, Monial POSTs each signal to that URL.
Use this when you want a firehose of every signal into n8n, Zapier, Clay, or your own service.
Test it from Settings → Test webhook. Delivery attempts are stored in the webhook log; you can retry a failed row from there.
List webhooks
Each list can have its own webhookUrl. A signal is delivered to a list webhook only if:
- The list has a
webhookUrl, and - The signal’s person or account is in the list’s
selecteditems, or - The list has no
selecteditems and the person/account matches the listfilters
Use this to fan out a subset of accounts or people to a specific pipeline.
Keyword webhooks
Each keyword scraper can have its own webhookUrl. A signal is delivered to a keyword webhook only if:
- The keyword has a
webhookUrl, and - The signal was captured by that keyword (
keywordIdmatches)
Use this to send matching social, job, or news signals to a dedicated pipeline.
Payload
POST with Content-Type: application/json. The body is the signal record, including nested person and account when present.
{
"id": "2f1c0a8e-4b1a-4d3e-9c2b-7a6e5d4c3b2a",
"type": "PERSON_JOB_CHANGE",
"source": "https://www.linkedin.com/in/janedoe",
"text": "Jane Doe joined Acme Corp as VP Sales.",
"highlights": ["Jane Doe", "Acme Corp", "VP Sales"],
"personId": "person_456",
"accountId": "acct_123",
"createdAt": "2026-08-27T12:04:11.000Z",
"updatedAt": "2026-08-27T12:04:11.000Z",
"person": {
"id": "person_456",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@acme.com",
"linkedinUrl": "https://www.linkedin.com/in/janedoe",
"profilePictureKey": null,
"education": [],
"experience": [],
"createdAt": "2026-08-01T09:00:00.000Z",
"updatedAt": "2026-08-27T12:04:11.000Z"
},
"account": {
"id": "acct_123",
"name": "Acme Corp",
"linkedinUrl": "https://www.linkedin.com/company/acme",
"websiteUrl": "https://acme.com",
"headcount": 120,
"location": "San Francisco",
"industry": "Software",
"logoKey": null,
"techStack": [],
"recentFundingRound": [],
"recentMergersAndAcquisitions": [],
"createdAt": "2026-08-01T09:00:00.000Z",
"updatedAt": "2026-08-27T12:04:11.000Z"
}
}
person or account is null when the signal is not tied to that entity.
Signal fields
| Field | Type | Description |
|---|---|---|
id | string | Signal id |
type | string | Signal type (see below) |
source | string | Source URL |
text | string | Signal text |
highlights | string[] | Short phrases to highlight in text |
personId | string | null | Related person |
accountId | string | null | Related account |
keywordId | string | null | Keyword scraper that captured this signal |
listId | string | null | List monitor that captured this signal |
createdAt | string | ISO timestamp |
updatedAt | string | ISO timestamp |
organizationId | string | null | Set on list-monitor signals; null for the public firehose |
Signal types
PERSON_JOB_CHANGEACCOUNT_TECH_STACK_CHANGEACCOUNT_HEADCOUNT_CHANGEACCOUNT_JOB_HIRINGACCOUNT_RECENT_FUNDING_ROUNDACCOUNT_RECENT_MERGERS_AND_ACQUISITIONSACCOUNT_DECISION_MAKER_CHANGEACCOUNT_DATA_CHANGEACCOUNT_NEW_ANNOUNCEMENT
Delivery and retries
Monial sends a POST and records the URL, status, request, and response in the webhook log.
- Return 2xx as quickly as you can. Do heavy work asynchronously.
- Timeouts and non-2xx responses are logged as failures.
- Retry a failed delivery from Settings → webhook log.
- There is no signature header today. Keep your URL unguessable, or validate fields you expect (ids, types).
The Settings Test webhook button sends a sample payload so you can confirm your endpoint is reachable. The live payload is the signal object above.