POS API
This surface integrates a point-of-sale terminal that accepts Bitcoin payments: create a payment, show the customer a QR code, and track it until it settles on-chain.
- Authentication: each terminal is issued an
apiKeyand signs every request with an HMAC-SHA256 signature (signature+tsin the request), so the secret is never transmitted. - Operation groups: Payments (create, get, list), plus the
payment.status.updatedwebhook as an alternative to polling.
The flow
Get a terminal key
In the merchant dashboard, create a store and a terminal, then copy the terminal's key. See Stores and POS Terminals.
Create a payment
Post the amount and currency. The response includes the satoshi amount, the BTC price snapshot, an expiresAt deadline, and a qrString to present to the payer.
Pass your own externalId (order or invoice id) to make the call idempotent and to correlate the payment with your records.
Show the QR and wait
Render qrString as a QR code. The customer scans it in the GoBTC Pay app and approves.
Track it to completion
Either poll Get payment, or subscribe to the payment.status.updated webhook. The webhook's data has the same shape as the Get payment response, so one parser covers both.
Webhook signatures
Each delivery is signed. Verify the X-GoBTCPay-Signature: t=<unix>,v1=<hmac> header, where:
v1 = HMAC-SHA256(signingSecret, "{t}.{rawBody}")Delivery is at-least-once, so de-duplicate on eventId. Respond with any 2xx to acknowledge receipt; non-2xx responses are retried.
The apiKey is a per-terminal secret used to sign every request. Keep it server-side or on a controlled POS device. Never ship it in a public website.