Webhook payload reference
IntentLoom sends an HTTPS POST request when a new Reddit lead meets your
notification threshold. The request body is UTF-8 JSON and describes either a
Reddit post lead or a Reddit comment lead.
To start receiving events, add an HTTPS endpoint under Notifications → Webhook in the IntentLoom dashboard. Notification settings apply across all projects in your account. Events are sent in real time; leads created before you configure the webhook are not sent retroactively.
lead.created envelope
Every real event uses the same top-level envelope.
| Field | Type | Description |
|---|---|---|
id | UUID string | Unique event ID. |
type | string | Event type. Currently always lead.created. |
version | string | Payload schema version. Currently v1. |
occurred_at | string | UTC timestamp in ISO 8601 format. |
project | object | Project associated with the lead. |
lead | object | Immutable snapshot of the lead at event creation time. |
Project fields
| Field | Type | Description |
|---|---|---|
project.id | UUID string | IntentLoom project ID. |
project.name | string | Project name at event creation time. |
Common lead fields
| Field | Type | Description |
|---|---|---|
lead.id | UUID string | ID of the post lead or comment lead. |
lead.kind | string | reddit_post_lead or reddit_comment_lead. |
lead.relevance_score | number | Relevance score that met your notification threshold. |
lead.source_type | string | lead for keyword-driven discovery or competitor for competitor monitoring. |
lead.match_reason | string | Explanation recorded when IntentLoom qualified the lead. It can be empty. |
lead.trigger | object | Keyword and competitor context that triggered discovery. |
lead.post | object | Reddit post data. Its fields depend on lead.kind. |
lead.comment | object | Reddit comment data. Present only when lead.kind is reddit_comment_lead. |
Trigger fields
| Field | Type | Description |
|---|---|---|
lead.trigger.keyword | string or null | Matched project keyword, when available. |
lead.trigger.competitor | string or null | Competitor website associated with the match, when applicable. |
Treat trigger fields as optional context. Older or indirectly matched leads
can contain null for either value.
Reddit post lead
For reddit_post_lead, the post object contains the post title, content
excerpt, author, subreddit, and Reddit URL.
Post fields
| Field | Type | Description |
|---|---|---|
lead.post.title | string | Reddit post title. |
lead.post.body_excerpt | string | First 1,000 characters of the post body. It can be empty. |
lead.post.subreddit | string | Subreddit name as supplied by Reddit, for example r/startups. |
lead.post.author | string | Reddit author name. |
lead.post.source_url | string | Absolute URL for the Reddit post. |
Example
{
"id": "92e2d460-45b8-4bc7-a0d3-384faf4095d4",
"type": "lead.created",
"version": "v1",
"occurred_at": "2026-07-27T08:15:30.123456Z",
"project": {
"id": "10cdf591-16c6-4054-a8f7-d9a6123eb371",
"name": "Acme Scheduler"
},
"lead": {
"id": "e11097bf-f65f-42ee-bb23-c62a24d8040d",
"kind": "reddit_post_lead",
"relevance_score": 85.0,
"source_type": "lead",
"match_reason": "The author is actively looking for a scheduling tool for a small team.",
"trigger": {
"keyword": "scheduling tool",
"competitor": null
},
"post": {
"title": "Looking for a scheduling tool",
"body_excerpt": "Can anyone recommend a scheduling tool for a small team?",
"subreddit": "r/startups",
"author": "alice",
"source_url": "https://www.reddit.com/r/startups/comments/abc123/looking_for_a_scheduling_tool/"
}
}
}Reddit comment lead
For reddit_comment_lead, the post object identifies the parent Reddit
thread and a separate comment object contains the matched comment.
Parent post fields
| Field | Type | Description |
|---|---|---|
lead.post.title | string | Title of the parent Reddit post. |
lead.post.subreddit | string | Subreddit name as supplied by Reddit. |
lead.post.source_url | string | Reddit URL stored for the matched comment thread. In V1, this is the same URL as lead.comment.source_url. |
Comment fields
| Field | Type | Description |
|---|---|---|
lead.comment.body_excerpt | string | First 1,000 characters of the matched comment. It can be empty. |
lead.comment.author | string | Reddit comment author name. |
lead.comment.source_url | string | Absolute URL for the Reddit comment. |
Example
{
"id": "d78457a4-e282-4e1c-bc93-531583453c56",
"type": "lead.created",
"version": "v1",
"occurred_at": "2026-07-27T09:42:11.478901Z",
"project": {
"id": "10cdf591-16c6-4054-a8f7-d9a6123eb371",
"name": "Acme Analytics"
},
"lead": {
"id": "97c0387e-5900-43a0-8c20-486c19f66498",
"kind": "reddit_comment_lead",
"relevance_score": 91.0,
"source_type": "competitor",
"match_reason": "The commenter is comparing analytics products within the project's target budget.",
"trigger": {
"keyword": "product analytics",
"competitor": "https://competitor.example.com"
},
"post": {
"title": "Best analytics platform for a small SaaS?",
"subreddit": "r/SaaS",
"source_url": "https://www.reddit.com/r/SaaS/comments/xyz789/best_analytics_platform/c1_example/"
},
"comment": {
"body_excerpt": "We need product analytics under $100 per month and are comparing a few options.",
"author": "bob",
"source_url": "https://www.reddit.com/r/SaaS/comments/xyz789/best_analytics_platform/c1_example/"
}
}
}Idempotency
Use the body id as your idempotency key. Store it after processing the
event so retry deliveries remain safe to handle.
The header and body IDs identify the event, not an individual delivery attempt.
Send a 2xx response after the event has been accepted for processing.
Response and retry behavior
Your endpoint should respond within 10 seconds.
| Response or failure | IntentLoom behavior |
|---|---|
Any 2xx response | Marks the delivery successful. |
408, 425, 429, any 5xx, timeout, or network failure | Retries the delivery. |
Any 3xx response | Marks the delivery failed. Redirects are not followed. |
Most other 4xx responses | Marks the delivery failed without an automatic retry. |
A retryable delivery is attempted at most five times. The delays after the first four failed attempts are approximately 1 minute, 5 minutes, 30 minutes, and 2 hours. After 10 consecutive deliveries reach a final failed state, IntentLoom pauses the webhook destination. You can inspect delivery history, retry eligible failures, and resume a paused destination from the dashboard.
Version handling
Use the version field to choose the parser for an event. For v1:
- accept fields you recognize and ignore unknown fields;
- branch on
lead.kindbefore reading kind-specific fields; - do not assume nullable trigger values are present; and
- preserve the event ID when passing the event to downstream systems.