IssuerCallbackService

Issuer-implemented endpoint t-0 calls to reserve deposit addresses and obtain the deposit options for an intent.

Method NameRequest TypeResponse TypeDescription
CreatePaymentInstructionsCreatePaymentInstructionsRequestCreatePaymentInstructionsResponseReserves one deposit address per supported chain and returns the deposit options.

IssuerService

t-0 endpoints the Issuer calls to report what it did with a customer deposit and the USDt settlements that clear the intents it covers.

Method NameRequest TypeResponse TypeDescription
PaymentReceivedPaymentReceivedRequestPaymentReceivedResponseReports a deposit seen on-chain against an intent and the Issuer’s final disposition of it.
SettlementSentSettlementSentRequestSettlementSentResponseReports a USDt settlement sent on-chain to the registered destination, for t-0 to verify.

Requests And Response Types

CreatePaymentInstructionsRequest

FieldTypeLabelDescription
payment_intent_iduint64Intent the deposit addresses are reserved for.
acquirer_iduint64t-0’s stable id for the Acquirer; the Issuer resolves its settlement wallet from it.
amount_usdttzero.v1.pay.DecimalUSDt amount the reserved addresses should accept.
expires_atgoogle.protobuf.TimestampAbsolute moment t-0 requires the reservation held until, on t-0’s clock.

CreatePaymentInstructionsResponse

FieldTypeLabelDescription
successCreatePaymentInstructionsResponse.Success
failureCreatePaymentInstructionsResponse.Failure

CreatePaymentInstructionsResponse.Failure

FieldTypeLabelDescription
reasonCreatePaymentInstructionsResponse.Failure.Reason

CreatePaymentInstructionsResponse.Success

FieldTypeLabelDescription
deposit_optionsCreatePaymentInstructionsResponse.Success.DepositOptionrepeatedOne deposit option per chain the Issuer supports for this intent.
expires_atgoogle.protobuf.TimestampAbsolute expiry of the reservation; must be at or after the requested expires_at, else t-0 discards the instructions and declines the payment.

CreatePaymentInstructionsResponse.Success.DepositOption

One selectable deposit option: the chain, the one-time address reserved on it, and the USDt token contract.

FieldTypeLabelDescription
chaintzero.v1.pay.BlockchainChain this deposit option pays on.
deposit_addressstringOne-time deposit address reserved for this intent on chain.
token_contractstringUSDt token contract on chain the deposit must be made in.

PaymentReceivedRequest

FieldTypeLabelDescription
payment_intent_iduint64Intent the deposit was made against.
amount_usdttzero.v1.pay.DecimalUSDt the deposit actually credited, on either outcome; the Issuer reports what arrived and t-0 runs the equality check itself.
usdt_on_chaintzero.v1.pay.UsdtOnChainPayment
received_atgoogle.protobuf.TimestampMoment the Issuer observed the deposit as final on-chain.
authorizedPaymentReceivedRequest.Authorized
unprocessablePaymentReceivedRequest.Unprocessable

PaymentReceivedRequest.Authorized

The deposit passed the Issuer’s screening. Once t-0 accepts the report the Issuer owns the on-chain risk and is obligated to settle the intent.

This message has no fields defined.

PaymentReceivedRequest.Unprocessable

The Issuer will not process the deposit and the intent ends failed. The disposition says where the funds go and is final when reported.

FieldTypeLabelDescription
dispositiontzero.v1.pay.FundsDispositionWhere the funds go; final when reported.
reasontzero.v1.pay.PaymentFailureReasonWhy the deposit will not be processed; relayed to the Acquirer.

PaymentReceivedResponse

FieldTypeLabelDescription
acceptedPaymentReceivedResponse.Accepted
rejectedPaymentReceivedResponse.Rejected

PaymentReceivedResponse.Accepted

The disposition is recorded.

This message has no fields defined.

PaymentReceivedResponse.Rejected

The report was not recorded.

FieldTypeLabelDescription
reasonPaymentReceivedResponse.Rejected.Reason

SettlementSentRequest

FieldTypeLabelDescription
settlement_refstringIssuer’s id for this USDt settlement; idempotency key, unique per Issuer.
amount_usdttzero.v1.pay.DecimalTotal USDt settled across the covered intents.
settlementtzero.v1.pay.OnChainSettlementDetailsOn-chain transaction, chain, and registered destination wallet for this settlement.
settled_payment_intent_idsuint64repeatedIntents this settlement clears, treated as a set; per-intent amounts come from t-0’s ledger.
settled_atgoogle.protobuf.TimestampMoment the Issuer broadcast the settlement transaction.

SettlementSentResponse

FieldTypeLabelDescription
acceptedSettlementSentResponse.Accepted
rejectedSettlementSentResponse.Rejected

SettlementSentResponse.Accepted

This message has no fields defined.

SettlementSentResponse.Rejected

The report is not accepted. For a first-time ref the settlement is not recorded; for a CONFLICT on an already-accepted ref the original settlement stands. ON_CHAIN_UNCONFIRMED clears on its own and the report is resubmitted under the same settlement_ref once the transaction confirms; the other reasons open a manual reconciliation with t-0, and the corrected report follows from it.

FieldTypeLabelDescription
reasonSettlementSentResponse.Rejected.Reason

CreatePaymentInstructionsResponse.Failure.Reason

NameNumberDescription
REASON_UNSPECIFIED0
REASON_ADDRESS_POOL_EMPTY20No free one-time deposit addresses.
REASON_AMOUNT_OUT_OF_RANGE40The amount falls outside the acceptable range.

PaymentReceivedResponse.Rejected.Reason

NameNumberDescription
REASON_UNSPECIFIED0
REASON_INTENT_EXPIRED10Processing started after expires_at on t-0’s clock.
REASON_UNKNOWN_INTENT20No such intent exists, or another Issuer serves it.
REASON_AMOUNT_MISMATCH30amount_usdt is not exactly the amount_usdt commanded on CreatePaymentInstructions; authorized outcome only.
REASON_TRANSFER_RECORDED_FOR_ANOTHER_INTENT40The transfer is already another intent’s recorded deposit; no refund or disposition action follows — reconciled out of band.

SettlementSentResponse.Rejected.Reason

NameNumberDescription
REASON_UNSPECIFIED0
REASON_ON_CHAIN_UNCONFIRMED10The on-chain transaction is not yet confirmed. SettlementSent does not return this reason.
REASON_AMOUNT_MISMATCH20The confirmed amount does not equal amount_usdt or the covered intents’ sum.
REASON_WRONG_DESTINATION30destination_address (or its chain) is not the expected registered (chain, address) pair for the mode.
REASON_INTENT_NOT_SETTLEABLE40A listed intent is unknown, not authorized, or already covered. Fiat mode also accepts a settled intent, whose Acquirer confirmation may land before this reimbursement.
REASON_SETTLEMENT_REF_CONFLICT50Either this on-chain transfer is already recorded under a different settlement_ref, or this settlement_ref is already recorded with different identity fields. The stored settlement stands; a genuinely different transfer needs a different ref.