Skip to main content

Get / Update / Delete / Preview

Get binding details, update signal filters, field maps, or excluded fields, delete a binding, or preview the resolved and serialized payload without sending.

Manage a single delivery binding: retrieve its configuration, update the signal filter or field map, delete it, or preview the payload it would produce. Updates re-validate the compatibility triangle. Deleting a binding stops future routing but allows in-flight deliveries to complete.

Use GET to inspect the current binding config and last_status. Use PUT to adjust the signal filter, field map, or retry policy — changes take effect on the next matching event. Use DELETE when the binding is no longer needed; in-flight deliveries already in the job queue will still complete.

The PUT response returns the full updated binding. The compatibility triangle is re-validated on every update — if you change the signal_filter.event_type or serializer_format, the system verifies the new combination is still valid. The preview endpoint (POST /preview) walks the resolve-project-serialize flow with a synthetic event and returns the wire output without delivering.

Pair updates with the delivery history endpoint to verify the binding is producing expected results. If last_status shows failed, check the DLQ for error details before adjusting the binding config.

The public API preview endpoint currently returns a stub response. The internal preview endpoint is fully functional and walks the full resolve, project, and serialize flow with structural fallback.
GET/v1/delivery/bindings/:id

Response

Response fields

idstringBinding UUID.
namestringBinding name.
signal_filterobjectEvent filter.
deliverable_typestringPayload resolver type.
destination_idstringTarget destination UUID.
serializer_formatstringSerializer format.
serializer_configobjectSerializer configuration.
excluded_fieldsstring[] | nullBinding-level egress filter; null when no exclusions are set.
field_mapobjectJSONPath field projection map.
delivery_policyobjectRetry policy.
is_activebooleanWhether the binding is enabled.
last_statusstring | nullStatus of the most recent delivery attempt.
created_atstringISO 8601 creation timestamp.
updated_atstringISO 8601 last update timestamp.

Response

{
  "id": "d4e5f6a7-b8c9-0123-defa-345678901234",
  "name": "Notify on extraction complete",
  "signal_filter": { "event_type": "document.extraction.completed" },
  "deliverable_type": "document_capture",
  "destination_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "serializer_format": "json",
  "serializer_config": {},
  "field_map": { "vendor": "$.vendor_name", "total": "$.amount" },
  "delivery_policy": { "max_attempts": 5, "backoff_schedule": [1000, 5000, 30000] },
  "is_active": true,
  "last_status": "succeeded",
  "created_at": "2024-09-10T09:00:00.000Z",
  "updated_at": "2024-09-10T09:00:00.000Z"
}

Errors

Error responses

401unauthorizedMissing or invalid API key.
404not_foundNo binding with this ID exists for your organization.
429rate_limitedToo many requests. Retry after the period indicated in the Retry-After header.
PUT/v1/delivery/bindings/:id

Body parameters

signal_filterobjectUpdated event filter.
excluded_fieldsstring[]Updated egress filter (max 200 entries, 1-256 chars each). Only valid with the `pipeline.capture` deliverable. Pass an empty array to clear exclusions.
field_mapobjectUpdated field projection.
delivery_policyobjectUpdated retry policy.
is_activebooleanEnable or disable the binding.

Response

Response fields

idstringBinding UUID.
namestringBinding name.
signal_filterobjectUpdated event filter.
deliverable_typestringPayload resolver type.
destination_idstringTarget destination UUID.
serializer_formatstringSerializer format.
serializer_configobjectSerializer configuration.
field_mapobjectUpdated field projection map.
delivery_policyobjectUpdated retry policy.
is_activebooleanCurrent active status.
last_statusstring | nullStatus of the most recent delivery attempt.
created_atstringISO 8601 creation timestamp.
updated_atstringISO 8601 last update timestamp.

Response

{
  "id": "d4e5f6a7-b8c9-0123-defa-345678901234",
  "name": "Notify on extraction complete",
  "signal_filter": { "event_type": "document.extraction.completed" },
  "deliverable_type": "document_capture",
  "destination_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "serializer_format": "json",
  "serializer_config": {},
  "field_map": { "vendor": "$.vendor_name", "total": "$.amount", "date": "$.invoice_date" },
  "delivery_policy": { "max_attempts": 7 },
  "is_active": true,
  "last_status": "succeeded",
  "created_at": "2024-09-10T09:00:00.000Z",
  "updated_at": "2024-09-16T10:00:00.000Z"
}

Errors

Error responses

400validation_errorUpdated configuration fails the compatibility triangle validation.
401unauthorizedMissing or invalid API key.
404not_foundNo binding with this ID exists for your organization.
429rate_limitedToo many requests. Retry after the period indicated in the Retry-After header.
DELETE/v1/delivery/bindings/:id

Response

Response fields

deletedbooleanAlways true on success.

Response

{
  "deleted": true
}

Errors

Error responses

401unauthorizedMissing or invalid API key.
404not_foundNo binding with this ID exists for your organization.
429rate_limitedToo many requests. Retry after the period indicated in the Retry-After header.
POST/v1/delivery/bindings/:id/preview

Preview Response

On the public API this route currently returns the placeholder { "preview": "not-implemented-in-slice-1-MVP" }; the full preview described below is what the wired preview service returns today — it backs the platform's binding editor — and is the shape this route serves once the public wiring lands. The preview builds a synthetic event matching the binding's signal_filter, then walks the delivery pipeline up to — but not including — the connector call. When the resolver can produce a real payload, sample_mode is real and the response carries the projected payload, the serialized bytes, and a wire_preview of the body and headers. When the synthetic entity cannot resolve (typically because the referenced entity does not exist yet), the preview degrades to sample_mode: "structural": it returns the resolver's declared shape with a fallback_reason instead of concrete data.

For a binding that carries excluded_fields, the response also includes exclusion_check — the only surface where a misconfigured exclusion is caught. checked: true means a real payload was resolved and unmatched_keys lists the exclusion entries that matched no field on it (matching is exact and case-sensitive, so an unmatched key is usually a typo or a renamed field — and it withholds nothing at delivery time); an empty array means every key matched. checked: false means the preview could not verify the keys — the structural fallback has no payload to check against — and reason says why. It is not a claim that the keys match.

Response fields

availablebooleanAlways true when the preview ran.
sample_modestring`real` (payload resolved) or `structural` (resolver shape only).
signalobjectThe synthetic event the preview fed through the binding.
resolverobjectThe deliverable resolver: `type` and declared `shape`.
projectedobject | nullResolved and field-map-projected payload; null in structural mode.
serializedobject | nullSerializer output; null in structural mode.
wire_previewobject | nullDelivery-time view: `body_preview`, `mime`, `size_bytes`, `headers_preview`.
structural_sampleobjectPresent in structural mode: `deliverable_type` and `shape`.
fallback_reasonstringWhy the preview fell back to structural mode, if it did.
exclusion_checkobjectPresent only when the binding carries `excluded_fields`: `checked`, `unmatched_keys[]`, optional `reason`.

Response (real sample, one unmatched exclusion key)

{
  "available": true,
  "sample_mode": "real",
  "signal": { "type": "document.structured", "document_id": "…", "pipeline_id": "…" },
  "resolver": { "type": "pipeline.capture", "shape": { "kind": "record", "is_collection": false, "columns": [] } },
  "projected": { "fields": { "vendor_name": "Acme Corp", "total_amount": "1250.00" } },
  "serialized": { "mime": "application/json", "size_bytes": 182 },
  "wire_preview": {
    "body_preview": "{\"fields\":{\"vendor_name\":\"Acme Corp\",\"total_amount\":\"1250.00\"}}",
    "mime": "application/json",
    "size_bytes": 182,
    "headers_preview": { "X-Talonic-Idempotency-Key": "a3f8c2d1e4b7…" }
  },
  "exclusion_check": {
    "checked": true,
    "unmatched_keys": ["SQL_Data"]
  }
}
An entry in exclusion_check.unmatched_keys means that key withholds nothing at delivery time — the field the operator believes withheld is still shipping. Fix the key (matching is exact and case-sensitive) and preview again. checked: false is not a pass: it means the keys could not be verified.

Errors

Error responses

401unauthorizedMissing or invalid API key.
404not_foundNo binding with this ID exists for your organization.
429rate_limitedToo many requests. Retry after the period indicated in the Retry-After header.

Frequently asked questions

Does deleting a binding affect in-flight deliveries?+
No. In-flight deliveries (already queued in the delivery job queue) will complete normally. Deletion only prevents new events from being routed to this binding.
Is the preview endpoint live?+
The public API preview endpoint currently returns a stub response. The internal preview endpoint is fully functional and walks the full resolve -> project -> serialize flow.
Does updating a binding re-check compatibility?+
Yes. Every PUT re-validates the compatibility triangle. If you change the signal_filter.event_type, deliverable_type, or serializer_format to an incompatible combination, the update is rejected with a 400 validation error.
What does exclusion_check tell me?+
For a binding carrying excluded_fields, the preview reports whether each exclusion key actually matched a field on a resolved payload. `checked: true` with an empty `unmatched_keys` means every key matched; a listed key withholds nothing at delivery time. `checked: false` means the keys could not be verified (structural fallback) — not that they match.