Use the JuzePOS Payments API when you already have a website, WooCommerce store, or Shopify payments app, and you want JuzePOS to take the payment, keep inventory in sync with the counter, and pay out to the same bank account as in-store sales.
| Path | When to use it |
|---|---|
| Hosted checkout | Your site builds the cart, then you send the shopper to a JuzePOS pay page. Easiest. You do not collect card numbers. |
| Direct charge | You collect the card on your domain (Stripe.js or Square Web SDK), then send JuzePOS a token. Shoppers never leave your site. |
| WooCommerce or Shopify | Install the JuzePOS gateway (sections 8 and 9). The shopper still pays on a JuzePOS page. Those carts already include tax. |
| JuzePOS marketplace | You want a JuzePOS-hosted storefront instead of your own site. That is Settings → Marketplace (Pro / add-on), not this API. |
jz_live_… immediately — JuzePOS shows it once.Send the secret on every request as Authorization: Bearer jz_live_… or X-Api-Key: jz_live_…. Production base URL: https://juzepos.com/api. Rate limit: 300 requests per minute per key.
POST /v1/checkouts with either a dollar amount or catalog lineItems, plus returnUrl and cancelUrl.checkoutUrl.returnUrl with checkout_id. Cancel uses cancelUrl.GET /v1/checkouts/:id or GET /v1/payments/:id (the id is the JuzePOS order id), and/or wait for the payment.succeeded webhook. Do not mark an order paid only because the shopper hit the success page.curl -X POST https://juzepos.com/api/v1/checkouts \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1001" \
-d '{
"amount": 42.00,
"returnUrl": "https://your-shop.com/success",
"cancelUrl": "https://your-shop.com/cart",
"reference": "order-1001"
}'
The hosted pay page takes a card. Wallet, cash, ACH, Tap to Pay, and split tender use a direct charge (section 4). Tax is $0.00 unless you send applyTax: true (section 5). A cart that already includes tax should leave applyTax off.
GET /v1/payments/config and pass the publishable Stripe or Square keys to your browser.pm_… / pi_… (Stripe) or cnon:… / ccof:… (Square).POST /v1/payments with that paymentToken and the amount or line items.status: succeeded, failed, or pending. Later you can poll GET /v1/payments/:id.curl -X POST https://juzepos.com/api/v1/payments \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1001" \
-d '{ "amount": 42.00, "paymentToken": "pm_...", "reference": "order-1001" }'
GET /v1/products and GET /v1/categories return live prices and on-hand stock (query: page, limit, search, categoryId).
Prefer product-backed line items so JuzePOS owns the price and decrements the same inventory as the POS:
curl -X POST https://juzepos.com/api/v1/checkouts \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-d '{
"lineItems": [{ "productId": "<id>", "variantId": "<id?>", "quantity": 1 }],
"returnUrl": "https://your-shop.com/success",
"cancelUrl": "https://your-shop.com/cart"
}'
A client-supplied unitPrice is ignored when productId is set.
Send applyTax: true on a checkout or a direct charge. JuzePOS adds the location sales-tax rate, or the merchant rate when the location has none, on the goods subtotal only. The delivery fee is not taxed. Leave applyTax off when your cart total already includes tax.
curl -X POST https://juzepos.com/api/v1/checkouts \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-d '{
"amount": 100.00,
"applyTax": true,
"locationId": "<location-id>",
"returnUrl": "https://your-shop.com/success",
"cancelUrl": "https://your-shop.com/cart"
}'
A 10% store rate on $100.00 of goods returns a total of $110.00. taxAmount is on the checkout response.
ProofMile must already be enabled for the store and the pickup location needs a street, city, state, and ZIP. Send delivery.address. JuzePOS quotes a live fee, adds it after tax, and dispatches the courier after the payment succeeds.
curl -X POST https://juzepos.com/api/v1/checkouts \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-d '{
"amount": 42.00,
"applyTax": true,
"returnUrl": "https://your-shop.com/success",
"cancelUrl": "https://your-shop.com/cart",
"delivery": {
"phone": "+17045550100",
"address": {
"line1": "100 Main St",
"city": "Charlotte",
"state": "NC",
"postalCode": "28202"
}
}
}'
Set paymentMethod on POST /v1/payments. Hosted checkout stays card-only.
| paymentMethod | What to send |
|---|---|
card (default) | paymentToken from Stripe (pm_ / pi_) or Square (cnon: / ccof:) |
wallet | customerId of a saved JuzePOS customer. No card token. |
cash | Amount or line items only. Records a cash sale. No token. |
ach | paymentToken for the bank account, and customerId when you have one. |
tap_to_pay | paymentToken from the reader and deviceId. |
split | splitCashAmount and splitCardAmount. They must add up to the final total, including tax and delivery. The card portion is $0 or at least $0.50, and a card portion needs paymentToken. |
curl -X POST https://juzepos.com/api/v1/payments \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1002" \
-d '{
"amount": 15.00,
"paymentMethod": "split",
"splitCashAmount": 10.00,
"splitCardAmount": 5.00,
"paymentToken": "pm_..."
}'
GET /v1/payments?status=requires_payment&page=1&limit=20. Status is requires_payment, paid, failed, refunded, or canceled.POST /v1/payments/:id/cancel.POST /v1/payments/cancel with { "ids": ["…", "…"] }. Each result is canceled or error. A paid payment must be refunded instead.POST /v1/payments/:id/refunds. Omit amount for a full refund.Idempotency-Key on checkout and charge. The same key within 24 hours returns the original order and will not double-charge.payment.succeeded, payment.failed, refund.completed. Verify X-Juze-Signature (t=<unix>,v1=<hex HMAC-SHA256 of t.rawBody>) with the signing secret shown once. Failed deliveries retry for about 8 hours. Example verifier: Developers → Webhooks.plugins/woocommerce/juzepos-gateway.php into wp-content/plugins/juzepos-gateway/ and activate JuzePOS Payments.https://juzepos.com/api.https://your-store.com/?wc-api=juzepos.POST /v1/woocommerce/checkouts and sends the shopper to the JuzePOS pay page. Woo already calculated tax, so JuzePOS does not add tax again. A shipping address turns on ProofMile when the order needs delivery.payment.succeeded webhook marks the Woo order paid. Refunds from Woo call POST /v1/payments/:id/refunds.JUZEPOS_API_KEY to the merchant’s jz_live_… key and run plugins/shopify/server.mjs. Point the payments app payment URL at that server’s POST /payment.POST /v1/shopify/payment-sessions and returns the JuzePOS checkoutUrl as redirect_url.curl -X POST https://juzepos.com/api/v1/shopify/payment-sessions \
-H "Authorization: Bearer jz_live_..." \
-H "Content-Type: application/json" \
-d '{
"id": "sess_1",
"gid": "gid://shopify/PaymentSession/1",
"amount": "18.50",
"currency": "USD",
"cancel_url": "https://your-store.myshopify.com/cart",
"kind": "sale"
}'
v1 takes a payment from your own site and from a WooCommerce or Shopify cart:
POST /v1/payments (paymentMethod)applyTax: true (goods only; delivery is not taxed). Leave it off when your cart total already includes taxdelivery.address. The live fee is added to the total and dispatched after paymentGET /v1/payments, void one with POST /v1/payments/:id/cancel, or void many with POST /v1/payments/cancelWooCommerce: install plugins/woocommerce/juzepos-gateway.php and set the API key. Shopify: run plugins/shopify/server.mjs and point the payments app at POST /payment. Both open a JuzePOS hosted checkout. Payouts use the same ACH schedule as in-store card sales. Shopify shows JuzePOS only after that payments app is installed. It is not an Authorize.net gateway.
Hosted checkout is a few server calls plus a redirect. Direct charge needs someone who can put Stripe or Square’s card form on your site. JuzePOS support can point you at the docs; we do not build custom storefronts as part of standard support.
Yes. A custom cart calls POST /v1/checkouts or POST /v1/payments. WooCommerce uses the JuzePOS gateway plugin, which posts the order to POST /v1/woocommerce/checkouts. Shopify’s payments app posts the session to POST /v1/shopify/payment-sessions (or to the bundled plugins/shopify server). Those carts already include tax, so the adapters do not add store tax again. This is not an Authorize.net connection.
Always send a stable Idempotency-Key (your order id is a good choice) and treat retries as the same request. Confirm with GET /v1/payments/:id before creating another charge.
| Page | What it covers |
|---|---|
| Developers (reference) | Curl, auth, errors, webhook verify snippet |
| Merchant User Manual | POS, catalog, payouts, and staff |
| ProofMile delivery | Last-mile delivery on POS and marketplace |
| Support | Contact and troubleshooting |
Questions: support@juzepos.com