Skip to main content
All routes require:
Paths are store-scoped. The key must include the scope for that method and access to that shop. Dashboard permission ceiling: managePayments. storeId in the JSON body is ignored. The shop is the {storeId} in the path. These routes are rate limited to 120 requests per 60 seconds (429). There is no list method on /payouts. Recent payout requests are on the balance response. Create is POST /payouts. Cancel is DELETE /payouts/{requestId}.

Get balance

Scope: balance:read Status 200. A missing store returns 404. A missing store id in the path is 400 (Store ID is required).
Lifetime totals and recentPayments include orders that have a Join Markt Crypto invoice id and status paid or completed. recentPayments is at most 25 rows, ordered by completedAt descending, then createdAt descending. recentPayoutRequests is at most 25 rows, newest createdAt first. Cancel only finds a request that is in this list. The response does not include publicId.

Create payout

Scope: payout:create Status 201.
walletKey selects a wallet already stored on the shop: Payouts must be enabled and at least one wallet must be set. The selected wallet must be non-empty. amount must be at least payout.minAmount and no greater than store.balance. Currency on the request is the store currency (same 3-letter rule as balance). payoutEmail on the created row is the store payout email.
request uses those fields only. status starts as pending. Invalid body is 400 with the field errors joined. Store not found is 404.

Cancel payout

Scope: payout:create {requestId} is the internal id, or the public id PAY-XXXX-XXXX-XXXX-XXXX-XXXX. A public id is resolved to the internal id for this shop. An unknown public id is left as sent and then fails the lookup below. The request must appear in recentPayoutRequests (the latest 25). Otherwise the response is 404 (Payout request not found), including when an older request still exists. Only pending can be cancelled. Another status returns 400 (Only pending payout requests can be cancelled, code not_cancellable). Success is 200:
amount is credited back to the store balance. The cancelled row is not in this response. Read balance again to see the new balance.

Errors

Error JSON is { "success": false, "error": "...", "code": "..." } plus any payload fields from the table above.