Endorsements

How endorsements gate what a customer can do, and how to request new ones.

Every instrument and every movement type is gated by an endorsement. The sequence is always the same:

  1. Request the endorsement you need.
  2. Wait for it to reach APPROVED.
  3. Call the endpoint it unlocks.

Calling the endpoint first returns endorsement_not_enabled. Check the endorsement before you call rather than relying on the error.

Reading them

GET /v1/customers/{customerId}/endorsements

Every entry has two gates, and both have to clear before anything provisions.

endorsement_status is Alfred's own product and rail eligibility.

ValueWhat it means for the instrument
INCOMPLETEThe instrument is not usable and nothing provisions.
APPROVEDThe instrument is usable and the endpoint will now succeed.
PAUSEDThe endorsement is withdrawn temporarily. Existing instruments stop accepting new movement, and balances are unaffected.
REVOKEDThe endorsement is withdrawn permanently. Requesting it again creates a new endorsement instead of resuming this one.

provider_endorsements[] is the provider-side approval, which Alfred doesn't control.

Approved and still waiting

A customer can read APPROVED on our side and still not provision, because a provider endorsement is outstanding.

That shows up as reason_code: provider_processing with next_action: none. Neither the customer nor you has anything to do, and Alfred is not the party holding it up. Keep listening for the webhook until the provider responds.

This is worth handling explicitly in your UI, because "approved but nothing happened" reads like a bug otherwise.

Requesting one

POST /v1/customers/{customerId}/endorsements
{ "endorsement": "fiat_collection" }

The customer has to be ACTIVE. If it isn't, the endorsement stays at INCOMPLETE indefinitely.

For fiat_collection the request itself triggers provisioning. You don't create the instrument first and then ask for permission.

Wait on customer.endorsement.updated reaching APPROVED.

The catalog

EndorsementUnlocks
fiat_collectionReceiving local currency into a virtual account
stablecoin_payinReceiving stablecoin to a deposit address
stablecoin_balanceHolding a stablecoin balance
fiat_payout.cross_borderPaying out to a bank account in another country
stablecoin_payout.third_partyPaying out to a wallet that isn't the customer's own
corporate_usd_accountOpening a Corporate USD Account
local_stablecoin.MXNaHolding MXNa in Mexico
local_stablecoin.ARSaHolding ARSa in Argentina
local_stablecoin.COPaHolding COPa in Colombia
local_stablecoin.BRZHolding BRZ in Brazil

Local stablecoin endorsements are granted per asset because eligibility is decided per jurisdiction. Approval for MXNa does not imply approval for BRZ.

Pauses and revocations

PAUSED and REVOKED arrive on customer.endorsement.updated with no other warning. They stop new movement on instruments that were working the day before.

Many integrations only handle INCOMPLETE moving to APPROVED. If yours does that, the first time an endorsement is withdrawn payments will start failing with no visible explanation. Handle all four values.


Did this page help you?