Initialize a customer-paid scan payment

Creates a pending PaymentTransaction (purpose=scan) for a vendor whose
scan_payment_bearer is customer, then returns the data the widget needs to launch
the gateway.

  • Currency NGN → Paystack inline. Response carries paystack.public_key; the widget
    opens the Paystack inline checkout client-side using reference and amount.
  • Any other currency → Startbutton hosted checkout. Response carries
    startbutton.checkout_url; the widget opens this URL in a new tab.

Idempotent on (vendor_id, batch_id) while the row is pending — replaying the request
returns the existing reference instead of stacking orphans. The exception is
has_body_addon: a replay that changes it is re-priced onto a new reference, and the
superseded row is abandoned so its open checkout cannot collect the old amount.

The breakdown block exposes the gateway fee added on top of the scan price (Oyster's
rate, the vendor's markup, and the flat body fee when has_body_addon is set). The
widget uses this to display "Subtotal + Fee = Total" before launching the gateway.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params
uuid
required

UUID v7 generated by the widget at scan start. The same value is sent to
/skin/analyze later as client_batch_id and becomes the SkinImageAnalysis batch id.

string
required
length ≤ 255
string | null
string | null
boolean
Defaults to false

Whether this session also captures hands/feet. When true the quote adds the
vendor's flat body-scan fee on top of the face rate — one fee per session,
however many parts are captured.

Send it based on what will actually be analysed, not on what the customer
picked at the offer: a part they selected but never finished capturing is not
delivered, and the fee would bill them for nothing.

Ignored when the vendor has body scanning switched off, since the API refuses
those body scans anyway. Omitting it prices a face scan.

Headers
string
required

Vendor slug — used to resolve the vendor.

string
enum
required
Allowed:
Responses

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json