{"openapi":"3.1.2","info":{"title":"Revotab","version":"0.0.1"},"servers":[{"url":"https:\/\/revotab.com\/api\/v1"}],"paths":{"\/me":{"get":{"operationId":"me.show","summary":"Who is signed in, and every restaurant they work at with their role and plan","tags":["Account"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"user"},"name":{"type":"string"},"email":{"type":"string"},"email_verified":{"type":"boolean"},"locale":{"type":["string","null"]},"is_admin":{"type":"boolean"},"two_factor":{"type":"boolean"},"current_restaurant_id":{"type":["integer","null"]},"restaurants":{"type":"string"}},"required":["id","kind","name","email","email_verified","locale","is_admin","two_factor","current_restaurant_id","restaurants"]}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"patch":{"operationId":"me.update","summary":"Change name or email. A new email has to be confirmed again","tags":["Account"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":255},"email":{"type":"string","format":"email","maxLength":255}}}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"user"},"name":{"type":"string"},"email":{"type":"string"},"email_verified":{"type":"boolean"},"locale":{"type":["string","null"]},"is_admin":{"type":"boolean"},"two_factor":{"type":"boolean"},"current_restaurant_id":{"type":["integer","null"]},"restaurants":{"type":"string"}},"required":["id","kind","name","email","email_verified","locale","is_admin","two_factor","current_restaurant_id","restaurants"]}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"me.destroy","description":"An owner's restaurant accounts are closed too: billing stops and booking pages go offline.","summary":"Delete this account","tags":["Account"],"parameters":[{"name":"password","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Your account was deleted."}},"required":["message"]}}}},"503":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["We could not reach Stripe to stop your subscription, so nothing was deleted. Please try again in a minute."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/password":{"put":{"operationId":"me.password","summary":"Change password. Signs out every other device","tags":["Account"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"current_password":{"type":"string"},"password":{"type":"string"},"password_confirmation":{"type":"string"}},"required":["current_password","password","password_confirmation"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Password changed. Other devices were signed out."}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/language":{"put":{"operationId":"me.language","summary":"The language of the dashboard, emails and API messages","tags":["Account"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"locale":{"type":"string","enum":["en","el"]}},"required":["locale"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"user"},"name":{"type":"string"},"email":{"type":"string"},"email_verified":{"type":"boolean"},"locale":{"type":["string","null"]},"is_admin":{"type":"boolean"},"two_factor":{"type":"boolean"},"current_restaurant_id":{"type":["integer","null"]},"restaurants":{"type":"string"}},"required":["id","kind","name","email","email_verified","locale","is_admin","two_factor","current_restaurant_id","restaurants"]}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/two-factor":{"get":{"operationId":"me.two-factor","summary":"Two-factor status","tags":["Account"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"enabled":{"type":"boolean"},"pending":{"type":"boolean"},"confirmed_at":{"type":["string","null"]},"required":{"type":"boolean"},"recovery_codes_left":{"type":["integer","null"]}},"required":["enabled","pending","confirmed_at","required","recovery_codes_left"]}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"me.two-factor.enable","description":"Returns the secret, an `otpauth:\/\/` link and a QR code (SVG) for the authenticator app.\nThen confirm with a code from the app.","summary":"Start turning on two-factor","tags":["Account"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"secret":{"type":"string"},"otpauth_url":{"type":"string"},"qr_svg":{"type":"string"}},"required":["secret","otpauth_url","qr_svg"]}},"required":["data"]}}}},"409":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Two-factor authentication is already on."]}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"me.two-factor.disable","summary":"Turn off two-factor. HQ admins must keep it on","tags":["Account"],"parameters":[{"name":"password","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Two-factor authentication is off."}},"required":["message"]}}}},"403":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Platform admins must keep two-factor authentication on."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/two-factor\/confirm":{"post":{"operationId":"me.two-factor.confirm","summary":"Finish turning on two-factor. Returns the recovery codes, shown only this once","tags":["Account"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"code":{"type":"string","maxLength":12}},"required":["code"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"recovery_codes":{"type":"array","items":{"type":"string"}}},"required":["recovery_codes"]}},"required":["data"]}}}},"409":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Start two-factor setup first."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/two-factor\/recovery-codes":{"post":{"operationId":"me.two-factor.recovery-codes","summary":"New recovery codes. The old ones stop working","tags":["Account"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"recovery_codes":{"type":"array","items":{"type":"string"}}},"required":["recovery_codes"]}},"required":["data"]}}}},"409":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Two-factor authentication is off."]}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/tokens":{"get":{"operationId":"me.tokens","summary":"Devices signed in to this account (one token each)","tags":["Account"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"abilities":{"type":"string"},"last_used_at":{"type":["string","null"]},"created_at":{"type":"string"},"current":{"type":"boolean"}},"required":["id","name","abilities","last_used_at","created_at","current"]}}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/tokens\/{token}":{"delete":{"operationId":"me.tokens.revoke","summary":"Sign out one device","tags":["Account"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Signed out."}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/devices":{"post":{"operationId":"me.devices","description":"Send it after sign-in and whenever the push token changes. Used for the team and guest apps.","summary":"Register this device for push notifications","tags":["Account"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android","macos","windows","linux","web"]},"push_token":{"type":["string","null"],"maxLength":512},"name":{"type":["string","null"],"maxLength":120},"app_version":{"type":["string","null"],"maxLength":40}},"required":["platform"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/restaurants":{"post":{"operationId":"me.restaurants.store","description":"The first one starts the account and its free trial (or a running sign-up `offer`,\nsuch as `starter-2-months`). Later ones add a venue to the account the user owns.","summary":"Create a restaurant","tags":["Account"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"cuisine":{"type":["string","null"],"maxLength":80},"city":{"type":["string","null"],"maxLength":80},"address":{"type":["string","null"],"maxLength":160},"phone":{"type":["string","null"],"maxLength":30},"email":{"type":["string","null"],"format":"email","maxLength":160},"covers":{"type":["integer","null"],"minimum":4,"maximum":500},"timezone":{"type":["string","null"]},"currency":{"type":["string","null"],"enum":["EUR","GBP","USD","CHF",null]},"offer":{"type":["string","null"],"maxLength":60}},"required":["name"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"timezone":{"type":"string"},"currency":{"type":"string"},"role":{"type":"string","const":"owner"},"account":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"plan":{"type":"string"},"plan_name":{"type":"string"},"status":{"type":"string"},"trial_ends_at":{"type":["string","null"]},"has_access":{"type":"boolean"},"features":{"type":"array","items":[]}},"required":["id","name","plan","plan_name","status","trial_ends_at","has_access","features"]}},"required":["id","name","slug","timezone","currency","role","account"]}},"required":["data"]},{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"timezone":{"type":"string"},"currency":{"type":"string"},"role":{"type":"string","const":"owner"},"account":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"plan":{"type":"string"},"plan_name":{"type":"string"},"status":{"type":"string"},"trial_ends_at":{"type":["string","null"]},"has_access":{"type":"boolean"},"features":{"type":"array","items":[]}},"required":["id","name","plan","plan_name","status","trial_ends_at","has_access","features"]}},"required":["id","name","slug","timezone","currency","role","account"]},"trial_days":{"type":["integer","string"]}},"required":["data","trial_days"]}]}}}},"403":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["New sign-ups are paused at the moment. Please contact us."]}},"required":["message"]}}}},"402":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Your plan does not include more venues. Upgrade to Premium."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/me\/sandbox":{"post":{"operationId":"me.sandbox","description":"A demo restaurant with every module and test data, never billed and kept out of the\ndirectory. Use it to build against the API: create integration keys with\n`POST \/restaurants\/{id}\/settings\/api-keys`. One sandbox per account.","summary":"Create (or open) this account's developer sandbox","tags":["Account"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/devices":{"post":{"operationId":"guest.devices","description":"Send it after sign-in and whenever the push token changes. Used for the team and guest apps.","summary":"Register this device for push notifications","tags":["Account"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android","macos","windows","linux","web"]},"push_token":{"type":["string","null"],"maxLength":512},"name":{"type":["string","null"],"maxLength":120},"app_version":{"type":["string","null"],"maxLength":40}},"required":["platform"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/dashboard":{"get":{"operationId":"hq.index","tags":["Admin"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/accounts":{"get":{"operationId":"hq.accounts","tags":["Admin"],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"plan","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/accounts\/{organization}":{"get":{"operationId":"hq.accounts.show","tags":["Admin"],"parameters":[{"name":"organization","in":"path","required":true,"description":"The organization ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"hq.organizations.update","tags":["Admin"],"parameters":[{"name":"organization","in":"path","required":true,"description":"The organization ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","pro","premium"]},"subscription_status":{"type":"string","enum":["trialing","active","past_due","cancelled"]},"trial_ends_at":{"type":["string","null"],"format":"date-time"}},"required":["plan","subscription_status"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/accounts\/{organization}\/extend-trial":{"post":{"operationId":"hq.accounts.extend","tags":["Admin"],"parameters":[{"name":"organization","in":"path","required":true,"description":"The organization ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":90}},"required":["days"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/restaurants":{"get":{"operationId":"hq.restaurants","tags":["Admin"],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support-exit":{"post":{"operationId":"hq.exit","tags":["Admin"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support-mode\/{restaurant}":{"post":{"operationId":"hq.enter","summary":"Support mode: open a customer's back office without joining their team","tags":["Admin"],"parameters":[{"name":"restaurant","in":"path","required":true,"description":"The restaurant ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/users":{"get":{"operationId":"hq.users","tags":["Admin"],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/users\/{user}\/admin":{"post":{"operationId":"hq.users.admin","tags":["Admin"],"parameters":[{"name":"user","in":"path","required":true,"description":"The user ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["You cannot remove your own admin access."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/app\/config":{"get":{"operationId":"app.config","description":"Call it when the app opens. Says whether this version is current, still allowed\n(`update_required: true` means the app must send people to `store_url`), whether\nRevotab is in maintenance, and which sign-ins are open. Set in HQ > Settings > Mobile.\n\nEvery other request may also send `X-App-Name` (`team` or `guest`), `X-App-Platform` and\n`X-App-Version`: a version below the minimum then answers `426 update_required`.","summary":"App start-up check","tags":["AppConfig"],"parameters":[{"name":"app","in":"query","required":true,"schema":{"type":"string","enum":["team","guest"]}},{"name":"platform","in":"query","required":true,"schema":{"type":"string","enum":["ios","android","macos","windows","linux","web"]}},{"name":"version","in":"query","description":"The app's version, such as `1.4.2`.","schema":{"type":["string","null"],"pattern":"^\\d+(\\.\\d+){0,3}$","maxLength":20}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"app":{"type":"string"},"platform":{"type":"string"},"version":{"type":["string","null"]},"latest_version":{"type":["string","null"]},"minimum_version":{"type":["string","null"]},"force_update":{"type":"boolean"},"update_available":{"type":"boolean"},"update_required":{"type":"boolean"},"update_message":{"type":["string","null"]},"store_url":{"anyOf":[{"type":"string"},{"type":"null"},{"type":"string","enum":[""]}]},"maintenance":{"type":"object","properties":{"active":{"type":"boolean"},"message":{"type":["string","null"]}},"required":["active","message"]},"features":{"type":"object","properties":{"team_sign_in":{"type":"boolean"},"guest_accounts":{"type":"boolean"},"push":{"type":"boolean"}},"required":["team_sign_in","guest_accounts","push"]},"server_time":{"type":"string"}},"required":["app","platform","version","latest_version","minimum_version","force_update","update_available","update_required","update_message","store_url","maintenance","features","server_time"]}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/restaurants\/{restaurant}\/billing":{"get":{"operationId":"restaurant.billing","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"checkout","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/billing\/cancel":{"post":{"operationId":"restaurant.billing.cancel","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/billing\/details":{"put":{"operationId":"restaurant.billing.details","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"billing_name":{"type":"string","maxLength":160},"billing_reg_code":{"type":["string","null"],"maxLength":40},"billing_vat_number":{"type":["string","null"],"pattern":"^[A-Za-z]{2}[A-Za-z0-9 .\\-]{2,16}$","maxLength":20},"billing_address":{"type":"string","maxLength":200},"billing_postal_code":{"type":["string","null"],"maxLength":20},"billing_city":{"type":"string","maxLength":80},"billing_country":{"type":"string","enum":["AT","BE","BG","CY","CZ","DE","DK","EE","ES","FI","FR","GR","HR","HU","IE","IT","LT","LU","LV","MT","NL","PL","PT","RO","SE","SI","SK","GB","CH","NO","US","AL","TR","RS","MK","UA","AE","CA","AU"],"minLength":2,"maxLength":2},"billing_email":{"type":["string","null"],"format":"email","maxLength":160}},"required":["billing_name","billing_address","billing_city","billing_country"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/billing\/invoices\/{invoice}":{"get":{"operationId":"restaurant.billing.invoice","summary":"One of the organisation's own invoices, as PDF","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/pdf":{"schema":{"type":"string"}}},"headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/billing\/plan":{"post":{"operationId":"restaurant.billing.choose","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","pro","premium"]}},"required":["plan"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/billing\/portal":{"post":{"operationId":"restaurant.billing.portal","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/billing\/resume":{"post":{"operationId":"restaurant.billing.resume","tags":["Billing"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/blog":{"get":{"operationId":"blog","tags":["Blog"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/blog\/category\/{category}":{"get":{"operationId":"blog.category","tags":["Blog"],"parameters":[{"name":"category","in":"path","required":true,"schema":{"type":["string","null"],"default":null}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/blog\/{slug}":{"get":{"operationId":"blog.show","tags":["Blog"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/restaurants\/{slug}\/booking":{"get":{"operationId":"book","tags":["Booking"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/restaurants\/{slug}\/availability":{"get":{"operationId":"availability","tags":["Booking"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"party","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"shifts":{"type":"array","items":{"type":"object","properties":{"shift":{"type":"array","items":[]},"slots":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"available":{"type":"boolean"},"deposit":{"type":"string"}},"required":["time","available","deposit"]}}},"required":["shift","slots"]}}},"required":["shifts"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/restaurants\/{slug}\/availability\/month":{"get":{"operationId":"availability.month","summary":"Day-by-day status for the calendar: open, full or closed","tags":["Booking"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"month","in":"query","required":true,"schema":{"type":"string"}},{"name":"party","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"days":{"type":"string"}},"required":["days"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/restaurants\/{slug}\/reservations":{"post":{"operationId":"book.store","tags":["Booking"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date"},"time":{"type":"string"},"party_size":{"type":"integer","minimum":1,"maximum":100},"first_name":{"type":"string","maxLength":80},"last_name":{"type":"string","maxLength":80},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":"string","maxLength":30},"occasion":{"type":["string","null"],"maxLength":40},"guest_notes":{"type":["string","null"],"maxLength":1000},"marketing_opt_in":{"type":"boolean"},"accept_terms":{"enum":["yes","on","1",1,"true",true]}},"required":["date","time","party_size","first_name","last_name","email","phone"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/restaurants\/{slug}\/waitlist":{"post":{"operationId":"waitlist","tags":["Booking"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date"},"time":{"type":["string","null"]},"party_size":{"type":"integer","minimum":1,"maximum":100},"first_name":{"type":"string","maxLength":80},"last_name":{"type":["string","null"],"maxLength":80},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":["string","null"],"maxLength":30}},"required":["date","party_size","first_name","email"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/restaurants\/{restaurant}\/campaigns":{"get":{"operationId":"restaurant.campaigns","tags":["Campaign"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.campaigns.store","tags":["Campaign"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/campaigns\/audience":{"get":{"operationId":"restaurant.campaigns.audience","tags":["Campaign"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"channel","in":"query","schema":{"type":"string","default":"email"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","minimum":0}},"required":["count"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/campaigns\/{campaign}":{"put":{"operationId":"restaurant.campaigns.update","tags":["Campaign"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"campaign","in":"path","required":true,"description":"The campaign ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Sent campaigns cannot be edited."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.campaigns.destroy","tags":["Campaign"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"campaign","in":"path","required":true,"description":"The campaign ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/campaigns\/{campaign}\/send":{"post":{"operationId":"restaurant.campaigns.send","tags":["Campaign"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"campaign","in":"path","required":true,"description":"The campaign ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"scheduled_at":{"type":["string","null"],"format":"date-time"}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/careers":{"get":{"operationId":"careers","tags":["Careers"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/careers\/{slug}":{"get":{"operationId":"careers.show","tags":["Careers"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"careers.apply","tags":["Careers"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":["string","null"],"maxLength":40},"link":{"type":["string","null"],"format":"uri","maxLength":250},"message":{"type":["string","null"],"maxLength":5000},"cv":{"type":["string","null"],"format":"binary","contentMediaType":"application\/octet-stream","description":"Maximum file size: 5120 kilobytes."},"consent":{"enum":["yes","on","1",1,"true",true]},"website":{"type":"string"}},"required":["name","email"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/hq\/content":{"get":{"operationId":"hq.content","tags":["Content"],"parameters":[{"name":"tab","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/categories":{"post":{"operationId":"hq.content.categories.store","tags":["Content"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/categories\/{category}":{"put":{"operationId":"hq.content.categories.update","tags":["Content"],"parameters":[{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.content.categories.destroy","tags":["Content"],"parameters":[{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/pages":{"post":{"operationId":"hq.content.pages.store","tags":["Content"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/pages\/new":{"get":{"operationId":"hq.content.pages.create","tags":["Content"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/pages\/{page}":{"get":{"operationId":"hq.content.pages.edit","tags":["Content"],"parameters":[{"name":"page","in":"path","required":true,"description":"The page ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.content.pages.update","tags":["Content"],"parameters":[{"name":"page","in":"path","required":true,"description":"The page ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.content.pages.destroy","tags":["Content"],"parameters":[{"name":"page","in":"path","required":true,"description":"The page ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/posts":{"post":{"operationId":"hq.content.posts.store","tags":["Content"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/posts\/new":{"get":{"operationId":"hq.content.posts.create","tags":["Content"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/posts\/{post}":{"get":{"operationId":"hq.content.posts.edit","tags":["Content"],"parameters":[{"name":"post","in":"path","required":true,"description":"The post ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.content.posts.update","tags":["Content"],"parameters":[{"name":"post","in":"path","required":true,"description":"The post ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.content.posts.destroy","tags":["Content"],"parameters":[{"name":"post","in":"path","required":true,"description":"The post ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/content\/preview":{"post":{"operationId":"hq.content.preview","summary":"Live preview of the Markdown text, rendered exactly as the website will","tags":["Content"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"body":{"type":["string","null"],"maxLength":200000}}}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"html":{"type":"string"},"minutes":{"type":"integer"}},"required":["html","minutes"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/dashboard":{"get":{"operationId":"restaurant.dashboard","tags":["Dashboard"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/emails":{"get":{"operationId":"restaurant.emails","tags":["Email"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/emails\/alerts":{"put":{"operationId":"restaurant.emails.alerts","tags":["Email"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":["string","null"],"maxLength":300},"new_booking":{"type":"boolean"},"cancellation":{"type":"boolean"},"new_order":{"type":"boolean"},"voucher_sold":{"type":"boolean"}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{key}\/emails\/{key}":{"put":{"operationId":"restaurant.emails.update","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.emails.reset","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"locale","in":"query","required":true,"schema":{"type":"string","enum":["en","el","de","fr","it","es","nl","pt"]}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{key}\/emails\/{key}\/preview":{"post":{"operationId":"restaurant.emails.preview","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"html":{"type":"string"}},"required":["subject","html"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{key}\/emails\/{key}\/test":{"post":{"operationId":"restaurant.emails.test","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/email-suppressions\/{suppression}":{"delete":{"operationId":"hq.emails.suppressions.destroy","tags":["Email"],"parameters":[{"name":"suppression","in":"path","required":true,"description":"The suppression ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/emails":{"get":{"operationId":"hq.emails","tags":["Email"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/emails\/{key}":{"put":{"operationId":"hq.emails.update","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.emails.reset","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"locale","in":"query","required":true,"schema":{"type":"string","enum":["en","el","de","fr","it","es","nl","pt"]}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/emails\/{key}\/preview":{"post":{"operationId":"hq.emails.preview","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"html":{"type":"string"}},"required":["subject","html"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/emails\/{key}\/test":{"post":{"operationId":"hq.emails.test","tags":["Email"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance":{"get":{"operationId":"hq.finance.index","tags":["Finance"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/accounts\/{organization}\/billing":{"put":{"operationId":"hq.finance.billing.update","tags":["Finance"],"parameters":[{"name":"organization","in":"path","required":true,"description":"The organization ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"billing_name":{"type":"string","maxLength":160},"billing_reg_code":{"type":["string","null"],"maxLength":40},"billing_vat_number":{"type":["string","null"],"pattern":"^[A-Za-z]{2}[A-Za-z0-9 .\\-]{2,16}$","maxLength":20},"billing_address":{"type":"string","maxLength":200},"billing_postal_code":{"type":["string","null"],"maxLength":20},"billing_city":{"type":"string","maxLength":80},"billing_country":{"type":"string","enum":["AT","BE","BG","CY","CZ","DE","DK","EE","ES","FI","FR","GR","HR","HU","IE","IT","LT","LU","LV","MT","NL","PL","PT","RO","SE","SI","SK","GB","CH","NO","US","AL","TR","RS","MK","UA","AE","CA","AU"],"minLength":2,"maxLength":2},"billing_email":{"type":["string","null"],"format":"email","maxLength":160}},"required":["billing_name","billing_address","billing_city","billing_country"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/banks":{"post":{"operationId":"hq.finance.banks.store","tags":["Finance"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/banks\/{bank}":{"put":{"operationId":"hq.finance.banks.update","tags":["Finance"],"parameters":[{"name":"bank","in":"path","required":true,"description":"The bank ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.finance.banks.destroy","tags":["Finance"],"parameters":[{"name":"bank","in":"path","required":true,"description":"The bank ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/company":{"get":{"operationId":"hq.finance.company","tags":["Finance"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.finance.company.update","tags":["Finance"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"legal_name":{"type":"string","maxLength":160},"reg_code":{"type":"string","maxLength":40},"vat_number":{"type":["string","null"],"pattern":"^[A-Za-z]{2}[A-Za-z0-9]{2,16}$","maxLength":20},"address":{"type":"string","maxLength":200},"postal_code":{"type":["string","null"],"maxLength":20},"city":{"type":"string","maxLength":80},"country":{"type":"string","enum":["AT","BE","BG","CY","CZ","DE","DK","EE","ES","FI","FR","GR","HR","HU","IE","IT","LT","LU","LV","MT","NL","PL","PT","RO","SE","SI","SK","GB","CH","NO","US","AL","TR","RS","MK","UA","AE","CA","AU"],"minLength":2,"maxLength":2},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":["string","null"],"maxLength":40},"website":{"type":["string","null"],"maxLength":120},"prefix":{"type":"string","pattern":"^[A-Za-z0-9]+$","maxLength":8},"terms_days":{"type":"integer","minimum":0,"maximum":120},"vat_rate":{"type":"number","minimum":0,"maximum":50},"footer":{"type":["string","null"],"maxLength":200},"auto_issue":{"type":"boolean"},"send_emails":{"type":"boolean"}},"required":["legal_name","reg_code","address","city","country","email","prefix","terms_days","vat_rate"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices":{"get":{"operationId":"hq.finance.invoices","tags":["Finance"],"parameters":[{"name":"q","in":"query","schema":{"type":["string","null"],"maxLength":80}},{"name":"status","in":"query","schema":{"type":["string","null"],"enum":["draft","review","issued","unpaid",null]}},{"name":"type","in":"query","schema":{"type":["string","null"],"enum":["invoice","credit_note",null]}},{"name":"month","in":"query","schema":{"type":["string","null"]}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"hq.finance.invoices.store","tags":["Finance"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"organization_id":{"type":["integer","null"]},"buyer":{"type":["object","null"],"properties":{"name":{"type":["string","null"],"maxLength":160},"reg_code":{"type":["string","null"],"maxLength":40},"vat_number":{"type":["string","null"],"maxLength":20},"address":{"type":["string","null"],"maxLength":200},"postal_code":{"type":["string","null"],"maxLength":20},"city":{"type":["string","null"],"maxLength":80},"country":{"type":["string","null"],"enum":["AT","BE","BG","CY","CZ","DE","DK","EE","ES","FI","FR","GR","HR","HU","IE","IT","LT","LU","LV","MT","NL","PL","PT","RO","SE","SI","SK","GB","CH","NO","US","AL","TR","RS","MK","UA","AE","CA","AU",null],"minLength":2,"maxLength":2},"email":{"type":["string","null"],"format":"email","maxLength":160}}},"lines":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","maxLength":250},"quantity":{"type":"number","minimum":0.01,"maximum":100000},"unit_price":{"type":"number","minimum":0,"maximum":1000000}},"required":["description","quantity","unit_price"]},"minItems":1,"maxItems":30},"supply_from":{"type":["string","null"],"format":"date-time"},"supply_to":{"type":["string","null"],"format":"date-time"},"notes":{"type":["string","null"],"maxLength":1000},"issue_now":{"type":"boolean"}},"required":["lines"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/new":{"get":{"operationId":"hq.finance.invoices.create","tags":["Finance"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/{invoice}":{"get":{"operationId":"hq.finance.invoices.show","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.finance.invoices.destroy","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Issued invoices are never deleted. Issue a credit note."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/{invoice}\/credit":{"post":{"operationId":"hq.finance.invoices.credit","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":300}},"required":["reason"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/{invoice}\/issue":{"post":{"operationId":"hq.finance.invoices.issue","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/{invoice}\/paid":{"post":{"operationId":"hq.finance.invoices.paid","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"paid_on":{"type":["string","null"],"format":"date-time"}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/{invoice}\/pdf":{"get":{"operationId":"hq.finance.invoices.pdf","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/pdf":{"schema":{"type":"string"}}},"headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/invoices\/{invoice}\/resend":{"post":{"operationId":"hq.finance.invoices.resend","tags":["Finance"],"parameters":[{"name":"invoice","in":"path","required":true,"description":"The invoice ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":[""]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/vat":{"get":{"operationId":"hq.finance.vat","tags":["Finance"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/vat\/csv":{"get":{"operationId":"hq.finance.vat.csv","tags":["Finance"],"responses":{"200":{"description":"","content":{"text\/csv; charset=UTF-8":{"schema":{"type":"string"}}},"headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/finance\/vat\/zip":{"get":{"operationId":"hq.finance.vat.zip","tags":["Finance"],"responses":{"200":{"description":"","content":{"application\/zip":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Disposition":{"required":true,"schema":{"type":"string"},"example":"attachment; filename=.zip"}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/floor-plan":{"get":{"operationId":"restaurant.floor","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/floor-plan\/layout":{"post":{"operationId":"restaurant.floor.layout","summary":"Saves positions after dragging tables around the editor","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"tables":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"x":{"type":"integer"},"y":{"type":"integer"},"rotation":{"type":["integer","null"]}},"required":["id","x","y"]},"minItems":1}},"required":["tables"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/floor-plan\/rooms":{"post":{"operationId":"restaurant.floor.rooms.store","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":60}},"required":["name"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/floor-plan\/rooms\/{room}":{"put":{"operationId":"restaurant.floor.rooms.update","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"room","in":"path","required":true,"description":"The room ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"width":{"type":["integer","null"],"minimum":300,"maximum":3000},"height":{"type":["integer","null"],"minimum":300,"maximum":3000}},"required":["name"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.floor.rooms.destroy","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"room","in":"path","required":true,"description":"The room ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/floor-plan\/tables":{"post":{"operationId":"restaurant.floor.tables.store","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/floor-plan\/tables\/{table}":{"put":{"operationId":"restaurant.floor.tables.update","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"table","in":"path","required":true,"description":"The table ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.floor.tables.destroy","tags":["FloorPlan"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"table","in":"path","required":true,"description":"The table ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/guests":{"get":{"operationId":"restaurant.guests","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.guests.store","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/guests\/export":{"get":{"operationId":"restaurant.guests.export","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"text\/csv":{"schema":{"type":"string"}}},"headers":{"Transfer-Encoding":{"required":true,"schema":{"type":"string","enum":["chunked"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/guests\/search":{"get":{"operationId":"restaurant.guests.search","summary":"Typeahead for the booking form","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#\/components\/schemas\/Guest"}},{"type":"array","items":{"type":"string"},"minItems":0,"maxItems":0}]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/guests\/{guest}":{"get":{"operationId":"restaurant.guests.show","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"guest","in":"path","required":true,"description":"The guest ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"restaurant.guests.update","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"guest","in":"path","required":true,"description":"The guest ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.guests.destroy","tags":["Guest"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"guest","in":"path","required":true,"description":"The guest ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/me":{"get":{"operationId":"guest.show","summary":"The signed-in guest","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"guest"},"email":{"type":"string"},"name":{"type":["string","null"]},"phone":{"type":["string","null"]},"locale":{"type":["string","null"]}},"required":["id","kind","email","name","phone","locale"]}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"patch":{"operationId":"guest.update","summary":"Change name, phone or language","tags":["Guest account","GuestAccount"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"phone":{"type":["string","null"],"maxLength":40},"locale":{"type":["string","null"],"enum":["en","el",null]}}}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"guest"},"email":{"type":"string"},"name":{"type":["string","null"]},"phone":{"type":["string","null"]},"locale":{"type":["string","null"]}},"required":["id","kind","email","name","phone","locale"]}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"guest.destroy","description":"Signs out every device. Restaurants keep their own booking records, as they would for\na guest who never had an account.","summary":"Delete this guest account","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Your account was deleted."}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/reservations":{"get":{"operationId":"guest.reservations","description":"`when=upcoming` (default) or `when=past`.","summary":"Bookings at every restaurant","tags":["Guest account","GuestAccount"],"parameters":[{"name":"when","in":"query","schema":{"type":["string","null"],"enum":["upcoming","past",null]}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CursorPaginator"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/vouchers":{"get":{"operationId":"guest.vouchers","summary":"Gift vouchers bought by or for this guest","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CursorPaginator"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/loyalty-cards":{"get":{"operationId":"guest.loyalty-cards","summary":"Loyalty cards at every restaurant. Open one with `GET \/public\/loyalty\/{token}`","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string"},"stamps":{"type":"integer"},"rewards_available":{"type":"integer"},"total_stamps":{"type":"integer"},"active":{"type":"boolean"},"program":{"type":["array","null"],"items":[]},"restaurant":{"type":["array","null"],"items":[]}},"required":["token","stamps","rewards_available","total_stamps","active","program","restaurant"]}}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/orders":{"get":{"operationId":"guest.orders","summary":"Takeaway orders at every restaurant","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CursorPaginator"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/feedback":{"get":{"operationId":"guest.feedback","summary":"Feedback the restaurants asked for and the guest has not given yet. Answer with `POST \/public\/reviews\/{token}`","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string"},"asked_at":{"type":"string"},"restaurant":{"type":["array","null"],"items":[]}},"required":["token","asked_at","restaurant"]}}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/preferences":{"get":{"operationId":"guest.preferences","summary":"Email preferences per restaurant (news and offers)","tags":["Guest account","GuestAccount"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"restaurant":{"type":["array","null"],"items":[]},"marketing_opt_in":{"type":"boolean"}},"required":["restaurant","marketing_opt_in"]}}},"required":["data"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/preferences\/{slug}":{"put":{"operationId":"guest.preferences.update","summary":"Turn a restaurant's news and offers on or off","tags":["Guest account","GuestAccount"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"marketing_opt_in":{"type":"boolean"}},"required":["marketing_opt_in"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Saved."}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/auth\/guest\/code":{"post":{"operationId":"auth.guest.code","description":"Always answers the same, so it never tells whether an email has an account.","summary":"Email a sign-in code","tags":["Guest sign-in","GuestAuth"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":255}},"required":["email"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"expires_in":{"type":"integer","const":600}},"required":["message","expires_in"]}}}},"503":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Guest accounts are paused at the moment."]}},"required":["message"]}}}},"429":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/auth\/guest\/verify":{"post":{"operationId":"auth.guest.verify","description":"Returns a bearer token for this device. Five wrong codes end the code.","summary":"Sign in with the emailed code","tags":["Guest sign-in","GuestAuth"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":255},"code":{"type":"string","minLength":6,"maxLength":6},"device_name":{"type":"string","maxLength":120},"name":{"type":["string","null"],"maxLength":255}},"required":["email","code","device_name"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/public\/human\/challenge":{"get":{"operationId":"human.challenge","tags":["HumanCheck"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"salt":{"type":"string"},"difficulty":{"type":"integer","const":15}},"required":["id","salt","difficulty"]}}}}}}},"\/restaurants\/{restaurant}\/insights":{"get":{"operationId":"restaurant.insights","tags":["Insights"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/api-keys":{"post":{"operationId":"restaurant.settings.keys.store","summary":"New API key. The key itself is shown once, in this answer only","tags":["Integrations"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"access":{"type":"string","enum":["read","write"]}},"required":["name","access"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{key}\/settings\/api-keys\/{key}":{"delete":{"operationId":"restaurant.settings.keys.destroy","tags":["Integrations"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/webhooks":{"post":{"operationId":"restaurant.settings.webhooks.store","summary":"New webhook. Its signing secret is shown once, in this answer only","tags":["Integrations"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["A restaurant can have up to 10 webhooks."]}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/webhooks\/{webhook}":{"put":{"operationId":"restaurant.settings.webhooks.update","tags":["Integrations"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"webhook","in":"path","required":true,"description":"The webhook ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.settings.webhooks.destroy","tags":["Integrations"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"webhook","in":"path","required":true,"description":"The webhook ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/webhooks\/{webhook}\/deliveries":{"get":{"operationId":"restaurant.settings.webhooks.deliveries","summary":"The last 50 deliveries of one webhook, newest first","tags":["Integrations"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"webhook","in":"path","required":true,"description":"The webhook ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"deliveries":{"type":"array","items":{"$ref":"#\/components\/schemas\/WebhookDelivery"}}},"required":["deliveries"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/webhooks\/{webhook}\/test":{"post":{"operationId":"restaurant.settings.webhooks.test","summary":"Send a test event (\"ping\") to the webhook now","tags":["Integrations"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"webhook","in":"path","required":true,"description":"The webhook ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"409":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Switch the webhook on first."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/job-applications\/{application}":{"put":{"operationId":"hq.jobs.applications.update","tags":["Job"],"parameters":[{"name":"application","in":"path","required":true,"description":"The application ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","reviewing","interview","hired","declined"]},"notes":{"type":["string","null"],"maxLength":5000}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.jobs.applications.destroy","tags":["Job"],"parameters":[{"name":"application","in":"path","required":true,"description":"The application ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/job-applications\/{application}\/cv":{"get":{"operationId":"hq.jobs.applications.cv","tags":["Job"],"parameters":[{"name":"application","in":"path","required":true,"description":"The application ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/pdf":{"schema":{"type":"string","format":"binary"}}},"headers":{"Transfer-Encoding":{"required":true,"schema":{"type":"string","enum":["chunked"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/jobs":{"get":{"operationId":"hq.jobs","tags":["Job"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"hq.jobs.store","tags":["Job"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/jobs\/applications":{"get":{"operationId":"hq.jobs.applications","summary":"One inbox for every application, filtered by job and by status","tags":["Job"],"parameters":[{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/jobs\/new":{"get":{"operationId":"hq.jobs.create","tags":["Job"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/jobs\/{job}":{"get":{"operationId":"hq.jobs.show","tags":["Job"],"parameters":[{"name":"job","in":"path","required":true,"description":"The job ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.jobs.update","tags":["Job"],"parameters":[{"name":"job","in":"path","required":true,"description":"The job ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.jobs.destroy","tags":["Job"],"parameters":[{"name":"job","in":"path","required":true,"description":"The job ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/keywords":{"post":{"operationId":"hq.seo.keywords.store","tags":["Keyword"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/keywords\/import":{"post":{"operationId":"hq.seo.keywords.import","summary":"Imports Google Search Console > Performance > Queries (Export > CSV, file \"Queries.csv\").\nUpdates tracked keywords and can add new queries above an impressions threshold","tags":["Keyword"],"requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","contentMediaType":"application\/octet-stream","description":"Maximum file size: 5120 kilobytes."},"add_new":{"type":"boolean"},"min_impressions":{"type":["integer","null"],"minimum":0}},"required":["file"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/keywords\/{keyword}":{"put":{"operationId":"hq.seo.keywords.update","tags":["Keyword"],"parameters":[{"name":"keyword","in":"path","required":true,"description":"The keyword ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.seo.keywords.destroy","tags":["Keyword"],"parameters":[{"name":"keyword","in":"path","required":true,"description":"The keyword ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/landings":{"post":{"operationId":"hq.seo.landings.store","tags":["Landing"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/landings\/new":{"get":{"operationId":"hq.seo.landings.create","tags":["Landing"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/landings\/{landing}":{"get":{"operationId":"hq.seo.landings.edit","tags":["Landing"],"parameters":[{"name":"landing","in":"path","required":true,"description":"The landing ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.seo.landings.update","tags":["Landing"],"parameters":[{"name":"landing","in":"path","required":true,"description":"The landing ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.seo.landings.destroy","tags":["Landing"],"parameters":[{"name":"landing","in":"path","required":true,"description":"The landing ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/landings\/{landing}\/duplicate":{"post":{"operationId":"hq.seo.landings.duplicate","tags":["Landing"],"parameters":[{"name":"landing","in":"path","required":true,"description":"The landing ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/demo":{"post":{"operationId":"demo.store","tags":["Lead"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":["string","null"],"maxLength":40},"restaurant":{"type":["string","null"],"maxLength":160},"city":{"type":["string","null"],"maxLength":80},"venues":{"type":["integer","null"],"minimum":1,"maximum":1000},"message":{"type":["string","null"],"maxLength":2000},"website":{"type":"string"}},"required":["name","email"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/restaurants\/{slug}\/loyalty":{"get":{"operationId":"loyalty","tags":["Loyalty"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}},"post":{"operationId":"loyalty.store","tags":["Loyalty"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","maxLength":80},"last_name":{"type":["string","null"],"maxLength":80},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":["string","null"],"maxLength":30},"accept":{"enum":["yes","on","1",1,"true",true]},"marketing_opt_in":{"type":"boolean"}},"required":["first_name","email"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/loyalty\/{token}":{"get":{"operationId":"loyalty.card","tags":["Loyalty"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/public\/loyalty\/{token}\/leave":{"post":{"operationId":"loyalty.leave","tags":["Loyalty"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/public\/loyalty\/{token}\/rejoin":{"post":{"operationId":"loyalty.rejoin","tags":["Loyalty"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/restaurants\/{restaurant}\/guests\/{guest}\/loyalty":{"post":{"operationId":"restaurant.loyalty.enroll","summary":"From a guest's profile: give them a card and email them its link","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"guest","in":"path","required":true,"description":"The guest ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Switch the loyalty card on first."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/loyalty":{"get":{"operationId":"restaurant.loyalty","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"restaurant.loyalty.update","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"target":{"type":"integer","minimum":3,"maximum":20},"reward":{"type":"string","maxLength":80},"earn_visits":{"type":"boolean"},"earn_orders":{"type":"boolean"},"welcome_stamp":{"type":"boolean"}},"required":["target","reward"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/loyalty\/cards\/{card}\/redeem":{"post":{"operationId":"restaurant.loyalty.redeem","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"card","in":"path","required":true,"description":"The card ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"card":{"type":"array","items":[]},"message":{"type":"string","const":"Reward used. Enjoy!"}},"required":["card","message"]}}}},"422":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"card":{"type":"array","items":[]},"message":{"type":"string"}},"required":["card","message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/loyalty\/cards\/{card}\/stamp":{"post":{"operationId":"restaurant.loyalty.stamp","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"card","in":"path","required":true,"description":"The card ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"key":{"type":["string","null"],"format":"uuid"}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/loyalty\/cards\/{card}\/unstamp":{"post":{"operationId":"restaurant.loyalty.unstamp","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"card","in":"path","required":true,"description":"The card ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"card":{"type":"array","items":[]},"message":{"type":"string","const":"Stamp removed."}},"required":["card","message"]}}}},"422":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"card":{"type":"array","items":[]},"message":{"type":"string"}},"required":["card","message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/loyalty\/lookup":{"post":{"operationId":"restaurant.loyalty.lookup","summary":"Scanner and search: find a card of this restaurant by its link or token","tags":["Loyalty"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"code":{"type":"string","maxLength":300}},"required":["code"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"array","items":[]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/reservations\/{code}":{"get":{"operationId":"reservation.show","tags":["ManageReservation"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/reservations\/{code}\/cancel":{"post":{"operationId":"reservation.cancel","tags":["ManageReservation"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}}}}},"\/public\/restaurants":{"get":{"operationId":"directory","tags":["Marketing"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/pricing":{"get":{"operationId":"pricing","tags":["Marketing"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/features":{"get":{"operationId":"features","tags":["Marketing"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/hq\/seo\/media":{"get":{"operationId":"hq.seo.media","summary":"For the image picker","tags":["Media"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/Media"}}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"hq.seo.media.store","tags":["Media"],"requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary","contentMediaType":"application\/octet-stream","description":"Maximum file size: 10240 kilobytes."},"minItems":1,"maxItems":20},"alt":{"type":["string","null"],"maxLength":200}},"required":["files"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/media\/{media}":{"put":{"operationId":"hq.seo.media.update","tags":["Media"],"parameters":[{"name":"media","in":"path","required":true,"description":"The media ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"alt":{"type":["string","null"],"maxLength":200}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.seo.media.destroy","tags":["Media"],"parameters":[{"name":"media","in":"path","required":true,"description":"The media ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/menu":{"get":{"operationId":"restaurant.menu","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/menu\/categories":{"post":{"operationId":"restaurant.menu.categories.store","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80}},"required":["name"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/menu\/categories\/{category}":{"put":{"operationId":"restaurant.menu.categories.update","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"sort":{"type":["integer","null"]}},"required":["name"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.menu.categories.destroy","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/menu\/items":{"post":{"operationId":"restaurant.menu.items.store","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":[""]}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/menu\/items\/{item}":{"put":{"operationId":"restaurant.menu.items.update","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"item","in":"path","required":true,"description":"The item ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":[""]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.menu.items.destroy","tags":["Menu"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"item","in":"path","required":true,"description":"The item ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/settings\/mobile\/firebase":{"post":{"operationId":"hq.settings.mobile.firebase","summary":"Store the Firebase service account (the JSON file from Firebase > Project settings > Service accounts)","tags":["MobileSettings"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"json":{"type":"string","maxLength":20000}},"required":["json"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.settings.mobile.firebase.destroy","tags":["MobileSettings"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/settings\/mobile\/keys\/{key}":{"delete":{"operationId":"hq.settings.mobile.keys.destroy","summary":"Revoke any restaurant's integration key (abuse, a leaked key)","tags":["MobileSettings"],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/settings\/mobile\/test-push":{"post":{"operationId":"hq.settings.mobile.test-push","summary":"A test notification to the admin's own signed-in app devices","tags":["MobileSettings"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"409":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Add the Firebase service account first."]}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/settings\/mobile\/{section}":{"put":{"operationId":"hq.settings.mobile","tags":["MobileSettings"],"parameters":[{"name":"section","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"push":{"type":"object","properties":{"enabled":{"type":"boolean"},"events":{"type":"array","items":{"type":"boolean"}}}},"access":{"type":"object","properties":{"team_sign_in":{"type":"boolean"},"guest_accounts":{"type":"boolean"},"integration_keys":{"type":"boolean"},"rate_signed_in":{"type":"integer","minimum":30,"maximum":5000},"rate_anonymous":{"type":"integer","minimum":10,"maximum":1000}}}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/newsletter":{"post":{"operationId":"newsletter.store","tags":["Newsletter"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":160},"website":{"type":"string"}},"required":["email"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/restaurants\/{restaurant}\/venues":{"post":{"operationId":"restaurant.venues.store","summary":"Adds another venue to the owner's group (multi-venue)","tags":["Onboarding"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/orders":{"get":{"operationId":"restaurant.orders","tags":["Order"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/orders\/{order}\/status":{"post":{"operationId":"restaurant.orders.status","tags":["Order"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"order","in":"path","required":true,"description":"The order ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","accepted","ready","collected","cancelled"]}},"required":["status"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/restaurants\/{slug}\/order":{"get":{"operationId":"order","tags":["OrderShop"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/public\/restaurants\/{slug}\/orders":{"post":{"operationId":"order.store","tags":["OrderShop"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"quantity":{"type":"integer","minimum":1,"maximum":50}},"required":["id","quantity"]},"minItems":1,"maxItems":50},"pickup_at":{"type":"string"},"first_name":{"type":"string","maxLength":80},"last_name":{"type":["string","null"],"maxLength":80},"email":{"type":"string","format":"email","maxLength":160},"phone":{"type":"string","maxLength":30},"notes":{"type":["string","null"],"maxLength":500},"pay_now":{"type":"boolean"}},"required":["items","pickup_at","first_name","email","phone"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/orders\/{code}":{"get":{"operationId":"order.status","tags":["OrderShop"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/hq\/settings":{"get":{"operationId":"hq.settings","tags":["PlatformSettings"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/settings-plans":{"put":{"operationId":"hq.settings.plans","tags":["PlatformSettings"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"plans":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["plans"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/settings\/{section}":{"put":{"operationId":"hq.settings.update","tags":["PlatformSettings"],"parameters":[{"name":"section","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"legal_name":{"type":["string","null"],"maxLength":160},"registry_code":{"type":["string","null"],"maxLength":40},"vat_number":{"type":["string","null"],"maxLength":40},"address":{"type":["string","null"],"maxLength":300},"support_email":{"type":"string","format":"email","maxLength":160},"billing_email":{"type":"string","format":"email","maxLength":160},"open":{"type":"boolean"},"trial_days":{"type":"integer","minimum":0,"maximum":90},"trial_plan":{"type":"string"},"active":{"type":"boolean"},"tone":{"type":"string","enum":["info","warning"]},"message":{"type":["string","null"],"maxLength":300}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurant":{"get":{"operationId":"publicApi.profile","tags":["PublicApi"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"array","items":[]}}}}}}},"\/availability":{"get":{"operationId":"publicApi.availability","tags":["PublicApi"],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"party","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"shifts":{"type":"array","items":{"type":"object","properties":{"shift":{"type":"array","items":[]},"slots":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"available":{"type":"boolean"},"deposit":{"type":"string"}},"required":["time","available","deposit"]}}},"required":["shift","slots"]}}},"required":["shifts"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/reservations":{"post":{"operationId":"publicApi.store","tags":["PublicApi"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date"},"time":{"type":"string"},"party_size":{"type":"integer","minimum":1,"maximum":100},"first_name":{"type":"string","maxLength":80},"last_name":{"type":["string","null"],"maxLength":80},"email":{"type":"string","format":"email"},"phone":{"type":["string","null"],"maxLength":30},"guest_notes":{"type":["string","null"],"maxLength":1000},"source":{"type":["string","null"],"enum":["api","google",null]}},"required":["date","time","party_size","first_name","email"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"status":{"type":"string"},"date":{"type":"string"},"time":{"type":"string"},"party_size":{"type":"integer"},"deposit_amount":{"type":"number"},"deposit_status":{"type":"string"},"manage_url":{"type":"string"}},"required":["code","status","date","time","party_size","deposit_amount","deposit_status","manage_url"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/reservations\/{code}":{"get":{"operationId":"publicApi.show","tags":["PublicApi"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"status":{"type":"string"},"date":{"type":"string"},"time":{"type":"string"},"party_size":{"type":"integer"},"deposit_amount":{"type":"number"},"deposit_status":{"type":"string"},"manage_url":{"type":"string"}},"required":["code","status","date","time","party_size","deposit_amount","deposit_status","manage_url"]}}}}}},"delete":{"operationId":"publicApi.cancel","tags":["PublicApi"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"status":{"type":"string"},"date":{"type":"string"},"time":{"type":"string"},"party_size":{"type":"integer"},"deposit_amount":{"type":"number"},"deposit_status":{"type":"string"},"manage_url":{"type":"string"}},"required":["code","status","date","time","party_size","deposit_amount","deposit_status","manage_url"]}}}}}}},"\/restaurants\/{restaurant}\/availability":{"get":{"operationId":"restaurant.availability","summary":"Staff view of free times, ignoring online-only rules like cutoff and booking window","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"party","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"ignore","in":"query","schema":{"type":["integer","null"]}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"shifts":{"type":"array","items":{"type":"object","properties":{"shift":{"type":"array","items":[]},"slots":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string"},"available":{"type":"boolean"},"deposit":{"type":"string"}},"required":["time","available","deposit"]}}},"required":["shift","slots"]}}},"required":["shifts"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reservations":{"get":{"operationId":"restaurant.reservations","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.reservations.store","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date"},"time":{"type":"string"},"party_size":{"type":"integer","minimum":1,"maximum":200},"duration":{"type":["integer","null"],"minimum":15,"maximum":600},"guest_id":{"type":["integer","null"]},"first_name":{"type":["string","null"],"maxLength":80},"last_name":{"type":["string","null"],"maxLength":80},"email":{"type":["string","null"],"format":"email","maxLength":160},"phone":{"type":["string","null"],"maxLength":30},"occasion":{"type":["string","null"],"maxLength":40},"guest_notes":{"type":["string","null"],"maxLength":1000},"staff_notes":{"type":["string","null"],"maxLength":1000},"source":{"type":"string","enum":["phone","walk_in","staff","email"]},"table_ids":{"type":["array","null"],"items":{"type":"integer"}},"force":{"type":"boolean"},"notify":{"type":"boolean"}},"required":["date","time","party_size","source"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reservations\/{reservation}":{"put":{"operationId":"restaurant.reservations.update","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"reservation","in":"path","required":true,"description":"The reservation ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date"},"time":{"type":"string"},"party_size":{"type":"integer","minimum":1,"maximum":200},"duration":{"type":"integer","minimum":15,"maximum":600},"occasion":{"type":["string","null"],"maxLength":40},"guest_notes":{"type":["string","null"],"maxLength":1000},"staff_notes":{"type":["string","null"],"maxLength":1000},"bill_amount":{"type":["number","null"],"minimum":0}},"required":["date","time","party_size","duration"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reservations\/{reservation}\/review":{"post":{"operationId":"restaurant.reservations.review","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"reservation","in":"path","required":true,"description":"The reservation ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reservations\/{reservation}\/status":{"post":{"operationId":"restaurant.reservations.status","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"reservation","in":"path","required":true,"description":"The reservation ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","confirmed","seated","completed","cancelled","no_show"]}},"required":["status"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reservations\/{reservation}\/tables":{"post":{"operationId":"restaurant.reservations.tables","tags":["Reservation"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"reservation","in":"path","required":true,"description":"The reservation ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"table_ids":{"type":"array","items":{"type":"integer"}}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/changes":{"get":{"operationId":"restaurant.changes","description":"Apps call this every few seconds (or when a push arrives) with the `server_time` from\nthe previous answer as `since`. Lists bookings, waitlist entries, orders and reviews\ncreated or changed after it (at most 500 of each). Without `since`: the last 5 minutes.","summary":"What changed since the last check","tags":["Restaurant: live updates","Changes"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":["string","null"],"format":"date-time"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"server_time":{"type":"string"},"since":{"type":"string"},"reservations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"code":{"type":"string"},"date":{"type":"string"},"time":{"type":"string"},"duration":{"type":"integer"},"party_size":{"type":"integer"},"status":{"type":"string"},"source":{"type":"string"},"occasion":{"type":["string","null"]},"guest_notes":{"type":["string","null"]},"staff_notes":{"type":["string","null"]},"deposit_amount":{"type":"number"},"deposit_status":{"type":"string"},"bill_amount":{"type":["number","null"]},"shift_id":{"type":["integer","null"]},"table_ids":{"anyOf":[{"type":"array"},{"type":"array","items":{"type":"string"},"minItems":0,"maxItems":0}]},"table_names":{"type":"string"},"review_requested":{"type":"boolean"},"guest":{"type":["array","null"],"items":[]}},"required":["id","code","date","time","duration","party_size","status","source","occasion","guest_notes","staff_notes","deposit_amount","deposit_status","bill_amount","shift_id","table_ids","table_names","review_requested","guest"]}},"waitlist":{"anyOf":[{"type":"array","items":{"$ref":"#\/components\/schemas\/WaitlistEntry"}},{"type":"array","items":{"type":"string"},"minItems":0,"maxItems":0}]},"orders":{"anyOf":[{"type":"array","items":{"$ref":"#\/components\/schemas\/Order"}},{"type":"array","items":{"type":"string"},"minItems":0,"maxItems":0}]},"reviews":{"type":"array","items":{"$ref":"#\/components\/schemas\/Review"}}},"required":["server_time","since","reservations","waitlist","orders","reviews"]}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/restaurants\/{slug}":{"get":{"operationId":"restaurant","tags":["RestaurantPage"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/restaurants\/{slug}\/menu":{"get":{"operationId":"menu","summary":"QR-code menu: a light page guests open at the table","tags":["RestaurantPage"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/restaurants\/{restaurant}\/messages":{"get":{"operationId":"restaurant.messages","tags":["RestaurantSettings"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings":{"get":{"operationId":"restaurant.settings","tags":["RestaurantSettings"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"restaurant.settings.update","tags":["RestaurantSettings"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"restaurant":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"statement_name":{"type":["string","null"],"description":"Letters, digits, spaces and . - & only (Stripe rule), at least one letter, short enough to fit.","pattern":"^[A-Za-z0-9 .\\-&]*[A-Za-z][A-Za-z0-9 .\\-&]*$","maxLength":13},"slug":{"type":"string","maxLength":60},"cuisine":{"type":["string","null"],"maxLength":80},"price_range":{"type":"integer","minimum":1,"maximum":4},"description":{"type":["string","null"],"maxLength":3000},"email":{"type":["string","null"],"format":"email"},"phone":{"type":["string","null"],"maxLength":30},"website":{"type":["string","null"],"format":"uri"},"address":{"type":["string","null"],"maxLength":160},"city":{"type":["string","null"],"maxLength":80},"postal_code":{"type":["string","null"],"maxLength":20},"country":{"type":"string","minLength":2,"maxLength":2},"timezone":{"type":"string"},"currency":{"type":"string","enum":["EUR","GBP","USD","CHF"]},"locale":{"type":"string","enum":["en","el","fr","de","es","it","nl","pt"]},"brand_color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"is_published":{"type":"boolean"}},"required":["name","slug","price_range","country","timezone","currency","locale","brand_color"]},"booking":{"type":"object","properties":{"min_party":{"type":"integer","minimum":1},"max_party":{"type":"integer","maximum":100},"booking_window_days":{"type":"integer","minimum":1,"maximum":365},"cutoff_minutes":{"type":"integer","minimum":0,"maximum":2880},"auto_confirm":{"type":"boolean"},"cancel_until_hours":{"type":"integer","minimum":0,"maximum":168},"no_show_fee":{"type":["number","null"],"minimum":0},"waitlist_enabled":{"type":"boolean"},"reminder_hours":{"type":"integer","minimum":0,"maximum":168},"review_delay_hours":{"type":"integer","minimum":0,"maximum":168},"large_party_message":{"type":["string","null"],"maxLength":300},"terms":{"type":["string","null"],"maxLength":3000}},"required":["min_party","max_party","booking_window_days","cutoff_minutes","cancel_until_hours","reminder_hours","review_delay_hours"]}},"required":["restaurant","booking"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/cover":{"post":{"operationId":"restaurant.settings.cover","tags":["RestaurantSettings"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"type":"object","properties":{"cover":{"type":"string","format":"binary","contentMediaType":"application\/octet-stream","description":"Maximum file size: 6144 kilobytes."}},"required":["cover"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.settings.cover.destroy","tags":["RestaurantSettings"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/token":{"post":{"operationId":"restaurant.settings.token","tags":["RestaurantSettings"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/reviews\/{token}":{"get":{"operationId":"review.show","tags":["Review"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"review.store","tags":["Review"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"rating":{"type":"integer","minimum":1,"maximum":5},"food":{"type":["integer","null"],"minimum":1,"maximum":5},"service":{"type":["integer","null"],"minimum":1,"maximum":5},"ambiance":{"type":["integer","null"],"minimum":1,"maximum":5},"value":{"type":["integer","null"],"minimum":1,"maximum":5},"comment":{"type":["string","null"],"maxLength":3000}},"required":["rating"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/restaurants\/{restaurant}\/reviews":{"get":{"operationId":"restaurant.reviews","tags":["Review"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"filter","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reviews\/{review}\/reply":{"post":{"operationId":"restaurant.reviews.reply","tags":["Review"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"review","in":"path","required":true,"description":"The review ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"reply":{"type":"string","maxLength":2000}},"required":["reply"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/reviews\/{review}\/toggle":{"post":{"operationId":"restaurant.reviews.toggle","tags":["Review"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"review","in":"path","required":true,"description":"The review ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/security":{"get":{"operationId":"hq.security","tags":["Security"],"parameters":[{"name":"level","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/newsletter\/export":{"get":{"operationId":"hq.newsletter.export","summary":"Confirmed newsletter subscribers as CSV, to import into Brevo (or any mailing tool)","tags":["SeoCenter"],"responses":{"200":{"description":"","content":{"text\/csv":{"schema":{"type":"string"}}},"headers":{"Transfer-Encoding":{"required":true,"schema":{"type":"string","enum":["chunked"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo":{"get":{"operationId":"hq.seo","tags":["SeoCenter"],"parameters":[{"name":"tab","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/leads\/{lead}":{"put":{"operationId":"hq.seo.leads.update","tags":["SeoCenter"],"parameters":[{"name":"lead","in":"path","required":true,"description":"The lead ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","contacted","won","lost"]}},"required":["status"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/settings\/{section}":{"put":{"operationId":"hq.seo.settings","tags":["SeoCenter"],"parameters":[{"name":"section","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"default_og_media_id":{"type":["integer","null"]},"pages":{"type":"array","items":{"type":"string"}},"":{"type":"string"},"logo_media_id":{"type":["integer","null"]},"favicon_media_id":{"type":["integer","null"]},"logo_icon_media_id":{"type":["integer","null"]},"theme_color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"images":{"type":"array","items":{"type":"string"}},"home":{"type":"object","properties":{"headline_1":{"type":"string","maxLength":60},"headline_2":{"type":"string","maxLength":60},"subtitle":{"type":"string","maxLength":260},"cta_primary":{"type":"string","maxLength":30},"cta_secondary":{"type":"string","maxLength":30},"cta_secondary_url":{"type":"string"}}},"topbar":{"type":"object","properties":{"active":{"type":"boolean"},"link_url":{"type":["string","null"],"pattern":"^(\\\/[^\\s]*|https:\\\/\\\/[^\\s]+)$","maxLength":300},"starts_on":{"type":["string","null"],"format":"date-time"},"ends_on":{"type":["string","null"],"format":"date-time"},"text":{"type":"object","properties":{"":{"type":["string","null"],"maxLength":160}}}}},"allow_promotion_codes":{"type":"boolean"},"offer":{"type":"object","properties":{"active":{"type":"boolean"},"code":{"type":["string","null"],"maxLength":40},"plan":{"type":["string","null"]},"days":{"type":["integer","null"],"minimum":15,"maximum":365},"ends_on":{"type":["string","null"],"format":"date-time"}}},"demo_requests":{"type":"boolean"},"ga4_id":{"type":["string","null"],"pattern":"^G-[A-Z0-9]{4,20}$"},"gtm_id":{"type":["string","null"],"pattern":"^GTM-[A-Z0-9]{4,12}$"},"ads_id":{"type":["string","null"],"pattern":"^AW-\\d{6,14}$"},"enhanced_conversions":{"type":"boolean"},"consent_mode":{"type":"string","enum":["basic","advanced"]},"consent_banner":{"type":"boolean"},"search_console":{"type":["string","null"],"pattern":"^[A-Za-z0-9_\\-]{10,100}$"},"track_restaurant_pages":{"type":"boolean"}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/ai-key":{"put":{"operationId":"hq.seo.ai.save","tags":["SeoWriter"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"key":{"type":"string","pattern":"^sk-ant-[A-Za-z0-9_\\-]{20,}$","maxLength":300}},"required":["key"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.seo.ai.remove","tags":["SeoWriter"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/seo\/write":{"post":{"operationId":"hq.seo.write","tags":["SeoWriter"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["free","ai"]},"kind":{"type":"string","enum":["post","page","landing","article","job","site"]},"locale":{"type":["string","null"],"enum":["en","el",null]},"title":{"type":["string","null"],"maxLength":300},"summary":{"type":["string","null"],"maxLength":1000},"body":{"type":["string","null"],"maxLength":100000},"keyword":{"type":["string","null"],"maxLength":120}},"required":["mode","kind"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"slug":{"type":"string"},"keywords":{"type":"array","items":[]}},"required":["keyword","title","description","slug","keywords"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/service":{"get":{"operationId":"restaurant.service","tags":["Service"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/closures":{"post":{"operationId":"restaurant.closures.store","tags":["Shift"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"starts_on":{"type":"string","format":"date-time"},"ends_on":{"type":"string","format":"date-time"},"shift_id":{"type":["integer","null"]},"reason":{"type":["string","null"],"maxLength":120}},"required":["starts_on","ends_on"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/closures\/{closure}":{"delete":{"operationId":"restaurant.closures.destroy","tags":["Shift"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"closure","in":"path","required":true,"description":"The closure ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/services":{"get":{"operationId":"restaurant.shifts","tags":["Shift"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.shifts.store","tags":["Shift"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/services\/{shift}":{"put":{"operationId":"restaurant.shifts.update","tags":["Shift"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"shift","in":"path","required":true,"description":"The shift ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.shifts.destroy","tags":["Shift"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"shift","in":"path","required":true,"description":"The shift ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/auth\/login":{"post":{"operationId":"auth.login","description":"Returns a token, or `two_factor_required: true` with a `challenge` to send to\n`POST \/auth\/two-factor` together with the code from the authenticator app.","summary":"Sign in","tags":["Sign-in","Auth"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"},"device_name":{"type":"string","description":"A name for this device, shown in the account's list of signed-in devices.","maxLength":120}},"required":["email","password","device_name"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"type":"object","properties":{"token":{"type":"string"},"token_type":{"type":"string","const":"Bearer"},"account":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","const":"user"},"name":{"type":"string"},"email":{"type":"string"},"email_verified":{"type":"boolean"},"locale":{"type":"string"},"is_admin":{"type":"boolean"},"two_factor":{"type":"boolean"},"current_restaurant_id":{"type":["integer","null"]},"restaurants":{"type":"string"}},"required":["id","kind","name","email","email_verified","locale","is_admin","two_factor","current_restaurant_id","restaurants"]}},"required":["token","token_type","account"]},{"type":"object","properties":{"two_factor_required":{"type":"boolean"},"challenge":{"type":"string"}},"required":["two_factor_required","challenge"]}]}}}},"503":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Signing in to the apps is paused at the moment."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/auth\/two-factor":{"post":{"operationId":"auth.two-factor","description":"Send the `challenge` from `\/auth\/login` with either the 6-digit `code` from the\nauthenticator app or one `recovery_code`.","summary":"Second sign-in step","tags":["Sign-in","Auth"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"challenge":{"type":"string"},"code":{"type":["string","null"],"maxLength":12},"recovery_code":{"type":["string","null"],"maxLength":24},"device_name":{"type":"string","maxLength":120}},"required":["challenge","device_name"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"token_type":{"type":"string","const":"Bearer"},"account":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"user"},"name":{"type":"string"},"email":{"type":"string"},"email_verified":{"type":"boolean"},"locale":{"type":["string","null"]},"is_admin":{"type":"boolean"},"two_factor":{"type":"boolean"},"current_restaurant_id":{"type":["integer","null"]},"restaurants":{"type":"string"}},"required":["id","kind","name","email","email_verified","locale","is_admin","two_factor","current_restaurant_id","restaurants"]}},"required":["token","token_type","account"]}}}},"401":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Please sign in again."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/auth\/register":{"post":{"operationId":"auth.register","description":"The new account then creates its first restaurant with `POST \/me\/restaurants`\n(which also takes a sign-up `offer` code).","summary":"Create a team account","tags":["Sign-in","Auth"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":255},"email":{"type":"string","format":"email","maxLength":255},"password":{"type":"string"},"device_name":{"type":"string","maxLength":120},"password_confirmation":{"type":"string"}},"required":["name","email","password","device_name","password_confirmation"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"token_type":{"type":"string","const":"Bearer"},"account":{"type":"object","properties":{"id":{"type":"integer"},"kind":{"type":"string","const":"user"},"name":{"type":"string"},"email":{"type":"string"},"email_verified":{"type":"boolean"},"locale":{"type":["string","null"]},"is_admin":{"type":"boolean"},"two_factor":{"type":"boolean"},"current_restaurant_id":{"type":["integer","null"]},"restaurants":{"type":"string"}},"required":["id","kind","name","email","email_verified","locale","is_admin","two_factor","current_restaurant_id","restaurants"]}},"required":["token","token_type","account"]}}}},"503":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Signing in to the apps is paused at the moment."]}},"required":["message"]}}}},"403":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["New sign-ups are paused at the moment. Please contact us."]}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/auth\/forgot-password":{"post":{"operationId":"auth.forgot-password","description":"Always answers the same, whether or not the email has an account.","summary":"Send a password reset link","tags":["Sign-in","Auth"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"If that email has an account, a reset link is on its way."}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}},"security":[]}},"\/auth\/logout":{"post":{"operationId":"auth.logout","description":"Ends the token used for this request.","summary":"Sign out this device","tags":["Sign-in","Auth"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Signed out."}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/auth\/email\/verification-notification":{"post":{"operationId":"auth.verification.send","summary":"Send the email confirmation link again","tags":["Sign-in","Auth"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"A new confirmation link is on its way."}},"required":["message"]}}}},"403":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":[""]}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/guest\/logout":{"post":{"operationId":"guest.logout","description":"Ends the token used for this request.","summary":"Sign out this device","tags":["Sign-in","Auth"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","const":"Signed out."}},"required":["message"]}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/help":{"get":{"operationId":"support","tags":["Support"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/help\/category\/{slug}":{"get":{"operationId":"support.category","tags":["Support"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/public\/help\/search":{"get":{"operationId":"support.search","summary":"Articles matching what someone is typing (help centre search and the request forms)","tags":["Support"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"type":"object","properties":{"results":{"type":"string"}},"required":["results"]},{"type":"object","properties":{"results":{"type":"array","items":{"type":"string"},"minItems":0,"maxItems":0}},"required":["results"]}]}}}}}}},"\/public\/help\/{slug}":{"get":{"operationId":"support.article","tags":["Support"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/help\/{slug}\/helpful":{"post":{"operationId":"support.helpful","tags":["Support"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"helpful":{"type":"boolean"}},"required":["helpful"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/support\/new":{"get":{"operationId":"support.new","tags":["Support"],"parameters":[{"name":"topic","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/public\/support\/tickets":{"post":{"operationId":"support.store","tags":["Support"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email","maxLength":160},"company":{"type":["string","null"],"maxLength":160},"topic":{"type":"string","enum":["sales","account","billing","bookings","setup","technical","idea","partner","other"]},"subject":{"type":"string","minLength":4,"maxLength":200},"message":{"type":"string","minLength":10,"maxLength":5000},"website":{"type":"string"}},"required":["name","email","topic","subject","message"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/support\/tickets\/{token}":{"get":{"operationId":"support.ticket","summary":"The private page for a request, opened from the email link","tags":["Support"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}},"post":{"operationId":"support.ticket.reply","tags":["Support"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":2,"maxLength":5000}},"required":["message"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/support\/tickets\/{token}\/solved":{"post":{"operationId":"support.ticket.solve","tags":["Support"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/restaurants\/{restaurant}\/support":{"get":{"operationId":"restaurant.support","tags":["Support"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"filter","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.support.store","tags":["Support"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","enum":["bookings","setup","billing","account","technical","idea","other"]},"priority":{"type":"string","enum":["normal","urgent"]},"subject":{"type":"string","minLength":4,"maxLength":200},"message":{"type":"string","minLength":10,"maxLength":5000}},"required":["topic","priority","subject","message"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/support\/{ticket}":{"get":{"operationId":"restaurant.support.show","tags":["Support"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"ticket","in":"path","required":true,"description":"The ticket ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/support\/{ticket}\/reply":{"post":{"operationId":"restaurant.support.reply","tags":["Support"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"ticket","in":"path","required":true,"description":"The ticket ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":2,"maxLength":5000}},"required":["message"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/support\/{ticket}\/solved":{"post":{"operationId":"restaurant.support.solve","tags":["Support"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"ticket","in":"path","required":true,"description":"The ticket ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support":{"get":{"operationId":"hq.support","tags":["Support"],"parameters":[{"name":"view","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/articles":{"get":{"operationId":"hq.support.articles","tags":["Support"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"hq.support.articles.store","tags":["Support"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/articles\/new":{"get":{"operationId":"hq.support.articles.create","tags":["Support"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/articles\/{article}":{"get":{"operationId":"hq.support.articles.edit","tags":["Support"],"parameters":[{"name":"article","in":"path","required":true,"description":"The article ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.support.articles.update","tags":["Support"],"parameters":[{"name":"article","in":"path","required":true,"description":"The article ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.support.articles.destroy","tags":["Support"],"parameters":[{"name":"article","in":"path","required":true,"description":"The article ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/categories":{"post":{"operationId":"hq.support.categories.store","tags":["Support"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/categories\/{category}":{"put":{"operationId":"hq.support.categories.update","tags":["Support"],"parameters":[{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.support.categories.destroy","tags":["Support"],"parameters":[{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["Move or delete its articles first."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/replies":{"get":{"operationId":"hq.support.replies","tags":["Support"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"hq.support.replies.store","tags":["Support"],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/replies\/{reply}":{"put":{"operationId":"hq.support.replies.update","tags":["Support"],"parameters":[{"name":"reply","in":"path","required":true,"description":"The reply ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.support.replies.destroy","tags":["Support"],"parameters":[{"name":"reply","in":"path","required":true,"description":"The reply ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/{ticket}":{"get":{"operationId":"hq.support.show","tags":["Support"],"parameters":[{"name":"ticket","in":"path","required":true,"description":"The ticket ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"put":{"operationId":"hq.support.update","tags":["Support"],"parameters":[{"name":"ticket","in":"path","required":true,"description":"The ticket ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["open","pending","solved"]},"priority":{"type":"string","enum":["low","normal","urgent"]},"topic":{"type":"string","enum":["account","billing","bookings","setup","technical","idea","sales","partner","other"]},"assigned_to":{"type":["integer","null"]}}}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/support\/{ticket}\/reply":{"post":{"operationId":"hq.support.reply","tags":["Support"],"parameters":[{"name":"ticket","in":"path","required":true,"description":"The ticket ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":10000},"internal":{"type":"boolean"},"solve":{"type":"boolean"},"saved_reply_id":{"type":["integer","null"]}},"required":["message"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system":{"get":{"operationId":"hq.system","tags":["System"],"parameters":[{"name":"log","in":"query","schema":{"type":["string","null"],"maxLength":80}},{"name":"level","in":"query","schema":{"type":["string","null"],"enum":["debug","info","notice","warning","error","critical","alert","emergency",null]}},{"name":"q","in":"query","schema":{"type":["string","null"],"maxLength":120}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system\/backups\/{name}":{"get":{"operationId":"hq.system.backups.download","tags":["System"],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/octet-stream":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Disposition":{"required":true,"schema":{"type":"string"},"example":"attachment"}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.system.backups.delete","tags":["System"],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system\/backups\/{name}\/verify":{"post":{"operationId":"hq.system.backups.verify","tags":["System"],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system\/jobs\/{uuid}":{"delete":{"operationId":"hq.system.jobs.forget","tags":["System"],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system\/jobs\/{uuid}\/retry":{"post":{"operationId":"hq.system.jobs.retry","tags":["System"],"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system\/logs\/{name}":{"get":{"operationId":"hq.system.logs.download","tags":["System"],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"text\/plain":{"schema":{"type":"string"}}},"headers":{"Content-Disposition":{"required":true,"schema":{"type":"string"},"example":"attachment"}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"hq.system.logs.clear","tags":["System"],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/hq\/system\/run\/{action}":{"post":{"operationId":"hq.system.run","tags":["System"],"parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/team":{"get":{"operationId":"restaurant.team","tags":["Team"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.team.store","summary":"Adds an existing user, or creates an account and emails a password-setup link","tags":["Team"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["manager","host","staff"]}},"required":["name","email","role"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/team\/{user}":{"put":{"operationId":"restaurant.team.update","tags":["Team"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","in":"path","required":true,"description":"The user ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["manager","host","staff"]}},"required":["role"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"delete":{"operationId":"restaurant.team.destroy","tags":["Team"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","in":"path","required":true,"description":"The user ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":["The owner cannot be removed."]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/unsubscribe\/{guest}":{"get":{"operationId":"unsubscribe","tags":["Unsubscribe"],"parameters":[{"name":"guest","in":"path","required":true,"description":"The guest ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"403":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":[""]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}},"post":{"operationId":"unsubscribe.store","tags":["Unsubscribe"],"parameters":[{"name":"guest","in":"path","required":true,"description":"The guest ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"200":{"description":"","content":{"application\/json":{"schema":{"type":"string","const":"Unsubscribed"}}}},"403":{"description":"An error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview.","examples":[""]}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/restaurants\/{restaurant}\/vouchers":{"get":{"operationId":"restaurant.vouchers","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/vouchers\/issue":{"post":{"operationId":"restaurant.vouchers.issue","summary":"Issue a voucher by hand (sold at the till, or a goodwill gesture)","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":120},"value":{"type":"number","minimum":1},"buyer_name":{"type":"string","maxLength":120},"buyer_email":{"type":"string","format":"email"},"recipient_name":{"type":["string","null"],"maxLength":120},"recipient_email":{"type":["string","null"],"format":"email"},"message":{"type":["string","null"],"maxLength":500},"expires_on":{"type":["string","null"],"format":"date-time"},"send_email":{"type":"boolean"}},"required":["title","value","buyer_name","buyer_email"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/vouchers\/products":{"post":{"operationId":"restaurant.vouchers.products.store","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/vouchers\/products\/{product}":{"put":{"operationId":"restaurant.vouchers.products.update","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"product","in":"path","required":true,"description":"The product ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/vouchers\/{voucher}\/cancel":{"post":{"operationId":"restaurant.vouchers.cancel","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"voucher","in":"path","required":true,"description":"The voucher ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/vouchers\/{voucher}\/redeem":{"post":{"operationId":"restaurant.vouchers.redeem","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"voucher","in":"path","required":true,"description":"The voucher ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","minimum":0.01},"note":{"type":["string","null"],"maxLength":200}},"required":["amount"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/vouchers\/{voucher}\/refund":{"post":{"operationId":"restaurant.vouchers.refund","summary":"Full refund of an unused voucher bought online (e.g. within the 14-day withdrawal period)","tags":["Voucher"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"voucher","in":"path","required":true,"description":"The voucher ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/public\/restaurants\/{slug}\/vouchers":{"get":{"operationId":"vouchers","tags":["VoucherShop"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}},"post":{"operationId":"vouchers.store","tags":["VoucherShop"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"voucher_product_id":{"type":"integer"},"buyer_name":{"type":"string","maxLength":120},"buyer_email":{"type":"string","format":"email","maxLength":160},"recipient_name":{"type":["string","null"],"maxLength":120},"recipient_email":{"type":["string","null"],"format":"email","maxLength":160},"message":{"type":["string","null"],"maxLength":500}},"required":["voucher_product_id","buyer_name","buyer_email"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/public\/vouchers\/{code}":{"get":{"operationId":"voucher.show","tags":["VoucherShop"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/restaurants\/{restaurant}\/waitlist":{"get":{"operationId":"restaurant.waitlist","tags":["Waitlist"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}},"post":{"operationId":"restaurant.waitlist.store","tags":["Waitlist"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date"},"time":{"type":["string","null"]},"party_size":{"type":"integer","minimum":1,"maximum":100},"first_name":{"type":"string","maxLength":80},"last_name":{"type":["string","null"],"maxLength":80},"email":{"type":["string","null"],"format":"email"},"phone":{"type":["string","null"],"maxLength":30},"notes":{"type":["string","null"],"maxLength":500}},"required":["date","party_size","first_name"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/waitlist\/{entry}":{"delete":{"operationId":"restaurant.waitlist.destroy","tags":["Waitlist"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"entry","in":"path","required":true,"description":"The entry ID","schema":{"type":"integer"}}],"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/waitlist\/{entry}\/book":{"post":{"operationId":"restaurant.waitlist.book","tags":["Waitlist"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"entry","in":"path","required":true,"description":"The entry ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"time":{"type":"string"}},"required":["time"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/waitlist\/{entry}\/notify":{"post":{"operationId":"restaurant.waitlist.notify","tags":["Waitlist"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}},{"name":"entry","in":"path","required":true,"description":"The entry ID","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"time":{"type":"string"}},"required":["time"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/widget":{"put":{"operationId":"restaurant.settings.widget","tags":["Widget"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"launcher":{"type":"object","properties":{"enabled":{"type":"boolean"},"style":{"type":"string","enum":["pill","rounded","square","icon"]},"position":{"type":"string","enum":["left","right"]},"icon":{"type":"string","enum":["calendar","utensils","bell","none"]},"label":{"type":"object","properties":{"en":{"type":"string","maxLength":32},"el":{"type":["string","null"],"maxLength":32}},"required":["en"]},"color":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"text_color":{"type":["string","null"],"pattern":"^#[0-9a-fA-F]{6}$"},"offset":{"type":"integer","minimum":0,"maximum":120},"mobile":{"type":"boolean"}},"required":["enabled","style","position","icon","offset","mobile"]},"open":{"type":"object","properties":{"desktop":{"type":"string","enum":["panel","modal"]}},"required":["desktop"]},"theme":{"type":"object","properties":{"radius":{"type":"string","enum":["sharp","soft","round"]},"mode":{"type":"string","enum":["light","dark"]}},"required":["radius","mode"]},"form":{"type":"object","properties":{"layout":{"type":"string","enum":["steps","compact"]}},"required":["layout"]},"page":{"type":"object","properties":{"background":{"type":"string","enum":["photo","color"]},"background_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"panel":{"type":"string","enum":["light","dark","brand"]},"notes":{"type":"object","properties":{"en":{"type":["string","null"],"maxLength":600},"el":{"type":["string","null"],"maxLength":600}}},"language_switch":{"type":"boolean"}},"required":["background","background_color","panel","language_switch"]},"teaser":{"type":"object","properties":{"enabled":{"type":"boolean"},"text":{"type":"object","properties":{"en":{"type":["string","null"],"maxLength":90},"el":{"type":["string","null"],"maxLength":90}}},"delay":{"type":"integer","minimum":1,"maximum":60}},"required":["enabled","delay"]},"page_name":{"type":["string","null"],"pattern":"^[a-z0-9][a-z0-9-]*$","minLength":2,"maxLength":40}},"required":["launcher","open","theme","form","page","teaser"]}}}},"responses":{"302":{"description":"","headers":{"Location":{"required":true,"schema":{"type":"string"}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/widget\/check":{"post":{"operationId":"restaurant.settings.widget.check","summary":"Looks at a page of the restaurant's website and says whether the widget is on it.\nOnly public https:\/\/ addresses; the page is read, nothing on it runs","tags":["Widget"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":300}},"required":["url"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"anyOf":[{"type":"object","properties":{"ok":{"type":"boolean"},"message":{"type":"string","const":"The widget is on this page. Guests can book from it."}},"required":["ok","message"]},{"type":"object","properties":{"ok":{"type":"boolean"},"message":{"type":"string","const":"The Revotab script is there, but for another restaurant. Copy your code again."}},"required":["ok","message"]},{"type":"object","properties":{"ok":{"type":"boolean"},"message":{"type":"string","const":"Your booking widget is on this page, built into it."}},"required":["ok","message"]},{"type":"object","properties":{"ok":{"type":"boolean"},"message":{"type":"string","const":"We did not find the widget on this page. Some website builders only add code after you publish."}},"required":["ok","message"]}]},{"type":"object","properties":{"ok":{"type":"boolean"},"message":{"type":"string","const":"We could not open that page. Check the address and try again."}},"required":["ok","message"]}]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}},"\/restaurants\/{restaurant}\/settings\/widget\/qr":{"get":{"operationId":"restaurant.settings.widget.qr","summary":"A QR code to the booking page, as SVG, for menus, tables and windows","tags":["Widget"],"parameters":[{"name":"restaurant","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"image\/svg+xml":{"schema":{"type":"string"}}},"headers":{"Content-Disposition":{"schema":{"type":"string"}}}},"401":{"$ref":"#\/components\/responses\/AuthenticationException"}}}}},"components":{"schemas":{"CursorPaginator":{"type":"object","properties":{"data":{"type":"string"},"path":{"type":["string","null"]},"per_page":{"type":"integer"},"next_cursor":{"type":["string","null"]},"next_page_url":{"type":["string","null"]},"prev_cursor":{"type":["string","null"]},"prev_page_url":{"type":["string","null"]}},"required":["data","path","per_page","next_cursor","next_page_url","prev_cursor","prev_page_url"],"title":"CursorPaginator"},"Guest":{"type":"object","properties":{"id":{"type":"integer"},"restaurant_id":{"type":"integer"},"first_name":{"type":"string"},"last_name":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"language":{"type":["string","null"]},"birthday":{"type":["string","null"],"format":"date-time"},"company":{"type":["string","null"]},"notes":{"type":["string","null"]},"allergies":{"type":["string","null"]},"tags":{"type":["array","null"],"items":[]},"vip":{"type":"boolean"},"blacklisted":{"type":"boolean"},"marketing_opt_in":{"type":"boolean"},"visits_count":{"type":"integer"},"no_shows_count":{"type":"integer"},"cancellations_count":{"type":"integer"},"total_spent":{"type":"string"},"last_visit_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"full_name":{"type":"string"}},"required":["id","restaurant_id","first_name","last_name","email","phone","language","birthday","company","notes","allergies","tags","vip","blacklisted","marketing_opt_in","visits_count","no_shows_count","cancellations_count","total_spent","last_visit_at","created_at","updated_at","full_name"],"title":"Guest"},"Media":{"type":"object","properties":{"id":{"type":"integer"},"path":{"type":"string"},"original_name":{"type":"string"},"mime":{"type":"string"},"size":{"type":"integer"},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"alt":{"type":["string","null"]},"uploaded_by":{"type":["integer","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string"}},"required":["id","path","original_name","mime","size","width","height","alt","uploaded_by","created_at","updated_at","url"],"title":"Media"},"Order":{"type":"object","properties":{"id":{"type":"integer"},"restaurant_id":{"type":"integer"},"guest_id":{"type":["integer","null"]},"code":{"type":"string"},"pickup_at":{"type":"string","format":"date-time"},"status":{"type":"string"},"subtotal":{"type":"string"},"total":{"type":"string"},"payment_status":{"type":"string"},"notes":{"type":["string","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","restaurant_id","guest_id","code","pickup_at","status","subtotal","total","payment_status","notes","created_at","updated_at"],"title":"Order"},"Review":{"type":"object","properties":{"id":{"type":"integer"},"restaurant_id":{"type":"integer"},"reservation_id":{"type":["integer","null"]},"guest_id":{"type":["integer","null"]},"token":{"type":"string"},"rating":{"type":["integer","null"]},"food":{"type":["integer","null"]},"service":{"type":["integer","null"]},"ambiance":{"type":["integer","null"]},"value":{"type":["integer","null"]},"comment":{"type":["string","null"]},"reply":{"type":["string","null"]},"replied_at":{"type":["string","null"],"format":"date-time"},"submitted_at":{"type":["string","null"],"format":"date-time"},"published":{"type":"boolean"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","restaurant_id","reservation_id","guest_id","token","rating","food","service","ambiance","value","comment","reply","replied_at","submitted_at","published","created_at","updated_at"],"title":"Review"},"WaitlistEntry":{"type":"object","properties":{"id":{"type":"integer"},"restaurant_id":{"type":"integer"},"guest_id":{"type":["integer","null"]},"reservation_id":{"type":["integer","null"]},"date":{"type":"string","format":"date"},"preferred_time":{"type":["string","null"]},"party_size":{"type":"integer"},"status":{"type":"string"},"token":{"type":"string"},"notes":{"type":["string","null"]},"notified_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","restaurant_id","guest_id","reservation_id","date","preferred_time","party_size","status","token","notes","notified_at","created_at","updated_at"],"title":"WaitlistEntry"},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"integer"},"webhook_id":{"type":"integer"},"event":{"type":"string"},"delivery_id":{"type":"string"},"payload":{"type":"array","items":[]},"status":{"type":["integer","null"]},"attempts":{"type":"integer"},"response":{"type":["string","null"]},"delivered_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","webhook_id","event","delivery_id","payload","status","attempts","response","delivered_at","created_at","updated_at"],"title":"WebhookDelivery"}},"responses":{"ValidationException":{"description":"Validation error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Errors overview."},"errors":{"type":"object","description":"A detailed description of each field that failed validation.","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["message","errors"]}}}},"AuthenticationException":{"description":"Unauthenticated","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}},"ModelNotFoundException":{"description":"Not found","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}}}}}