{"openapi":"3.0.0","info":{"title":"pos-cloud-api","version":"0.1.0","description":"API serving the smartPOS Cloud desktop, web, and mobile apps"},"servers":[{"url":"https://pos-cloud-api.prodevinnovationz.workers.dev"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{},"parameters":{}},"paths":{"/v1/auth/signup":{"post":{"tags":["Auth"],"summary":"Sign up with email and password","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8},"first_name":{"type":"string","minLength":1},"last_name":{"type":"string","minLength":1}},"required":["email","password","first_name","last_name"]}}}},"responses":{"201":{"description":"Account created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/auth/signin":{"post":{"tags":["Auth"],"summary":"Sign in with email and password","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":1}},"required":["email","password"]}}}},"responses":{"200":{"description":"Signed in","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/auth/signout":{"post":{"tags":["Auth"],"summary":"Sign out (revokes the caller's session)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Signed out","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/companies":{"get":{"tags":["Admin: Companies"],"summary":"List companies across all businesses","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"string","enum":["restaurant_bar","retail","other"]},"required":false,"name":"business_type","in":"query"},{"schema":{"type":"string","minLength":1},"required":false,"name":"search","in":"query"},{"schema":{"type":"boolean","nullable":true},"required":false,"name":"is_disabled","in":"query"}],"responses":{"200":{"description":"Companies retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}},"post":{"tags":["Admin: Companies"],"summary":"Create a company","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"business_name":{"type":"string","minLength":1},"business_type":{"type":"string","enum":["restaurant_bar","retail","other"]},"country_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"is_test_account":{"type":"boolean"}},"required":["business_name","business_type","country_id"]}}}},"responses":{"201":{"description":"Company created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/companies/{id}":{"get":{"tags":["Admin: Companies"],"summary":"Get a company by id","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Company retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}},"patch":{"tags":["Admin: Companies"],"summary":"Update a company (including toggling is_disabled)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"business_name":{"type":"string","minLength":1},"business_type":{"type":"string","enum":["restaurant_bar","retail","other"]},"country_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"is_test_account":{"type":"boolean"},"is_disabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Company updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/billing":{"get":{"tags":["Admin: Billing"],"summary":"List billing records across all companies","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"string","enum":["active","trialing","past_due","canceled","incomplete"]},"required":false,"name":"subscription_status","in":"query"},{"schema":{"type":"string","enum":["starter","professional","enterprise"]},"required":false,"name":"package","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"company_id","in":"query"}],"responses":{"200":{"description":"Billing records retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}}},"/v1/admin/billing/{companyId}":{"get":{"tags":["Admin: Billing"],"summary":"Get a company's billing record","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":true,"name":"companyId","in":"path"}],"responses":{"200":{"description":"Billing record retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/billing/{companyId}/invoices":{"get":{"tags":["Admin: Billing"],"summary":"List a company's Stripe invoices","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":true,"name":"companyId","in":"path"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"}],"responses":{"200":{"description":"Invoices retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}}},"/v1/admin/company-users":{"get":{"tags":["Admin: Company Users"],"summary":"List user accounts across all companies","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"outlet_id","in":"query"},{"schema":{"type":"string","enum":["super","waiter","cashier","receptionist","accountant","kds","manager","admin","super_admin"]},"required":false,"name":"role","in":"query"},{"schema":{"type":"boolean","nullable":true},"required":false,"name":"is_active","in":"query"},{"schema":{"type":"string","minLength":1},"required":false,"name":"search","in":"query"}],"responses":{"200":{"description":"Company users retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}},"post":{"tags":["Admin: Company Users"],"summary":"Create a company user account","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8},"first_name":{"type":"string","minLength":1},"last_name":{"type":"string","minLength":1},"role":{"type":"string","enum":["super","waiter","cashier","receptionist","accountant","kds","manager","admin","super_admin"]},"outlet_id":{"type":"string","format":"uuid"}},"required":["email","password","first_name","last_name","role","outlet_id"]}}}},"responses":{"201":{"description":"Company user created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/company-users/{id}":{"get":{"tags":["Admin: Company Users"],"summary":"Get a company user account by id","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Company user retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}},"patch":{"tags":["Admin: Company Users"],"summary":"Update a company user account (role, outlet, active status)","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["super","waiter","cashier","receptionist","accountant","kds","manager","admin","super_admin"]},"outlet_id":{"type":"string","format":"uuid"},"is_active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Company user updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/orders":{"get":{"tags":["Admin: Orders"],"summary":"List orders across all businesses","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"outlet_id","in":"query"},{"schema":{"type":"string","enum":["DINE","TAKEAWAY","CASH"]},"required":false,"name":"mode","in":"query"},{"schema":{"type":"string","format":"date"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"string","format":"date"},"required":false,"name":"date_to","in":"query"}],"responses":{"200":{"description":"Orders retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}}},"/v1/admin/orders/{id}":{"get":{"tags":["Admin: Orders"],"summary":"Get an order with its items, settlements, and discounts","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Order retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/order-settlements":{"get":{"tags":["Admin: Orders"],"summary":"List order settlements across all businesses","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"outlet_id","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"payment_method_id","in":"query"},{"schema":{"type":"string","format":"date"},"required":false,"name":"date_from","in":"query"},{"schema":{"type":"string","format":"date"},"required":false,"name":"date_to","in":"query"}],"responses":{"200":{"description":"Order settlements retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}}},"/v1/admin/menu-items/categories":{"get":{"tags":["Admin: Menu Items"],"summary":"List menu categories across all businesses","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"outlet_id","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","enum":["active","inactive","out_of_stock"]},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"Menu categories retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}},"post":{"tags":["Admin: Menu Items"],"summary":"Create a menu category","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"outlet_id":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"display_order":{"type":"integer"},"status":{"type":"string","enum":["active","inactive","out_of_stock"]}},"required":["outlet_id","name"]}}}},"responses":{"201":{"description":"Menu category created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/menu-items/categories/{id}":{"patch":{"tags":["Admin: Menu Items"],"summary":"Update a menu category","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"display_order":{"type":"integer"},"status":{"type":"string","enum":["active","inactive","out_of_stock"]}}}}}},"responses":{"200":{"description":"Menu category updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/menu-items":{"get":{"tags":["Admin: Menu Items"],"summary":"List menu items across all businesses","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"items_per_page","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"outlet_id","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"company_id","in":"query"},{"schema":{"type":"string","format":"uuid"},"required":false,"name":"category_id","in":"query"},{"schema":{"type":"string","enum":["active","inactive","out_of_stock"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","minLength":1},"required":false,"name":"search","in":"query"}],"responses":{"200":{"description":"Menu items retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"array","items":{"nullable":true}},"count":{"type":"number"},"has_next":{"type":"boolean"},"page":{"type":"number"},"items_per_page":{"type":"number"},"total_pages":{"type":"number"},"sort_by":{"type":"string"},"sort_direction":{"type":"string","enum":["asc","desc"]}},"required":["success","message","data","count","has_next","page","items_per_page","total_pages"]}}}}}},"post":{"tags":["Admin: Menu Items"],"summary":"Create a menu item","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"outlet_id":{"type":"string","format":"uuid"},"category_id":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"base_price":{"type":"number","minimum":0},"sku":{"type":"string"},"status":{"type":"string","enum":["active","inactive","out_of_stock"]},"display_order":{"type":"integer"},"is_taxable":{"type":"boolean"},"tax_rate":{"type":"number","minimum":0},"allergens":{"type":"array","items":{"type":"string"}}},"required":["outlet_id","name","base_price"]}}}},"responses":{"201":{"description":"Menu item created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}},"/v1/admin/menu-items/{id}":{"get":{"tags":["Admin: Menu Items"],"summary":"Get a menu item by id","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Menu item retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}},"patch":{"tags":["Admin: Menu Items"],"summary":"Update a menu item","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"category_id":{"type":"string","nullable":true,"format":"uuid"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"base_price":{"type":"number","minimum":0},"sku":{"type":"string"},"status":{"type":"string","enum":["active","inactive","out_of_stock"]},"display_order":{"type":"integer"},"is_taxable":{"type":"boolean"},"tax_rate":{"type":"number","minimum":0},"allergens":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Menu item updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"nullable":true}},"required":["success","message"]}}}}}}}}}