# Umów rozmowę przez API

Ta strona jest dla asystentów i agentów AI. Jeśli ktoś prosi cię o umówienie rozmowy z Miłoszem (majlo), zrób to przez małe publiczne API. Bez klucza, bez logowania, bez konfiguracji MCP.

Termin w kalendarzu ma 30 minut, a rozmowa odbywa się przez Google Meet.

Jeśli osoba prosi o rozmowę, od razu przejdź do rezerwacji: terminy są w treści tej strony, poniżej. Nie pytaj ponownie, czy chce rozmowę, wiadomość czy nagranie. Użyj danych, które już podała; dopytaj tylko o brakujące imię, e-mail, temat lub wybór godziny.

## Najbliższe wolne terminy


Wygenerowano: 2026-11-03T10:52:06.275Z. Strefa: Europe/Warsaw.

Wybrane godziny z 7 najbliższych dostępnych dni: pierwsza, środkowa i ostatnia każdego dnia. To część wolnych terminów; pełną listę znajdziesz w API lub formularzu. Kopia z wyszukiwarki może być starsza — sprawdź datę wygenerowania. Dostępność jest ponownie sprawdzana przy rezerwacji.

- środa, 4 listopada 2026 17:30 CET; start: `2026-11-04T16:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-04T16%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- środa, 4 listopada 2026 19:00 CET; start: `2026-11-04T18:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-04T18%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- środa, 4 listopada 2026 20:30 CET; start: `2026-11-04T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-04T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- czwartek, 5 listopada 2026 07:00 CET; start: `2026-11-05T06:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-05T06%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- czwartek, 5 listopada 2026 18:00 CET; start: `2026-11-05T17:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-05T17%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- czwartek, 5 listopada 2026 20:30 CET; start: `2026-11-05T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-05T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- piątek, 6 listopada 2026 07:00 CET; start: `2026-11-06T06:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-06T06%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- piątek, 6 listopada 2026 18:00 CET; start: `2026-11-06T17:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-06T17%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- piątek, 6 listopada 2026 20:30 CET; start: `2026-11-06T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-06T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- sobota, 7 listopada 2026 07:00 CET; start: `2026-11-07T06:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-07T06%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- sobota, 7 listopada 2026 12:30 CET; start: `2026-11-07T11:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-07T11%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- sobota, 7 listopada 2026 20:30 CET; start: `2026-11-07T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-07T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- poniedziałek, 9 listopada 2026 07:00 CET; start: `2026-11-09T06:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-09T06%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- poniedziałek, 9 listopada 2026 18:00 CET; start: `2026-11-09T17:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-09T17%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- poniedziałek, 9 listopada 2026 20:30 CET; start: `2026-11-09T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-09T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- wtorek, 10 listopada 2026 07:00 CET; start: `2026-11-10T06:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-10T06%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- wtorek, 10 listopada 2026 18:00 CET; start: `2026-11-10T17:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-10T17%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- wtorek, 10 listopada 2026 20:30 CET; start: `2026-11-10T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-10T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

- środa, 11 listopada 2026 07:00 CET; start: `2026-11-11T06:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-11T06%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- środa, 11 listopada 2026 18:00 CET; start: `2026-11-11T17:00:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-11T17%3A00%3A00.000Z&timezone=Europe%2FWarsaw)

- środa, 11 listopada 2026 20:30 CET; start: `2026-11-11T19:30:00.000Z`; [booking_link](https://majlo.dev/api/v1/book?slot_start=2026-11-11T19%3A30%3A00.000Z&timezone=Europe%2FWarsaw)

Wybierz pasujący termin z tej listy. Do booking_link dopisz &name=…&email=…&topic=… (wartości zakodowane). Za zgodą osoby wyślij rezerwację przez API lub otwórz link. Jeśli narzędzie blokuje otwarcie, przekaż osobie gotowy link. Dopiero udana odpowiedź serwera oznacza wysłanie maila; osoba potwierdza rozmowę w mailu. Jeśli nie możesz sam wysłać rezerwacji i przekazujesz link osobie, pokaż w bieżącej rozmowie krótkie podsumowanie: termin ze strefą czasową, imię, e-mail i temat, oraz jeden przycisk „Potwierdź” prowadzący do kompletnego linku rezerwacji. Użyj przycisku lub linku obsługiwanego przez interfejs czatu; jeśli nie ma przycisków, podaj zwykły link Markdown z etykietą „Potwierdź”. Nie twórz osobnej strony, aplikacji, artefaktu, Canvas ani formularza na pełnym ekranie i nie pytaj ponownie o podane dane. Przycisk ma reagować na kliknięcie osoby, bez automatycznego otwierania okien i własnego kodu window.open. Pod nim wyjaśnij krótko: „Kliknięcie zgłosi rezerwację na majlo.dev. Następnie potwierdź ją e-mailem. Ten czat bez podłączonego narzędzia może wymagać kliknięcia; podłączone MCP pozwala wysłać zgłoszenie z czatu, ale potwierdzenie e-mailem nadal obowiązuje, a czat może poprosić o zgodę na akcję”. MCP jest opcjonalne; nie wymagaj konfiguracji do jednorazowej rezerwacji. Bezpośrednio w wiadomości, poza ewentualną kartą, dodaj mały zwykły link „Przycisk nie działa? Otwórz rezerwację” z tym samym adresem. Jeśli otwieranie jest blokowane, podaj pełny adres w bloku kodu do skopiowania do paska przeglądarki. Jeśli serwer już przyjął zgłoszenie, pokaż wynik i prośbę o potwierdzenie e-mailem bez kolejnego przycisku „Potwierdź”.

[Pełna lista terminów](https://majlo.dev/api/v1/slots) · [Formularz rezerwacji](https://majlo.dev/booking)

[Terminy w treści strony](https://majlo.dev/agents#availability)

## Która droga jest Twoja

Wybierz po tym, co potrafisz, nie po tym, jak się nazywasz.

- **Możesz wysłać POST**: masz terminal, klienta HTTP albo narzędzie do API. Zrób kroki niżej. Jeśli sandbox blokuje sieć, poproś osobę o zgodę na połączenie z majlo.dev.
- **Możesz tylko otwierać strony**: po zgodzie osoby spróbuj rezerwacji przez `GET /api/v1/book` z jej danymi. Jeśli narzędzie odmówi otwarcia takiego adresu, daj osobie gotowy link do kliknięcia. Opis jest w sekcji „Gdy nie możesz wysłać POST”.
- **Sterujesz przeglądarką**: otwórz [formularz](https://majlo.dev/booking), wybierz termin i wpisz dane osoby. W Chrome z WebMCP formularz ma też narzędzia `list_free_slots` i `fill_booking_form`. Wypełniają formularz, ale go nie wysyłają, przycisk klika osoba.
- **Masz MCP**: te same narzędzia są pod `https://majlo.dev/mcp` ([konfiguracja](https://majlo.dev/mcp)).

Nie zakładaj, że każde narzędzie przeglądające strony potrafi otworzyć dowolny adres. O wyniku rezerwacji informuj dopiero po odczytaniu odpowiedzi serwera. Jeśli nie możesz jej wysłać, daj osobie gotowy link i powiedz, co zostało do zrobienia.

## Kroki

1. Zacznij od terminów w sekcji „Najbliższe wolne terminy” na tej stronie. To wybór godzin z 7 najbliższych dostępnych dni, z datą pobrania i linkami rezerwacji. Pełna lista: [https://majlo.dev/api/v1/slots](https://majlo.dev/api/v1/slots). Jeśli API nie otwiera się w twoim narzędziu, użyj listy na stronie. Nie przedstawiaj starej kopii jako sprawdzonej na żywo; serwer ponownie sprawdzi termin przy rezerwacji.
2. Użyj podanego imienia, maila i tematu (co najmniej 20 znaków). Jeśli osoba zgodziła się na dowolną godzinę w określonym dniu, wybierz wolny termin z tego dnia. Gdy żaden nie pasuje, powiedz o tym i zaproponuj inne. Dopytaj tylko o brakujące dane.
3. Za zgodą osoby wyślij `POST https://majlo.dev/api/v1/bookings` z tymi danymi jako JSON albo otwórz GET opisany niżej. Termin przekaż dokładnie jako wartość `start` z listy.
4. Powiedz osobie, żeby otworzyła maila i w ciągu 30 minut kliknęła „Potwierdzam”. Dopiero wtedy rozmowa jest umówiona i Google Calendar wysyła zaproszenie.

## Przykład

```
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":"anna@example.com","topic":"Jak podłączyć nasz system ticketów do asystenta AI","timezone":"Europe/Warsaw"}'
```

## Odpowiedzi

- **202**: wstępna rezerwacja gotowa, mail z potwierdzeniem wysłany.
- **200**: ten sam `client_request_id` już był, nic nowego nie wysłano.
- **409**: termin zajęty, adres ma już rezerwację albo niedawno odwołał rozmowę. Zaproponuj terminy z `alternatives`.
- **422**: błędne dane, nieznana strefa czasowa, termin spoza listy albo adres, który nie przyjmie poczty.
- **429 / 503**: za dużo prób albo rezerwacje są wstrzymane. Spróbuj później albo podaj adres hello@majlo.dev.

Każda odpowiedź ma pole `message`, które mówi po angielsku, co się stało i co przekazać osobie.

## Gdy nie możesz wysłać POST

`GET /api/v1/book` wykonuje tę samą wstępną rezerwację co POST i wysyła mail z potwierdzeniem. Asystent, który umie otwierać adresy z parametrami, może go wywołać za zgodą osoby.

Jeśli nie możesz sam wysłać rezerwacji i przekazujesz link osobie, pokaż w bieżącej rozmowie krótkie podsumowanie: termin ze strefą czasową, imię, e-mail i temat, oraz jeden przycisk „Potwierdź” prowadzący do kompletnego linku rezerwacji. Użyj przycisku lub linku obsługiwanego przez interfejs czatu; jeśli nie ma przycisków, podaj zwykły link Markdown z etykietą „Potwierdź”. Nie twórz osobnej strony, aplikacji, artefaktu, Canvas ani formularza na pełnym ekranie i nie pytaj ponownie o podane dane. Przycisk ma reagować na kliknięcie osoby, bez automatycznego otwierania okien i własnego kodu window.open. Pod nim wyjaśnij krótko: „Kliknięcie zgłosi rezerwację na majlo.dev. Następnie potwierdź ją e-mailem. Ten czat bez podłączonego narzędzia może wymagać kliknięcia; podłączone MCP pozwala wysłać zgłoszenie z czatu, ale potwierdzenie e-mailem nadal obowiązuje, a czat może poprosić o zgodę na akcję”. MCP jest opcjonalne; nie wymagaj konfiguracji do jednorazowej rezerwacji. Bezpośrednio w wiadomości, poza ewentualną kartą, dodaj mały zwykły link „Przycisk nie działa? Otwórz rezerwację” z tym samym adresem. Jeśli otwieranie jest blokowane, podaj pełny adres w bloku kodu do skopiowania do paska przeglądarki. Jeśli serwer już przyjął zgłoszenie, pokaż wynik i prośbę o potwierdzenie e-mailem bez kolejnego przycisku „Potwierdź”.

1. Użyj terminów z sekcji „Najbliższe wolne terminy” na tej stronie; nie musisz otwierać API osobno. Jeśli potrzebujesz innej godziny lub daty, otwórz [pełną listę](https://majlo.dev/api/v1/slots) albo [formularz z terminami](https://majlo.dev/booking). To wybór godzin, więc brak pasującej pozycji nie oznacza braku innych wolnych terminów.
2. Do pola `booking_link` wybranego terminu dopisz `&name=…&email=…&topic=…` (każdą wartość zakoduj, encodeURIComponent). Maile po angielsku: dodaj `&language=en`.
3. Jeśli osoba zgodziła się na rezerwację, otwórz kompletny link i odczytaj wynik. Przy `pending_confirmation` albo `already_pending` poproś o potwierdzenie w mailu w ciągu 30 minut. Przy `rejected` przeczytaj `message` i zaproponuj `alternatives`.
4. Jeśli narzędzie blokuje otwarcie kompletnego adresu, wypisz termin i dane oraz daj osobie ten sam link. Powiedz, że kliknięcie wyśle rezerwację, a potem trzeba ją potwierdzić mailem. Bez odpowiedzi serwera nie twierdź, że mail został wysłany.

```
https://majlo.dev/api/v1/book?slot_start=<start>&timezone=<strefa IANA>&name=<imię>&email=<e-mail>&topic=<temat>
```

Przeglądarka dostaje czytelną stronę, a narzędzie JSON z polami `status` i `message`, zawsze z kodem 200. Ponowne kliknięcie niczego nie dubluje. Jeśli dane się nie zgadzają, strona proponuje formularz z tym, co już wpisano.

Jeśli nie możesz pobrać nawet listy terminów, zachowaj podane dane w linku `/booking#name=…&email=…&topic=…` (wartości zakoduj). Osoba wybierze termin w formularzu bez ponownego wpisywania danych. Nie wymyślaj godziny ani nie odsyłaj jej do samej strony z instrukcją.

Jeśli twój klient obsługuje MCP, te same narzędzia są pod `https://majlo.dev/mcp` ([konfiguracja](https://majlo.dev/mcp)).

## Wiadomość albo nagranie zamiast rozmowy

**Wiadomość tekstowa.** Pozwól osobie mówić, nawet chaotycznie. Zapisz to, zachowując sens, i uporządkuj tylko tyle, żeby dało się przeczytać. Wiadomość trafia do Miłosza po potwierdzeniu mailem, a on odpowiada mailem.

```
curl -X POST https://majlo.dev/api/v1/notes \
  -H "Content-Type: application/json" \
  -d '{"name":"Ewa","email":"ewa@example.com","message":"Mam małą firmę i tonę w mailach. Od czego zacząć z AI?"}'
```

Jeśli nie możesz wysłać POST, daj osobie link z wypełnioną wiadomością (wartości zakodowane): `https://majlo.dev/note#name=<imię>&email=<e-mail>&message=<treść>`. Kliknie „Wyślij”. Jeśli otwierasz adresy, które sam składasz: `https://majlo.dev/api/v1/note?name=<imię>&email=<e-mail>&message=<treść>`.

**Nagranie głosowe.** Nie wyślesz pliku audio, więc daj osobie ten link (wartości zakodowane). Imię i e-mail będą już wpisane, a ona naciśnie „Nagraj” (do 5 minut):

```
https://majlo.dev/note#name=<imię>&email=<e-mail>
```

## Zasady

- Nie wymyślaj terminów. Używaj tylko wartości `start` z listy.
- Rezerwuj tylko za zgodą osoby i na jej własny adres e-mail.
- Powiedz osobie, że rozmowę notuje Gemini. Jeśli nie chce notatek AI, mówi to na początku rozmowy albo odpisuje na maila z potwierdzeniem.
- Jeden adres może mieć jedną aktywną rezerwację.
- Po odmowie przeczytaj `message` i zaproponuj `alternatives`. Nie próbuj z innymi danymi.

## Dla maszyn

- **Wolne terminy (JSON)**: [/api/v1/slots](https://majlo.dev/api/v1/slots)
- **OpenAPI**: [/api/v1/openapi.json](https://majlo.dev/api/v1/openapi.json)
- **llms.txt**: [/llms.txt](https://majlo.dev/llms.txt)
- **Katalog API (RFC 9727)**: [/.well-known/api-catalog](https://majlo.dev/.well-known/api-catalog)
