Calling
Enable secure payment processing during voice calls.
When implemented in your voice application, it manages the entire payment flow —
collecting card details from the caller via DTMF, then POSTing them to a payment_connector_url you host.
Your server is responsible for charging the card through your payment processor (Stripe, Braintree, etc.) and returning the result to SignalWire.
The pay method supports two primary transaction types: charges and tokenization.
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 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.
An object that accepts the following properties.
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.
The amount to charge against payment method passed in the request. Float value with no currency prefix passed as string.
Uses the ISO 4217 currency code of the charge amount.
Custom description of the payment provided in the request.
The method of how to collect the payment details. Currently only dtmf mode is supported.
Language to use for prompts being played to the caller by the pay method. Supported languages are listed in the Voice and Languages page.
Number of times the pay method will retry to collect payment details.
The minimum length of the postal code the user must enter.
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.
The identifier for your custom parameter. This will be the key in the parameters object.
The value associated with the parameter. This will be the value in the parameters object.
Indicates the payment method which is going to be used in this payment request. Currently only credit-card is supported.
Takes true, false or real postcode (if it’s known beforehand) to let pay method know whether to prompt for postal code.
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.
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”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.
The action to perform. Allowed values: Say (text-to-speech), Play (play an audio file).
When type is Say, the text to be spoken. When type is Play, the URL to the audio file.
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.
Space-separated list of card types this prompt applies to.
Allowed values: visa, mastercard, amex, maestro, discover, optima, jcb, diners-club.
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 declinedTakes true or false to let pay method know whether to prompt for security code.
The URL to send requests for each status change during the payment process. See the status_url request body section for more details.
Limit in seconds that pay method waits for the caller to press another digit before moving on to validate the digits captured.
Whether the payment is a one off payment or re-occurring. Allowed values: one-time, reusable.
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.
Text-to-speech voice to use. Supported voices are listed in the Voice and Languages page.
status_url request bodyThe status_url parameter is used to send requests for each status change during the payment process.
The type of event that is being reported. Will always be calling.call.pay.
The channel that the event is being reported from.
The timestamp of the event in the format of unix timestamp.
The project ID the event is being reported from.
The Space ID the event is being reported from.
An object containing the parameters of the event.
The URL to send requests to for each status change during the payment process.
The method to use for the requests to the status_url.
The status of the payment process.
The error type of the payment process.
The payment method of the payment process.
The payment card number of the payment process.
The payment card type of the payment process.
The security code of the payment process.
The expiration date of the payment process.
The payment card postal code of the payment process.
The control ID of the payment process.
The call ID of the payment process.
The node ID of the payment process.
Below is an example of the request body that will be sent to the status_url.
payment_connector_urlSignalWire 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.
Unique identifier for the transaction.
The payment method (e.g., credit-card).
The card number collected from the caller.
The card security code.
The card expiry month (e.g., 12).
The card expiry year (e.g., 99).
The billing postal code.
The amount to charge.
The ISO 4217 currency code.
The token type (one-time or reusable).
The payment description provided in the pay method.
Your endpoint must respond with JSON. The format varies depending on the transaction type.
Return a 200 HTTP status code with:
A unique identifier for the successful transaction.
Must be null for successful transactions.
Must be null for successful transactions.
Error responses will trigger the payment-failed prompt in your SWML application.
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}).
The overall outcome of the payment process. Possible values:
success - The payment was successful.too-many-failed-attempts - The caller exceeded the max_attempts limit.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 the STOP command.caller-hung-up - The caller hung up before completing payment.validation-error - Card details failed validation.internal-error - An internal system error occurred.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}).
Token generated by the payment processor. Use this for future transactions when using tokenization (charge_amount: 0).
Confirmation code returned by the payment processor for a successful charge.
Redacted card number (e.g., ************1234).
Type of card used (e.g., visa, mastercard, amex).
Card expiration date (e.g., 1225 for December 2025).
Redacted security code (e.g., ***).
Postal code entered by the caller.
Error description if the payment failed. Empty on success.
Error code if the payment failed. Empty on success.
Error object from the payment connector. Only present when the connector returns an error.
Connector-specific error code.
Connector-specific error message.