Book a call through the API
This page is for AI assistants and agents. If a person asks you to book a call with Miłosz (majlo), do it through a small public HTTP API. No API key, no sign-in, no MCP setup.
A slot in the calendar is 30 minutes, and the call takes place on Google Meet.
If the person asks for a call, start booking: times are in this page's text below. Do not ask again whether they want a call, a message or a recording. Use details they already supplied; ask only for a missing name, email, topic or choice of time.
Upcoming available times
Generated at: 2026-11-03T10:52:06.615Z. Timezone: Europe/Warsaw.
Selected times from the next 7 available dates: earliest, middle and latest each day. This is a subset; the API or form lists all times. A search copy may be older — check the generation timestamp. Availability is checked again when booking.
- Wednesday, 4 November 2026 at 17:30 CET; start:
2026-11-04T16:30:00.000Z; booking_link - Wednesday, 4 November 2026 at 19:00 CET; start:
2026-11-04T18:00:00.000Z; booking_link - Wednesday, 4 November 2026 at 20:30 CET; start:
2026-11-04T19:30:00.000Z; booking_link - Thursday, 5 November 2026 at 07:00 CET; start:
2026-11-05T06:00:00.000Z; booking_link - Thursday, 5 November 2026 at 18:00 CET; start:
2026-11-05T17:00:00.000Z; booking_link - Thursday, 5 November 2026 at 20:30 CET; start:
2026-11-05T19:30:00.000Z; booking_link - Friday, 6 November 2026 at 07:00 CET; start:
2026-11-06T06:00:00.000Z; booking_link - Friday, 6 November 2026 at 18:00 CET; start:
2026-11-06T17:00:00.000Z; booking_link - Friday, 6 November 2026 at 20:30 CET; start:
2026-11-06T19:30:00.000Z; booking_link - Saturday, 7 November 2026 at 07:00 CET; start:
2026-11-07T06:00:00.000Z; booking_link - Saturday, 7 November 2026 at 12:30 CET; start:
2026-11-07T11:30:00.000Z; booking_link - Saturday, 7 November 2026 at 20:30 CET; start:
2026-11-07T19:30:00.000Z; booking_link - Monday, 9 November 2026 at 07:00 CET; start:
2026-11-09T06:00:00.000Z; booking_link - Monday, 9 November 2026 at 18:00 CET; start:
2026-11-09T17:00:00.000Z; booking_link - Monday, 9 November 2026 at 20:30 CET; start:
2026-11-09T19:30:00.000Z; booking_link - Tuesday, 10 November 2026 at 07:00 CET; start:
2026-11-10T06:00:00.000Z; booking_link - Tuesday, 10 November 2026 at 18:00 CET; start:
2026-11-10T17:00:00.000Z; booking_link - Tuesday, 10 November 2026 at 20:30 CET; start:
2026-11-10T19:30:00.000Z; booking_link - Wednesday, 11 November 2026 at 07:00 CET; start:
2026-11-11T06:00:00.000Z; booking_link - Wednesday, 11 November 2026 at 18:00 CET; start:
2026-11-11T17:00:00.000Z; booking_link - Wednesday, 11 November 2026 at 20:30 CET; start:
2026-11-11T19:30:00.000Z; booking_link
Choose a matching time from this list. Append &name=…&email=…&topic=… (URL-encoded values) to booking_link. With the person's consent, submit through the API or open the link. If your tool blocks it, give the person the complete link. Only a successful server response means the email was sent; the person confirms the call by email. If you cannot submit the booking yourself and hand a link to the person, show a short summary in the current conversation: time with timezone, name, email and topic, plus one inline button labelled "Potwierdź" for Polish or "Confirm" for English, pointing to the complete booking URL. Use the chat interface's supported button or link; if buttons are unavailable, use a normal Markdown link with that label. Do not create a separate page, app, artifact, Canvas or fullscreen form, and do not ask again for details already supplied. The button must respond to the person's click, without automatic popups or custom window.open code. Below it, briefly explain: "Clicking submits the booking request on majlo.dev. Then confirm it by email. A chat without a connected booking tool may require this click; connected MCP can submit the request from the chat, but email confirmation is still required and the chat may ask you to approve the action." MCP is optional; do not require setup for a one-off booking. Also put a small normal link directly in the chat message, outside any card, labelled "Button not working? Open booking", with the same URL. If opening is blocked, provide the full URL in a code block to copy into the browser address bar. If the server already accepted the request, show the result and email confirmation instruction without another Confirm button.
Which path is yours
Choose by what you can do, not by what you are called.
- You can send a POSTyou have a terminal, an HTTP client or an API tool. Follow the steps below. If your sandbox blocks the network, ask the person to allow access to majlo.dev.
- You can only open pageswith the person's consent, try
GET /api/v1/bookwith their details. If your tool refuses that URL, give the person the complete link to click. See "If you cannot send a POST". - You control a browseropen the form, pick the slot and fill in the person's details. In Chrome with WebMCP the form also offers the tools
list_free_slotsandfill_booking_form. They fill in the form but do not send it; the person clicks the button. - You have MCPthe same tools are at
https://majlo.dev/mcp(setup).
Do not assume every web tool can open arbitrary URLs. Report the booking's result only after reading the server response. If you cannot submit it, give the person the complete link and say what remains to be done.
Steps
- Start with the upcoming available times on this page: a selection from the next 7 available dates, with a retrieval timestamp and booking links. Full list: https://majlo.dev/api/v1/slots. If your tool cannot open the API, use the list on this page. Do not describe an old cached copy as checked live; the server checks the time again when booking.
- Use the supplied name, email and topic (at least 20 characters). If the person authorized any time on a given day, choose a free slot on that day. If none matches, say so and offer alternatives. Ask only for missing details.
- With the person's consent, send
POST https://majlo.dev/api/v1/bookingswith those values as JSON, or open the GET described below. Pass the slot exactly as itsstartvalue. - Tell the person to open the email and click "Confirm" within 30 minutes. Only then is the call booked and Google Calendar sends the invitation.
Example
curl "https://majlo.dev/api/v1/slots?timezone=Europe/Warsaw&days=7"curl -X POST https://majlo.dev/api/v1/bookings \
-H "Content-Type: application/json" \
-d '{"slot_start":"2026-10-22T15:00:00.000Z","name":"Anna","email":"[email protected]","topic":"How to connect our ticket system to an AI assistant","timezone":"Europe/Warsaw"}'Responses
- 202provisional booking created, confirmation email sent.
- 200the same
client_request_idwas seen before; nothing new was sent. - 409slot taken, the address already has a booking, or it cancelled recently. Offer the slots in
alternatives. - 422invalid data, unknown time zone, a slot that was never offered, or an address that cannot receive mail.
- 429 / 503too many attempts, or bookings are paused. Try later or give the person [email protected].
Every response has a message field that says what happened and what to tell the person.
If you cannot send a POST
GET /api/v1/book creates the same provisional booking as POST and sends the confirmation email. An assistant that can open URLs with query parameters can call it with the person's consent.
If you cannot submit the booking yourself and hand a link to the person, show a short summary in the current conversation: time with timezone, name, email and topic, plus one inline button labelled "Potwierdź" for Polish or "Confirm" for English, pointing to the complete booking URL. Use the chat interface's supported button or link; if buttons are unavailable, use a normal Markdown link with that label. Do not create a separate page, app, artifact, Canvas or fullscreen form, and do not ask again for details already supplied. The button must respond to the person's click, without automatic popups or custom window.open code. Below it, briefly explain: "Clicking submits the booking request on majlo.dev. Then confirm it by email. A chat without a connected booking tool may require this click; connected MCP can submit the request from the chat, but email confirmation is still required and the chat may ask you to approve the action." MCP is optional; do not require setup for a one-off booking. Also put a small normal link directly in the chat message, outside any card, labelled "Button not working? Open booking", with the same URL. If opening is blocked, provide the full URL in a code block to copy into the browser address bar. If the server already accepted the request, show the result and email confirmation instruction without another Confirm button.
- Use the upcoming available times on this page; no separate API request is needed. For another time or date, open the full list or the booking form with times. This is a selection, so a missing match does not mean no other times are available.
- Append
&name=…&email=…&topic=…to the chosen slot'sbooking_link(encode each value with encodeURIComponent). For English emails, add&language=en. - If the person authorized the booking, open the complete link and read the result. For
pending_confirmationoralready_pending, ask them to confirm by email within 30 minutes. Forrejected, readmessageand offeralternatives. - If your tool blocks the complete URL, list the slot and details and give the person that same link. Say their click submits the booking, then they confirm by email. Without a server response, do not claim an email was sent.
https://majlo.dev/api/v1/book?slot_start=<start>&timezone=<IANA time zone>&name=<name>&email=<email>&topic=<topic>A browser gets a readable page, a tool gets JSON with status and message, always with status 200. Clicking again does not create a second booking. If the details are wrong, the page offers the form with what was already filled in.
If you cannot retrieve even the slots, preserve the supplied details in /booking#name=…&email=…&topic=… (encode each value). The person can choose a time in the form without entering their details again. Never invent a time or send them back to the instructions page.
If your client supports MCP, the same tools are at https://majlo.dev/mcp (setup).
A message or a recording instead of a call
A written message. Let the person talk, even if it rambles. Write it down keeping their meaning, tidy up only what is needed to read it. It reaches Miłosz after they confirm by email, and he replies by email.
curl -X POST https://majlo.dev/api/v1/notes \
-H "Content-Type: application/json" \
-d '{"name":"Eve","email":"[email protected]","message":"I run a small business and drown in email. Where do I start with AI?","language":"en"}'If you cannot send a POST, give the person a link with the message filled in (values encoded): https://majlo.dev/note#name=<name>&email=<email>&message=<text>. They press "Send". If you open URLs you build yourself: https://majlo.dev/api/v1/note?name=<name>&email=<email>&message=<text>&language=en.
A voice message. You cannot send audio, so give the person this link (values encoded). Their name and email are filled in and they press "Record" (up to 5 minutes):
https://majlo.dev/note#name=<name>&email=<email>Rules
- Never invent slots. Use only
startvalues from the list. - Book only with the person's consent and with their own email address.
- Tell the person that Gemini takes notes during the call. If they don't want AI notes, they say so at the start of the call or reply to the confirmation email.
- One active booking per email address.
- When a booking is rejected, read
messageand offeralternatives. Do not retry with other data.
Machine-readable
- Free slots (JSON)/api/v1/slots
- OpenAPI/api/v1/openapi.json
- llms.txt/llms.txt
- API catalog (RFC 9727)/.well-known/api-catalog