MonialDocs

Webhooks

Monial POSTs JSON to your HTTPS endpoint when a new signal is captured. There are three destinations:

  1. Organization webhook — every new signal
  2. List webhook — only signals that match a saved list
  3. 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 selected items, or
  • The list has no selected items and the person/account matches the list filters

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 (keywordId matches)

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

FieldTypeDescription
idstringSignal id
typestringSignal type (see below)
sourcestringSource URL
textstringSignal text
highlightsstring[]Short phrases to highlight in text
personIdstring | nullRelated person
accountIdstring | nullRelated account
keywordIdstring | nullKeyword scraper that captured this signal
listIdstring | nullList monitor that captured this signal
createdAtstringISO timestamp
updatedAtstringISO timestamp
organizationIdstring | nullSet on list-monitor signals; null for the public firehose

Signal types

  • PERSON_JOB_CHANGE
  • ACCOUNT_TECH_STACK_CHANGE
  • ACCOUNT_HEADCOUNT_CHANGE
  • ACCOUNT_JOB_HIRING
  • ACCOUNT_RECENT_FUNDING_ROUND
  • ACCOUNT_RECENT_MERGERS_AND_ACQUISITIONS
  • ACCOUNT_DECISION_MAKER_CHANGE
  • ACCOUNT_DATA_CHANGE
  • ACCOUNT_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.