Webhooks & Notifications
Get notified the moment background jobs finish — machine-readable webhooks for your systems, in-app notifications for your team.
Webhooks & Notifications
Many Fiber operations — batch enrichments, lookups, searches, monitoring — run in the background. Instead of polling, you get told the moment a job finishes, success or failure, through two complementary channels:
| Channel | Audience | What it's for |
|---|---|---|
| Webhooks | Your systems | Machine-readable events delivered to your HTTPS endpoint |
| In-app notifications | Your team (in the Fiber app) | Human-readable alerts with email backup — zero config |
Both fire at the same moments, so you can build on whichever fits the workflow.
Setting up webhooks
- Go to
fiber.ai/app/webhooks→ Set up webhooks. - Add Endpoint — must be HTTPS.
- Select the event types to receive. Save — delivery starts immediately.
Delivery is fully managed for you: automatic retries with exponential backoff, cryptographic signature verification, a self-service portal with delivery logs, and one-click replay.
Event catalog
Enrichment
| Event | Fires when |
|---|---|
reveal.completed | A contact reveal finishes |
batch_live_enrich.completed | A batch live enrichment job finishes |
batch_contact_enrich.completed | A batch contact enrichment job finishes |
audience.enrichment_completed | An audience enrichment finishes |
audience.prospect_export_completed | A prospect CSV export finishes |
audience.company_export_completed | A company CSV export finishes |
Lookup
| Event | Fires when |
|---|---|
github_to_linkedin.completed | A GitHub→LinkedIn batch lookup finishes |
github_lookup.completed | A GitHub profile lookup finishes |
domain_lookup.completed | A domain lookup finishes |
social_media_lookup.completed | A social media lookup finishes |
Search
| Event | Fires when |
|---|---|
saved_search.run_completed | A saved search run finishes |
combined_search.completed | An async combined search finishes |
google_maps_search.completed | A Google Maps search finishes |
local_business_search.completed | A local business search finishes |
audience.build_completed | An audience build finishes |
Monitoring
| Event | Fires when |
|---|---|
tracker.signal_detected | A Tracker rule fires a signal |
tracker.list_run_upcoming | A tracker list refreshes in ~1 day |
tracker.list_run_completed | A tracker list finished a scheduled refresh |
job.changed | Tracked profiles changed jobs |
job_changes.profiles_added | Profiles added to a job-change list |
Other
| Event | Fires when |
|---|---|
depth_chart.completed | A company depth-chart generation finishes |
sales_nav_scrape.completed | A Sales Navigator people scrape finishes |
sales_nav_lite_scrape.completed | A Sales Navigator lite scrape finishes |
Payload structure
Every payload includes:
success— whether the job succeeded,- an identifier —
task_id,run_id,search_id, oraudience_iddepending on the operation, error— populated on failure.
Example (reveal.completed):
{
"task_id": "abc123",
"success": true,
"emails": [{ "emailAddress": "jane@company.com", "type": "work" }],
"phone_numbers": [{ "phoneNumber": "+1-555-0100", "type": "mobile" }],
"linkedin_url": "https://www.linkedin.com/in/jane-doe"
}Tracker signals use a richer envelope with the matched entity and rule details.
Verifying signatures
Every delivery carries svix-id, svix-timestamp, and svix-signature
headers. Always verify before trusting a payload — official libraries exist
for Node, Python, Go, Java, Ruby, Rust, PHP, and C#/.NET. The signing secret is
in the webhook portal.
import { Webhook } from "svix";
const wh = new Webhook("whsec_your_signing_secret"); // from the portal
app.post("/webhooks/fiber", (req, res) => {
try {
const payload = wh.verify(req.body, {
"svix-id": req.headers["svix-id"],
"svix-timestamp": req.headers["svix-timestamp"],
"svix-signature": req.headers["svix-signature"],
});
// verified — process payload
res.status(200).send("OK");
} catch {
res.status(400).send("Invalid signature");
}
});Retry behavior
A delivery is considered failed if your endpoint returns non-2xx or doesn't respond within 30 seconds. Retries then run with exponential backoff:
immediate → 5s → 5min → 30min → 2h → 8hAfter all retries the message is marked failed in the portal, where you can manually retry it.
In-app notifications
For humans, not systems: completed background jobs also show up as in-app notifications in the Fiber dashboard (with email follow-ups), powered by Novu. Batch jobs, searches, lookups, and scrapes all notify the team automatically — no configuration needed.
Use this when your team just wants to know "my audience export is done" without wiring an endpoint; use webhooks when another system needs to act on the result.
Testing
- webhook.site — paste a unique URL as your endpoint and watch payloads live.
- Send Example — every event type has a "Send Example" button in the portal.
- Svix CLI — tunnel deliveries to local development:
svix listen http://localhost:3000/webhooks/fiberAdvice
- Acknowledge fast, process later. Return a 2xx immediately and handle the payload asynchronously — slow handlers trip the 30-second timeout and cause pointless retries.
- Make handlers idempotent. Retries mean you may receive the same event more than once; dedupe on the event identifier.
- Verify signatures everywhere. Unverified endpoints are a spoofing risk.
- Prefer webhooks over polling for async operations — you learn about completion sooner and save the polling calls entirely.
Tracker
Watch companies and people for the changes that matter — 52 rule types, refresh cadences from daily to quarterly, signals delivered by webhook and API.
Market Intelligence APIs
Hotels and vacation rentals, flight itineraries, and live financial instrument data — real-world market data beyond B2B profiles.