Deliveries and replay
Inspect webhook deliveries and send a delivery again when permitted.
The APIs on this page require alpha access for your organization. App availability and API access are separate. Check access and permissions.
List an endpoint's deliveries
GET /v1/webhook-endpoints/{endpoint_id}/deliveries
Lists what was sent to an endpoint and how each delivery went, never the event's content. status can be sent more than once to match any of them.
Requires webhooks:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: list_webhook_deliveries. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
Parameters
| Name | Send in | Required | Type or allowed values | Notes |
|---|---|---|---|---|
endpoint_id |
path | Yes | string | |
limit |
query | No | integer | |
cursor |
query | No | string | |
event_type |
query | No | "deduplication.run.finished", "deduplication.ai_assessment_run.finished", "deduplication.ai_assessment_run.needs_attention", "deduplication.plan.ready", "deduplication.plan.authorized", "deduplication.plan.invalidated", "deduplication.execution.finished", "deduplication.execution.needs_attention", "deduplication.set.review_changed", "deduplication.exclusion.changed", "deduplication.schedule.paused", "scheduled_run.sent", "scheduled_run.ended", "scheduled_run_batch.ended" |
|
status |
query | No | array of "queued", "sending", "delivered", "failed", "suppressed" |
Repeat this query parameter for multiple values. |
event_id |
query | No | string | |
created_at_from |
query | No | string (date-time) | |
created_at_before |
query | No | string (date-time) | |
sort |
query | No | "-created_at", "created_at" |
Response
| HTTP status | Result |
|---|---|
200 |
A page of deliveries. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
array of WebhookDelivery | Yes | |
data[].object |
"webhook_delivery" |
Yes | |
data[].id |
string | Yes | |
data[].version |
string | Yes | |
data[].endpoint_id |
string | Yes | |
data[].kind |
"event", "test", "replay" |
Yes | |
data[].event_id |
string or null | Yes | |
data[].event_type |
"deduplication.run.finished", "deduplication.ai_assessment_run.finished", "deduplication.ai_assessment_run.needs_attention", "deduplication.plan.ready", "deduplication.plan.authorized", "deduplication.plan.invalidated", "deduplication.execution.finished", "deduplication.execution.needs_attention", "deduplication.set.review_changed", "deduplication.exclusion.changed", "deduplication.schedule.paused", "scheduled_run.sent", "scheduled_run.ended", "scheduled_run_batch.ended" or null |
Yes | |
data[].replay_of |
string or null | Yes | |
data[].status |
"queued", "sending", "delivered", "failed", "suppressed" |
Yes | |
data[].delivery_outcome |
"not_sent", "accepted", "rejected", "unknown" |
Yes | |
data[].attempts |
integer | Yes | |
data[].next_attempt_at |
string (date-time) or null | Yes | |
data[].http_status |
integer or null | Yes | |
data[].reason_code |
string or null | Yes | |
data[].created_at |
string (date-time) | Yes | |
data[].ended_at |
string (date-time) or null | Yes | |
pagination |
object | Yes | |
pagination.next_cursor |
string or null | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, invalid_request, unknown_parameter, invalid_cursor. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
One of: scope_required. |
404 |
One of: not_found. |
409 |
One of: already_verified, delivery_in_progress, destination_unavailable, endpoint_inactive, idempotency_conflict, name_taken, secret_required, verification_required, version_conflict. |
410 |
One of: resource_expired. |
413 |
One of: request_too_large. |
422 |
One of: invalid_url, unsupported_filter. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Get a delivery
GET /v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}
Gets one delivery to an endpoint by its ID.
Requires webhooks:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: get_webhook_delivery. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
Parameters
| Name | Send in | Required | Type or allowed values | Notes |
|---|---|---|---|---|
endpoint_id |
path | Yes | string | |
delivery_id |
path | Yes | string |
Response
| HTTP status | Result |
|---|---|
200 |
The delivery. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
WebhookDelivery | Yes | |
data.object |
"webhook_delivery" |
Yes | |
data.id |
string | Yes | |
data.version |
string | Yes | |
data.endpoint_id |
string | Yes | |
data.kind |
"event", "test", "replay" |
Yes | |
data.event_id |
string or null | Yes | |
data.event_type |
"deduplication.run.finished", "deduplication.ai_assessment_run.finished", "deduplication.ai_assessment_run.needs_attention", "deduplication.plan.ready", "deduplication.plan.authorized", "deduplication.plan.invalidated", "deduplication.execution.finished", "deduplication.execution.needs_attention", "deduplication.set.review_changed", "deduplication.exclusion.changed", "deduplication.schedule.paused", "scheduled_run.sent", "scheduled_run.ended", "scheduled_run_batch.ended" or null |
Yes | |
data.replay_of |
string or null | Yes | |
data.status |
"queued", "sending", "delivered", "failed", "suppressed" |
Yes | |
data.delivery_outcome |
"not_sent", "accepted", "rejected", "unknown" |
Yes | |
data.attempts |
integer | Yes | |
data.next_attempt_at |
string (date-time) or null | Yes | |
data.http_status |
integer or null | Yes | |
data.reason_code |
string or null | Yes | |
data.created_at |
string (date-time) | Yes | |
data.ended_at |
string (date-time) or null | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
One of: scope_required. |
404 |
One of: not_found. |
409 |
One of: already_verified, delivery_in_progress, destination_unavailable, endpoint_inactive, idempotency_conflict, name_taken, secret_required, verification_required, version_conflict. |
410 |
One of: resource_expired. |
413 |
One of: request_too_large. |
422 |
One of: invalid_url, unsupported_filter. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Send a delivery again
POST /v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}/replays
Sends a delivery to its endpoint again. Works only when the endpoint is active and the delivery is not still being sent.
Requires webhooks:write. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: replay_webhook_delivery. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
Parameters
| Name | Send in | Required | Type or allowed values | Notes |
|---|---|---|---|---|
endpoint_id |
path | Yes | string | |
delivery_id |
path | Yes | string | |
expected_version |
JSON body | Yes | string | |
request_key |
Header: Idempotency-Key |
Yes | string |
Response
| HTTP status | Result |
|---|---|
202 |
The delivery is on its way again. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
OperationReceipt | Yes | |
data.id |
string | Yes | |
data.object |
"operation" |
Yes | |
data.version |
string | Yes | |
data.resource_id |
string | Yes | |
data.resource_type |
string | Yes | |
data.status |
"pending", "succeeded", "failed", "canceled", "needs_attention" |
Yes | |
data.terminal |
boolean | Yes | |
data.created_at |
string (date-time) | Yes | |
data.ended_at |
string (date-time) or null | Yes | |
data.reason_code |
string or null | Yes | |
data.replayed |
true |
No | |
data.operation_type |
"scan_cancel", "ai_assessment", "ai_assessment_cancel", "review_update", "exclusion_create", "exclusion_update", "scheduled_batch_create", "scheduled_batch_update", "scheduled_batch_cancel", "scheduled_run_cancel", "scheduled_record_cancel", "schedule_create", "schedule_update", "webhook_endpoint_create", "webhook_endpoint_update", "webhook_secret_rotate", "endpoint_verification", "webhook_replay", "merge_rebuild", "scheduled_batch_transfer", "webhook_endpoint_transfer" |
Yes | When data.operation_type is "scan_cancel", "ai_assessment", "ai_assessment_cancel", "review_update", "exclusion_create", "exclusion_update", "scheduled_batch_create", "scheduled_batch_update", "scheduled_batch_cancel", "scheduled_run_cancel", "scheduled_record_cancel", "schedule_create", "schedule_update", "webhook_endpoint_create", "webhook_endpoint_update", "webhook_secret_rotate", "endpoint_verification", "webhook_replay", "merge_rebuild", "scheduled_batch_transfer", "webhook_endpoint_transfer". |
data.action_metadata |
object | Yes | |
data.action_metadata.resource_version |
string | Yes | |
data.action_metadata.allowed_actions |
array of string | Yes | |
data.operation_type |
"merge_execute", "merge_cancel" |
Yes | When data.operation_type is "merge_execute", "merge_cancel". |
data.action_metadata.execute_not_before |
string (date-time) | Yes | When data.operation_type is "merge_execute", "merge_cancel". |
data.action_metadata.authorization_expires_at |
string (date-time) | Yes | When data.operation_type is "merge_execute", "merge_cancel". |
data.operation_type |
"plan_prepare", "plan_revision_prepare", "retry_plan_prepare" |
Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.plan_revision |
string | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.effects_digest |
string or null | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.preview_digest |
string or null | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.recovery_coverage_digest |
string or null | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_requirement |
object | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_requirement.scope |
"organization_baseline" |
Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_requirement.mode |
"api_key_allowed", "not_allowed" |
Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_requirement.policy_version |
string | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_requirement.grant_evaluation |
"at_execution" |
Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_requirement.reason_code |
string or null | Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.action_metadata.authorization_state |
"unauthorized", "authorized", "rejected", "invalidated", "expired" |
Yes | When data.operation_type is "plan_prepare", "plan_revision_prepare", "retry_plan_prepare". |
data.operation_type |
"review_bulk_update", "exclusion_bulk_create" |
Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results |
array of object | Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].index |
integer | Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].outcome |
"succeeded", "failed" |
Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].resource_ref |
object | No | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].resource_ref.id |
string | Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].resource_ref.version |
string | Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].error |
object | No | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].error.code |
string | Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].error.message |
string | Yes | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.action_metadata.results[].error.param |
string | No | When data.operation_type is "review_bulk_update", "exclusion_bulk_create". |
data.operation_type |
"scan", "scan_continue" |
Yes | When data.operation_type is "scan", "scan_continue". |
data.action_metadata.ai_child |
object | Yes | When data.operation_type is "scan", "scan_continue". |
data.action_metadata.ai_child.state |
"not_requested", "pending_admission", "admitted", "skipped", "failed" |
Yes | When data.operation_type is "scan", "scan_continue". |
data.action_metadata.ai_child.reason_code |
string or null | Yes | When data.operation_type is "scan", "scan_continue". |
data.action_metadata.ai_child.ai_run_id |
string | No | When data.operation_type is "scan", "scan_continue". |
data.action_metadata.ai_child.ai_operation_id |
string | No | When data.operation_type is "scan", "scan_continue". |
data.action_metadata.ai_child.operation_url |
string (uri) | No | When data.operation_type is "scan", "scan_continue". |
Accepted work can continue after the request returns. Follow its returned status or operation until it finishes; accepting work does not mean every item succeeded. See operation status.
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, invalid_request, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
One of: scope_required, plan_required, not_available. |
404 |
One of: not_found. |
409 |
One of: idempotency_conflict, version_conflict, delivery_in_progress, endpoint_inactive. |
410 |
One of: resource_expired. |
413 |
One of: request_too_large. |
422 |
One of: invalid_url, unsupported_filter. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
The public OpenAPI document lists generally available API families. Alpha operations may not appear in that document; their request and response fields are listed on this page. Use the API Playground to inspect a real response with your connection's access.