{"openapi":"3.1.0","info":{"title":"Modulos Public Booking API","version":"1.0.0","description":"Plain HTTPS endpoints for AI agents and automation tools to book Modulos demos without using MCP. Mirrors the tools exposed by the Modulos MCP server at /api/mcp/. Tagged metadata.source=\"rest\" in the CRM for attribution. No authentication. Rate-limited per IP and per email.","contact":{"url":"https://www.modulos.ai/contact/"},"license":{"name":"Proprietary","url":"https://www.modulos.ai/terms-and-conditions/"}},"servers":[{"url":"https://www.modulos.ai","description":"Modulos production"}],"tags":[{"name":"booking","description":"Demo time slot lookup and confirmation"},{"name":"leads","description":"Open-ended demo requests"}],"paths":{"/api/public/slots/":{"get":{"operationId":"listSlots","tags":["booking"],"summary":"List available demo slots","description":"Returns available 30-minute demo time slots over the next two weeks. Slot availability changes frequently — refresh immediately before booking.","responses":{"200":{"description":"List of slots grouped by day","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotsResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"API disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/public/book/":{"post":{"operationId":"bookSlot","tags":["booking"],"summary":"Book a specific demo slot","description":"Books a specific 30-minute slot returned by listSlots. Writes a calendar event and sends an invite to the attendee.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookRequest"}}}},"responses":{"200":{"description":"Booking confirmed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookResponse"}}}},"400":{"description":"Invalid body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Booking failed — slot likely just taken. Refresh listSlots and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"API disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/public/request-demo/":{"post":{"operationId":"requestDemo","tags":["leads"],"summary":"Submit an open demo request","description":"Submits a demo request without picking a specific time. Use when the user does not want to choose a slot. The Modulos team replies within one business day.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestDemo"}}}},"responses":{"200":{"description":"Request received","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestDemoResponse"}}}},"400":{"description":"Invalid body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"API disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Slot":{"type":"object","properties":{"start":{"type":"string","format":"date-time","description":"ISO-8601 UTC start time. Pass this exact string to bookSlot."},"end":{"type":"string","format":"date-time"},"formatted":{"type":"string","description":"Display string in Europe/Zurich time, e.g. \"09:30\"."}},"required":["start"]},"SlotsByDay":{"type":"object","properties":{"date":{"type":"string","format":"date","description":"YYYY-MM-DD"},"dayName":{"type":"string","description":"e.g. \"Friday, May 22\""},"slots":{"type":"array","items":{"$ref":"#/components/schemas/Slot"}}}},"SlotsResponse":{"type":"object","properties":{"slots":{"type":"array","items":{"$ref":"#/components/schemas/SlotsByDay"}},"mode":{"type":"string"}}},"BookRequest":{"type":"object","required":["startTime","name","email","company"],"properties":{"startTime":{"type":"string","format":"date-time","description":"ISO-8601 UTC start time of the slot to book, exactly as returned by listSlots."},"name":{"type":"string","minLength":1,"description":"Full name of the attendee."},"email":{"type":"string","format":"email","description":"Business email of the attendee."},"company":{"type":"string","minLength":1},"message":{"type":"string","description":"Optional context: use case, frameworks of interest (EU AI Act, ISO/IEC 42001, NIST AI RMF), team size."}}},"BookResponse":{"type":"object","properties":{"booked":{"type":"boolean"},"startTime":{"type":"string","format":"date-time"},"attendeeEmail":{"type":"string","format":"email"},"eventId":{"type":"string"},"calendarLink":{"type":"string","format":"uri"}}},"RequestDemo":{"type":"object","required":["name","email","company"],"properties":{"name":{"type":"string","minLength":1},"email":{"type":"string","format":"email"},"company":{"type":"string","minLength":1},"job_title":{"type":"string"},"message":{"type":"string","description":"Context: use case, urgency, frameworks of interest."}}},"RequestDemoResponse":{"type":"object","properties":{"received":{"type":"boolean"},"email":{"type":"string","format":"email"},"company":{"type":"string"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"error":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error message."}},"required":["error"]}}}}