For resellers

Partner API guide

Let your own site or bot order from us, paid from your deposit or credit, with the login back at once.

Getting started

  1. Become a reseller on "Sell with us" and wait for approval.
  2. Ask for API access on the support page; the shop makes your key and webhook secret.
  3. Make a deposit, or agree a credit limit and billing cycle with the shop.

Authentication

Every request carries an Authorization Bearer header. Keep the key on your server, never in a web page or an app.

curl https://api.luminapluspremium.com/api/v1/partner/v1/balance \
  -H "Authorization: Bearer lp_live_xxxxxxxxxxxxxxxx"

Endpoints

  • GET /partner/v1/productsProducts, your wholesale price and stock left (null = delivered by hand, no count)
  • GET /partner/v1/balanceBalance, credit limit, what you can still spend, and what you owe
  • POST /partner/v1/ordersOrder: variantId, quantity, reference (your id; repeating it never orders twice), inviteEmail (email-invite packages only)
  • GET /partner/v1/ordersYour orders, newest first (limit, offset)
  • GET /partner/v1/orders/:idAn order with the logins delivered (while they are live)
  • GET /partner/v1/statement?from=&to=The bill for a period (ISO 8601)
curl -X POST https://api.luminapluspremium.com/api/v1/partner/v1/orders \
  -H "Authorization: Bearer lp_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"variantId":"<variantId>","quantity":1,"reference":"SHOP-10023"}'

# 201
{"data":{"id":"…","orderNumber":"LPAPI20261026-1A2B3C4D","reference":"SHOP-10023",
 "status":"FULFILLED","total":"80.00","items":[{"productName":"Netflix","variantName":"30 วัน",
 "deliveries":[{"status":"ACTIVE","expiresAt":"…","seat":"จอ 3",
 "credential":{"email":"…","password":"…"}}]}]},"replayed":false}

Errors

  • 401 API_KEY_REQUIRED / API_KEY_INVALID · No key, a revoked key, or a suspended account
  • 402 INSUFFICIENT_BALANCE · Not enough money; see needed and available
  • 404 VARIANT_NOT_AVAILABLE · The package is off sale or does not exist
  • 409 OUT_OF_STOCK · Sold out; nothing was charged
  • 400 QUANTITY_LIMIT · Too many in one order; see max

Webhooks

When an order is delivered we POST to your URL. Check the signature before trusting it, then read the login with GET /partner/v1/orders/:id. A call that fails is retried every minute for a day.

POST <your webhook URL>
X-LuminaPlus-Timestamp: 1767225600
X-LuminaPlus-Signature: sha256=<hex>

{"event":"order.delivered","orderId":"…","orderNumber":"…","reference":"SHOP-10023","status":"FULFILLED"}

// Node.js
const expected = "sha256=" + crypto.createHmac("sha256", WEBHOOK_SECRET)
  .update(timestamp + "." + rawBody).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))
  && Math.abs(Date.now() / 1000 - Number(timestamp)) < 300;

Deposit, credit and bills

Every order is taken from your balance; with a credit limit it may go below zero up to that limit. A refunded or cancelled order gives the money back. The shop bills on the cycle you agreed.

Problems and claims

Resellers reach us directly on the support page, and are answered first. Sign-in codes and service mail are on My products in your reseller account.