Skip to content

Payout failed

POST

The payout could not be sent. When nothing can have been broadcast the amount is available again; otherwise it stays held while FeitPay investigates. store_id is null.

FeitPay-Signature
required
string
/^t=[0-9]+(,v1=[0-9a-f]{64})+$/

t=<unix seconds>,v1=<hex> — HMAC-SHA256 keyed with the endpoint’s full whsec_… secret over <t>.<raw request body>. While a rotated secret is still valid, one v1= value is sent per valid secret: accept the delivery if any value matches (constant-time comparison) and reject timestamps outside your tolerance (the official SDKs default to 300 seconds).

Example

t=1760961600,v1=186aa47526353adc39a808f8e0bd84f501a5a6a1f483572b1f8a3eab3ed44cc8
FeitPay-Event-Id
required
string

Same as event_id in the body. Delivery is at-least-once — deduplicate on this value.

FeitPay-Event-Type
required
string
Allowed values: payment_intent.created invoice.awaiting_payment payment.detected payment.confirming payment.confirmed payment.expired payment.review_required payment.reorged payment.resolved payment.canceled webhook.test merchant.verification_updated payout.requested payout.approved payout.rejected payout.canceled payout.sent payout.completed payout.failed
FeitPay-Delivery-Id
required
string

One delivery per event and endpoint; the id stays the same across retries.

FeitPay-Delivery-Attempt
required
integer
>= 1

1 for the first attempt, incremented on every retry.

Media typeapplication/json

Body of the payout.* webhooks.

object
event_id
required
string
event_type
required
string
Allowed values: payment_intent.created invoice.awaiting_payment payment.detected payment.confirming payment.confirmed payment.expired payment.review_required payment.reorged payment.resolved payment.canceled webhook.test merchant.verification_updated payout.requested payout.approved payout.rejected payout.canceled payout.sent payout.completed payout.failed
api_version
required
string
created_at
required
string format: date-time
merchant_id
required
string
store_id
required
string | null
environment
required
string
Allowed values: test live
object
required
object
type
required
string
id
required
string
event_type
required
string
Allowed values: payout.requested payout.approved payout.rejected payout.canceled payout.sent payout.completed payout.failed
object
required
object
type
required
string
Allowed value: payout
id
required
string
data
required
object
status
required

Pending_approval (waiting for a second merchant member) → pending_operator (FeitPay review) → submitting → submitted (created in Bitcart) → sent (broadcast) → complete (confirmed). Terminal: rejected, canceled, failed.

string
Allowed values: pending_approval pending_operator submitting submitted sent complete rejected canceled failed
asset
required
string
amount
required

Decimal string. Never a float.

string
/^(0|[1-9][0-9]*)(\.[0-9]+)?$/
destination
required
string
tx_hash
required
string | null
failure_reason
required
string | null

Any 2xx response within 10 seconds marks the delivery as succeeded. The response body is only kept as a short excerpt for troubleshooting.

Any other outcome — a non-2xx status, a redirect (never followed), a timeout or a network error — is retried with exponential backoff (base × 2^(attempt − 1), capped at 6 hours, with 50–100% jitter; 10 attempts in the default configuration) and then moved to the dead-letter queue. 410 Gone stops retries immediately.