Skip to main content
Topograph uses webhooks to notify you about asynchronous events:
  1. Data Retrieval: When company data or documents are ready (verification data).
  2. Monitoring: When a monitored company changes (Monitoring API).

Configuration

You configure webhooks in the Topograph Dashboard under Developers > Webhooks.

Verification (Security)

You should verify every webhook to ensure it actually came from us.

1. Get your signing secret

You can find your endpoint’s signing secret (starting with whsec_) in the Dashboard.

2. Verify the signature

We include headers in every request to allow verification:
  • svix-id: Unique message ID
  • svix-timestamp: Timestamp
  • svix-signature: The signature itself
Use a standard webhook signature verification library or your own HMAC verification code to verify these headers.

Event Types

company.updated

Sent when company data is retrieved or updated. Webhooks are sent progressively as data becomes available - you may receive multiple webhooks for the same request as different data points complete. The payload matches the response you get by calling GET /v2/company/{requestId}, plus an added type field.
Key fields:
FieldDescription
typeEvent type identifier (company.updated)
request.requestIdUnique identifier to correlate webhooks with your original request
request.versionMonotonic snapshot version for this requestId. A higher value is a newer snapshot. Use it to discard stale, out-of-order deliveries (see Ordering and duplicate delivery).
request.dataStatusStatus of each data point (succeeded, in_progress, enriching, failed). enriching means the datapoint is in progress with an intermediate AI enrichment result available.
companyCore company information
ultimateBeneficialOwnersArray of beneficial owners (when available)
legalRepresentativesArray of legal representatives (when available)
shareholdersArray of shareholders (when available)
documentsRetrieved documents with signed download URLs

monitor.notification

Sent when a monitored company changes status or details.
Change categories:
  • status - Company status changed (active, dissolved, etc.)
  • address - Legal address changed
  • ownership - Shareholders or UBOs changed
  • financial - Capital or financial information changed
  • legalRepresentatives - Legal representatives or directors changed
  • other - Other changes detected
  • disappeared - Company no longer found in register

Ordering and duplicate delivery

Webhooks for the same requestId are not guaranteed to arrive in order, and the same event can be delivered more than once due to retries. A company.updated that fails on its first delivery is retried later and can land after a newer one that succeeded immediately. Two rules keep your data correct:
  1. Each payload is a full snapshot, identical to what GET /v2/company/{requestId} returned at the time it was sent. Merge it into your store per data point. Do not blindly replace your record based on arrival order, or a late in_progress delivery can overwrite newer data.
  2. Use request.version to reject stale updates. It increases every time the snapshot changes for a requestId. Track the highest version you have applied per requestId and ignore any webhook whose version is lower than or equal to it. The late in_progress delivery carries a lower version than the final one, so this drops it.
request.version is scoped to a single requestId. Do not compare it across different requests.

Retry Policy

If your server returns an error (non-2xx status) or times out, we will retry delivery with exponential backoff.
  • First retry: Immediate
  • Subsequent retries: Increasing delays (seconds, minutes, hours)
  • Duration: We retry for up to 3 days
Ensure your webhook endpoint is idempotent and responds quickly (return 200 OK immediately, process later).