{"openapi":"3.1.0","info":{"title":"Lango — Integration API","version":"1.0.0","description":"Push PMS events so guests can log in to Wi-Fi with room number + last name. Authenticate with `Authorization: Bearer <api key>` generated in Integrations > API keys."},"servers":[{"url":"https://lango.localtel.tech/api/v1"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"Guest":{"type":"object","required":["reservation_id","room","last_name"],"properties":{"reservation_id":{"type":"string","description":"PMS confirmation / reservation number (stable key)"},"room":{"type":"string","example":"1204"},"last_name":{"type":"string","example":"Otieno"},"first_name":{"type":"string"},"email":{"type":"string","format":"email"},"language":{"type":"string","example":"en"},"vip":{"type":"string"},"arrival":{"type":"string","format":"date"},"departure":{"type":"string","format":"date","description":"Caps Wi-Fi access at checkout time + grace"},"no_post":{"type":"boolean","description":"Room is not allowed to receive charges"}}}}},"paths":{"/sites":{"get":{"summary":"List sites this key can access","security":[{"bearer":[]}],"x-scope":"portal:read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}}}},"/sites/{site}/guests/checkin":{"post":{"summary":"Check in (or upsert) a guest","security":[{"bearer":[]}],"x-scope":"guests:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Guest"}}}}}},"/sites/{site}/guests/update":{"post":{"summary":"Update guest details (name, departure, room)","security":[{"bearer":[]}],"x-scope":"guests:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Guest"}}}}}},"/sites/{site}/guests/checkout":{"post":{"summary":"Check out by reservation_id or room — ends Wi-Fi sessions","security":[{"bearer":[]}],"x-scope":"guests:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reservation_id":{"type":"string"},"room":{"type":"string"}}}}}}}},"/sites/{site}/guests/move":{"post":{"summary":"Room move","security":[{"bearer":[]}],"x-scope":"guests:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["new_room"],"properties":{"reservation_id":{"type":"string"},"old_room":{"type":"string"},"new_room":{"type":"string"}}}}}}}},"/sites/{site}/guests":{"get":{"summary":"List in-house guests","security":[{"bearer":[]}],"x-scope":"guests:read","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}}},"put":{"summary":"Full resync — replace the in-house list","security":[{"bearer":[]}],"x-scope":"guests:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"guests":{"type":"array","items":{"$ref":"#/components/schemas/Guest"}}}}}}}}},"/sites/{site}/sessions":{"get":{"summary":"List live Wi-Fi sessions (?status=all for history)","security":[{"bearer":[]}],"x-scope":"sessions:read","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}}}},"/sites/{site}/sessions/{id}":{"delete":{"summary":"Disconnect a session","security":[{"bearer":[]}],"x-scope":"sessions:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}}}},"/sites/{site}/vouchers":{"post":{"summary":"Create access codes (e.g. for conference attendees)","security":[{"bearer":[]}],"x-scope":"vouchers:write","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string"},"count":{"type":"integer"},"max_uses":{"type":"integer"},"valid_hours":{"type":"integer"},"note":{"type":"string"},"code":{"type":"string"}}}}}}}},"/sites/{site}/plans":{"get":{"summary":"List access plans","security":[{"bearer":[]}],"x-scope":"portal:read","parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"Site id (sit_…) or site key"}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"403":{"description":"Missing scope"}}}}},"x-webhooks":{"description":"Outbound events POSTed to your webhook URL. Verify X-Portal-Signature = \"sha256=\" + HMAC_SHA256(secret, X-Portal-Timestamp + \".\" + body).","events":["session.created","session.ended","guest.checked_in","guest.checked_out","posting.requested","payment.paid","payment.failed","ping"]}}