POST to the URL you register, with a signed JSON payload describing the event.
A webhook subscription defines which events you want to receive and where to receive them. You can optionally scope a subscription to events from specific sequence templates, keeping your integration focused on the campaigns that matter. Every delivery is signed with an HMAC-SHA256 signature so you can verify that requests genuinely originate from Topo.
Reading subscriptions requires the
webhooks:read scope. Creating, updating, deleting, and testing subscriptions requires the webhooks:write scope.The webhook subscription object
Every webhook subscription has the following fields. Thesecret field is the exception — it is only present in the create response and is never returned again.
Unique identifier for this subscription.
Human-readable label for the subscription (1–255 characters).
The HTTPS URL Topo POSTs events to.
Optional free-form description.
The event types this subscription receives. See Event types.
When set, Topo only delivers events from those sequence templates.
null means all templates.Lifecycle status of the subscription. One of
ACTIVE, PAUSED, DISABLED. See Subscription status.The first few characters of the signing secret, safe to display. Use this to identify which secret is in use without exposing it.
When the subscription was created.
When the subscription was last modified.
Subscription status
| Status | Behaviour |
|---|---|
ACTIVE | Topo delivers matching events to the endpoint. |
PAUSED | Delivery is temporarily suspended. Events that arrive while paused are not queued — resume the subscription to start receiving new events again. |
DISABLED | The subscription has been administratively disabled. Set status to ACTIVE via PATCH to re-enable it. |
Event types
Each subscription declares which event types it wants to receive. Thetype field in every delivered payload is the discriminator.
type value | What it means |
|---|---|
message.sent | An email or LinkedIn message was sent to the contact. |
message.opened | The contact opened an email. |
message.link_clicked | The contact clicked a tracked link in an email. |
message.replied | The contact replied to a message. |
invitation.sent | A LinkedIn connection request was sent. |
invitation.accepted | The contact accepted a LinkedIn connection request. |
hot_lead.created | Topo’s AI flagged this contact as a hot lead. |
meeting.created | A meeting was booked with the contact. |
sequence.created | A contact was enrolled into a sequence. |
sequence.paused | An active sequence was paused. |
sequence.resumed | A paused sequence was resumed. |
sequence.stopped | The sequence was stopped early. |
sequence.completed | The sequence ran to completion. |
task.created | A manual task was created for the contact. |
task.completed | A manual task was marked complete. |
task.skipped | A manual task was skipped. |
Topo may add new event types as additive changes within
/v1. Your endpoint must accept and ignore unknown type values — do not return a non-2xx status just because you don’t recognise an event type.Webhook payload structure
Every delivery is an HTTPPOST with a JSON body. The payload is the same discriminated OutboundWebhookEventPayload object surfaced by the Activities API.
snake_case. See Activities — shared payload fields for the full field reference.
Delivery headers
Every POST Topo sends includes these headers:| Header | Description |
|---|---|
Content-Type | application/json |
X-Topo-Signature | HMAC-SHA256 hex digest of the raw request body, prefixed with sha256=. |
X-Topo-Event-Type | The type value of the payload (e.g. hot_lead.created). |
Verifying signatures
Every delivery is signed. You should reject requests that fail signature verification to prevent spoofed events from affecting your system. The signature is computed as:sha256=) against the X-Topo-Signature header. Always compare using a constant-time equality function to prevent timing attacks.
List webhook subscriptions
Query parameters
Page number. Must be ≥ 1.
Items per page. Between 1 and 100.
Example
Create a webhook subscription
201 Created with the subscription object, including the signing secret in a secret field.
Request body
A human-readable label for the subscription. 1–255 characters.
The HTTPS URL Topo should POST events to. Must be a valid HTTP or HTTPS URL.
Optional free-form description. Up to 1,000 characters.
One or more event type values this subscription should receive. Must contain at least one entry. See Event types.
When provided, only events from these sequence templates are delivered to this subscription. Omit or pass
null to receive events from all templates.Response fields (creation only)
The creation response includes all subscription object fields plus:The full signing secret for this subscription. Use this to verify delivery signatures. Returned only once — store it now.
Example — create a subscription for hot leads and replies
Get a webhook subscription
secret is not included in this response — only secret_prefix.
Path parameters
The unique identifier of the subscription.
Example
Update a webhook subscription
Path parameters
The unique identifier of the subscription to update.
Request body
New name. 1–255 characters.
New delivery URL.
New description. Pass
null to clear an existing description.Replace the event type filter. Must contain at least one entry. Do not pass
null — omit the field to leave it unchanged.Replace the sequence template scope. Pass
null to remove scoping and receive events from all templates.New lifecycle status. One of
ACTIVE, PAUSED, DISABLED. Do not pass null — omit the field to leave it unchanged.Example — pause a subscription
Delete a webhook subscription
204 No Content on success. This action cannot be undone — any endpoint that relied on this subscription will stop receiving events immediately.
Path parameters
The unique identifier of the subscription to delete.
Example
Send a test delivery
Path parameters
The unique identifier of the subscription to test.
Response
true if your endpoint responded with a 2xx status code, false otherwise.A human-readable description of the failure when
delivered is false. null on success.Example
Sequence template scoping
By default a subscription receives events from every sequence template in your workspace. If you want to isolate events from a particular campaign — for example, routing events from your enterprise outbound template to a different CRM pipeline — setsequence_template_ids when creating or updating the subscription.
A subscription with sequence_template_ids will only receive events where payload.sequence_template_id is in that list. Events from all other templates are silently ignored for that subscription.
To remove scoping and receive events from all templates again, PATCH the subscription with "sequence_template_ids": null.
Webhook lifecycle
Topo’s API stability policy guarantees the subscription object shape, pagination envelope, and event type discriminator values are frozen within
/v1. New event types may be added additively — your integration should ignore unknown type values rather than treating them as errors.