Surfe · AsyncAPI Specification
Surfe Webhooks
Version
View Spec
View on GitHub
B2B DataContact DataSales IntelligenceEnrichmentLead GenerationCRMProspectingAsyncAPIWebhooksEvents
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.