Pushing Leads Via Webhook

Step-by-step guide to sending LinkedIn signal leads to a custom webhook endpoint.

Pushing Leads Via Webhook

Topa can automatically send LinkedIn leads from your signals to any webhook endpoint you control. Once configured, every time a signal runs and captures new leads, Topa applies your saved filter and Ai Messaging pitch (optional), enriches contact details (optional), and POSTs one JSON payload per lead to your URL.

Company posts and irrelevant posts are excluded by default.

Step 1: Prepare your webhook endpoint

Before connecting a signal, set up an HTTPS endpoint that can receive lead data from Topa.

  1. Create a URL on your server (for example https://your-server.example.com/webhooks/topa)
  2. Accept POST requests with a JSON body
  3. Return any 2xx HTTP status code when the payload is received successfully

Topa sends requests with Content-Type: application/json and User-Agent: TopaLinkedInSignalWebhook/1.0. If your endpoint returns an error or times out, Topa retries automatically (with backoff) before marking a lead as failed.

You do not need to add an API key in Topa for webhooks — the endpoint URL is configured per signal.

Step 2: Open Integrations on a signal

Webhooks are configured per signal — each signal can send to its own endpoint.

  1. In the sidebar, click LinkedIn Signals
  2. Find the signal you want to connect in the signals table
  3. In the Actions column, click Integrations

The Integrations dialog opens. You will see options for Smartlead, Instantly, Webhook, Topa Campaign, and HeyReach.

Step 3: Choose Webhook and set delivery options

Click WebhookPOST every new lead to a custom URL.

Topa walks you through Step 1 of the Webhook setup:

Apply a saved filter (optional)

Choose Yes if you only want leads matching a saved filter to be sent. Select the filter from the dropdown.

Choose No to send all eligible leads from the signal (still excluding company posts and irrelevant posts by default).

If you have not created a saved filter yet, go to LinkedIn Leads, set up your ICP filters, and click Save filter first.

Apply an Ai Messaging template (optional)

Choose Yes if you want Topa to generate personalised messaging for each lead before sending. Select the pitch from the dropdown.

Choose No to send leads without generating Ai messaging first.

Prewritten messages will be available in the webhook payload as ai_outreach_message, ai_vm_message, and ai_connection_message on the lead object.

If you have not created a pitch yet, go to LinkedIn Leads and add one under Ai Messaging Pitch first.

Enrichment options

Unlike email tools, webhooks do not require an email address. Choose how Topa should enrich leads before sending:

  • None — send leads with LinkedIn profile data only (no enrichment lookup)
  • Enrich Email — look up email addresses before sending
  • Enrich Cell & Email — look up both cellphone and email

When enrichment is enabled, Topa waits for lookups to complete before sending the webhook. Enrichment uses credits from your account.

Click Continue when you are done.

Step 4: Enter your webhook URL and save

In Step 2 of the Webhook setup:

  1. Enter your Webhook endpoint URL (must start with http:// or https://)
  2. Review the summary (signal, saved filter, Ai Messaging template, enrichment)
  3. Click Save webhook

The Webhook card on the Integrations home screen will show an Active badge when a URL is saved. Clear the URL field and save to disable the webhook.

Step 5: Test and push leads

Once the integration is active, you have two useful actions on the Webhook card:

  • Push Test Lead — send three sample payloads (posted, commented, and liked scenarios) to your endpoint to verify delivery is working
  • Push Old Leads — re-queue all eligible existing leads from this signal through the webhook pipeline (useful if you set up the integration after leads were already captured)

Clicking Push Old Leads asks you to confirm before queuing.

Test payloads include test: true, test_batch: true, and test_scenario at the top level so you can tell them apart from live traffic. The lead object uses the same fields as live delivery.

When does this trigger?

Each time your signal runs and captures new leads, Topa automatically:

  1. Excludes company posts and irrelevant posts
  2. Applies your saved filter (if configured)
  3. Enriches email and/or cellphone (if configured)
  4. Generates Ai messaging from your pitch (if configured)
  5. Sends one POST request per matching lead to your webhook URL

Each lead is sent as its own request. Your endpoint should respond with a 2xx status to acknowledge receipt.

What data is sent to your webhook?

Topa sends a POST request to the URL you configured on the signal. The body is a single JSON object. Unset fields on the lead object may appear as null (for example comment_text on a poster, or enriched_email when enrichment is off). Your integration should treat null and missing keys the same.

Top-level fields

FieldDescription
eventAlways linkedin_signal.lead
sent_atISO timestamp when Topa sent the request
attemptDelivery attempt number (starts at 1, increments on retries)
signalObject with signal metadata (see table below)
leadObject with lead data (see table below)

signal object fields

FieldDescription
idTopa signal ID
nameSignal name
typeSignal type (profile or keyword monitoring)
targetMonitored LinkedIn profile/company URL or keyword
webhook_enrich_modenone, email, or email_phone
webhook_had_ai_pitchtrue if an Ai Messaging template was enabled
webhook_had_saved_filtertrue if a saved filter was enabled

lead object fields

FieldDescription
idTopa lead ID
user_idTopa account user ID
signal_idTopa signal ID
lead_typeliked, commented, or posted
sourceInternal source tag (for example linkedin_person_signal or linkedin_keyword_signal)
keywordMatched keyword (keyword signals / post authors)
author_nameLead's LinkedIn display name
author_headlineLinkedIn headline
author_titleJob title
author_urlLinkedIn profile URL
post_textLinkedIn post content
post_urlLinkedIn post URL
comment_textComment text (commenters only)
companyCompany name
country / cityLead location
enriched_emailEmail from enrichment (if configured and found)
enriched_phoneCellphone from enrichment (if configured and found)
ai_outreach_messageAi-generated outreach message (if pitch enabled)
ai_vm_messageAi-generated voicemail script (if pitch enabled)
ai_connection_messageAi-generated LinkedIn connection note (if pitch enabled)

Example Data Available In Your Webhook To Run Campaigns

Below are example lead payloads for each engagement type. The signal object is included once for context — it is the same shape on every request.

Example signal object (engagement signals)

FieldValue
idsig_abc123
nameDan Wardrope Engagement
typeprofile
targethttps://www.linkedin.com/in/dan-wardrope/
webhook_enrich_modeemail_phone
webhook_had_ai_pitchtrue
webhook_had_saved_filterfalse

Example: Commenter (lead_type: commented)

A person who commented on a post on a monitored profile or company page. Same as a liker, but includes comment_text. The monitored profile is identified by signal.target.

FieldValue
lead_typecommented
sourcelinkedin_person_signal
author_nameJames Ortiz
author_headlineHead of Growth at BuildCo
author_titleHead of Growth
author_urlhttps://www.linkedin.com/in/jamesortiz
comment_textThis is exactly the problem we are solving — great post.
post_textExcited to share our Q1 results — outbound is working better than ever.
post_urlhttps://www.linkedin.com/feed/update/urn:li:activity:7123456789012345678
companyBuildCo
cityLondon
countryUnited Kingdom
enriched_emailjames.ortiz@buildco.com
enriched_phone+14155550987
ai_outreach_messageHi James, your comment on Dan's post really stood out...
ai_vm_messageHi James, calling about your comment on outbound strategy...
ai_connection_messageHi James — great comment on Dan's post. Would love to connect.

Full webhook payload

{  "event": "linkedin_signal.lead",  "sent_at": "2026-06-16T14:30:00.000Z",  "attempt": 1,  "signal": {    "id": "sig_abc123",    "name": "Dan Wardrope Engagement",    "type": "profile",    "target": "https://www.linkedin.com/in/dan-wardrope/",    "webhook_enrich_mode": "email_phone",    "webhook_had_ai_pitch": true,    "webhook_had_saved_filter": false  },  "lead": {    "id": "00000000-0000-0000-0000-000000000002",    "user_id": "00000000-0000-0000-0000-000000000099",    "signal_id": "sig_abc123",    "lead_type": "commented",    "source": "linkedin_person_signal",    "keyword": "",    "author_name": "James Ortiz",    "author_headline": "Head of Growth at BuildCo",    "author_title": "Head of Growth",    "author_url": "https://www.linkedin.com/in/jamesortiz",    "post_text": "Excited to share our Q1 results — outbound is working better than ever.",    "post_url": "https://www.linkedin.com/feed/update/urn:li:activity:7123456789012345678",    "comment_text": "This is exactly the problem we are solving — great post.",    "company": "BuildCo",    "country": "United Kingdom",    "city": "London",    "enriched_email": "james.ortiz@buildco.com",    "enriched_phone": "+14155550987",    "ai_outreach_message": "Hi James, your comment on Dan's post really stood out...",    "ai_vm_message": "Hi James, calling about your comment on outbound strategy...",    "ai_connection_message": "Hi James — great comment on Dan's post. Would love to connect."  }}

Example: Poster (lead_type: posted)

A person who posted about your monitored keyword (Keyword Monitoring signal). Includes keyword and their own post_text. The keyword is also on signal.target.

Example signal object (keyword signal)

FieldValue
idsig_xyz789
nameOutbound Sales Keyword
typekeyword
targetoutbound sales
webhook_enrich_modeemail
webhook_had_ai_pitchtrue
webhook_had_saved_filtertrue
FieldValue
lead_typeposted
sourcelinkedin_keyword_signal
keywordoutbound sales
author_nameEmma Walsh
author_headlineFounder at SaaS Foundry
author_titleFounder
author_urlhttps://www.linkedin.com/in/emmawalsh
post_textWe just hit $1M ARR using outbound sales — here is what worked for us.
post_urlhttps://www.linkedin.com/feed/update/urn:li:activity:7987654321098765432
companySaaS Foundry
cityAustin
countryUnited States
enriched_emailemma.walsh@saasfoundry.com
enriched_phone+14155550654
ai_outreach_messageHi Emma, congrats on the $1M ARR post about outbound sales...
ai_vm_messageHi Emma, quick note about your outbound sales post...
ai_connection_messageHi Emma — loved your post on outbound sales. Would love to connect.

Full webhook payload

{  "event": "linkedin_signal.lead",  "sent_at": "2026-06-16T15:45:00.000Z",  "attempt": 1,  "signal": {    "id": "sig_xyz789",    "name": "Outbound Sales Keyword",    "type": "keyword",    "target": "outbound sales",    "webhook_enrich_mode": "email",    "webhook_had_ai_pitch": true,    "webhook_had_saved_filter": true  },  "lead": {    "id": "00000000-0000-0000-0000-000000000001",    "user_id": "00000000-0000-0000-0000-000000000099",    "signal_id": "sig_xyz789",    "lead_type": "posted",    "source": "linkedin_keyword_signal",    "keyword": "outbound sales",    "author_name": "Emma Walsh",    "author_headline": "Founder at SaaS Foundry",    "author_title": "Founder",    "author_url": "https://www.linkedin.com/in/emmawalsh",    "post_text": "We just hit $1M ARR using outbound sales — here is what worked for us.",    "post_url": "https://www.linkedin.com/feed/update/urn:li:activity:7987654321098765432",    "company": "SaaS Foundry",    "country": "United States",    "city": "Austin",    "enriched_email": "emma.walsh@saasfoundry.com",    "enriched_phone": "+14155550654",    "ai_outreach_message": "Hi Emma, congrats on the $1M ARR post about outbound sales...",    "ai_vm_message": "Hi Emma, quick note about your outbound sales post...",    "ai_connection_message": "Hi Emma — loved your post on outbound sales. Would love to connect."  }}

Example: Liker (lead_type: liked)

A person who liked a post on a monitored profile or company page. Uses the same engagement signal object as the commenter example above.

FieldValue
lead_typeliked
sourcelinkedin_person_signal
author_nameSarah Chen
author_headlineVP Sales at Acme Inc
author_titleVP Sales
author_urlhttps://www.linkedin.com/in/sarahchen
post_textExcited to share our Q1 results — outbound is working better than ever.
post_urlhttps://www.linkedin.com/feed/update/urn:li:activity:7123456789012345678
companyAcme Inc
citySan Francisco
countryUnited States
enriched_emailsarah.chen@acme.io
enriched_phone+14155550123
ai_outreach_messageHi Sarah, loved seeing you engage with Dan's post on outbound...
ai_vm_messageHi Sarah, quick voicemail about your interest in outbound sales...
ai_connection_messageHi Sarah — saw you liked Dan's post on outbound. Would love to connect.

Full webhook payload

{  "event": "linkedin_signal.lead",  "sent_at": "2026-06-16T16:10:00.000Z",  "attempt": 1,  "signal": {    "id": "sig_abc123",    "name": "Dan Wardrope Engagement",    "type": "profile",    "target": "https://www.linkedin.com/in/dan-wardrope/",    "webhook_enrich_mode": "email_phone",    "webhook_had_ai_pitch": true,    "webhook_had_saved_filter": false  },  "lead": {    "id": "00000000-0000-0000-0000-000000000003",    "user_id": "00000000-0000-0000-0000-000000000099",    "signal_id": "sig_abc123",    "lead_type": "liked",    "source": "linkedin_person_signal",    "keyword": "",    "author_name": "Sarah Chen",    "author_headline": "VP Sales at Acme Inc",    "author_title": "VP Sales",    "author_url": "https://www.linkedin.com/in/sarahchen",    "post_text": "Excited to share our Q1 results — outbound is working better than ever.",    "post_url": "https://www.linkedin.com/feed/update/urn:li:activity:7123456789012345678",    "company": "Acme Inc",    "country": "United States",    "city": "San Francisco",    "enriched_email": "sarah.chen@acme.io",    "enriched_phone": "+14155550123",    "ai_outreach_message": "Hi Sarah, loved seeing you engage with Dan's post on outbound...",    "ai_vm_message": "Hi Sarah, quick voicemail about your interest in outbound sales...",    "ai_connection_message": "Hi Sarah — saw you liked Dan's post on outbound. Would love to connect."  }}