{"name":"schedule.pizza","apiVersion":"v1","limits":{"maxAlternativeSlotCount":50,"maxDurationMinutes":480,"maxExactSlotCount":100,"maxGranularityMinutes":240,"maxProfileCount":8,"maxWindowDays":31},"endpoints":{"availability":{"method":"GET","path":"/api/v1/availability","params":{"url":"string (optional schedule.pizza link; use instead of user/code)","user":"string (required unless url is provided)","code":"string (required unless url is provided)"},"headers":{"CF-Connecting-IP":"string (injected by Cloudflare)"}},"health":{"method":"GET","path":"/api/v1/health","checks":["runtime secrets","D1 binding","D1 schema"]},"book":{"method":"POST","path":"/api/v1/book","body":{"url":"string (optional schedule.pizza link; use instead of user/code)","user":"string (required unless url is provided)","code":"string (required unless url is provided)","slot":"string (required, UTC ISO 8601 start time)","name":"string (required, booker name)","email":"string (required, valid booker email)","timezone":"string (optional, valid IANA timezone)"},"headers":{"CF-Connecting-IP":"string (injected by Cloudflare)"}},"bookGroup":{"method":"POST","path":"/api/v1/book-group","body":{"participants":[{"url":"string (optional schedule.pizza link; use instead of user/code)","user":"string (required unless url is provided)","code":"string (required unless url is provided)"}],"durationMinutes":"number (1-480)","granularityMinutes":"number (1-240)","maxExactSlotCount":"number (1-100)","maxAlternativeSlotCount":"number (1-50)","timeZone":"IANA time zone","window":{"start":"UTC ISO 8601","end":"UTC ISO 8601, max 31 days"},"slot":"string (required, UTC ISO 8601 exact slot start)","name":"string (required, booker name)","email":"string (required, valid booker email)","timezone":"string (optional, valid booker timezone)"},"headers":{"CF-Connecting-IP":"string (injected by Cloudflare)"}},"recommend":{"method":"POST","path":"/api/v1/recommend","body":"same as /api/v1/schedule","response":{"exact":"returned first when everyone is free","alternatives":"ranked by conflict cost when no exact slot exists"},"headers":{"CF-Connecting-IP":"string (injected by Cloudflare)"}},"schedule":{"method":"POST","path":"/api/v1/schedule","body":{"participants":[{"url":"string (optional schedule.pizza link; use instead of user/code)","user":"string (required unless url is provided)","code":"string (required unless url is provided)"}],"durationMinutes":"number (1-480)","granularityMinutes":"number (1-240)","maxExactSlotCount":"number (1-100)","maxAlternativeSlotCount":"number (1-50)","timeZone":"IANA time zone","window":{"start":"UTC ISO 8601","end":"UTC ISO 8601, max 31 days"}},"headers":{"CF-Connecting-IP":"string (injected by Cloudflare)"}},"me":{"method":"GET","path":"/api/v1/me","auth":"Better Auth session cookie"},"account":{"method":"GET","path":"/api/v1/account","auth":"Better Auth session cookie"},"accountBookings":{"method":"GET","path":"/api/v1/account/bookings","auth":"Better Auth session cookie","response":{"kind":"individual, group, or unknown","cancel":{"allowed":"boolean","disabledReason":"null, group_booking, or calendar_missing"}}},"cancelBooking":{"method":"POST","path":"/api/v1/account/bookings/:bookingId/cancel","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"same origin as BETTER_AUTH_URL"}},"bootstrap":{"method":"POST","path":"/api/v1/me/bootstrap","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"same origin as BETTER_AUTH_URL"},"body":{"username":"string (required)","timezone":"IANA time zone (required)","displayName":"string (optional)","slotSizeMinutes":"number (optional: 15, 30, 45, 60)","calendarId":"string (optional, defaults to primary)"}},"saveProfile":{"method":"PUT","path":"/api/v1/account/profile","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"same origin as BETTER_AUTH_URL"},"body":{"username":"string (required)","timezone":"IANA time zone (required)","displayName":"string (optional)","slotSizeMinutes":"number (optional: 15, 30, 45, 60)","calendarId":"string (optional, defaults to primary)"}},"rotateBookingCode":{"method":"POST","path":"/api/v1/me/booking-code","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"same origin as BETTER_AUTH_URL"}}},"examples":{"availability":{"method":"GET","url":"/api/v1/availability?user=alice&code=moon-tiger-seven"},"book":{"method":"POST","path":"/api/v1/book","body":{"user":"alice","code":"moon-tiger-seven","slot":"2030-01-07T17:00:00.000Z","name":"Ada","email":"ada@example.com","timezone":"America/Los_Angeles"}},"schedule":{"method":"POST","path":"/api/v1/schedule","body":{"participants":[{"user":"alice","code":"moon-tiger-seven"},{"user":"bob","code":"river-lime-harbor"}],"durationMinutes":30,"granularityMinutes":15,"maxExactSlotCount":10,"maxAlternativeSlotCount":5,"timeZone":"America/Los_Angeles","window":{"start":"2030-01-07T17:00:00.000Z","end":"2030-01-08T01:00:00.000Z"}}},"recommend":{"method":"POST","path":"/api/v1/recommend","body":{"participants":[{"user":"alice","code":"moon-tiger-seven"},{"user":"bob","code":"river-lime-harbor"}],"durationMinutes":30,"granularityMinutes":15,"maxExactSlotCount":10,"maxAlternativeSlotCount":5,"timeZone":"America/Los_Angeles","window":{"start":"2030-01-07T17:00:00.000Z","end":"2030-01-08T01:00:00.000Z"}}},"bookGroup":{"method":"POST","path":"/api/v1/book-group","body":{"participants":[{"user":"alice","code":"moon-tiger-seven"},{"user":"bob","code":"river-lime-harbor"}],"durationMinutes":30,"granularityMinutes":15,"maxExactSlotCount":10,"maxAlternativeSlotCount":5,"timeZone":"America/Los_Angeles","window":{"start":"2030-01-07T17:00:00.000Z","end":"2030-01-08T01:00:00.000Z"},"slot":"2030-01-07T18:00:00.000Z","name":"Ada","email":"ada@example.com","timezone":"America/Los_Angeles"}},"account":{"method":"GET","path":"/api/v1/account","auth":"Better Auth session cookie"},"bootstrap":{"method":"POST","path":"/api/v1/me/bootstrap","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"https://schedule.pizza"},"body":{"username":"alice","timezone":"America/Los_Angeles","displayName":"Alice","slotSizeMinutes":30,"calendarId":"primary"}},"saveProfile":{"method":"PUT","path":"/api/v1/account/profile","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"https://schedule.pizza"},"body":{"username":"alice","timezone":"America/Los_Angeles","displayName":"Alice","slotSizeMinutes":30,"calendarId":"primary"}},"rotateBookingCode":{"method":"POST","path":"/api/v1/me/booking-code","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"https://schedule.pizza"}},"accountBookings":{"method":"GET","path":"/api/v1/account/bookings","auth":"Better Auth session cookie"},"cancelBooking":{"method":"POST","path":"/api/v1/account/bookings/booking_123/cancel","auth":"Better Auth session cookie","headers":{"Cookie":"Better Auth session cookie","Origin":"https://schedule.pizza"}}},"errors":{"400":["missing_parameter","invalid_json","missing_field","invalid_field","invalid_slot","invalid_schedule_request"],"401":["unauthenticated"],"403":["forbidden_origin"],"404":["booking_code_invalid","booking_missing"],"409":["booking_calendar_missing","group_booking_cancel_unsupported","host_profile_exists","host_profile_missing","slot_unavailable","username_taken"],"422":["host_unavailable","participant_email_missing"],"424":["google_account_missing","google_access_token_missing","google_calendar_scope_missing","google_refresh_token_missing"],"429":["booking_code_rate_limited","booking_rate_limited"],"500":["booking_confirmation_failed","booking_cancel_failed","booking_failure_record_failed","auth_user_email_missing","client_ip_unavailable","host_configuration_invalid"],"502":["google_event_delete_failed","google_event_insert_failed","google_event_insert_response_invalid","google_freebusy_failed","google_freebusy_response_invalid","google_token_refresh_failed","google_token_response_invalid"],"503":["database_unavailable","runtime_secret_missing"]}}