Track agent payments
Developer webhooks are today’s push option for your backend. Subscribe toapproval.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
Anorganization-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 HTTPSPOST 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.
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 sameReinx-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
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
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.