Surfe · AsyncAPI Specification
Surfe Webhooks
Version
View Spec
View on GitHub
B2B DataContact DataSales IntelligenceEnrichmentLead GenerationCRMProspectingAsyncAPIEvents
AsyncAPI Specification
generated: '2026-08-13'
method: searched
source: https://developers.surfe.com/webhooks
spec_type: none
asyncapi_published: false
asyncapi_note: >-
Surfe publishes no AsyncAPI document and no streaming transport (no WebSocket,
no SSE). Its event surface is outbound HTTP webhooks only, so the webhook
catalog below is captured verbatim from the provider's own documentation
rather than fabricating an AsyncAPI. This matches the standing finding in
review.yml.
description: >-
Surfe delivers enrichment results as outbound HTTP POST callbacks. Webhooks
are not subscribed to out of band — the caller supplies
`notificationOptions.webhookUrl` on the enrichment request itself, and Surfe
POSTs each event to that URL. Three event types are documented.
delivery:
transport: https
method: POST
content_type: application/json
subscription_model: per-request
subscription_field: notificationOptions.webhookUrl
acknowledgement: >-
The receiver must respond HTTP 200 OK. Surfe states that a different status
"may" cause a retry "depending on your configuration" — the retry schedule,
backoff and give-up policy are not published.
signing: none_documented
signing_note: >-
No signature header, shared secret, or timestamp-replay protection is
documented for Surfe webhooks. A receiver cannot verify that a callback came
from Surfe from the request alone.
retries: unspecified
envelope:
fields:
- {name: eventType, type: string, required: true, description: The event type discriminator.}
- {name: data, type: object, required: true, description: Event payload, shaped per event type.}
example: '{"eventType": "person.enrichment.completed", "data": { ... }}'
events:
- type: person.enrichment.completed
summary: A single contact inside a bulk enrichment has finished.
trigger: POST /v2/people/enrich with notificationOptions.webhookUrl set
cardinality: one per person in the batch
data:
enrichmentID: uuid of the enrichment job
person: >-
EnrichedPersonResponse — the same type returned in the `people` field of
GET /v2/people/enrich/{id}. Carries firstName, lastName, jobTitle,
seniorities, departments, companyName, companyDomain, country, location,
linkedInUrl, externalID, emails[] (email + validationStatus),
mobilePhones[] (mobilePhone + confidenceScore) and status.
source: https://developers.surfe.com/webhooks
- type: person.batch-enrichment.completed
summary: Every contact in a bulk people enrichment has finished processing.
trigger: POST /v2/people/enrich with notificationOptions.webhookUrl set
cardinality: one per batch, in addition to the per-person events
data:
enrichmentID: uuid of the enrichment job
enrichmentCallbackURL: 'Absolute URL to retrieve the full result, e.g. https://api.surfe.com/v2/people/enrich/{id}'
message: Human-readable completion message
source: https://developers.surfe.com/webhooks
- type: company.enrichment.completed
summary: A company inside a bulk enrichment has finished.
trigger: POST /v2/companies/enrich with notificationOptions.webhookUrl set
cardinality: one per company in the batch
data:
enrichmentID: uuid of the enrichment job
company: >-
The enriched organization record — name, websites[], description,
employeeCount, founded, hqAddress, hqCountry, industries[], externalID and
related firmographics.
source: https://developers.surfe.com/webhooks
event_count: 3
history:
- date: '2026-04-21'
change: >-
Batch-completion webhook introduced. The changelog announces it as
`batch.enrichment.completed` with a payload carrying batchID, eventType and
a data object (enrichmentID, enrichmentCallbackURL, message); the current
webhooks reference documents the same event as
`person.batch-enrichment.completed` and does not show a batchID field. Both
names are published by Surfe; the webhooks reference is the newer surface.
sources:
- https://developers.surfe.com/changelog
- https://developers.surfe.com/webhooks
gaps:
- No webhook signature or verification mechanism is documented.
- No retry policy, delivery-attempt limit, or dead-letter behaviour is published.
- No endpoint to list, register, rotate or replay webhooks — the URL is per-request only.
- No AsyncAPI, EventCatalog, or machine-readable event schema is published.
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/surfe-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.