{"openapi": "3.0.3", "info": {"title": "Kyber Billing API", "version": "2.0.0", "description": "Quotes, proposals, invoices, subscriptions and payment links for KyberApps, KyberGate, KyberAccess, KyberWatch and KyberCopy (payee Kyber Systems LLC), across several Stripe accounts. All amounts are integer cents in USD. Every object carries brand and account_id."}, "servers": [{"url": "https://billing.kyberapps.com/api/v1"}], "components": {"securitySchemes": {"bearer": {"type": "http", "scheme": "bearer", "description": "Token created in Settings. Scopes: read, quotes:write, proposals:write, invoices:write, subscriptions:write, links:write, admin"}}}, "paths": {"/me": {"get": {"summary": "Who am I", "description": "Returns the token label and scopes.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}}}, "/pricing-rules": {"get": {"summary": "Pricing rules", "description": "The pricing rules as data: KyberCopy bands, KyberGate floor and bands, manual products, multi-year discounts.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}}}, "/pricing-rules/suggest": {"get": {"summary": "Suggest a line", "description": "Default description, unit and unit price for a product. requires_price=true means the price must be supplied manually.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "product", "in": "query", "schema": {"type": "string"}}, {"name": "qty", "in": "query", "schema": {"type": "string"}}, {"name": "enrollment", "in": "query", "schema": {"type": "string"}}]}}, "/terms": {"get": {"summary": "Agreement text", "description": "Current Master Subscription Agreement text and version.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}}}, "/orgs": {"get": {"summary": "List organizations", "description": "", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "search", "in": "query", "schema": {"type": "string"}}]}, "post": {"summary": "Create organization", "description": "type is school, district or other. contacts is a list of {name,email,phone,role}. products is a list of product names.", "security": [{"bearer": []}], "x-scope": "quotes:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "requestBody": {"content": {"application/json": {"example": {"name": "Sample Academy", "type": "school", "address": "1 Main St, Albany, NY", "enrollment": 900, "contacts": [{"name": "Dana Lee", "email": "dlee@sample.edu", "phone": "", "role": "IT Director"}], "products": ["KyberCopy"], "tax_exempt": true, "tax_exempt_no": "EX-12345"}}}}, "parameters": [{"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}]}}, "/orgs/{id}": {"get": {"summary": "Get organization", "description": "Includes the org's quotes, proposals and invoices.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}, "patch": {"summary": "Update organization", "description": "Send only the fields you want to change.", "security": [{"bearer": []}], "x-scope": "quotes:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"enrollment": 1200}}}}}}, "/quotes": {"get": {"summary": "List quotes", "description": "status: draft, sent, accepted, expired, declined, converted.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "org_id", "in": "query", "schema": {"type": "string"}}, {"name": "status", "in": "query", "schema": {"type": "string"}}]}, "post": {"summary": "Create quote", "description": "Lines: product (KyberGate, KyberAccess, KyberWatch, KyberCopy), description (optional, defaulted), qty, unit, unit_cents or unit_price (dollars), years, term_start, term_end, is_pilot. KyberCopy price is defaulted from the org's enrollment band when unit_cents is omitted. KyberGate never below 500 cents. KyberAccess and KyberWatch need a manual price. discount_type: none, percent (discount_percent, e.g. 10) or fixed (discount_amount in dollars). multi_year_percent: 0, 10 or 15. valid_until defaults to 30 days.", "security": [{"bearer": []}], "x-scope": "quotes:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "requestBody": {"content": {"application/json": {"example": {"org_id": 1, "lines": [{"product": "KyberCopy", "qty": 1, "term_start": "2026-11-01", "term_end": "2027-10-31"}, {"product": "KyberGate", "qty": 800, "unit_price": "5.50", "description": "KyberGate Basic, per device, annual"}], "discount_type": "percent", "discount_percent": 10, "notes": "Pricing held through the validity date."}}}}, "parameters": [{"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}]}}, "/quotes/{id}": {"get": {"summary": "Get quote", "description": "Includes share_path (/q/<token>) for the customer-facing page.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}, "patch": {"summary": "Update quote", "description": "Same fields as create. Pass status: declined to decline. Accepted or converted quotes are locked.", "security": [{"bearer": []}], "x-scope": "quotes:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"lines": [{"product": "KyberCopy", "qty": 2, "unit_price": "3600"}]}}}}}}, "/quotes/{id}/send": {"post": {"summary": "Mark quote sent", "description": "Sets status=sent and returns share_url. Nothing is emailed; deliver the link yourself.", "security": [{"bearer": []}], "x-scope": "quotes:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {}}}}}}, "/quotes/{id}/duplicate": {"post": {"summary": "Duplicate quote", "description": "New draft with a new number.", "security": [{"bearer": []}], "x-scope": "quotes:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {}}}}}}, "/proposals": {"get": {"summary": "List proposals", "description": "", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "org_id", "in": "query", "schema": {"type": "string"}}, {"name": "status", "in": "query", "schema": {"type": "string"}}]}, "post": {"summary": "Create proposal from quote", "description": "Snapshots the quote and org, drafts the cover letter, attaches the current agreement text. payment_terms: net30 (PO, Stripe send_invoice) or card (hosted invoice, charge automatically). send: true also marks it sent.", "security": [{"bearer": []}], "x-scope": "proposals:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "requestBody": {"content": {"application/json": {"example": {"quote_id": 1, "payment_terms": "net30", "po_number": "", "send": true}}}}, "parameters": [{"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}]}}, "/proposals/{id}": {"get": {"summary": "Get proposal", "description": "Includes share_url and the quote snapshot.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}, "patch": {"summary": "Update proposal", "description": "cover_letter, payment_terms, po_number, term_start, term_end, status (sent/declined). Locked after acceptance.", "security": [{"bearer": []}], "x-scope": "proposals:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"po_number": "PO-2026-118"}}}}}}, "/proposals/{id}/status": {"get": {"summary": "Proposal status", "description": "Acceptance details: accepted_name, accepted_title, accepted_email, accepted_at (UTC), accepted_ip.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}}, "/proposals/{id}/send": {"post": {"summary": "Mark proposal sent", "description": "Returns share_url. Nothing is emailed.", "security": [{"bearer": []}], "x-scope": "proposals:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {}}}}}}, "/invoices": {"get": {"summary": "List invoices", "description": "Also returns stripe_connected and stripe_test_mode.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "org_id", "in": "query", "schema": {"type": "string"}}, {"name": "status", "in": "query", "schema": {"type": "string"}}]}, "post": {"summary": "Create invoice from accepted proposal", "description": "With Stripe connected: creates a draft Stripe invoice from the proposal snapshot (send_invoice net-30 for PO, charge_automatically for card). send: true finalizes and sends it. Without Stripe, or for check/PO tracking, pass manual: true to create a local invoice record (amount defaults to the proposal total).", "security": [{"bearer": []}], "x-scope": "invoices:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "requestBody": {"content": {"application/json": {"example": {"proposal_id": 1, "send": false}}}}, "parameters": [{"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}]}}, "/invoices/{id}": {"get": {"summary": "Get invoice", "description": "", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}}, "/invoices/{id}/send": {"post": {"summary": "Finalize and send Stripe invoice", "description": "", "security": [{"bearer": []}], "x-scope": "invoices:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {}}}}}}, "/invoices/{id}/mark-paid": {"post": {"summary": "Mark paid (check or PO)", "description": "method: check, ach, po, other. reference: check number or remittance id.", "security": [{"bearer": []}], "x-scope": "invoices:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"method": "check", "reference": "chk 10422"}}}}}}, "/subscriptions": {"get": {"summary": "List subscriptions", "description": "Annual plans mirrored from Stripe, per brand and per Stripe account. amount_cents is the annualised value; next_invoice_at is the renewal date.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "org_id", "in": "query", "schema": {"type": "string"}}, {"name": "status", "in": "query", "schema": {"type": "string"}}, {"name": "brand", "in": "query", "schema": {"type": "string"}}, {"name": "account", "in": "query", "schema": {"type": "string"}}]}, "post": {"summary": "Create subscription from accepted proposal", "description": "The proposal's quote must have billing_mode=subscription (or pass it anyway to bill an accepted quote annually). Creates the Stripe subscription on the proposal's account (annual, N-year interval for multi-year lines), the first invoice follows Stripe's collection method. Nothing is emailed.", "security": [{"bearer": []}], "x-scope": "subscriptions:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "requestBody": {"content": {"application/json": {"example": {"proposal_id": 1}}}}, "parameters": [{"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}]}}, "/subscriptions/{id}": {"get": {"summary": "Get subscription", "description": "", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}, "patch": {"summary": "Set subscription brand", "description": "brand: kyberapps, kybergate, kyberaccess, kyberwatch, kybercopy or unassigned.", "security": [{"bearer": []}], "x-scope": "subscriptions:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"brand": "kybergate"}}}}}}, "/subscriptions/{id}/sync": {"post": {"summary": "Sync subscription from Stripe", "description": "", "security": [{"bearer": []}], "x-scope": "subscriptions:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {}}}}}}, "/payment-links": {"get": {"summary": "List payment links", "description": "", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "brand", "in": "query", "schema": {"type": "string"}}, {"name": "account", "in": "query", "schema": {"type": "string"}}, {"name": "org_id", "in": "query", "schema": {"type": "string"}}]}, "post": {"summary": "Create payment link", "description": "Stripe-hosted pay page. account (label) defaults to the brand's account. unit_cents or unit_price; qty; recurring: empty (one-off), month or year; product optional (KyberGate, KyberCopy, ...).", "security": [{"bearer": []}], "x-scope": "links:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "requestBody": {"content": {"application/json": {"example": {"brand": "kybergate", "description": "KyberGate \u00b7 1,200 devices \u00b7 2026-27", "unit_price": "6000", "qty": 1, "recurring": "", "org_id": 1}}}}, "parameters": [{"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}]}}, "/payment-links/{id}": {"get": {"summary": "Get payment link", "description": "", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}]}}, "/payment-links/{id}/deactivate": {"post": {"summary": "Deactivate payment link", "description": "", "security": [{"bearer": []}], "x-scope": "links:write", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {}}}}}}, "/orgs/{id}/portal": {"post": {"summary": "Customer portal session", "description": "Short-lived Stripe customer-portal URL for the org (invoice history, payment methods, billing details; cancel is off). account optional.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"account": "kyber-systems"}}}}}}, "/stripe-accounts": {"get": {"summary": "List Stripe accounts", "description": "Label, Stripe account id, display name, default brand, mode, connected, webhook secret set, last sync. Never returns keys.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}}}, "/stripe-accounts/{id}/sync": {"post": {"summary": "Sync one Stripe account", "description": "id is the label or numeric id. full: true also walks products and quotes (the Import existing action). Read-only against Stripe.", "security": [{"bearer": []}], "x-scope": "admin", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}, "201": {"description": "Created"}}, "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer"}}, {"name": "Idempotency-Key", "in": "header", "schema": {"type": "string"}, "description": "Replays the stored response for the same key, token and path."}], "requestBody": {"content": {"application/json": {"example": {"full": false}}}}}}, "/brands": {"get": {"summary": "Brands", "description": "The five brands (KyberApps umbrella + four products), the payee, and which Stripe account each brand bills from.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}}}, "/dashboard": {"get": {"summary": "Dashboard numbers", "description": "MRR, ARR, open, overdue, paid YTD, active subscriptions, pilots: total, per brand and per Stripe account.", "security": [{"bearer": []}], "x-scope": "read", "responses": {"200": {"description": "OK"}, "401": {"description": "Missing or invalid token"}, "403": {"description": "Token lacks scope"}, "404": {"description": "Not found"}, "422": {"description": "Validation error, see error field"}, "429": {"description": "Rate limited"}}, "parameters": [{"name": "brand", "in": "query", "schema": {"type": "string"}}, {"name": "account", "in": "query", "schema": {"type": "string"}}]}}}}