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.
- Create a URL on your server (for example
https://your-server.example.com/webhooks/topa) - Accept
POSTrequests with a JSON body - 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.
- In the sidebar, click LinkedIn Signals
- Find the signal you want to connect in the signals table
- 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 Webhook — POST 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:
- Enter your Webhook endpoint URL (must start with
http://orhttps://) - Review the summary (signal, saved filter, Ai Messaging template, enrichment)
- 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:
- Excludes company posts and irrelevant posts
- Applies your saved filter (if configured)
- Enriches email and/or cellphone (if configured)
- Generates Ai messaging from your pitch (if configured)
- Sends one
POSTrequest 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
signal object fields
lead object fields
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)
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.
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)
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.
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." }}