AcquirerCallbackService link
Acquirer-implemented callbacks t-0 pushes: authorization, settlement
progress, expiry, and payment failure. Each is delivered to the Acquirer’s
registered callback URL at least once; the Acquirer dedupes on the t-0-minted
id it carries.
AcquirerService link
t-0 endpoints the Acquirer calls to price a payment, open a payment intent, and
confirm fiat receipt.
Requests And Response Types link
CreatePaymentIntentRequest link
| Field | Type | Label | Description |
|---|
| payment_ref | string | | Payment identifier from the Acquirer’s own ledger, echoed on PaymentAuthorized, PaymentExpired, and PaymentFailed. Not an idempotency key, and not required to be unique. |
| idempotency_key | string | | Retry identity for this call, unique per Acquirer. At most one payment intent is ever created under one key, and repeating a key whose intent exists returns it unchanged. Retrying a declined payment takes a fresh key under the same payment_ref. |
| settlement | CreatePaymentIntentRequest.SettlementAmount | | |
| local | LocalAmount | | |
| quote_id | uint64 | | A standing quote from GetPaymentQuote; it must still stand, and its currency must equal local.currency when local is given. |
CreatePaymentIntentRequest.SettlementAmount link
The payment in the settlement asset, USDt: the asset every settlement leg
moves, so this figure is present for every payment whatever the Acquirer is
settled in. What it becomes in fiat, and at which rate, is the response’s
fiat settlement block, never this message.
| Field | Type | Label | Description |
|---|
| value | tzero.v1.pay.Decimal | | Amount in USDt, at most 2 decimal places. In fiat settlement mode t-0 derives the local amount from it at the locked rate; in USDt settlement mode it is also what the Acquirer is settled. |
CreatePaymentIntentResponse link
CreatePaymentIntentResponse.Failure link
CreatePaymentIntentResponse.Success link
CreatePaymentIntentResponse.Success.OnchainSettlement link
On-chain settlement mode; carries no data. The Issuer settles
settlement_amount in USDt to the Acquirer’s registered wallet; no quote
and no FX.
This message has no fields defined.
CreatePaymentIntentResponse.Success.UsdtOnChainInstructions link
The customer’s USDt-via-QR payment instructions.
CreatePaymentIntentResponse.Success.UsdtOnChainInstructions.DepositOption link
One selectable deposit option: the chain, the one-time address reserved
on it, and the USDt token contract with its decimals. Together with
settlement_amount these are everything the POS needs to build whatever
it carries to the customer (a QR image, a wallet deep link, or a plain
address).
| Field | Type | Label | Description |
|---|
| chain | tzero.v1.pay.Blockchain | | Chain this deposit option pays on. |
| deposit_address | string | | One-time deposit address reserved for this intent on chain. |
| token_contract | string | | USDt token contract on chain the deposit must be made in. |
| token_decimals | uint32 | | Decimals of token_contract: the amount to transfer in the token’s base units is settlement_amount * 10^token_decimals. USDt does not use the same decimals on every chain. |
FiatSettlement link
The fiat terms locked for a payment whose Acquirer is settled in fiat: the
standing quote, its rate, and the local amount the Acquirer is settled.
Returned on CreatePaymentIntent and repeated unchanged on PaymentAuthorized,
PaymentExpired and PaymentFailed; absent for an Acquirer settled on-chain.
| Field | Type | Label | Description |
|---|
| quote_id | uint64 | | t-0’s id of the standing quote the intent locked: the referenced one, or the one t-0 resolved when the request named none. |
| fx_rate | tzero.v1.pay.Decimal | | Locked rate, in units of local.currency per 1 USDt. |
| local | LocalAmount | | Fiat amount the Acquirer is settled: as sent in the request’s local, or, for a payment denominated in USDt, round(settlement_amount × fx_rate, half-up) to the currency’s minor units. |
GetPaymentQuoteRequest link
| Field | Type | Label | Description |
|---|
| local_currency | string | | Three-letter currency code in ISO 4217 form the merchant is quoting in (e.g. COP); not checked against the ISO list. |
| local_amount | tzero.v1.pay.Decimal | | Fiat amount in local_currency to price; a value finer than the currency’s minor units is invalid input. |
GetPaymentQuoteResponse link
GetPaymentQuoteResponse.Failure link
GetPaymentQuoteResponse.Success link
| Field | Type | Label | Description |
|---|
| quote_id | uint64 | | t-0’s id for the standing quote that priced this request; not consumed by use, any number of intents may reference it while it stands. |
| settlement_amount | tzero.v1.pay.Decimal | | The payment in the settlement asset (USDt): round(local_amount / fx_rate, 2 dp, half-up). Indicative; the binding figure is derived the same way on CreatePaymentIntent. |
| fx_rate | tzero.v1.pay.Decimal | | Standing quote’s rate, in units of local_currency per 1 USDt. |
| expires_at | google.protobuf.Timestamp | | Moment the quote stops standing, on t-0’s clock; it cannot be referenced after this. |
LocalAmount link
An amount in the local fiat currency the customer was quoted in. Minor units
are t-0’s own rule, not ISO 4217’s: COP, CLP, PYG and JPY are kept in whole
units, every other currency at two decimal places.
| Field | Type | Label | Description |
|---|
| value | tzero.v1.pay.Decimal | | Amount in currency; a value finer than the currency’s minor units is invalid input. |
| currency | string | | Three-letter currency code in ISO 4217 form (e.g. COP); not checked against the ISO list. |
PaymentAuthorizedRequest link
| Field | Type | Label | Description |
|---|
| payment_intent_id | uint64 | | Intent that was authorized. |
| payment_ref | string | | Echo of the CreatePaymentIntent payment_ref, so the merchant order can be matched by it or by payment_intent_id. |
| usdt_on_chain | tzero.v1.pay.UsdtOnChainPayment | | |
| approved_at | google.protobuf.Timestamp | | Moment t-0 accepted the Issuer’s report and authorized the payment. |
| settlement_amount | tzero.v1.pay.Decimal | | USDt the deposit credited; equals the intent’s settlement_amount, stated so the Acquirer’s ledger derives nothing. |
| received_at | google.protobuf.Timestamp | | Moment the Issuer observed the deposit final on-chain. |
| fiat_settlement | FiatSettlement | | The fiat terms locked on CreatePaymentIntent; present only for an Acquirer settled in fiat. |
PaymentAuthorizedResponse link
This message has no fields defined.
PaymentExpiredRequest link
The QR window lapsed on t-0’s clock with no payment reported; the payment is
over and nothing will settle for it.
| Field | Type | Label | Description |
|---|
| payment_intent_id | uint64 | | Intent that expired. |
| payment_ref | string | | Echo of the CreatePaymentIntent payment_ref, alongside payment_intent_id. |
| expired_at | google.protobuf.Timestamp | | Moment the intent expired on t-0’s clock. |
| fiat_settlement | FiatSettlement | | The fiat terms locked on CreatePaymentIntent; present only for an Acquirer settled in fiat. |
PaymentExpiredResponse link
This message has no fields defined.
PaymentFailedRequest link
A customer deposit against this intent will not settle and the intent is
terminally failed: clear the pending order and drop the QR. Sent only while
the QR window is still open; once an intent has expired, its expiry notice is
the last word on that payment.
PaymentFailedResponse link
This message has no fields defined.
SettlementCompletedRequest link
| Field | Type | Label | Description |
|---|
| settlement_id | uint64 | | t-0’s id for this on-chain settlement; the Acquirer dedupes on it. |
| settlement_amount | tzero.v1.pay.Decimal | | USDt amount that reached the Acquirer’s wallet. |
| settled_payment_intent_ids | uint64 | repeated | Intents this settlement clears. |
| settled_at | google.protobuf.Timestamp | | Moment t-0 verified the settlement final on-chain. |
| settlement | tzero.v1.pay.OnChainSettlementDetails | | The on-chain USDt transfer that reached the Acquirer’s registered wallet. |
| acquirer_id | uint64 | | t-0’s id for the Acquirer this settlement is addressed to. |
SettlementCompletedResponse link
This message has no fields defined.
SettlementInitiatedRequest link
| Field | Type | Label | Description |
|---|
| fiat_settlement_id | uint64 | | t-0’s id for this fiat settlement; the Acquirer dedupes on it. |
| lp_id | uint64 | | t-0’s id for the LP that sent the transfer; scopes bank_transfer_ref. |
| bank_transfer_ref | string | | Reference the LP put on the bank-rails transfer; matched against the statement. |
| settled_payment_intent_ids | uint64 | repeated | Intents this settlement clears; the Acquirer maps them to its own payment_refs. |
| local | LocalAmount | | Fiat amount and currency of the bank-rails transfer the LP reported; SettlementReceived must confirm exactly this figure. |
| acquirer_id | uint64 | | t-0’s id for the Acquirer this settlement is addressed to. |
| initiated_at | google.protobuf.Timestamp | | Moment t-0 accepted the LP’s fiat-settlement report. |
| settled_at | google.protobuf.Timestamp | | Moment the LP reported completing the bank-rails transfer — the value date to match on the statement. |
SettlementInitiatedResponse link
This message has no fields defined.
SettlementReceivedRequest link
| Field | Type | Label | Description |
|---|
| lp_id | uint64 | | t-0’s id for the LP that sent the transfer, echoed from SettlementInitiated. |
| bank_transfer_ref | string | | Reference on the received transfer, matched against the bank statement. |
| local_currency | string | | ISO 4217 currency credited. |
| amount_received | tzero.v1.pay.Decimal | | Fiat amount credited to the Acquirer’s account. |
| received_at | google.protobuf.Timestamp | | Moment the funds landed in the Acquirer’s account. |
SettlementReceivedResponse link
SettlementReceivedResponse.Accepted link
The confirmation is recorded and the covered intents are settled.
This message has no fields defined.
SettlementReceivedResponse.Rejected link
The confirmation was not recorded and the covered intents stay authorized; resubmit the same (lp_id, bank_transfer_ref) with corrected fields.
CreatePaymentIntentResponse.Failure.Reason link
| Name | Number | Description |
|---|
| REASON_UNSPECIFIED | 0 | |
| REASON_ISSUER_UNAVAILABLE | 10 | The Issuer could not be reached, or returned no usable instructions. |
| REASON_ADDRESS_POOL_EMPTY | 20 | The Issuer has no free one-time deposit addresses. |
| REASON_AMOUNT_OUT_OF_RANGE | 40 | The amount falls outside the acceptable range. |
| REASON_QUOTE_EXPIRED | 50 | The referenced quote no longer stands. |
| REASON_QUOTE_INSUFFICIENT_HEADROOM | 70 | The quote’s remaining validity is too short to guarantee execution before it expires. |
| REASON_QUOTE_UNAVAILABLE | 80 | No standing quote for the payment’s currency right now (quote_id omitted). |
GetPaymentQuoteResponse.Failure.Reason link
| Name | Number | Description |
|---|
| REASON_UNSPECIFIED | 0 | |
| REASON_QUOTE_UNAVAILABLE | 10 | No standing quote available for this currency right now. |
SettlementReceivedResponse.Rejected.Reason link
| Name | Number | Description |
|---|
| REASON_UNSPECIFIED | 0 | |
| REASON_AMOUNT_MISMATCH | 10 | amount_received does not equal the settlement_amount announced on SettlementInitiated. |
| REASON_UNKNOWN_TRANSFER | 20 | No fiat settlement matches the (lp_id, bank_transfer_ref) pair. |
| REASON_CURRENCY_MISMATCH | 30 | local_currency is not the currency announced on SettlementInitiated for the matched transfer. |