Skip to main content

API - Webhooks

Webhooks API

Updated this week

Surfe Webhooks: Real-Time Notifications Made Simple

What is a webhook?

Think of a webhook as a "special messenger" that automatically sends you data the moment something important happens. So you don’t have to keep checking manually. It’s like a notifier that does the worrying for you.


How Does It Work? Three Simple Steps

  1. You give us a URL

    This is like giving us an address where we can send a message. It’s called your webhook endpoint, a public URL that can accept a message (a POST request) from us.

  2. An event happens

    For example, Surfe might finish enriching a contact. When that’s done, we automatically send the info to your URL, no polling required.

  3. You say “Got it!”

    Your server needs to reply with a 200 OK—that’s your way of saying, “Thanks, I received the data.” If you send something else, we might try sending it again based on your settings.


What Event Can I Get Notified About?

Right now, Surfe supports:

  • person.enrichment.completed — This tells you when a contact’s enrichment is done. It includes useful information like their name, email, job title, and more

When this event happens and you provided a webhookUrl, Surfe sends:


{
"eventType": "person.enrichment.completed",
"data": {
"enrichmentID": "0198c820-d5f1-7c7f-a9f7-a19fc24846t7",
"person": {
"externalID": "Webhooktest-id",
"firstName": "David",
"lastName": "Chevalier",
"companyName": "Surfe",
"companyDomain": "surfe.com",
"linkedInUrl": "https://linkedin.com/in/david-maurice-chevalier",
"jobTitle": "Co-Founder & CEO",
"location": "Paris, Île-de-France",
"country": "France",
"emails": [
{
"email": "d.c@surfe.com",
"validationStatus": "VALID"
}
],
"mobilePhones": [
{
"mobilePhone": "+491111113211",
"confidenceScore": 0.95
}
],
"status": "COMPLETED"
}
}
}

This structure gives you everything you need to process the enriched data—no polling needed.

  • company.enrichment.completed

Get notified when Surfe finishes enriching details about a company, like their name, website, size, industry, etc.

Webhook event name: company.enrichment.completed

Sample payload:

{
"eventType": "company.enrichment.completed",
"data": {
"enrichmentID": "0198c823-0a32-7b13-a007-bc69376b003a",
"company": {
"externalID": "webhooktest-id",
"name": "Surfe",
"description": "SURFE is a company that specializes in LinkedIn prospecting and streamlining.",
"linkedInURL": "https://linkedin.com/company/leadjet",
"websites": [
"surfe.com",
"ftapi.com",
"evaneos.net"
],
"founded": "2020",
"revenue": "0-1M",
"employeeCount": 63,
"keywords": [
"marketing/advertising",
"computers electronics and technology > computers electronics and technology - other (in united states)",
"waterfall enrichment",
"outreach",
"crm",
"linkedin",
"prospecting",
"data",
"hubspot",
"salesforce",
"salesloft",
"copper",
"pipedrive",
"email finder",
"linkedin prospecting",
"streamlined",
"contact lists",
"crm integration",
"technology",
"enterprise-software",
"apps",
"internet",
"saas",
"sales automation",
"software"
],
"hqCountry": "FR",
"hqAddress": "52 rue chaussée d'antin, Paris, 75009, FR",
"industry": "Software",
"subIndustry": "Application Software",
"digitalPresence": [
{
"name": "X (Formerly Twitter)",
"url": "https://www.twitter.com/surfehq"
},
{
"name": "Facebook",
"url": "https://www.facebook.com/surfehq"
},
{
"name": "Instagram",
"url": "https://www.instagram.com/surfe.hq"
},
{
"name": "Instagram",
"url": "https://www.instagram.com/surfehq"
},
{
"name": "YouTube",
"url": "https://www.youtube.com/channel/uchin3orv1opldf4yz93qqxq"
},
{
"name": "Crunchbase",
"url": "https://www.crunchbase.com/organization/leadjet"
}
],
"fundingRounds": [
{
"name": "",
"amount": ,
"amountCurrency": "$",
"announcedDate": "",
"leadInvestors": [
""
]
},
{
"name": "",
"amount": ,
"amountCurrency": "$",
"announcedDate": "",
"leadInvestors": [
""
]
}
],
"ipo": {
"date":
"sharePrice":
"sharePriceCurrency":
},
"isPublic": false,
"followersCountLinkedin": 8896,
"followersCountLinkedi": 8896,
"status": "COMPLETED"
}
}
}

Why Use Webhooks Instead of Polling?

  • Automatic: No manual checking. You get updates right away.

  • Efficient: Your system isn’t kept busy asking for info over and over again.

  • Light on resources: Saves you time and computing power.


How to Set It Up in Plain English

  1. When you send your enrichment request, include a webhookUrl inside notificationOptions.

  2. Make sure your server can accept POST requests and respond quickly with 200 OK.

  3. Handle the data when it arrives, maybe store it, process it, or trigger another action.

Here’s what the request looks like:

curl -X POST "https://api.surfe.com/v2/people/enrich" \
-H "Authorization: Bearer <your‑token>" \
-H "Content‑Type: application/json" \
-d '{
"include": {
"email": true,
"linkedInUrl": false,
"mobile": false
},
"notificationOptions": {
"webhookUrl": "https://your‑server.com/webhook"
},
"people": [
{
"companyDomain": "surfe.com",
"companyName": "Surfe",
"externalID": "external‑id",
"firstName": "David",
"lastName": "Chevalier",
"linkedinUrl": "https://..."
}
]
}'

Once the enrichment is done, you’ll receive the person.enrichment.completed payload at your webhook endpoint


Summary Table

When You Do This…

Then This Happens…

Provide a webhookUrl

Surfe sends updates automatically when enrichment completes

Your server returns 200 OK

Surfe knows you’ve received the data successfully

You receive the payload in your system

You can then use or store the enriched information


Need Help?

If you have any questions or need further assistance, feel free to reach out to our support team via Intercom.

Additional Resources

Did this answer your question?