Authentication
Authorization: Bearer <subscriber_jwt> — the JWT issued to the subscriber after login.
Endpoints
GET /partner/subscriber/me
Returns the subscriber record, all their subscriptions, any anonymous external-checkout sessions linked to the account, and provider branding:An account with no subscriber record yet (freshly registered, nothing ordered) gets a 200 with
"subscriber": null and empty subscriptions — not a 404.GET /partner/subscriber/me/details
Returns the full account profile used by the Account page.customer_number is the provider-scoped, human-readable customer number (four letters, dash, four digits — also printed on invoices); it is null for accounts linked before the number rollout that have not been backfilled:
/me, which returns "subscriber": null).
PATCH /partner/subscriber/me/password
{"success": true, "message": "Password updated successfully"}. A wrong current password returns 400 "Current password is incorrect".
GET /partner/subscriber/me/invoices
Returns the subscriber’s kurnl invoices (local invoice rows, not Invoice Ninja objects), sorted byinvoice_date descending:
"No subscriber record found for this account" when the account has no subscriber record (same for the other /me/* sub-resources).
GET /partner/subscriber/me/credit-notes
Returns the subscriber’s credit notes — cancellation refunds and credits, plan-change and operator credits — read live from the provider’s billing system (Invoice Ninja), newest first. Drafts, archived and voided notes are never listed. Unlike invoices, nothing is stored on the kurnl side.state is the customer-facing status: open (issued, not yet settled), refunded (refunded to the card), paid_out (paid out by other means), applied (applied against an invoice). amount is the gross amount in the provider’s currency.
The PDF of a credit note is served by GET /api/v1/credit-notes/{id}/pdf with the subscriber’s session — the same access model as invoice PDFs; a note that does not belong to the subscriber answers 404.
Returns 404 when the account has no subscriber record and 502 when the billing system is unreachable (never an empty list in that case).
GET /partner/subscriber/me/usage
Per-month download/upload usage in GB for the subscriber’s active subscription — the last 6 complete calendar months plus the current month to date. Returns{"status": "no_subscription" | "no_data", "months": []} when no subscription or no network data exists.
GET /partner/subscriber/status-history
The subscriber’s own connection timeline, newest first:{"events": [{"id", "started_at", "resolved_at", "ongoing"}]}. Degrades to an empty list on any failure so it stays loadable during outages.
PATCH /partner/subscriber/me/billing-day
Choose the day of the calendar month one of the subscriber’s own subscriptions is invoiced and charged on. Allowed values are 1 to 10; the default is 1.effective_periodis the first calendar month the new day applies to, as its 1st.next_send_dateis when the recurring invoice will next send, ornullwhen the subscription has no recurring invoice yet.
The billing period is always the calendar month, so this changes only when money is
collected — never what is owed. No invoice, no credit note and no correction is ever
produced by a billing-day change. If the current month has already been invoiced, the new
day takes effect from the next month instead.
200 on success · 404 when the subscription is not the caller’s ·
422 when billing_day is outside 1–10 · 409 when the current month has not been
invoiced yet and the chosen day has already passed (or is today) — pick a day still ahead
of today, or wait until this month’s invoice is issued · 502 when the day was saved but
the next invoice could not be rescheduled (retry).
GET/POST /partner/subscriber/me/payment-method*
GET .../me/payment-method, POST .../me/payment-method/setup and
POST .../me/payment-method/confirm manage the subscriber’s saved card in their
provider’s own Stripe account. If that provider has no Stripe connection, each returns
409:
Subscriber management for ISPs (listing subscribers, looking up accounts, triggering cancel) is done through the dashboard, not the partner API. Subscribers are created automatically as part of the provisioning flows — see External Checkout and Provider-Initiated Provisioning.