POST /v1/invoices call with no product setup.
Before you start
Three things happen in the dashboard, not through the API. Create a store, enable at least one payment method and set a payout wallet for its chain — walked through in Create your store. Then create at least one listed product and note itsid, a UUID: that is what you pass as productId. See
Products.
A store with no payment methods enabled cannot create orders, and an unlisted product is
rejected at order creation with Product is not available.
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 response carries the calling key’s own
orders:write— to create and expire ordersorders:read— to read them back
scopes, and
enabledPaymentMethods confirms your setup landed. See
the whoami endpoint for
the full body.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.
The
Idempotency-Key header makes the create safe to retry. A repeat with the
same key returns the original order rather than minting a second one — no
matter how the body changed.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 and signature scheme.What to read next
Authentication
The eight scopes, what each unlocks, and 401 versus 403.
Conventions
Money formats, timestamps, ids and the error shape.
Webhooks
Payload shapes and signature verification in three languages.
Payment lifecycle
State machines, partial payments, confirmation depths.