Appearance
Billing Admin
Endpoints
GET /api/v1/admin/payment-requests?status=... list (limit 200, sorted -createdAt)
POST /api/v1/admin/payment-requests/:id/approve approve { admin_notes? }
POST /api/v1/admin/payment-requests/:id/reject reject { admin_notes? }
GET /api/v1/admin/subscriptions list with workspace + user enrichment
GET /api/v1/admin/invoices list invoicesAll require admin.
Payment requests
A payment request is created when a user submits a manual payment proof (bank transfer, cheque) for a plan upgrade. Each request carries:
status:pending|approved|rejectedworkspace_id,requested_by(user)- Workspace name and user (name, email) joined for display
admin_notes(max 2 000 chars) — captured at approval / rejection time
Approving a request flips the workspace's plan and unlocks features; rejecting it leaves the existing plan unchanged and surfaces admin_notes to the requester.
Subscriptions
The subscriptions list rolls up every active and past subscription with the workspace and owning user joined in. Use it for ad-hoc support — finding "the workspace whose payment failed last Tuesday" — or auditing.
Invoices
/admin/invoices lists every invoice issued, regardless of status (paid, open, void). Useful for accounting reconciliation; full export is a roadmap item.