components: schemas: Asset: description: Blockchain asset identifier used for on-chain transfers. type: object additionalProperties: false properties: chain: description: Chain/network where the asset exists. $ref: ../../external/chain_network.yaml#/components/schemas/ChainNetwork token_symbol: description: Symbol of the token on the selected chain. type: string contract_address: description: Smart-contract address for tokenized assets. type: string ExternalChainAsset: description: Blockchain asset identifier used for external-chain endpoints. `token_symbol` is required by current quote/initiate logic; `chain` remains optional. required: - token_symbol allOf: - $ref: ./payment.yaml#/components/schemas/Asset LedgerEndpoint: description: | Internal ledger-based endpoint used as payment source or destination. Current request handling accepts exactly one of `account_ref` or `account_code`. `ledger_account_ref` is accepted as a legacy alias for `account_ref`. type: object additionalProperties: false properties: account_ref: description: Reference of the primary ledger account. type: string ledger_account_ref: description: Legacy alias for `account_ref`. deprecated: true type: string account_code: description: Account code of the primary ledger account. type: string contra_account_ref: description: Optional contra ledger account reference for balancing entries. type: string contra_account_code: description: Optional contra ledger account code for balancing entries. type: string PaymentMethodEndpoint: description: Stored payment method selector. Sent with endpoint type `paymentMethod` and `data.ref`. type: object additionalProperties: false required: - ref properties: ref: description: Stored payment method reference. type: string AccountEndpoint: description: Account-owned main payment method selector. Sent with endpoint type `account` and `data.ref`. type: object additionalProperties: false required: - ref properties: ref: description: Account reference whose main payment method should be used. type: string RecipientEndpoint: description: Recipient-owned main payment method selector. Sent with endpoint type `recipient` and `data.ref`. type: object additionalProperties: false required: - ref properties: ref: description: Recipient reference whose main payment method should be used. type: string ManagedWalletEndpoint: description: Endpoint referencing a managed wallet within the platform. type: object additionalProperties: false required: - ref properties: ref: description: Reference of the managed wallet. type: string asset: description: Asset details for the managed wallet transfer. $ref: ./payment.yaml#/components/schemas/Asset ExternalChainEndpoint: description: Endpoint representing an external blockchain address. type: object additionalProperties: false required: - asset - address properties: asset: description: Asset to be transferred to or from the external address. $ref: ./payment.yaml#/components/schemas/ExternalChainAsset address: description: Target blockchain address. type: string memo: description: Optional destination memo or tag required by some chains. type: string CardEndpoint: description: | Raw card payout endpoint. Current quotation logic only requires `pan`; `exp_month` and `exp_year` are accepted but optional while pricing. Raw-card payment execution requires `pan`, `exp_month`, and `exp_year`. That execution rule also applies when a payment is later created from `quoteRef`, because the quoted endpoint snapshot is reused. type: object additionalProperties: false required: - pan properties: pan: description: Primary account number of the card. Required for both quotation and raw-card payment execution. type: string firstName: description: Optional cardholder first name hint. Current quote and execution logic do not require it. type: string lastName: description: Optional cardholder last name hint. Current quote and execution logic do not require it. type: string exp_month: description: Card expiration month. Optional for quotation, but required for raw-card payment execution, including payments executed later from `quoteRef`. type: integer format: int32 minimum: 0 exp_year: description: Card expiration year. Optional for quotation, but required for raw-card payment execution, including payments executed later from `quoteRef`. type: integer format: int32 minimum: 0 country: description: Optional card country hint. Current quote and execution logic do not require it. type: string CardTokenEndpoint: description: | Tokenized card payout endpoint used instead of raw PAN details. Current quotation and payment-execution logic require only `token`. `masked_pan` remains optional and is mainly used for display, auditing, and provider-specific context. type: object additionalProperties: false required: - token properties: token: description: Provider-issued card token. Required for both quotation and tokenized-card payment execution. type: string masked_pan: description: Optional masked PAN representation for display and auditing. Current quote and execution logic do not require it. type: string BankAccountEndpoint: description: | Russian domestic bank-account payout endpoint. The recipient name is grouped under `recipient` with `first_name` and `last_name`. type: object additionalProperties: false required: - recipient - kpp - bankName - bik - accountNumber - correspondentAccount properties: recipient: description: Legal recipient name for the bank-account payout. type: object additionalProperties: false required: - first_name - last_name properties: first_name: description: Recipient first name. type: string last_name: description: Recipient last name. type: string inn: description: Optional Russian INN tax identifier for the recipient. If present, it must be valid. Bank payout execution uses this value before falling back to the customer or saved owner tax identifier. type: string kpp: description: Russian KPP tax registration reason code. type: string bankName: description: Recipient bank name. type: string bik: description: 9-digit Russian bank identification code. type: string accountNumber: description: 20-digit Russian bank account number. type: string correspondentAccount: description: 20-digit correspondent account number. type: string example: recipient: first_name: Ivan last_name: Ivanov inn: '7707083893' kpp: '770701001' bankName: Test Bank bik: '044525225' accountNumber: '40702810900000000001' correspondentAccount: '30101810400000000225' IBANEndpoint: description: International bank-account payout endpoint. type: object additionalProperties: false required: - iban - accountHolder properties: iban: type: string accountHolder: type: string bic: type: string bankName: type: string Endpoint: description: | Polymorphic payment endpoint definition. Every endpoint is expressed with the same `type` plus `data` shape. Stored references are typed endpoints too: a stored payment method uses `type: paymentMethod`, a recipient main method uses `type: recipient`, and an account main method uses `type: account`, each with a `ref` inside `data`. Flat top-level selector fields (`paymentMethodRef`, `recipientRef`, `accountRef`) are not accepted; the request handler rejects them. type: object additionalProperties: false required: - type - data properties: type: description: Endpoint type determining the shape of the `data` field. $ref: ../../external/endpoint_type.yaml#/components/schemas/EndpointType data: description: Endpoint payload corresponding to the selected endpoint type. For raw `card` payloads, `pan` is always required and expiry becomes required once the intent is executed. anyOf: - $ref: ./payment.yaml#/components/schemas/PaymentMethodEndpoint - $ref: ./payment.yaml#/components/schemas/AccountEndpoint - $ref: ./payment.yaml#/components/schemas/RecipientEndpoint - $ref: ./payment.yaml#/components/schemas/LedgerEndpoint - $ref: ./payment.yaml#/components/schemas/ManagedWalletEndpoint - $ref: ./payment.yaml#/components/schemas/ExternalChainEndpoint - $ref: ./payment.yaml#/components/schemas/CardEndpoint - $ref: ./payment.yaml#/components/schemas/CardTokenEndpoint - $ref: ./payment.yaml#/components/schemas/BankAccountEndpoint - $ref: ./payment.yaml#/components/schemas/IBANEndpoint metadata: description: Optional key-value metadata attached to the endpoint. type: object additionalProperties: type: string PaymentResponseEndpoint: description: | Endpoint snapshot attached to a persisted payment. Uses the same `type` plus `data` shape as request endpoints. Stored-reference snapshots are emitted as typed endpoints (`paymentMethod`, `account`, or `recipient`) with a `ref` inside `data`. type: object additionalProperties: false required: - type - data properties: type: description: Endpoint type for the endpoint snapshot. $ref: ../../external/endpoint_type.yaml#/components/schemas/EndpointType data: description: Endpoint payload snapshot; shape depends on `type`. anyOf: - $ref: ./payment.yaml#/components/schemas/PaymentMethodEndpoint - $ref: ./payment.yaml#/components/schemas/AccountEndpoint - $ref: ./payment.yaml#/components/schemas/RecipientEndpoint - $ref: ./payment.yaml#/components/schemas/LedgerEndpoint - $ref: ./payment.yaml#/components/schemas/ManagedWalletEndpoint - $ref: ./payment.yaml#/components/schemas/ExternalChainEndpoint - $ref: ./payment.yaml#/components/schemas/CardEndpoint - $ref: ./payment.yaml#/components/schemas/CardTokenEndpoint - $ref: ./payment.yaml#/components/schemas/BankAccountEndpoint - $ref: ./payment.yaml#/components/schemas/IBANEndpoint Customer: description: Customer identity and address attributes for compliance and routing. type: object additionalProperties: false properties: id: description: External or internal customer identifier. type: string first_name: description: Customer first name. type: string middle_name: description: Customer middle name. type: string last_name: description: Customer last name. type: string ip: description: Source IP address associated with the payment request. type: string zip: description: Postal or ZIP code. type: string country: description: Country code of customer residence or billing address. type: string state: description: State or region. type: string city: description: City name. type: string address: description: Street address line. type: string tax_identifier: description: Customer tax identifier. Russian bank-account payouts interpret this value as INN. type: string CurrencyPair: description: Foreign-exchange currency pair. type: object additionalProperties: false required: - base - quote properties: base: description: Base currency code. type: string quote: description: Quote currency code. type: string FxIntent: description: FX execution preferences associated with a payment. type: object additionalProperties: false required: - pair - side properties: pair: description: Currency pair for FX conversion. $ref: ./payment.yaml#/components/schemas/CurrencyPair side: description: Side of the FX trade intent. $ref: ../../external/fx_side.yaml#/components/schemas/FxSide firm: description: Whether a firm quote is required. type: boolean ttl_ms: description: Desired quote time-to-live in milliseconds. type: integer format: int64 preferred_provider: description: Preferred FX liquidity provider identifier. type: string max_age_ms: description: Maximum accepted quote age in milliseconds. type: integer format: int32 PaymentIntent: description: Requested payment execution parameters before processing. For raw `card` destinations, quotation accepts missing expiry but payment execution requires `exp_month` and `exp_year`. type: object additionalProperties: false required: - kind - source - destination - amount properties: kind: description: High-level payment kind that drives orchestration behavior. $ref: ../../external/payment_kind.yaml#/components/schemas/PaymentKind source: description: Source endpoint from which funds are debited. $ref: ./payment.yaml#/components/schemas/Endpoint destination: description: Destination endpoint to which funds are credited. If `type=card`, `exp_month` and `exp_year` are optional while quoting but required when the payment is executed. $ref: ./payment.yaml#/components/schemas/Endpoint amount: description: Requested payment amount. $ref: ../common/money.yaml#/components/schemas/Money fx: description: Optional FX preferences when conversion is needed. $ref: ./payment.yaml#/components/schemas/FxIntent settlement_mode: description: Settlement strategy for the transfer. $ref: ../../external/settlement_mode.yaml#/components/schemas/SettlementMode fee_treatment: description: How fees should be applied to source/destination amounts. type: string enum: - unspecified - add_to_source - deduct_from_destination attributes: description: Additional key-value attributes used by downstream processors. type: object additionalProperties: type: string comment: description: Optional free-form comment attached to the payment intent. type: string customer: description: Optional customer information attached to the payment intent. $ref: ./payment.yaml#/components/schemas/Customer FeeLine: description: Single fee component included in a payment quote. type: object additionalProperties: false properties: ledgerAccountRef: description: Ledger account reference receiving or charging this fee. type: string amount: description: Monetary amount of the fee line. $ref: ../common/money.yaml#/components/schemas/Money lineType: description: Fee line classification. type: string side: description: Indicates whether the fee applies on debit or credit side. type: string meta: description: Optional metadata for fee calculation traceability. type: object additionalProperties: type: string QuoteFees: description: Collection of fee lines for a quoted payment. type: object additionalProperties: false properties: lines: description: List of individual quoted fee lines. type: array items: $ref: ./payment.yaml#/components/schemas/FeeLine QuoteAmounts: description: Amount breakdown returned with a payment quote. type: object additionalProperties: false properties: sourcePrincipal: description: Principal amount debited from the source before fees. $ref: ../common/money.yaml#/components/schemas/Money sourceDebitTotal: description: Total amount debited from the source including adjustments. $ref: ../common/money.yaml#/components/schemas/Money destinationSettlement: description: Net amount expected to settle at the destination. $ref: ../common/money.yaml#/components/schemas/Money FxQuote: description: FX quote details used to price converted payment amounts. type: object additionalProperties: false properties: quoteRef: description: Identifier of the FX quote. type: string baseCurrency: description: Base currency of the quote pair. type: string quoteCurrency: description: Quote currency of the quote pair. type: string side: description: FX side used for pricing. type: string price: description: Quoted FX price as a decimal string. type: string baseAmount: description: Base currency amount covered by this quote. $ref: ../common/money.yaml#/components/schemas/Money quoteAmount: description: Quote currency amount corresponding to the base amount. $ref: ../common/money.yaml#/components/schemas/Money expiresAtUnixMs: description: Quote expiration timestamp in Unix milliseconds. type: integer format: int64 pricedAtUnixMs: description: Quote pricing timestamp in Unix milliseconds. type: integer format: int64 provider: description: Provider that supplied the FX quote. type: string rateRef: description: Provider-specific rate reference identifier. type: string firm: description: Indicates whether the FX quote is firm. type: boolean FxRateCalculation: description: Exchange-rate calculation used by an FX quote. type: object additionalProperties: false required: - requestedPair - requestedSide - pathKind - marketRate - effectiveRate - overrideScope - specialRateApplied - legs properties: requestedPair: description: Requested currency pair for the FX quote. $ref: ./payment.yaml#/components/schemas/CurrencyPair requestedSide: description: FX side interpreted against the requested pair. $ref: ../../external/fx_side.yaml#/components/schemas/FxSide pathKind: description: Whether the applied rate was obtained from a direct pair or a cross-rate path. type: string enum: - direct - cross marketRate: description: Market-path rate before quote-level overrides, as a decimal string. type: string effectiveRate: description: Final rate applied to the quote after leg-level or whole-rate overrides, as a decimal string. type: string overrideScope: description: Location of the rate override. `none` means no special rate was applied. type: string enum: - none - leg - total specialRateApplied: description: Derived convenience flag equal to `overrideScope != none`. type: boolean overrideRef: description: Opaque support/audit reference for whole-rate overrides. Clients must not parse it. type: string asOfUnixMs: description: Calculation/path decision timestamp in Unix milliseconds. type: integer format: int64 legs: description: Resolved market path legs used to obtain the rate. type: array items: $ref: ./payment.yaml#/components/schemas/FxRateCalculationLeg FxRateCalculationLeg: description: One market-path leg used in an FX quote rate calculation. type: object additionalProperties: false required: - pair - sourcePair - invertedFromSource - marketRate - effectiveRate - overrideApplied properties: pair: description: Oriented pair multiplied in path order. $ref: ./payment.yaml#/components/schemas/CurrencyPair sourcePair: description: Stored/provider pair before orientation adjustments. $ref: ./payment.yaml#/components/schemas/CurrencyPair invertedFromSource: description: Whether the source pair was inverted to produce this oriented leg. type: boolean marketRate: description: Market executable rate for this leg, as a decimal string. type: string effectiveRate: description: Effective rate for this leg after leg-level override, as a decimal string. type: string provider: description: Rate provider identifier. type: string rateRef: description: Opaque support/audit reference for the source rate. Clients must not parse it. type: string asOfUnixMs: description: Source rate timestamp for this leg in Unix milliseconds. type: integer format: int64 overrideApplied: description: Whether a leg-level override was applied to this leg. type: boolean overrideRef: description: Opaque support/audit reference for the leg-level override. Clients must not parse it. type: string SpecialRateInfo: description: Indicates whether quotation pricing policy applied a non-market FX rate to the quote. type: object additionalProperties: false required: - applied properties: applied: description: Derived from `fxRateCalculation.overrideScope != none` when `fxRateCalculation` is present. type: boolean PaymentQuote: description: Pricing result for a specific payment intent. type: object additionalProperties: false required: - executable - state properties: quoteRef: description: Unique identifier of the payment quote. type: string intentRef: description: Reference to the payment intent used for quoting. type: string state: description: Backend quotation execution state. `executable` means the quote can be submitted for execution. `blocked`, `indicative`, `expired`, and `unspecified` must not be executed as-is. type: string enum: - unspecified - indicative - executable - blocked - expired executable: description: Explicit execution flag. `false` means the quote must not be sent to `/payments/by-quote` or `/payments/by-multiquote`. type: boolean blockReason: description: Reason the quote is not executable when `state` is `blocked`. Omitted for executable, indicative, and expired quotes. type: string enum: - route_unavailable - limit_blocked - risk_blocked - insufficient_liquidity - price_stale - amount_too_small - amount_too_large amounts: description: Amount breakdown for source and destination values. $ref: ./payment.yaml#/components/schemas/QuoteAmounts fees: description: Fee breakdown included in the quote. $ref: ./payment.yaml#/components/schemas/QuoteFees fxQuote: description: Associated FX quote when conversion is part of the payment. $ref: ./payment.yaml#/components/schemas/FxQuote fxRateCalculation: description: Explanation of how the FX quote rate was obtained. $ref: ./payment.yaml#/components/schemas/FxRateCalculation specialRate: description: Indicates whether quotation pricing policy applied a special FX rate while pricing this quote. $ref: ./payment.yaml#/components/schemas/SpecialRateInfo PaymentFailureCode: description: | Broad machine-readable category for a payment or operation that reports a failure condition. This field is a public category, not the orchestration service's canonical failure code. A card payout terminated after a definitive AML denial uses `failure_restriction`; its canonical orchestration code is `card.aml_denied`. The enumeration is closed and safe to use for failure handling after checking the payment state. The state remains the lifecycle authority: `failure_restriction` can accompany non-terminal `needs_attention` while manual review or additional checks are pending. `failure_policy` is reserved and is not currently returned by the API; policy blocks are reported as `failure_restriction`. The published cause-to-category-to-reason list is at https://app.sendico.io/docs/en/payment-failures/ type: string enum: - failure_unspecified - failure_balance - failure_ledger - failure_fx - failure_chain - failure_fees - failure_policy - failure_validation - failure_restriction example: failure_restriction PaymentFailureReason: description: | Stable lowercase machine-readable reason token intended for client handling. A card payout terminated after a definitive AML denial uses `aml_denied`. Detailed AML evidence, including the matched blacklist reason, and raw gateway, provider, or RPC messages are not exposed here. Unlike `failureCode`, this token set is open: compliance policy reason codes and provider-derived reasons can add values without a contract change. Treat unknown tokens as the category-level failure and keep a fallback message. Default reasons per category: `insufficient_funds`; `ledger_operation_failed`, `ledger_operation_cancelled`, `ledger_access_violation`, `ledger_validation_failed`; `fee_fx_conversion_failed`; `fee_posting_failed`; `gateway_execution_failed`, `gateway_execution_rejected`, `gateway_execution_cancelled`, `gateway_transfer_failed`, `gateway_transfer_cancelled`, `card_payout_failed`, `card_payout_cancelled`, `provider_declined`, `provider_limit`, `provider_unavailable`, `provider_status_unknown`, `provider_unknown`, `velocity_limit_exceeded`, `limits_rejected`; `validation_failed`, `quote_precision_identity_missing`, `quote_precision_asset_identity_mismatch`, `quote_precision_asset_scale_missing`, `quote_precision_amount_scale_exceeded`, `card_validation_failed`, `card_scheme_unsupported`, `card_expired`, `amount_below_minimum`, `amount_above_maximum`, `duplicate_transaction`, `currency_unsupported`; `card_scheme_disabled`, `aml_denied`, `policy_blocked`, `review_required`, `more_checks_required`, `risk_restricted`, `operation_restricted`, `card_product_unsupported`; `assessment_failed`; `failure_unspecified` for an unclassified cause. Additional currently known override reasons are `do_not_honor`, `invalid_card`, `invalid_card_number`, `invalid_cardholder_name`, `cardholder_name_mismatch`, `card_details_invalid`, `card_expiry_required`, `invalid_amount`, `provider_cancelled`, `disabled_card_scheme`, `unsupported_gateway_card_scheme`, and `recipient_tax_identifier_required`. Structured bank validation can add normalized reasons ending in `_required` or `_invalid`; compliance policy reason codes are also an open set. The published cause-to-category-to-reason list, including the additional provider, submit-validation, and bank-validation tokens, is at https://app.sendico.io/docs/en/payment-failures/ type: string pattern: '^[a-z0-9_]+$' example: aml_denied PaymentOperation: description: | Execution step record captured during payment processing. For a card payout terminated by AML screening, `failureCode` is `failure_restriction` and `failureReason` is `aml_denied`. type: object additionalProperties: false properties: stepRef: description: Identifier of the orchestration step. type: string code: description: Operation code representing the executed action. type: string state: description: Current state of the operation. type: string label: description: Human-readable operation label. type: string comment: description: Optional comment attached to the execution step. type: string money: description: Planned and executed monetary snapshots for the operation. $ref: ./payment.yaml#/components/schemas/PaymentOperationMoney operationRef: description: External operation reference identifier reported by the gateway. type: string gateway: description: Gateway microservice type handling the operation. type: string failureCode: $ref: ./payment.yaml#/components/schemas/PaymentFailureCode failureReason: $ref: ./payment.yaml#/components/schemas/PaymentFailureReason startedAt: description: RFC 3339 timestamp when execution of the operation started. type: string format: date-time completedAt: description: RFC 3339 timestamp when execution of the operation completed. type: string format: date-time PaymentOperationMoney: description: Planned and executed monetary snapshots associated with the operation. type: object additionalProperties: false properties: planned: description: Monetary values planned for the operation before execution. $ref: ./payment.yaml#/components/schemas/PaymentOperationMoneySnapshot executed: description: Monetary values observed after the operation was executed. $ref: ./payment.yaml#/components/schemas/PaymentOperationMoneySnapshot PaymentOperationMoneySnapshot: description: Monetary snapshot containing base and converted amounts for an operation state. type: object additionalProperties: false properties: amount: description: Primary money amount associated with the operation snapshot. $ref: ../common/money.yaml#/components/schemas/Money convertedAmount: description: Secondary amount for conversion operations in the same snapshot. $ref: ../common/money.yaml#/components/schemas/Money Payment: description: | Persisted payment aggregate with status, quote, and operation history. A definitive card-payout AML denial terminates the payment in the failed state and is reported as `failureCode: failure_restriction` with `failureReason: aml_denied` at both payment and failed-operation level. type: object additionalProperties: false properties: paymentRef: description: Unique payment reference identifier. type: string state: description: Current lifecycle state of the payment. $ref: ../../external/payment_state.yaml#/components/schemas/PaymentState comment: description: Optional comment copied from the original payment intent. type: string source: description: Source endpoint snapshot captured from intent. $ref: ./payment.yaml#/components/schemas/PaymentResponseEndpoint destination: description: Destination endpoint snapshot captured from intent. $ref: ./payment.yaml#/components/schemas/PaymentResponseEndpoint failureCode: $ref: ./payment.yaml#/components/schemas/PaymentFailureCode failureReason: $ref: ./payment.yaml#/components/schemas/PaymentFailureReason operations: description: Chronological list of operations executed for this payment. type: array items: $ref: ./payment.yaml#/components/schemas/PaymentOperation lastQuote: description: Most recent payment quote used or generated for the payment. $ref: ./payment.yaml#/components/schemas/PaymentQuote createdAt: description: RFC 3339 timestamp when the payment was created. type: string format: date-time completedAt: description: RFC 3339 timestamp when the payment reached a terminal state. Omitted while the payment is still in progress. type: string format: date-time meta: description: Additional metadata captured for the payment. type: object additionalProperties: type: string