How the pieces map to OpenAI Realtime
| Ringup piece | On your Realtime bridge |
|---|---|
create_checkout | An HTTP POST your bridge makes when the order is confirmed |
| The transfer target | The transfer_to SIP URI the Checkout Session returns |
| The transfer | A <Dial><Sip> (or SIP REFER) on your telephony to the Ringup SIP URI |
| The result | A checkout.completed webhook to your server |
Prerequisites
- A running OpenAI Realtime agent reachable over the phone (Twilio media streams, the SIP connector, or your own SIP trunk).
- The telephony account that owns the inbound call leg.
- A Ringup account and API key. Test mode works out of the box on a shared sandbox. See Testing.
Step 1: Create a Checkout Session when the order is confirmed
Give the model a tool (a Realtimefunction) that signals the order is ready to pay, and handle
that tool call in your bridge by calling Ringup. There is no platform tool to register with
Ringup; this is a plain HTTP call from your server with your Ringup API key.
payment_required is none, do not transfer: finish the call normally. Otherwise transfer.
Step 2: Transfer on your bridge
Have the agent speak one short bridge line (“One moment, connecting you to secure payment”), then transfer the caller on your telephony. On Twilio, redirect the call to TwiML that dials the Ringup SIP URI, carrying the Checkout Sessionid:
Step 3: The return, and the result (the webhook)
Ringup answers the transferred call, recognizes the Caller, charges the saved Card, and texts a receipt. A first-time caller with no saved card is texted a secure pay link instead. Then the call ends one of three ways, from what you passed in Step 1:return_toset: Ringup transfers the caller back to your bridge with the outcome in SIP headers (X-Payment-Status,X-Confirmation), so your agent resumes and closes the call.success_message/failure_messageset (noreturn_to): Ringup reads your line and ends.- Neither: Ringup reads a short default and ends. The receipt is the proof.
return_to that cannot connect falls back to reading your success_message (or the default),
so a failed return never strands the caller. Either way, your server reconciles from a webhook:
order_id you passed, store the payment_id, and flip your order to paid. See
Webhooks for the full catalog, statuses, signature verification, and
idempotency.
Validation status
Because your bridge owns the telephony, the transfer is standard<Dial><Sip> (or SIP REFER) on
your provider. Ringup’s hosted transfer endpoint is rolling out; confirm access in your Ringup
dashboard before relying on this in production. The recognition, charge, receipt, and webhook
behavior is the same payment path Ringup runs everywhere.