Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

Create Quotation

Create Quotation

Before initiating a payout transaction, create a quotation to lock in the exchange rate and view the total cost including fees. Quotations are valid for up to 60 minutes, giving your users time to review and confirm the transaction details.


Overview

The quotation endpoint:

  • Calculates the exact amount the recipient will receive
  • Locks the FX rate for up to 60 minutes
  • Shows all applicable fees transparently
  • Returns available payer networks for the destination

Important: A valid quotation ID is required when creating a payout transaction. The locked rate from the quotation will be applied to the actual transfer.


Endpoint

POST /api/v1/pay-out/create-quotation

Authentication: Basic Auth (Business Key + Business Secret)

Base URLs:

  • Sandbox: https://sandbox-api.cashela.com
  • Production: https://api.cashela.com

Required Headers

Authorization: Basic <base64_encoded_credentials>
Content-Type: application/json
Accept: application/json
Idempotency-Key: <uuid-v4>

Request Parameters

Body Parameters

ParameterTypeRequiredDescription
external_identifierstringYesYour unique reference for this quotation. Used for idempotency and reconciliation. Max 255 characters.
modestringYesCalculation mode: SOURCE_AMOUNT (you specify how much to send) or DESTINATION_AMOUNT (you specify how much recipient gets).
transaction_typestringYesTransaction type: C2C (Customer to Customer), B2C (Business to Customer), B2B (Business to Business).
service_idintegerYesPayout service identifier. See Get Services for available services.
sourceobjectYesSource details: currency, country, and amount.
source.currencystringYesISO 3-letter currency code (e.g., USD, EUR).
source.country_iso_codestringYesISO 3-letter country code of source (e.g., USA).
source.amountnumberConditionalAmount to send. Required when mode is SOURCE_AMOUNT.
destinationobjectYesDestination details: currency, country, and amount.
destination.currencystringYesISO 3-letter currency code (e.g., MXN, BRL).
destination.country_iso_codestringYesISO 3-letter country code of destination (e.g., MEX, BRA).
destination.amountnumberConditionalAmount recipient will receive. Required when mode is DESTINATION_AMOUNT.

Calculation Modes

SOURCE_AMOUNT: Specify how much you want to send, and the API calculates how much the recipient will receive after fees and FX conversion.

DESTINATION_AMOUNT: Specify how much the recipient should receive, and the API calculates how much you need to send including fees.


Example Requests

Send a Fixed Source Amount (SOURCE_AMOUNT)

Use this when the sender wants to pay exactly $1,000 USD:

Terminal window
curl -X POST "https://api.cashela.com/api/v1/pay-out/create-quotation" \
-H "Authorization: Basic $(echo -n 'your_business_key:your_business_secret' | base64)" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-d '{
"external_identifier": "PAYOUT-2025-00123",
"mode": "SOURCE_AMOUNT",
"transaction_type": "C2C",
"service_id": 2,
"source": {
"currency": "USD",
"country_iso_code": "USA",
"amount": 1000.00
},
"destination": {
"currency": "BRL",
"country_iso_code": "BRA",
"amount": null
}
}'

Deliver a Fixed Destination Amount (DESTINATION_AMOUNT)

Use this when the recipient needs exactly 5,000 BRL:

Terminal window
curl -X POST "https://api.cashela.com/api/v1/pay-out/create-quotation" \
-H "Authorization: Basic $(echo -n 'your_business_key:your_business_secret' | base64)" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: b2c3d4e5-f6a7-8901-bcde-f23456789012" \
-d '{
"external_identifier": "PAYOUT-2025-00124",
"mode": "DESTINATION_AMOUNT",
"transaction_type": "C2C",
"service_id": 2,
"source": {
"currency": "USD",
"country_iso_code": "USA",
"amount": null
},
"destination": {
"currency": "BRL",
"country_iso_code": "BRA",
"amount": 5000.00
}
}'

Response Format

Success Response (201 Created)

{
"success": true,
"data": {
"id": "qtn_01HJ3KBCD8E9F0G1H2I3J4K5L6",
"reference": "CSH-QTN-20250202-00001234",
"external_identifier": "PAYOUT-2025-00123",
"mode": "SOURCE_AMOUNT",
"transaction_type": "C2C",
"source": {
"amount": 1000.00,
"currency": "USD",
"country_iso_code": "USA"
},
"destination": {
"amount": 5416.96,
"currency": "BRL",
"country_iso_code": "BRA"
},
"sent_amount": {
"amount": 1000.00,
"currency": "USD"
},
"wholesale_fx_rate": 5.41696,
"retail_fx_rate": 5.35,
"fee": {
"amount": 15.00,
"currency": "USD",
"breakdown": {
"transfer_fee": 10.00,
"fx_markup": 5.00
}
},
"total_cost": {
"amount": 1015.00,
"currency": "USD"
},
"creation_date": "2025-02-02T12:56:04.000Z",
"expiration_date": "2025-02-02T13:56:04.000Z",
"status": "ONHOLD",
"payers_available": [
{
"id": 45,
"name": "BANCO SANTANDER BRASIL S.A",
"code": "santander_br",
"currency": "BRL",
"country": "BRA",
"service": {
"id": 2,
"name": "BankAccount"
},
"estimated_delivery": "1-2 business days",
"minimum_amount": 10.00,
"maximum_amount": 50000.00
},
{
"id": 46,
"name": "BANCO DO BRASIL S.A",
"code": "bb_br",
"currency": "BRL",
"country": "BRA",
"service": {
"id": 2,
"name": "BankAccount"
},
"estimated_delivery": "1-2 business days",
"minimum_amount": 10.00,
"maximum_amount": 50000.00
}
]
},
"message": "Quotation created successfully"
}

Response Parameters

FieldTypeDescription
idstringUnique quotation ID. Use this when creating the payout transaction.
referencestringCashela system reference for support and reconciliation.
external_identifierstringYour provided reference echoed back.
modestringCalculation mode used (SOURCE_AMOUNT or DESTINATION_AMOUNT).
transaction_typestringTransaction type (C2C, B2C, B2B).
sourceobjectSource amount, currency, and country.
destinationobjectDestination amount (calculated if SOURCE_AMOUNT mode), currency, and country.
sent_amountobjectTotal amount debited from your account (includes fees).
wholesale_fx_ratenumberWholesale/mid-market exchange rate.
retail_fx_ratenumberRate applied to this transaction (may include markup).
feeobjectFee amount and breakdown.
fee.breakdownobjectItemized fee components (transfer fee, FX markup, etc.).
total_costobjectTotal amount including fees in source currency.
creation_datestringISO 8601 timestamp when quotation was created.
expiration_datestringISO 8601 timestamp when quotation expires. Rate is locked until this time.
statusstringQuotation status: ONHOLD (active), USED (transaction created), EXPIRED.
payers_availablearrayList of available payout providers for this corridor.
payers_available[].idintegerPayer ID to use when creating transaction.
payers_available[].namestringPayer/bank display name.
payers_available[].codestringUnique payer code.
payers_available[].estimated_deliverystringExpected delivery time.
payers_available[].minimum_amountnumberMinimum transfer amount.
payers_available[].maximum_amountnumberMaximum transfer amount.

Quotation Status Lifecycle

StatusDescriptionNext Steps
ONHOLDActive quotation with locked rateCreate transaction before expiration
USEDTransaction created using this quotationMonitor transaction status
EXPIREDRate lock expiredCreate new quotation

Rate Locking Rules

  • Lock Duration: 60 minutes from creation
  • Rate Guarantee: The locked rate is applied to your transaction if created before expiration
  • One-Time Use: Each quotation can only be used for one transaction
  • Balance Check: Quotation creation verifies you have sufficient balance

Best Practice: Display the expiration_date to users with a countdown timer. Prompt them to refresh the quotation if they take too long to confirm.


Error Responses

HTTP StatusError CodeDescription
400INVALID_INPUTMalformed request or invalid JSON
401UNAUTHORIZEDInvalid API credentials
403FORBIDDENIP not allowlisted
403INSUFFICIENT_FUNDSAccount balance too low
404SERVICE_NOT_FOUNDInvalid service_id
404CORRIDOR_NOT_AVAILABLESource/destination corridor not supported
422AMOUNT_BELOW_MINIMUMAmount below minimum for this corridor
422AMOUNT_ABOVE_MAXIMUMAmount exceeds maximum for this corridor
422CURRENCY_MISMATCHInvalid currency for the specified country
429RATE_LIMITEDToo many requests

Best Practices

  1. Always display rates and fees to users before they confirm
  2. Show expiration countdown so users know how long the rate is valid
  3. Handle expired quotations gracefully by creating a new one
  4. Store the quotation ID to create the transaction later
  5. Check payers_available to show users which delivery methods are available

Next Steps

After creating a quotation, use the returned id to Create Transaction with the beneficiary details.