Skip to content

Take a One-Off Payment

Channels: Hosted · Embedded · Direct Methods: Card · BECS

The core flow behind every one-off payment:

  1. Create a payment intent on your server
  2. Collect payment details through your chosen channel
  3. Confirm the payment
  4. Treat the payment_intent.succeeded webhook as the source of truth

Step 1 — Create a payment intent

Terminal window
curl -X POST https://api.elasticpay.co/api/v1/payment_intents \
-H "Authorization: Bearer sk_sandbox_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"amount": 5000, "currency": "AUD"}'

Response:

{
"id": "pi_0abc123def456ghi789jkl012mn",
"status": "requires_payment_method",
"client_secret": "pi_0abc123def456ghi789jkl012mn_secret_xyz987",
"amount": 5000,
"currency": "AUD"
}

Pass the client_secret to your front end — it lets the widget confirm the payment without exposing your secret key.

Step 2 — Collect payment details

Pick a channel:

  • Hosted payment page — form-POST the customer to ElasticPay; no front-end code. Card only.
  • Embedded widget — mount the card widget (or the BECS widget) on your page. The widget tokenises the details and returns a pm_xxx.
  • Direct API — you already hold a tokenised pm_xxx (e.g. a saved method) and confirm server-side.

Step 3 — Confirm the payment

Terminal window
curl -X POST https://api.elasticpay.co/api/v1/payment_intents/pi_0abc123def456ghi789jkl012mn/confirm \
-H "Authorization: Bearer sk_sandbox_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"payment_method": "pm_0xyz789abc123def456ghi012jkl"}'

Check status in the response:

StatusMeaning
succeededPayment complete
processingPending — normal for BECS; wait for the webhook
requires_action3D Secure challenge (card) — the widget handles it
failedDeclined

For BECS, processing can last days and can still end in a dishonour — see BECS Direct Debit.

Step 4 — Listen for webhooks

payment_intent.succeeded is the authoritative completion signal; don’t rely on the synchronous response alone. See Webhooks.

Also saving the method?

If the customer agrees to keep their card on file, create the intent with a customer_id and "metadata": {"store_payment_method": "true"} — the first purchase then establishes the stored credential in the same transaction. See Save a Payment Method.