Webhooks
Webhooks notify you when new leads are found. LikesToLeads sends an HTTP POST request to your endpoint with the lead data.
Setup
Go to Settings and add a webhook URL. The URL must use HTTPS. You can create up to 5 webhooks.
Each webhook gets a signing secret, visible on the Settings page. Use it to verify that requests are authentic.
Events
| Event | Trigger |
|---|---|
lead.enriched |
One or more leads were enriched |
Payload
{
"delivery_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "lead.enriched",
"timestamp": "2026-04-09T12:34:56.000000+00:00",
"data": {
"leads": [
{
"urn": "ACoAAExampleURN1234567890",
"full_name": "Jane Smith",
"headline": "VP of Sales at Acme Corp",
"company_name": "Acme Corp",
"job_title": "VP of Sales",
"location": "San Francisco, California",
"linkedin_url": "https://www.linkedin.com/in/janesmith",
"engagement_type": "reaction",
"signal_name": "John Doe",
"reaction_type": "LIKE",
"comment_text": "",
"connections": 2500,
"followers": 8400,
"industry": "Software Development",
"company_size": "201-500",
"post_id": "f1e2d3c4-b5a6-4789-0123-456789abcdef"
}
],
"posts": [
{
"id": "f1e2d3c4-b5a6-4789-0123-456789abcdef",
"url": "https://www.linkedin.com/posts/johndoe_example-activity-1234567890",
"text": "Excited to announce our new product launch...",
"date": "2026-05-08T14:23:00.000Z"
}
],
"count": 1
}
}
leads and posts are normalized: each post appears once in posts, and every lead references it via post_id. When a popular post drives many engagements in a single delivery, you get the post’s text once instead of duplicated per lead.
Top-Level Fields
| Field | Type | Description |
|---|---|---|
delivery_id |
string | Unique ID for this delivery (UUID). Use to deduplicate. |
event |
string | Event type (e.g., lead.enriched) |
timestamp |
string | ISO 8601 UTC timestamp |
data |
object | Event-specific payload |
Lead Fields
| Field | Type | Description |
|---|---|---|
urn |
string | Stable LinkedIn person identifier. Use this as your dedup key — linkedin_url formats can vary. |
full_name |
string | Full name |
headline |
string | LinkedIn headline |
company_name |
string | Current company |
job_title |
string | Current job title |
location |
string | Profile location |
linkedin_url |
string | LinkedIn profile URL |
engagement_type |
string | reaction, comment, or repost |
signal_name |
string | The signal (monitored profile) that authored the post |
reaction_type |
string | Reaction kind (LIKE, PRAISE, EMPATHY, INTEREST, APPRECIATION, ENTERTAINMENT). Empty string for non-reaction engagements. |
comment_text |
string | The comment the lead left on the post. Empty string for non-comment engagements. |
connections |
integer | Number of connections |
followers |
integer | Number of followers |
industry |
string | Industry |
company_size |
string | Company size range (e.g., “201-500”) |
post_id |
string | null | Reference to an entry in posts. null if the post is no longer available. |
Post Fields
Posts in the posts array represent the LinkedIn posts the leads engaged with. Each post was authored by the signal named in the lead’s signal_name.
| Field | Type | Description |
|---|---|---|
id |
string | Stable identifier — match against lead.post_id |
url |
string | Direct link to the LinkedIn post |
text |
string | Full post text |
date |
string | ISO 8601 timestamp of when the post was published |
Signature Verification
Each delivery includes an X-Webhook-Signature header — an HMAC-SHA256 hex digest of the request body, signed with your webhook secret.
import hmac
import hashlib
def verify_signature(payload_body, signature, secret):
expected = hmac.new(
secret.encode(),
payload_body.encode(),
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature)
# In your webhook handler:
signature = request.headers.get('X-Webhook-Signature')
is_valid = verify_signature(request.data.decode(), signature, YOUR_WEBHOOK_SECRET)
Headers
| Header | Value |
|---|---|
Content-Type |
application/json |
X-Webhook-Signature |
HMAC-SHA256 hex digest |
X-Webhook-Event |
Event type (e.g., lead.enriched) |
Testing
Use the “Test” button next to any webhook on the Settings page. Test payloads include "test": true so you can distinguish them from real deliveries.
Managing Webhooks
Enable / Disable — Toggle a webhook without deleting it.
Delete — Permanently removes the webhook.