# transaction/quote

## Purpose
Retrieve a real-time pricing quote for a remittance transaction before committing to the actual transfer. This endpoint calculates exchange rates, fees, and total amounts based on the requested transaction parameters.
## When to Use
Use this endpoint when you need to:
- Display pricing information to customers before they commit to a transaction
- Calculate the exact amount the beneficiary will receive
- Show exchange rates and fee breakdowns
- Validate transaction parameters and limits
- Compare pricing across different delivery methods or payout networks

## Authentication
Requires `x-client-id` and `x-secret-key` headers for partner authentication.
## Notes
- Quotes are valid for 15 minutes from the timestamp
- Exchange rates are subject to market fluctuations
- Fees may vary based on delivery method, destination country, and payout network
- Transaction limits (minimum/maximum amounts) are returned in the response
- All amounts are calculated in real-time based on current rates and partner configuration
- The optional `receiptFormat` field controls the pre-receipt output format (`html` or `pdf`). When omitted, the receipt is generated in `html` by default. It only applies when receipt generation is enabled for the partner.

## Common Errors
- `400` Validation errors (missing/invalid fields)
- `401` Invalid credentials
- `422` Business-rule rejection (e.g., pricing not available)
- `500` Internal error

<details><summary><b>Error codes (click to expand)</b></summary><table style='border-collapse:collapse; width:100%; margin-top:8px;'><thead><tr><th style='border:1px solid #e5e7eb; padding:6px; text-align:left;'>Code</th><th style='border:1px solid #e5e7eb; padding:6px; text-align:left;'>Description</th></tr></thead><tbody><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400000</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>The body of the request is required. Invalid JSON format.</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400001</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field is required (applies to any required field)</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400002</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field must be of the correct type (string, number, object, array)</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400003</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field does not meet minimum length requirement</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400004</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field exceeds maximum length</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400005</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field does not match required format (e.g., email, date)</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400006</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field value is below minimum allowed value</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400007</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field value exceeds maximum allowed value</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400008</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field has too many decimal places</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400009</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field does not match required pattern (regex)</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>400010</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Field value is not in the list of allowed values</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>401000</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Invalid credentials</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422001</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Amount below minimum transaction limit</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422002</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Amount exceeds maximum transaction limit</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422003</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Destination country not supported (also when deliveryLocationNetwork is missing or empty)</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422004</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Delivery mode not available for destination country</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422005</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Currency pair not supported</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422006</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Pricing not available for requested parameters</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>422007</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Partner not configured for quote endpoint</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>500000</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Internal server error</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>500001</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Database error</td></tr><tr><td style='border:1px solid #e5e7eb; padding:6px; width:140px;'><code>500002</code></td><td style='border:1px solid #e5e7eb; padding:6px;'>Pricing service unavailable</td></tr></tbody></table></details>

Endpoint: POST /transaction/quote
Version: 1.0.0

## Header parameters:

  - `x-client-id` (string, required)
    Unique identifier assigned to the integrating client. It determines the validation rules, allowed values, compliance policies, and operational limits applied to the request.

Error codes: required=400001, type=400002, minLength=400003, maxLength=400004

  - `x-secret-key` (string, required)
    Secret authentication key associated with the client. It is used to authorize the request and must be kept strictly confidential.

Error codes: required=400001, type=400002, minLength=400003, maxLength=400004

## Request fields (application/json):

  - `originationAmount` (number)
    Amount to send in the source currency. Either originationAmount or deliveryAmount must be provided (not both). If originationAmount is provided, the system calculates the delivery amount. Must be a positive number with up to 2 decimal places.
Error codes: type=400002, minimum=400006, decimal=400008

  - `deliveryAmount` (number)
    Desired delivery amount in destination currency. Either originationAmount or deliveryAmount must be provided (not both). If deliveryAmount is provided, the system calculates the origination amount (reverse calculation). The delivery amount may be adjusted to the nearest factor multiple if the payer requires it.
Error codes: type=400002, minimum=400006, decimal=400008

  - `originationCurrencyISO` (string, required)
    Source currency ISO 4217 code (e.g., 'USD', 'EUR'). Must be exactly 3 uppercase letters.
Error codes: required=400001, type=400002, minLength=400003, maxLength=400004, pattern=400009

  - `deliveryAmountCurrencyISO` (string, required)
    Delivery amount currency ISO 4217 code (e.g., 'MXN', 'COP'). Must be exactly 3 uppercase letters.
Error codes: required=400001, type=400002, minLength=400003, maxLength=400004, pattern=400009

  - `deliveryCountryISO` (string, required)
    Delivery country ISO 3166-1 alpha-3 code (e.g., 'MEX', 'COL'). Must be exactly 3 uppercase letters.
Error codes: required=400001, type=400002, minLength=400003, maxLength=400004, pattern=400009

  - `deliveryMode` (string, required)
    Defines the payout execution method for the transaction.
Specifies how and where the funds will be delivered to the beneficiary (e.g., cash pickup, bank deposit, mobile wallet, or home delivery), including all routing and operational parameters required to complete the payout.
You can check the delivery methods available according to your delivery country in our catalogs API:
Catalogs Endpoint Delivery Methods: GET /catalogs/countries/{deliveryCountryISO}/deliver-methods
Delivery modes (click to expand)CodeDelivery ModeDescriptionACAJERO ELEC.Cash withdrawal at an ATM (electronic cashier).BBre-B ++ ESPECBre-B digital payment network with special configuration.CBANK (DEPOSIT)Direct deposit to a bank account.DDELIVERY ++ESPECCash delivered to the recipient's address with special configuration.EPRODUCTOSProduct-based delivery (specialized).FDELIVERY ++ SUPERHome delivery with super/premium configuration.GDELIVERY ++ SUPERSuper home delivery (premium, alternate).HPRIPriority delivery method.IBre-B ++ SUPERBre-B digital payment network with super configuration.JBre-B ++ SUPERBre-B with super configuration (alternate).LUPIUnified Payments Interface (India).MOFFICE ++ ESPECCash pickup at office with special configuration.NBANK ++ ESPECBank deposit with special configuration.OM-WALLETDeposit to a mobile wallet.POFFICE (CASH)Cash withdrawal at an authorized location (office).RNOT USEDReserved code (not currently in use).SOFFICE ++ SUPERCash pickup at office with super configuration.TBANK ++ SUPERBank deposit with super configuration.UM-WALLET ++ ESPECMobile wallet with special configuration.VM-WALLET ++ SUPERMobile wallet with super configuration.XPIXPIX instant payment (Brazil).> **Important:** The availability of delivery methods may vary by destination country, partner configuration, and Viamericas internal operational settings. Always consult the `/catalogs/countries/{deliveryCountryISO}/deliver-methods` endpoint to obtain the methods currently available for your integration.

Error codes: required=400001, type=400002, allowedValues=400010
    Enum: "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "L", "M", "N", "O", "P", "R", "S", "T", "U", "V", "X"

  - `deliveryLocationNetwork` (string, required)
    Payout network or provider code (e.g., '059568AA', '000010AA'). This field is required for accurate pricing. The pricing engine needs a specific payout network identifier to determine exchange rates and fees. Without it, the request will fail with error 422003 (destination country not supported).
Error codes: required=400001, type=400002, minLength=400003, maxLength=400004

  - `fundingType` (string, required)
    Funding method used by the sender. Affects tax calculation ΓÇö Cash (C) may include additional federal/state taxes. Values: C (Cash), D (Debit Card), U (ACH/Bank Transfer), A (Credit Card), H (PayByPhone).
Error codes: required=400001, type=400002, allowedValues=400010
    Enum: "C", "D", "U", "A", "H"

  - `transactionContext` (object)
    Transaction context with branch information. When provided, branchId is used directly for pricing lookup instead of deriving it from the partner chain.
Error codes: type=400002

  - `transactionContext.branchId` (string)
    Branch ID to use for pricing. If not provided, the system derives the branch from the partner's chain_id.
Error codes: type=400002, minLength=400003, maxLength=400004

  - `promoCode` (string)
    Optional promotional/coupon code to validate and apply. If valid, the discount is applied to the fee breakdown. Invalid codes do not block the quote ΓÇö the quote is returned without discount and includes the validation result in the promoCode response object.
Error codes: type=400002, minLength=400003, maxLength=400004, pattern=400009

  - `receiptFormat` (string)
    Optional output format for the pre-transaction receipt (receiptUrl). Allowed values: 'html', 'pdf'. When omitted, the receipt is generated in 'html' format by default. Only applies when receipt generation is enabled for the partner; sending an unsupported value returns error 400010.
Error codes: type=400002, allowedValues=400010
    Enum: "html", "pdf"

## Response 200 fields (application/json):

  - `status` (string)
    Response status (success)

  - `quote` (object)
    Quote details

  - `quote.quoteTimestamp` (string)
    ISO 8601 timestamp when the quote was generated (UTC timezone). Format: YYYY-MM-DDTHH:MM:SSZ. Example: '2026-02-05T10:30:00Z'. Quotes are typically valid for 15 minutes from this timestamp.

  - `quote.originationAmount` (number)
    Amount to send in the source currency. This is the amount the sender wants to transfer, excluding fees. Precision: 2 decimal places. Example: 100.00

  - `quote.originationCurrencyISO` (string)
    Source currency ISO 4217 code (3 uppercase letters). This is the currency the sender is paying in. Common values: USD (US Dollar), EUR (Euro), GBP (British Pound). Example: 'USD'

  - `quote.deliveryAmount` (number)
    Amount the recipient will receive in the destination currency. This is calculated by applying the exchange rate to the origination amount. Precision: 2 decimal places. Example: 1850.00

  - `quote.deliveryAmountCurrencyISO` (string)
    Destination currency ISO 4217 code (3 uppercase letters). This is the currency the recipient will receive. Common values: MXN (Mexican Peso), COP (Colombian Peso), GTQ (Guatemalan Quetzal), HNL (Honduran Lempira). Example: 'MXN'

  - `quote.totalAmount` (number)
    Total amount the sender will pay, including all fees (originationAmount + totalFee). This is the final amount that will be charged to the sender. Precision: 2 decimal places. Example: 102.50

  - `quote.exchangeRate` (number)
    Exchange rate applied to convert from source currency to destination currency. The deliveryAmount is calculated as: originationAmount ├ù exchangeRate, using this rate exactly as returned, so the value is reproducible on the client side. The rate is rounded to 2 decimal places to match the ViaOne platform. Precision: 2 decimal places. Example: 18.50 (meaning 1 USD = 18.50 MXN)

  - `quote.feeBreakdown` (object)
    Detailed breakdown of all fees and charges applied to the transaction.

  - `quote.feeBreakdown.fee` (number)
    Base transaction service fee charged for processing the remittance. This is the standard fee for the transfer service. Precision: 2 decimal places. Example: 2.00

  - `quote.feeBreakdown.fundingFee` (number)
    Additional fee charged based on the funding method used by the sender (e.g., bank account, credit card, debit card). Different funding methods may have different fees. Precision: 2 decimal places. Example: 0.50

  - `quote.feeBreakdown.taxes` (number)
    Applicable taxes on the transaction, if any. This may include state or local taxes depending on the sender's location. Will be 0.00 if no taxes apply. Precision: 2 decimal places. Example: 0.00

  - `quote.feeBreakdown.discount` (number)
    Discount amount applied from a valid promo code (negative value). Only present when a valid promoCode is provided. Formula: discount = -(fixDiscount + fee ├ù percentageDiscount). Example: -2.50

  - `quote.feeBreakdown.totalFee` (number)
    Sum of all fees (fee + fundingFee + taxes + discount). This is the total cost of fees that will be added to the origination amount. When a promo code discount is applied, totalFee is reduced accordingly. Precision: 2 decimal places. Example: 2.50

  - `quote.deliveryMode` (string)
    Delivery method code indicating how the recipient will receive the funds. Single-letter codes: 'C' (Bank Deposit - funds deposited directly to recipient's bank account), 'P' (Cash Pickup - recipient collects cash at a physical location), 'O' (Mobile Wallet - funds sent to recipient's mobile wallet), 'H' (Home Delivery - cash delivered to recipient's address). Example: 'P'

  - `quote.deliveryLocationNetwork` (string)
    Payout network or provider code identifying the specific network used for delivery. This code determines which banks, cash pickup locations, or mobile wallet providers can be used. Format: alphanumeric code, typically 6-8 characters. Examples: '059568AA' (Elektra), '000010AA' (Bancomer), 'PV0001' (specific bank network). Required for accurate pricing and delivery routing.

  - `quote.minimumAmount` (number)
    Minimum transaction amount allowed for this currency pair and delivery method. Transactions below this amount will be rejected. This limit is determined by regulatory requirements and partner configuration. Precision: 2 decimal places. Example: 10.00

  - `quote.maximumAmount` (number)
    Maximum origination amount allowed (in source currency, e.g. USD). Determined by rate ranges and payer limits (limit_field < 3). Transactions above this amount will be rejected. Precision: 2 decimal places.

  - `quote.maximumDeliveryAmount` (number)
    Maximum delivery amount allowed in destination currency (e.g. MXN, COP). Only present when the payer has a local currency limit configured (limit_field >= 3). The recipient cannot receive more than this amount. Precision: 2 decimal places.

  - `quote.maximumDeliveryAmountCurrency` (string)
    ISO 4217 currency code for the maximumDeliveryAmount field (e.g. 'MXN', 'COP'). Only present when maximumDeliveryAmount is included.

  - `quote.receiptUrl` (string)
    Optional URL to a pre-transaction receipt (PDF or HTML) that can be shared with the customer before committing to the transaction. The format is controlled by the optional `receiptFormat` request field (defaults to HTML). The receipt provides a visual summary of the quote including all fees, exchange rate, and delivery details. Only included if receipt generation is enabled for the partner. Format: HTTPS URL. Example: 'https://s3.us-east-1.amazonaws.com/receipts.viamericas.net/abc123.html'

  - `quote.promoCode` (object)
    Promo code validation result. Only present when a promoCode was included in the request. Contains validation status and discount details if valid.

  - `quote.promoCode.code` (string)
    The promo code that was submitted for validation.

  - `quote.promoCode.isValid` (boolean)
    Whether the promo code is valid and the discount was applied. true = discount applied to feeBreakdown, false = no discount applied.

  - `quote.promoCode.fixDiscount` (number)
    Fixed discount amount in USD (only present when isValid=true). Example: 1.00

  - `quote.promoCode.percentageDiscount` (number)
    Percentage of the fee to discount as a decimal (only present when isValid=true). Example: 0.10 means 10% of the fee. Formula: totalDiscount = fixDiscount + (fee ├ù percentageDiscount)

  - `quote.promoCode.totalDiscount` (number)
    Total calculated discount amount applied to the fee (only present when isValid=true). This value appears as negative in feeBreakdown.discount.

  - `quote.promoCode.reason` (string)
    Reason why the promo code is invalid (only present when isValid=false). Values: 'invalid' (code does not exist), 'expired' (code has expired), 'used' (code already used), 'error' (validation service unavailable).

  - `quote.promoCode.message` (string)
    Human-readable message explaining why the promo code is invalid (only present when isValid=false).

  - `quote.viaTasa` (object)
    ViaTasa exchange rate markup result. Only present when ViaTasa is active for the partner/agency (viaTasa amount != 0). When applied, the exchangeRate returned in the quote already reflects the adjusted rate. ViaTasa is configured per agency; there is no request field for it.

  - `quote.viaTasa.originalRate` (number)
    Base exchange rate from pricing factors before the ViaTasa markup. Example: 18.50

  - `quote.viaTasa.adjustedRate` (number)
    Exchange rate after applying the ViaTasa markup. This is the rate reflected in the quote's exchangeRate and used to compute deliveryAmount. Example: 18.70

  - `quote.viaTasa.viaTasaAmount` (number)
    The ViaTasa markup added to the original rate (adjustedRate - originalRate). Example: 0.20

  - `quote.rateRange` (object)
    Allowed exchange-rate modification bounds when the agency has ViaTasa rules active. Indicates the min/max rate the agency may set for this quote. Only present when agency ViaTasa rules are configured (IsViatasa, branchType 'A', idFlagBranch 'A', PricingVersion 'v2'). Bounds are derived from the original rate and the agency's ViatasaLimit; the range may extend to cover the compositor ViaTasa amount.

  - `quote.rateRange.minRate` (number)
    Minimum exchange rate the agency may apply. Equals the original rate when the agency does not allow decreasing the rate (ViatasaAllowDecrease=false). Precision: 2 decimal places. Example: 18.13

  - `quote.rateRange.maxRate` (number)
    Maximum exchange rate the agency may apply, based on the original rate plus ViatasaLimit. Precision: 2 decimal places. Example: 18.87

  - `quote.warnings` (array)
    Non-blocking notices about the quote. These do NOT block the quote, but signal conditions that will prevent transaction creation (amount limits) or documental payer-limit notices (non-blocking payer limits, LIMIT_BLOCK='N'). Only present when at least one notice applies.

  - `quote.warnings.code` (string)
    Notice code. Business-rule codes: 'EXCEEDS_PAYER_DELIVERY_LIMIT', 'EXCEEDS_MAX_ORIGINATION_AMOUNT', 'BELOW_MIN_ORIGINATION_AMOUNT'. Non-blocking payer-limit notice code: 'PAYER_LIMIT_NOTICE'.

  - `quote.warnings.message` (string)
    Human-readable explanation of the notice.

  - `quote.warnings.limit` (number)
    The configured limit value that was exceeded. Only present for 'PAYER_LIMIT_NOTICE' notices.

  - `quote.warnings.currency` (string)
    ISO 4217 currency of the limit (origination currency when limit_field < 3, destination currency when limit_field >= 3). Only present for 'PAYER_LIMIT_NOTICE' notices.

  - `quote.warnings.title` (string)
    Optional short title for the payer-limit notice, when configured. Only present for 'PAYER_LIMIT_NOTICE' notices.

## Response 400 fields (application/json):

  - `errors` (array)
    List of validation errorsError catalog for 400 (click to expand)CodeDescription400000The body of the request is required. Invalid JSON format of the request body.400001Field is required (applies to any required field)400002Field must be of the correct type (string, number, object, array)400003Field does not meet minimum length requirement400004Field exceeds maximum length400005Field does not match required format (e.g., email, date)400006Field value is below minimum allowed value400007Field value exceeds maximum allowed value400008Field has too many decimal places400009Field does not match required pattern (regex)400010Field value is not in the list of allowed values

  - `errors.status` (string)
    Error status (always 'failed' for errors)

  - `errors.code` (number)
    Numeric error code identifying the specific validation error (400001-400010)

  - `errors.message` (string)
    Human-readable error message describing the validation failure

  - `errors.details` (string)
    Field name that failed validation

## Response 401 fields (application/json):

  - `errors` (array)
    List of authentication errorsError catalog for 401 (click to expand)CodeDescription401000Invalid credentials

  - `errors.status` (string)
    Error status (always 'failed' for errors)

  - `errors.code` (number)
    Authentication error code (401000)

  - `errors.message` (string)
    Human-readable authentication error message

  - `errors.details` (string)
    Additional authentication error context (optional)

## Response 422 fields (application/json):

  - `errors` (array)
    List of business rule errorsError catalog for 422 (click to expand)CodeDescription422001Amount below minimum transaction limit422002Amount exceeds maximum transaction limit422003Destination country not supported (Note: This error may also occur when deliveryLocationNetwork is missing or empty, as the pricing engine requires a specific payout network to determine rates)422004Delivery mode not available for destination country422005Currency pair not supported422006Pricing not available for requested parameters422007Partner not configured for quote endpoint422008Amount exceeds a blocking payer limit (LIMIT_BLOCK='Y'). The error payload includes 'limit' and 'currency' fields.

  - `errors.status` (string)
    Error status (always 'failed' for errors)

  - `errors.code` (number)
    Business rule error code (422001-422008). 422008 (AMOUNT_EXCEEDS_LIMIT) is returned when the amount to send exceeds a blocking payer limit (LIMIT_BLOCK='Y'); the error payload also includes 'limit' and 'currency', and may include 'title'. Non-blocking payer limits (LIMIT_BLOCK='N') do not error ΓÇö they appear in the response 'warnings' array as 'PAYER_LIMIT_NOTICE'.

  - `errors.message` (string)
    Human-readable business rule error message

  - `errors.details` (string)
    Additional context about the business rule violation

## Response 500 fields (application/json):

  - `errors` (array)
    List of server errorsError catalog for 500 (click to expand)CodeDescription500000Internal server error500001Database error500002Pricing service unavailable

  - `errors.status` (string)
    Error status (always 'failed' for errors)

  - `errors.code` (number)
    Server error code (500000-500002)

  - `errors.message` (string)
    Human-readable server error message

  - `errors.details` (string)
    Additional server error context (optional)

