POST /v1/invoices call with no product
setup.
Create a store and make it payable
In the dashboard:
- Create a store. Give it a name and an image — both appear on the hosted checkout page the buyer sees.
- Enable payment methods. Pick from the 13 supported methods. A store with
none enabled cannot create orders:
POST /v1/ordersfails withStore has no payment methods enabled. - Set a payout wallet per chain. This is where swept funds go. Register an address for every chain whose methods you enabled.
Create at least one listed product
Still in the dashboard, create a product with a
title, a price (a decimal
string like "50.00"), a currency (usd or eur), and — importantly —
listed turned on.An unlisted product is rejected at order creation with Product is not available. Note the product’s id, a UUID: that is what you pass as
productId.Optionally attach a delivery — a pool of licence keys, a shared file, a
redirect. See Products and delivery.Mint an API key with the scopes you need
In the dashboard’s developer settings, create a key. You must choose scopes;
there is no implicit full-access key. For this quickstart:The
orders:write— to create and expire ordersorders:read— to read them back
Response
scopes array is the calling key’s own — so an integration can discover
what it may do without provoking a 403 to find out. enabledPaymentMethods
confirms step 1 landed.Create an order
201 Created
- Persist
id. It is the order’s public short id and the value every webhook for this order carries asdata.id. - Note
expiresAt. 30 minutes from creation by default; passexpiresIn(10 minutes to 90 days) to widen it. - Use
extraContextto carry your own correlation data. It is echoed back verbatim in every webhook for this order, which is how you find the user again.
Redirect the buyer to checkoutUrl
Send the customer to
checkoutUrl. Everything from there is Taberna’s hosted
page: the buyer picks a token from your enabled methods, gets a locked quote and
a deposit address, pays, and watches confirmations tick up.When the payment completes, the page shows a Continue button pointing at your
successUrl. The dead-end states — expired, partial — link to cancelUrl.
Neither is required, but without successUrl the buyer simply stays on the
hosted page.Learn that it was paid
Two mechanisms, and you want the first.Webhooks (recommended). Set a webhook URL in the dashboard, save the returned
Polling (fallback). Read the order back from your server whenever a webhook
did not arrive:Act on
tbrn_whsec_… secret, and handle order.completed:Node.js (Express)
status === "completed". See Webhooks for the full event
list, signature scheme and retry schedule.What to read next
Authentication
The eight scopes, what each unlocks, and 401 versus 403.
Webhooks
Payload shapes, signature verification in three languages, retries.
Payment lifecycle
State machines, partial payments, confirmation depths.
Errors and limits
Status conventions, body limits, and what Taberna does not do yet.