pay
Enable secure payment processing during voice calls. When implemented in your voice application, it manages the entire payment flow, including data collection, validation, and processing, through your configured payment gateway.
Transaction Types
The pay method supports two primary transaction types: charges and tokenization.
Charges
When you need to process a payment right away, use a charge transaction. This collects the payment details and processes the transaction in real-time.
Setting any positive value for charge_amount initiates a charge transaction.
Tokenization
Tokenization allows you to securely store payment information for future use. Instead of processing a payment immediately, it generates a secure token that represents the payment method.
To initiate a tokenization transaction, either pass charge_amount as 0 or omit the charge_amount attribute entirely.
The token is provided and stored by your payment processor and can be used for future transactions without requiring customers to re-enter their payment details. Note that this behavior may vary depending on the payment processor you are using.
Properties
pay
An object that accepts the following properties.
pay.payment_connector_url
The URL to make POST requests with all the gathered payment details. This URL processes the final payment transaction and returns the results in the response. See payment_connector_url details below.
pay.charge_amount
The amount to charge against payment method passed in the request. Float value with no currency prefix passed as string.
pay.currency
Uses the ISO 4217 currency code of the charge amount.
pay.description
Custom description of the payment provided in the request.
pay.input
The method of how to collect the payment details. Currently only dtmf mode is supported.
pay.language
Language to use for prompts being played to the caller by the pay method. Supported languages are listed in the Voice and Languages page.
pay.max_attempts
Number of times the pay method will retry to collect payment details.
pay.min_postal_code_length
The minimum length of the postal code the user must enter.
pay.parameters
Array of parameter objects to pass to your payment processor.
Enables you to pass custom parameters or include additional payment details not covered by the standard pay attributes.
parameters[].name
The identifier for your custom parameter. This will be the key in the parameters object.
parameters[].value
The value associated with the parameter. This will be the value in the parameters object.
pay.payment_method
Indicates the payment method which is going to be used in this payment request. Currently only credit-card is supported.
pay.postal_code
Takes true, false or real postcode (if it’s known beforehand) to let pay method know whether to prompt for postal code.
pay.prompts
Array of prompt objects for customizing the audio prompts played during different stages of the payment process. If no custom prompts are provided, default prompts will be used. If custom prompts are provided but certain payment steps are omitted, the system will fall back to the default prompts for those steps.
prompts[].for
The payment step this prompt is for. Possible values:
payment-card-number- Collect the payment card number. Default: “Please enter your credit card number”expiration-date- Collect the expiration date. Default: “Please enter your credit card’s expiration date. 2 digits for the month and 2 digits for the year”security-code- Collect the security code. Default: “Please enter your credit card’s security code. It’s the 3 digits located on the back of your card”postal-code- Collect the postal code. Default: “Please enter your billing postal code”payment-processing- Played during payment processing. Default: “Payment processing. Please wait”payment-completed- Played when payment succeeds. Default: “Payment completed. Thank you”payment-failed- Played when payment fails. Default: “Payment failed”payment-canceled- Played when payment is cancelled. Default: “Payment canceled”
prompts[].actions
Array of action objects to execute for this prompt. Each action can either play an audio file or speak a phrase using text-to-speech.
actions[].type
The action to perform. Allowed values: Say (text-to-speech), Play (play an audio file).
actions[].phrase
When type is Say, the text to be spoken. When type is Play, the URL to the audio file.
prompts[].attempts
Which payment attempt(s) this prompt applies to. The value increments when a payment fails. Use a single number (e.g., "1") or space-separated numbers (e.g., "2 3") to target specific attempts.
prompts[].card_type
Space-separated list of card types this prompt applies to.
Allowed values: visa, mastercard, amex, maestro, discover, optima, jcb, diners-club.
prompts[].error_type
Space-separated list of error types this prompt applies to. Possible values:
timeout- User input timeoutinvalid-card-number- Failed card validationinvalid-card-type- Unsupported card typeinvalid-date- Invalid expiration dateinvalid-security-code- Invalid CVV formatinvalid-postal-code- Invalid postal code formatsession-in-progress- Concurrent session attemptinvalid-bank-routing-number- Invalid bank routing numberinvalid-bank-account-number- Invalid bank account numberinput-matching-failed- Input matching failedcard-declined- Payment declined
pay.security_code
Takes true or false to let pay method know whether to prompt for security code.
pay.status_url
The URL to send requests for each status change during the payment process. See the status_url request body section for more details.
pay.timeout
Limit in seconds that pay method waits for the caller to press another digit before moving on to validate the digits captured.
pay.token_type
Whether the payment is a one off payment or re-occurring. Allowed values: one-time, reusable.
pay.valid_card_types
List of payment cards allowed to use in the requested payment process, separated by a space.
Allowed values: visa, mastercard, amex, maestro, discover, jcb, diners-club.
pay.voice
Text-to-speech voice to use. Supported voices are listed in the Voice and Languages page.
status_url request body
The status_url parameter is used to send requests for each status change during the payment process.
event_type
The type of event that is being reported. Will always be calling.call.pay.
event_channel
The channel that the event is being reported from.
timestamp
The timestamp of the event in the format of unix timestamp.
project_id
The project ID the event is being reported from.
space_id
The Space ID the event is being reported from.
params
An object containing the parameters of the event.
params.status_url
The URL to send requests to for each status change during the payment process.
params.status_url_method
The method to use for the requests to the status_url.
params.for
The status of the payment process.
params.error_type
The error type of the payment process.
params.payment_method
The payment method of the payment process.
params.payment_card_number
The payment card number of the payment process.
params.payment_card_type
The payment card type of the payment process.
params.security_code
The security code of the payment process.
params.expiration_date
The expiration date of the payment process.
params.payment_card_postal_code
The payment card postal code of the payment process.
params.control_id
The control ID of the payment process.
params.call_id
The call ID of the payment process.
params.node_id
The node ID of the payment process.
Request format
Below is an example of the request body that will be sent to the status_url.
payment_connector_url
SignalWire sends a POST request to the payment_connector_url once all required payment information has been collected from the caller.
Your endpoint processes the payment and returns the result.
Request body
transaction_id
Unique identifier for the transaction.
method
The payment method (e.g., credit-card).
cardnumber
The card number collected from the caller.
cvv
The card security code.
expiry_month
The card expiry month (e.g., 12).
expiry_year
The card expiry year (e.g., 99).
postal_code
The billing postal code.
chargeAmount
The amount to charge.
currency_code
The ISO 4217 currency code.
token_type
The token type (one-time or reusable).
description
The payment description provided in the pay method.
Request example
Response format
Your endpoint must respond with JSON. The format varies depending on the transaction type.
Successful charge
Successful tokenization
Failed charge
Failed tokenization
Return a 200 HTTP status code with:
charge_id
A unique identifier for the successful transaction.
error_code
Must be null for successful transactions.
error_message
Must be null for successful transactions.
Error responses will trigger the payment-failed prompt in your SWML application.
Variables
When the payment process completes, the following variables are set in the vars scope.
Access them in subsequent SWML instructions using the ${variable} syntax (e.g., ${pay_result}).
pay_result
The overall outcome of the payment process. Possible values:
success- The payment was successful.too-many-failed-attempts- The caller exceeded themax_attemptslimit.payment-connector-error- The payment connector returned an error.caller-interrupted-with-star- The caller pressed the*key to cancel.relay-pay-stop- The payment was stopped via theSTOPcommand.caller-hung-up- The caller hung up before completing payment.validation-error- Card details failed validation.internal-error- An internal system error occurred.
pay_payment_results
Detailed payment results returned by the payment processor, including card details, tokens, and any error information.
Access nested properties with dot notation (e.g., ${pay_payment_results.payment_token}).
pay_payment_results.payment_token
Token generated by the payment processor. Use this for future transactions when using tokenization (charge_amount: 0).
pay_payment_results.payment_confirmation_code
Confirmation code returned by the payment processor for a successful charge.
pay_payment_results.payment_card_number
Redacted card number (e.g., ************1234).
pay_payment_results.payment_card_type
Type of card used (e.g., visa, mastercard, amex).
pay_payment_results.payment_card_expiration_date
Card expiration date (e.g., 1225 for December 2025).
pay_payment_results.payment_card_security_code
Redacted security code (e.g., ***).
pay_payment_results.payment_card_postal_code
Postal code entered by the caller.
pay_payment_results.payment_error
Error description if the payment failed. Empty on success.
pay_payment_results.payment_error_code
Error code if the payment failed. Empty on success.
pay_payment_results.connector_error
Error object from the payment connector. Only present when the connector returns an error.
connector_error.code
Connector-specific error code.
connector_error.message
Connector-specific error message.