Skip to main content
Webhooks push events from Reinx to your own infrastructure as signed HTTPS POSTs — transactions completing, approvals resolving, agents changing state. Use them to keep your systems in sync without polling. Endpoints are configured per organization in Settings → Webhooks in the dashboard, or via the API with a session token (Owner or Admin role required).

Track agent payments

Developer webhooks are today’s push option for your backend. Subscribe to approval.completed for the outcome of human review; expired approvals produce no approval.completed webhook. A human approval alone does not establish settlement; the agent must continue tracking the same payment to a final result. The agent-side option is get_payment_status with the same request_id. Optional wait_seconds (integer 0–60, default 0) long-polls and returns early on a status or step change or a terminal result. MCP resource subscriptions are a later design path; they are not available today and have no promised release date.

Current payment-tracking limits

transaction.completed notifies your backend about successful transactions, but its payload does not include the payment’s request_id. Its agent_events_id identifies the event row; for a wallet settlement this is the settlement child, not the original request handle. Do not assume you can correlate that delivery to the agent’s request by id. There is no transaction webhook for the FAILED, EXPIRED, or REVERSED outcomes today. Webhooks therefore do not provide a complete per-payment status stream. The agent owns reconciliation to a final result through get_payment_status using its agent key; organization keys cannot call this agent-band tool. Your backend can relay an approval notification to the agent, but should not wait for settlement webhooks as its only completion mechanism.

Creating an endpoint

The response includes the endpoint plus a signing secret (whsec_…). It is shown once — store it immediately; it can’t be retrieved later, only rotated.

Event types

Scope filtering

An organization-scoped endpoint receives every matching event in the org. project, team, and agent scopes deliver only events whose project/team/agent matches one of the endpoint’s scopeIds. Multiple endpoints can coexist — every endpoint whose scope and event types match receives its own delivery.

The delivery request

Each delivery is an HTTPS POST with these headers: And a JSON body:
project_id, team_id, agent_id, and agent_name are present on agent-related events; org-level events (billing, funding) omit them.

Verifying signatures

Every delivery is signed with your endpoint’s secret: HMAC-SHA256(secret, "<timestamp>.<raw body>"), hex-encoded, prefixed sha256=. Always verify against the raw request bytes, before any JSON parsing or re-serialization. During the 24-hour window after a secret rotation, Reinx-Signature carries two comma-separated signatures (one per secret) — accept the delivery if any of them matches yours.
Respond with any 2xx status within 15 seconds to acknowledge. Anything else — including a timeout — counts as a failure and is retried.

Retries and auto-disable

Delivery is at-least-once: a delivery is attempted up to 5 times, backing off after each failure — 5 minutes, 30 minutes, 2 hours, then 8 hours. Retries reuse the same Reinx-Delivery-Id, so deduplicate on it. After 10 consecutive failed deliveries, the endpoint is automatically disabled (isActive: false) and its queued deliveries are dropped. Check the endpoint’s status and delivery log in Settings → Webhooks; fix your receiver, then re-enable the endpoint there (or via PUT /v1/webhooks/:id), which resets the failure counter.

Rotating the secret

Returns the new secret (again shown once) plus secretPreviousExpiresAt. For the next 24 hours deliveries are signed with both the new and old secrets, so you can deploy the new secret to your receiver without dropping events. After the window only the new secret signs.

Testing an endpoint

Sends a synthetic signed event (data: { "test": true, … }) to your URL and returns the HTTP status and response time. Test sends appear in the delivery log flagged as tests and never count toward the auto-disable failure threshold.

Delivery log

Recent deliveries with status, HTTP response code, response time, and failure reason — also visible per-endpoint in the dashboard.