{"openapi":"3.0.3","info":{"title":"Ledgerly Backoffice API","version":"1.0.0","description":"Internal billing & customer-ops API for Ledgerly. Every resource in the backoffice is exposed here for automation and agent access."},"servers":[{"url":"https://backofficedemo.vercel.app"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"Organization":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"domain":{"type":"string"},"industry":{"type":"string"},"country":{"type":"string"},"is_active":{"type":"boolean"},"is_paying_customer":{"type":"boolean"},"mrr_cents":{"type":"integer"},"churn_risk":{"type":"string","enum":["low","medium","high"]},"created_at":{"type":"string","format":"date-time"}}},"User":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","admin","member","viewer"]},"is_active":{"type":"boolean"},"last_login_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"Plan":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"price_cents":{"type":"integer"},"billing_interval":{"type":"string","enum":["month","year"]},"seat_limit":{"type":"integer"},"is_active":{"type":"boolean"}}},"Subscription":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"plan_id":{"type":"integer"},"status":{"type":"string","enum":["trialing","active","past_due","canceled"]},"seats":{"type":"integer"},"current_period_end":{"type":"string","format":"date"},"created_at":{"type":"string","format":"date-time"}}},"Invoice":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"subscription_id":{"type":"integer","nullable":true},"amount_cents":{"type":"integer"},"status":{"type":"string","enum":["draft","open","paid","void","uncollectible"]},"issued_at":{"type":"string","format":"date"},"due_at":{"type":"string","format":"date"},"paid_at":{"type":"string","format":"date-time","nullable":true}}},"Payment":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"invoice_id":{"type":"integer","nullable":true},"amount_cents":{"type":"integer"},"method":{"type":"string","enum":["card","ach","wire","paypal"]},"status":{"type":"string","enum":["succeeded","failed","refunded","pending"]},"created_at":{"type":"string","format":"date-time"}}},"SupportTicket":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"user_id":{"type":"integer","nullable":true},"subject":{"type":"string"},"status":{"type":"string","enum":["open","pending","resolved","closed"]},"priority":{"type":"string","enum":["low","medium","high","urgent"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"ApiKey":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"label":{"type":"string"},"key_prefix":{"type":"string"},"is_active":{"type":"boolean"},"last_used_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"AuditLog":{"type":"object","properties":{"id":{"type":"integer"},"actor_email":{"type":"string"},"action":{"type":"string"},"target_type":{"type":"string"},"target_id":{"type":"integer","nullable":true},"metadata":{"type":"object","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"UsageEvent":{"type":"object","properties":{"id":{"type":"integer"},"organization_id":{"type":"integer"},"event_type":{"type":"string"},"quantity":{"type":"integer"},"occurred_at":{"type":"string","format":"date-time"}}}}},"paths":{"/api/v1/organizations":{"get":{"operationId":"list_organizations","summary":"List organizations","description":"Customer companies subscribed to Ledgerly.","tags":["Organizations"],"parameters":[{"name":"is_active","in":"query","required":false,"schema":{"type":"string"}},{"name":"is_paying_customer","in":"query","required":false,"schema":{"type":"string"}},{"name":"churn_risk","in":"query","required":false,"schema":{"type":"string"}},{"name":"industry","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_organization","summary":"Create a organization","tags":["Organizations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"industry":{"type":"string"},"country":{"type":"string"},"is_active":{"type":"boolean"},"is_paying_customer":{"type":"boolean"},"mrr_cents":{"type":"integer"},"churn_risk":{"type":"string","enum":["low","medium","high"]}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/organizations/{id}":{"get":{"operationId":"get_organization","summary":"Get a single organization","tags":["Organizations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_organization","summary":"Update a organization","tags":["Organizations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"industry":{"type":"string"},"country":{"type":"string"},"is_active":{"type":"boolean"},"is_paying_customer":{"type":"boolean"},"mrr_cents":{"type":"integer"},"churn_risk":{"type":"string","enum":["low","medium","high"]}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"delete":{"operationId":"delete_organization","summary":"Delete a organization","tags":["Organizations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted."},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/users":{"get":{"operationId":"list_users","summary":"List users","description":"Individual people who log into a customer organization.","tags":["Users"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"is_active","in":"query","required":false,"schema":{"type":"string"}},{"name":"role","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_user","summary":"Create a user","tags":["Users"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","admin","member","viewer"]},"is_active":{"type":"boolean"},"last_login_at":{"type":"string","format":"date-time","nullable":true}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/users/{id}":{"get":{"operationId":"get_user","summary":"Get a single user","tags":["Users"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_user","summary":"Update a user","tags":["Users"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","admin","member","viewer"]},"is_active":{"type":"boolean"},"last_login_at":{"type":"string","format":"date-time","nullable":true}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"delete":{"operationId":"delete_user","summary":"Delete a user","tags":["Users"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted."},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/plans":{"get":{"operationId":"list_plans","summary":"List plans","description":"Pricing plans customers can subscribe to.","tags":["Plans"],"parameters":[{"name":"is_active","in":"query","required":false,"schema":{"type":"string"}},{"name":"billing_interval","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_plan","summary":"Create a plan","tags":["Plans"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"price_cents":{"type":"integer"},"billing_interval":{"type":"string","enum":["month","year"]},"seat_limit":{"type":"integer"},"is_active":{"type":"boolean"}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plan"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/plans/{id}":{"get":{"operationId":"get_plan","summary":"Get a single plan","tags":["Plans"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plan"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_plan","summary":"Update a plan","tags":["Plans"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"price_cents":{"type":"integer"},"billing_interval":{"type":"string","enum":["month","year"]},"seat_limit":{"type":"integer"},"is_active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plan"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"delete":{"operationId":"delete_plan","summary":"Delete a plan","tags":["Plans"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted."},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/subscriptions":{"get":{"operationId":"list_subscriptions","summary":"List subscriptions","description":"Active and historical plan subscriptions per organization.","tags":["Subscriptions"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"plan_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Subscription"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_subscription","summary":"Create a subscription","tags":["Subscriptions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"plan_id":{"type":"integer"},"status":{"type":"string","enum":["trialing","active","past_due","canceled"]},"seats":{"type":"integer"},"current_period_end":{"type":"string","format":"date"}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/subscriptions/{id}":{"get":{"operationId":"get_subscription","summary":"Get a single subscription","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_subscription","summary":"Update a subscription","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"plan_id":{"type":"integer"},"status":{"type":"string","enum":["trialing","active","past_due","canceled"]},"seats":{"type":"integer"},"current_period_end":{"type":"string","format":"date"}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/invoices":{"get":{"operationId":"list_invoices","summary":"List invoices","description":"Billing invoices issued to organizations.","tags":["Invoices"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_invoice","summary":"Create a invoice","tags":["Invoices"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"subscription_id":{"type":"integer","nullable":true},"amount_cents":{"type":"integer"},"status":{"type":"string","enum":["draft","open","paid","void","uncollectible"]},"issued_at":{"type":"string","format":"date"},"due_at":{"type":"string","format":"date"},"paid_at":{"type":"string","format":"date-time","nullable":true}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/invoices/{id}":{"get":{"operationId":"get_invoice","summary":"Get a single invoice","tags":["Invoices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_invoice","summary":"Update a invoice","tags":["Invoices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"subscription_id":{"type":"integer","nullable":true},"amount_cents":{"type":"integer"},"status":{"type":"string","enum":["draft","open","paid","void","uncollectible"]},"issued_at":{"type":"string","format":"date"},"due_at":{"type":"string","format":"date"},"paid_at":{"type":"string","format":"date-time","nullable":true}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/payments":{"get":{"operationId":"list_payments","summary":"List payments","description":"Payment attempts and settlements against invoices.","tags":["Payments"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"invoice_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"method","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_payment","summary":"Create a payment","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"invoice_id":{"type":"integer","nullable":true},"amount_cents":{"type":"integer"},"method":{"type":"string","enum":["card","ach","wire","paypal"]},"status":{"type":"string","enum":["succeeded","failed","refunded","pending"]}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/payments/{id}":{"get":{"operationId":"get_payment","summary":"Get a single payment","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_payment","summary":"Update a payment","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"invoice_id":{"type":"integer","nullable":true},"amount_cents":{"type":"integer"},"method":{"type":"string","enum":["card","ach","wire","paypal"]},"status":{"type":"string","enum":["succeeded","failed","refunded","pending"]}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/support-tickets":{"get":{"operationId":"list_support_tickets","summary":"List support tickets","description":"Customer support requests raised by users.","tags":["Support Tickets"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"priority","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/SupportTicket"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_support_ticket","summary":"Create a support ticket","tags":["Support Tickets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"user_id":{"type":"integer","nullable":true},"subject":{"type":"string"},"status":{"type":"string","enum":["open","pending","resolved","closed"]},"priority":{"type":"string","enum":["low","medium","high","urgent"]}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicket"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/support-tickets/{id}":{"get":{"operationId":"get_support_ticket","summary":"Get a single support ticket","tags":["Support Tickets"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicket"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"patch":{"operationId":"update_support_ticket","summary":"Update a support ticket","tags":["Support Tickets"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"user_id":{"type":"integer","nullable":true},"subject":{"type":"string"},"status":{"type":"string","enum":["open","pending","resolved","closed"]},"priority":{"type":"string","enum":["low","medium","high","urgent"]}}}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportTicket"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/api-keys":{"get":{"operationId":"list_api_keys","summary":"List api keys","description":"API keys issued to organizations for programmatic access.","tags":["API Keys"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"is_active","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_api_key","summary":"Create a api key","tags":["API Keys"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"label":{"type":"string"},"is_active":{"type":"boolean"},"last_used_at":{"type":"string","format":"date-time","nullable":true}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/api-keys/{id}":{"get":{"operationId":"get_api_key","summary":"Get a single api key","tags":["API Keys"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}},"delete":{"operationId":"delete_api_key","summary":"Delete a api key","tags":["API Keys"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted."},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/audit-logs":{"get":{"operationId":"list_audit_logs","summary":"List audit logs","description":"Immutable log of actions taken across the platform.","tags":["Audit Logs"],"parameters":[{"name":"actor_email","in":"query","required":false,"schema":{"type":"string"}},{"name":"action","in":"query","required":false,"schema":{"type":"string"}},{"name":"target_type","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditLog"}}}}}}},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/audit-logs/{id}":{"get":{"operationId":"get_audit_log","summary":"Get a single audit log","tags":["Audit Logs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLog"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}},"/api/v1/usage-events":{"get":{"operationId":"list_usage_events","summary":"List usage events","description":"Product usage events emitted by customer organizations.","tags":["Usage Events"],"parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"event_type","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/UsageEvent"}}}}}}},"401":{"description":"Missing or invalid API key."}}},"post":{"operationId":"create_usage_event","summary":"Create a usage event","tags":["Usage Events"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"organization_id":{"type":"integer"},"event_type":{"type":"string"},"quantity":{"type":"integer"},"occurred_at":{"type":"string","format":"date-time"}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageEvent"}}}},"400":{"description":"Invalid request body."},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/usage-events/{id}":{"get":{"operationId":"get_usage_event","summary":"Get a single usage event","tags":["Usage Events"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageEvent"}}}},"401":{"description":"Missing or invalid API key."},"404":{"description":"Not found."}}}}}}