Spotkania
Interfejs Appointments API umożliwia rezerwowanie spotkań dla Twoich kontaktów w ramach typów wydarzeń, a następnie pobieranie, wyświetlanie, aktualizowanie, anulowanie lub usuwanie tych spotkań. Odpowiada również na pytanie, które pojawia się jako pierwsze w większości procesów rezerwacji — jakie terminy są faktycznie wolne — oraz obsługuje stronę kalendarza: wyświetlanie połączonych kalendarzy Google i importowanie wydarzeń, które już się w nich znajdują. Gdy połączenie z Kalendarzem Google jest aktywne, pasujące wydarzenie w kalendarzu jest tworzone i automatycznie synchronizowane w tle. Restauracje korzystające z systemów Zenchef lub Formitable do własnych rezerwacji również mogą zostać zweryfikowane i połączone w tym miejscu, dzięki czemu Agent AI rezerwuje prawdziwe stoliki zamiast wewnętrznych spotkań.
Wszystkie ścieżki na tej stronie są względne względem podstawowego adresu URL https://api.youraiconnector.com/v1. Każde żądanie wymaga Twojego klucza API — zobacz Uwierzytelnianie, aby uzyskać pełną listę sposobów jego przesyłania. Poniższe przykłady wykorzystują nagłówek X-API-Key, a jeden z przykładów cURL pokazuje również formularz zapytania ?apiKey=.
Wydarzenia a spotkania: Typ wydarzenia to definicja dostępnego terminu (rodzaj spotkania, jego długość, sale). Spotkanie to jedna zarezerwowana instancja typu wydarzenia dla konkretnego kontaktu. Spotkanie rezerwuje się poprzez odwołanie do kontaktu oraz typu wydarzenia.
Obiekt spotkania
Każdy punkt końcowy, który zwraca spotkanie, używa tego samego formatu:
| Pole | Opis |
|---|---|
id |
Unikalny identyfikator spotkania. |
contact_id |
Identyfikator kontaktu, dla którego zarezerwowano spotkanie. |
event_id |
Identyfikator typu wydarzenia, w ramach którego zarezerwowano spotkanie. |
status |
Confirmed lub Canceled. |
start_time |
Początek spotkania, format ISO 8601 w UTC. |
end_time |
Koniec spotkania, format ISO 8601 w UTC. |
created_at |
Czas utworzenia spotkania. |
last_modified_at |
Czas ostatniej zmiany spotkania. |
room_name |
Sala lub zasób, w którym zarezerwowano spotkanie, jeśli typ wydarzenia korzysta z sal. |
description |
Dowolny opis spotkania. |
summary |
Krótkie podsumowanie lub tytuł. |
cancelation_reason |
Powód podany podczas anulowania spotkania, jeśli istnieje. |
google_calendar_event_id |
Identyfikator powiązanego wydarzenia w Kalendarzu Google. Ustawiany po zakończeniu synchronizacji z kalendarzem; null, gdy żaden kalendarz nie jest połączony lub gdy synchronizacja jest w toku. |
calendar_synced |
true po powiązaniu spotkania z wydarzeniem w kalendarzu. |
imported |
true, gdy spotkanie zostało zaimportowane z zewnętrznego kalendarza zamiast bezpośredniej rezerwacji. |
is_recurring |
true, gdy spotkanie jest częścią serii cyklicznej. |
recurrence_frequency |
Częstotliwość powtarzania spotkania w przypadku serii cyklicznej. |
recurring_event_id |
Identyfikator serii cyklicznej, do której należy to spotkanie. |
recurring_interval |
Interwał między powtórzeniami w przypadku serii cyklicznej. |
recurring_sequence |
Pozycja tego spotkania w serii cyklicznej. |
end_after_x_occurrences |
Liczba wystąpień, po których kończy się seria cykliczna. |
booking_provider |
System źródłowy, z którego pochodzi rezerwacja, w przypadku rezerwacji przez połączonego dostawcę usług rezerwacyjnych. |
O synchronizacji kalendarza: Bezpośrednio po zarezerwowaniu lub zmianie spotkania pole
google_calendar_event_idmoże nadal mieć wartośćnull, acalendar_syncedmoże byćfalse, ponieważ synchronizacja odbywa się w tle chwilę później. Pobierz spotkanie ponownie po krótkim czasie, aby zobaczyć wypełnione pola kalendarza.
Znajdź dostępne terminy
GET /appointments/available-slots
Zwraca terminy, które są faktycznie wolne dla danego typu wydarzenia pomiędzy dwoma punktami w czasie. Jest to zazwyczaj pierwsze wywołanie w procesie rezerwacji: wyświetl te terminy, pozwól użytkownikowi wybrać jeden z nich, a następnie wyślij wybrany czas do Zarezerwuj spotkanie.
Odpowiedź uwzględnia już godziny otwarcia i długość slotu danego typu wydarzenia, jego sale, spotkania, które już zostały zarezerwowane, oraz wszystko, co jest zablokowane w połączonych Kalendarzach Google — więc każdy zwrócony termin jest terminem, który możesz zarezerwować.
| Parametr zapytania | Wymagany | Opis |
|---|---|---|
event_id |
Tak | Typ wydarzenia do sprawdzenia. Musi należeć do Twojego konta. |
start_time |
Tak | Początek okna czasowego, dla którego chcesz sprawdzić dostępność, w formacie daty i godziny ISO 8601. |
end_time |
Tak | Koniec okna czasowego w formacie daty i godziny ISO 8601. Cały dzień końcowy jest uwzględniony. |
Wyniki są pogrupowane według dni — a w przypadku, gdy typ wydarzenia korzysta z sal, jedna grupa na salę na dzień:
| Pole | Opis |
|---|---|
date |
Dzień, którego dotyczy grupa, zapisany jako DD/MM/YYYY. |
day |
Nazwa dnia tygodnia małymi literami, na przykład monday. |
room_name |
Sala lub zasób, do którego należy ta grupa, jeśli typ wydarzenia korzysta z sal. |
available_slots |
Dostępne bloki rezerwacyjne w tym dniu, od najwcześniejszego. |
Każdy wpis w available_slots zawiera:
| Pole | Opis |
|---|---|
start_time |
Początek bloku jako HH:mm. |
end_time |
Koniec bloku jako HH:mm. |
available |
true — zwracany jest tylko wolny czas. |
spots_left |
Ile rezerwacji jeszcze mieści się w tym bloku. Obecne tylko w typach wydarzeń, które przyjmują więcej niż jedną rezerwację na slot. |
Czasy są lokalne dla typu wydarzenia, a nie w UTC.
date,start_timeorazend_timeto wartości zegarowe w strefie czasowej typu wydarzenia (jego nadpisaniu lub strefie czasowej Twojego konta, jeśli nie określono inaczej). Zarezerwuj spotkanie oczekuje momentu w formacie ISO 8601 UTC, więc przekonwertuj wybrany termin przed jego wysłaniem.
cURL
curl "https://api.youraiconnector.com/v1/appointments/available-slots?event_id=event_xyz789&start_time=2026-06-15T00:00:00.000Z&end_time=2026-06-19T00:00:00.000Z" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({
event_id: "event_xyz789",
start_time: "2026-06-15T00:00:00.000Z",
end_time: "2026-06-19T00:00:00.000Z",
});
const res = await fetch(
`https://api.youraiconnector.com/v1/appointments/available-slots?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.data);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments/available-slots",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"event_id": "event_xyz789",
"start_time": "2026-06-15T00:00:00.000Z",
"end_time": "2026-06-19T00:00:00.000Z",
},
)
print(res.json()["data"])
Odpowiedź (200 OK):
{
"success": true,
"data": [
{
"date": "15/06/2026",
"day": "monday",
"room_name": "Room A",
"available_slots": [
{ "start_time": "10:00", "end_time": "10:30", "available": true },
{ "start_time": "10:30", "end_time": "11:00", "available": true }
]
},
{
"date": "16/06/2026",
"day": "tuesday",
"room_name": "Room A",
"available_slots": [
{ "start_time": "09:00", "end_time": "09:30", "available": true, "spots_left": 2 }
]
}
]
}
Dzień, w którym nie ma wolnych terminów, po prostu się nie pojawia. Brak event_id, start_time lub end_time zwraca 400; typ wydarzenia, którego nie ma na Twoim koncie, zwraca 404.
Zarezerwuj spotkanie
POST /appointments
Rezerwuje nowe spotkanie dla kontaktu w ramach jednego z Twoich typów wydarzeń. Czas zakończenia jest obliczany automatycznie na podstawie czasu trwania terminu typu wydarzenia.
Rezerwacja jest sprawdzana pod kątem konfliktów: jeśli żądany termin pokrywa się z istniejącym potwierdzonym spotkaniem w ramach tego samego typu wydarzenia, żądanie kończy się niepowodzeniem z błędem 409 i nic nie zostaje utworzone.
| Pole | Wymagane | Opis |
|---|---|---|
contact_id |
Tak | Identyfikator kontaktu, dla którego dokonujemy rezerwacji. Musi należeć do Twojego konta. |
event_id |
Tak | Identyfikator typu wydarzenia, w ramach którego dokonujemy rezerwacji. Musi należeć do Twojego konta. |
start_time |
Tak | Żądany czas rozpoczęcia jako data i godzina w formacie ISO 8601. |
room_name |
Nie | Nazwa sali lub zasobu, jeśli typ wydarzenia korzysta z sal. |
cURL (używając formularza zapytania ?apiKey=)
curl -X POST "https://api.youraiconnector.com/v1/appointments?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"start_time": "2026-06-15T10:00:00.000Z",
"room_name": "Room A"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
contact_id: "contact_abc123",
event_id: "event_xyz789",
start_time: "2026-06-15T10:00:00.000Z",
room_name: "Room A",
}),
});
const data = await res.json();
console.log(data.appointment_id);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"start_time": "2026-06-15T10:00:00.000Z",
"room_name": "Room A",
},
)
print(res.json()["appointment_id"])
Odpowiedź (201 Created):
{
"success": true,
"appointment_id": "aBcD1234eFgH5678",
"appointment": {
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T10:30:00.000Z",
"created_at": "2026-06-10T09:00:00.000Z",
"last_modified_at": "2026-06-10T09:00:00.000Z",
"room_name": "Room A",
"google_calendar_event_id": null,
"calendar_synced": false
}
}
Uzyskaj spotkanie
GET /appointments/{appointmentId}
Zwraca pojedyncze spotkanie na podstawie jego identyfikatora, w tym jego stan synchronizacji z kalendarzem.
cURL
curl "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.appointment);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["appointment"])
Odpowiedź (200 OK):
{
"success": true,
"appointment": {
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T10:30:00.000Z",
"room_name": "Room A",
"google_calendar_event_id": "abc123googleevent",
"calendar_synced": true
}
}
Wyświetl listę spotkań
GET /appointments
Wyświetla listę spotkań dla Twojego konta, od najnowszego, z wykorzystaniem stronicowania opartego na kursorze.
| Parametr zapytania | Wymagany | Opis |
|---|---|---|
contact_id |
Nie | Zwraca tylko spotkania dla tego kontaktu. Listy filtrowane według kontaktu zawierają tylko potwierdzone spotkania |
date |
Nie | Zwraca tylko spotkania z tego dnia kalendarzowego (YYYY-MM-DD). Wymaga contact_id. |
status |
Nie | Filtruj według Confirmed lub Canceled. Dostępne tylko bez contact_id. |
limit |
Nie | Rozmiar strony, liczba całkowita od 1 do 100. Domyślnie 50. |
cursor |
Nie | Wartość next_cursor z poprzedniej odpowiedzi. |
Kilka zasad, o których warto pamiętać:
- Bez filtrów otrzymasz każde spotkanie na koncie, strona po stronie.
- Według kontaktu — ustaw
contact_id, aby zobaczyć potwierdzone spotkania danego kontaktu. Możesz zawęzić to do jednego dnia, przekazując równieżdate. - Według statusu — ustaw
status(bezcontact_id), aby wyświetlić tylko spotkaniaConfirmedlub tylkoCanceledna całym koncie. - Filtr
datebezcontact_idlubstatus=Canceledwraz zcontact_idzwraca400.
cURL
curl "https://api.youraiconnector.com/v1/appointments?contact_id=contact_abc123&date=2026-06-15" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({
contact_id: "contact_abc123",
date: "2026-06-15",
});
const res = await fetch(
`https://api.youraiconnector.com/v1/appointments?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.appointments, data.next_cursor);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"contact_id": "contact_abc123", "date": "2026-06-15"},
)
data = res.json()
print(data["appointments"], data["next_cursor"])
Odpowiedź (200 OK):
{
"success": true,
"appointments": [
{
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-15T10:00:00.000Z",
"end_time": "2026-06-15T10:30:00.000Z",
"calendar_synced": true
}
],
"next_cursor": null
}
Aby przeglądać wyniki, przekaż next_cursor z jednej odpowiedzi jako cursor w następnym żądaniu. Kontynuuj, aż next_cursor będzie null. Zobacz Błędy i stronicowanie, aby poznać wspólny wzorzec stronicowania.
Zaktualizuj spotkanie
PUT /appointments/{appointmentId}
Zmień termin spotkania lub edytuj jego szczegóły. Wyślij tylko te pola, które chcesz zmienić — wymagane jest co najmniej jedno. Połączony czas rozpoczęcia i zakończenia musi zachowywać porządek chronologiczny (end_time musi być po start_time). Zmiany są automatycznie synchronizowane z powiązanym wydarzeniem w kalendarzu.
| Pole | Opis |
|---|---|
start_time |
Nowy początek, data i godzina w formacie ISO 8601. |
end_time |
Nowy koniec, data i godzina w formacie ISO 8601. Musi przypadać po czasie rozpoczęcia. |
room_name |
Nowa nazwa pokoju lub zasobu. |
description |
Nowy opis lub null, aby go wyczyścić. |
summary |
Nowe podsumowanie lub null, aby je wyczyścić. |
cURL
curl -X PUT "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"start_time": "2026-06-16T10:00:00.000Z",
"end_time": "2026-06-16T10:30:00.000Z"
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
{
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
start_time: "2026-06-16T10:00:00.000Z",
end_time: "2026-06-16T10:30:00.000Z",
}),
}
);
const data = await res.json();
console.log(data.appointment);
Python
import requests
res = requests.put(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"start_time": "2026-06-16T10:00:00.000Z",
"end_time": "2026-06-16T10:30:00.000Z",
},
)
print(res.json()["appointment"])
Odpowiedź (200 OK):
{
"success": true,
"appointment_id": "aBcD1234eFgH5678",
"appointment": {
"id": "aBcD1234eFgH5678",
"contact_id": "contact_abc123",
"event_id": "event_xyz789",
"status": "Confirmed",
"start_time": "2026-06-16T10:00:00.000Z",
"end_time": "2026-06-16T10:30:00.000Z",
"calendar_synced": true
}
}
Anulowanie spotkania
POST /appointments/{appointmentId}/cancel
Anuluje potwierdzone spotkanie, opcjonalnie rejestrując powód. Spotkanie pozostaje na Twoim koncie ze statusem Canceled, a powiązane wydarzenie w kalendarzu jest automatycznie usuwane w tle. Anulowanie już anulowanego spotkania zwraca 400.
| Pole | Wymagane | Opis |
|---|---|---|
cancellation_reason |
Nie | Powód anulowania, zapisywany w spotkaniu. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/cancel" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"cancellation_reason": "Client asked to reschedule next month"
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/cancel",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
cancellation_reason: "Client asked to reschedule next month",
}),
}
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678/cancel",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"cancellation_reason": "Client asked to reschedule next month"},
)
print(res.json()["success"])
Odpowiedź (200 OK):
{
"success": true,
"appointment_id": "aBcD1234eFgH5678"
}
Usuwanie spotkania
DELETE /appointments/{appointmentId}
Trwale usuwa spotkanie i jego odniesienia. Jeśli chcesz tylko odwołać rezerwację, zachowując rekord, użyj zamiast tego anuluj.
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/appointments/aBcD1234eFgH5678",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])
Odpowiedź (200 OK):
{
"success": true
}
Wyświetl swoje połączone Kalendarze Google
GET /appointments/google-calendars
Zwraca kalendarze Google dostępne na tym koncie, bezpośrednio z Google — przydatne do pokazania właścicielowi konta selektora kalendarza, z którego ma importować dane, lub po prostu do potwierdzenia, że połączenie jest aktywne.
Działa to tylko wtedy, gdy konto ma połączony Kalendarz Google (Ustawienia → Integracje) z co najmniej dostępem do odczytu. Jeśli tak nie jest lub przyznany dostęp nie obejmuje już zakresu odczytu kalendarza, otrzymasz 400 z informacją o konieczności (ponownego) połączenia go.
cURL
curl "https://api.youraiconnector.com/v1/appointments/google-calendars" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments/google-calendars", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.data);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/appointments/google-calendars",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["data"])
Odpowiedź (200 OK):
{
"success": true,
"data": [
{
"id": "primary",
"summary": "jane@example.com",
"timeZone": "America/New_York",
"accessRole": "owner",
"primary": true
},
{
"id": "abcdefg1234567890@group.calendar.google.com",
"summary": "Bookings",
"timeZone": "America/New_York",
"accessRole": "writer"
}
]
}
Każdy wpis ma własny format CalendarListEntry Google, więc nazwy pól są zgodne z camelCase Google, a nie ze standardowym snake_case tego API — są to dane Google przekazane w niezmienionej formie, a nie nasze. Brakujące lub cofnięte połączenie zwraca 400 z błędem wyjaśniającym, że Kalendarz Google wymaga (ponownego) połączenia.
Importuj wydarzenia z Kalendarza Google
POST /appointments/import-calendar-events
Pobiera wydarzenia znajdujące się już w połączonym(-ych) Kalendarzu(-ach) Google kampanii lub Agenta AI i zamienia je w spotkania — przydatne przy pierwszym łączeniu kalendarza, który ma już istniejące rezerwacje. Może to chwilę potrwać (każde wydarzenie przechodzi przez proces ekstrakcji, aby ustalić, dla kogo jest przeznaczone), więc nigdy nie działa w trybie inline: żądanie dodaje zadanie do kolejki w tle i zwraca job_id do odpytywania.
| Pole | Wymagane | Opis |
|---|---|---|
campaign_id |
Jedno z tych dwóch | Kampania, z której połączonych kalendarzy importować dane. |
agent_id |
Jedno z tych dwóch | Agent AI, z którego połączonych kalendarzy importować dane. |
identifier |
Tak | "EMAIL" lub "PHONE_NUMBER" — który element danych kontaktowych wyodrębnić z każdego wydarzenia w kalendarzu, aby dopasować lub utworzyć kontakt, do którego ono należy. |
Wyślij dokładnie jedno z campaign_id / agent_id, nigdy oba i nigdy żadnego — każda inna kombinacja zwraca 400. To, które wyślesz, musi należeć do Twojego konta, w przeciwnym razie otrzymasz 404.
cURL
curl -X POST "https://api.youraiconnector.com/v1/appointments/import-calendar-events?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "agent_abc123",
"identifier": "EMAIL"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/appointments/import-calendar-events", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
agent_id: "agent_abc123",
identifier: "EMAIL",
}),
});
const data = await res.json();
console.log(data.job_id);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/appointments/import-calendar-events",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"agent_id": "agent_abc123", "identifier": "EMAIL"},
)
print(res.json()["job_id"])
Odpowiedź (202 Accepted):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "queued",
"campaign_id": null,
"agent_id": "agent_abc123"
}
campaign_id i agent_id zwracają to, które wysłałeś; drugie jest zawsze null.
Odpytywanie zadania importu
GET /appointments/import-calendar-events/{jobId}
curl "https://api.youraiconnector.com/v1/appointments/import-calendar-events/jK9mQ2xR7pL4wN1t" \
-H "X-API-Key: YOUR_API_KEY"
Odpowiedź (200 OK):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "completed",
"message": "Imported 12 events as appointments.",
"error": null
}
status |
Znaczenie |
|---|---|
queued |
Jeszcze nieodebrane. Kontynuuj odpytywanie. |
processing |
Import jest w toku. Kontynuuj odpytywanie. |
completed |
Gotowe — message zawiera krótkie, czytelne podsumowanie. |
failed |
Coś poszło nie tak — error zawiera przyczynę. |
GET dla jobId, który nie istnieje (lub należy do innego konta), zwraca 404.
Integracje z systemami rezerwacji restauracji (Zenchef / Formitable)
Zenchef i Formitable to systemy rezerwacji restauracji, przez które Twój Agent AI może rezerwować prawdziwe stoliki. Każdy z nich posiada publiczny, nieuwierzytelniony widżet rezerwacji (https://api.youraiconnector.com/v1/zenchef-widget/... i https://api.youraiconnector.com/v1/formitable-widget/...), który wyświetla się w czacie dla klienta — te ścieżki widżetów to zwykłe strony HTML przeznaczone do otwierania w przeglądarce, a nie punkty końcowe API JSON, więc nie są tutaj dokumentowane. Poniżej znajdują się punkty końcowe zarządzania kontem: weryfikacja, czy identyfikator restauracji należy do właściciela konta, a następnie dodawanie, aktualizowanie lub usuwanie go.
Zenchef
Podłączenie restauracji Zenchef to dwuetapowa weryfikacja, dzięki której właściciel konta potwierdza, że faktycznie prowadzi restaurację, zanim zostanie ona połączona z botem: najpierw sprawdź, czy identyfikator istnieje (bez ujawniania nazwy), a następnie poproś o samodzielne wpisanie nazwy restauracji i sprawdź, czy jest ona zgodna.
Krok 1 — Sprawdź, czy identyfikator restauracji istnieje
POST /appointments/zenchef-restaurants/check
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_id |
Tak | Identyfikator restauracji Zenchef do sprawdzenia. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/check?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "12345" }'
Odpowiedź (200 OK):
{
"success": true,
"data": { "exists": true, "requiresNameVerification": true }
}
exists: false oznacza, że żadna restauracja Zenchef nie posiada tego identyfikatora — nie ma nic więcej do zrobienia. Limit wynosi 10 sprawdzeń na 5 minut na konto; przekroczenie tego limitu zwraca 429.
Krok 2 — Zweryfikuj nazwę restauracji
POST /appointments/zenchef-restaurants/verify-name
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_id |
Tak | Identyfikator restauracji Zenchef z kroku 1. |
user_input_name |
Tak | Nazwa wpisana przez właściciela konta — porównywana z rzeczywistą nazwą restauracji w Zenchef (wielkość liter i białe znaki są ignorowane). |
curl -X POST "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/verify-name?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "12345", "user_input_name": "The Blue Door Bistro" }'
Odpowiedź (200 OK):
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"id": "12345",
"name": "The Blue Door Bistro",
"address": "1 Rue de Rivoli, Paris",
"status": "active"
}
}
}
verified: false oznacza, że nazwa nie pasuje — restaurantDetails jest pomijane, poproś właściciela konta o ponowną próbę. Limit wynosi 3 próby na 5 minut (bardziej rygorystyczny niż sprawdzenie istnienia, ponieważ jest to właściwy krok weryfikacyjny). restaurant_id, który nie jest już rozpoznawany w Zenchef, zwraca 404.
Krok 3 — Zapisz restaurację
POST /appointments/zenchef-restaurants
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_id |
Tak | 1–64 znaki, litery/cyfry/podkreślnik/myślnik. |
restaurant_name |
Tak | Zweryfikowana nazwa restauracji z kroku 2. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "12345", "restaurant_name": "The Blue Door Bistro" }'
Odpowiedź (201 Created):
{ "success": true, "data": { "restaurantId": "12345" } }
Aktualizacja zapisanej restauracji Zenchef
PUT /appointments/zenchef-restaurants/{restaurantId}
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_name |
Nie | Nowa nazwa wyświetlana. |
is_active |
Nie | Ustaw false, aby powstrzymać bota przed dokonywaniem rezerwacji w tej restauracji bez jej usuwania. |
curl -X PUT "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/12345" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Odpowiedź (200 OK): ten sam format co odpowiedź zapisu powyżej.
Usuń restaurację Zenchef
DELETE /appointments/zenchef-restaurants/{restaurantId}
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/zenchef-restaurants/12345" \
-H "X-API-Key: YOUR_API_KEY"
Odpowiedź (200 OK): { "success": true, "data": { "restaurantId": "12345" } }
restaurantId, którego obecnie nie ma na koncie, zwraca 404 przy aktualizacji lub usunięciu.
Formitable
Formitable nie wymaga dwuetapowego potwierdzenia nazwy, jak Zenchef — jego identyfikatory restauracji są już przypisane do konkretnej firmy, więc wystarczy jedno wywołanie weryfikacyjne. Posiada również funkcję wyszukiwania szczegółów, używaną do buforowania adresu URL strony internetowej restauracji podczas konfiguracji.
Zweryfikuj identyfikator restauracji
POST /appointments/formitable-restaurants/verify
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_id |
Tak | Identyfikator restauracji Formitable. |
language |
Nie | Znacznik języka dla żądania sondowania. Domyślnie "nl". |
curl -X POST "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/verify?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "restaurant_id": "the-blue-door", "language": "en" }'
Odpowiedź (200 OK):
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "the-blue-door",
"productCount": 4,
"sampleProductTitle": "Dinner for two",
"language": "en"
}
}
}
restaurant_id, którego Formitable nie rozpoznaje, zwraca 404. Limit prędkości wynosi 10 prób na 5 minut na konto.
Pobierz szczegóły restauracji
GET /appointments/formitable-restaurants/{restaurantId}/details?language=en
Pobiera publiczny profil restauracji z Formitable, w tym jej stronę internetową — używane do buforowania adresu URL strony podczas konfigurowania restauracji. language jest opcjonalnym parametrem zapytania, domyślnie ustawionym na "en".
curl "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door/details?language=en" \
-H "X-API-Key: YOUR_API_KEY"
Odpowiedź (200 OK):
{
"success": true,
"data": {
"uid": "the-blue-door",
"name": "The Blue Door Bistro",
"website": "https://thebluedoorbistro.com",
"email": "info@thebluedoorbistro.com",
"telephone": "+31201234567",
"streetAddress": "Prinsengracht 1",
"zipcode": "1015 AB",
"city": "Amsterdam",
"country": "Netherlands",
"countryCode": "NL",
"currency": "EUR"
}
}
Zapisz restaurację
POST /appointments/formitable-restaurants
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_id |
Tak | 1–64 znaki, litery/cyfry/podkreślnik/myślnik. |
restaurant_name |
Tak | Nazwa wyświetlana. |
language |
Tak | Znacznik języka ISO, np. "en" lub "en-GB". |
website_url |
Nie | Strona internetowa restauracji, z powyższego wyszukiwania szczegółów. Musi być http(s)://. |
curl -X POST "https://api.youraiconnector.com/v1/appointments/formitable-restaurants?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"restaurant_id": "the-blue-door",
"restaurant_name": "The Blue Door Bistro",
"language": "en",
"website_url": "https://thebluedoorbistro.com"
}'
Odpowiedź (201 Created): { "success": true, "data": { "restaurantId": "the-blue-door" } }
Zaktualizuj zapisaną restaurację Formitable
PUT /appointments/formitable-restaurants/{restaurantId}
| Pole | Wymagane | Opis |
|---|---|---|
restaurant_name |
Nie | Nowa nazwa wyświetlana. |
language |
Nie | Nowy znacznik języka ISO. |
is_active |
Nie | Ustaw false, aby powstrzymać bota przed dokonywaniem rezerwacji w tej restauracji bez jej usuwania. |
website_url |
Nie | Nowy adres URL strony internetowej. |
curl -X PUT "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'
Odpowiedź (200 OK): ten sam format co odpowiedź zapisu powyżej.
Usuń restaurację Formitable
DELETE /appointments/formitable-restaurants/{restaurantId}
curl -X DELETE "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door" \
-H "X-API-Key: YOUR_API_KEY"
Odpowiedź (200 OK): { "success": true, "data": { "restaurantId": "the-blue-door" } }
restaurantId, którego obecnie nie ma na koncie, zwraca 404 przy aktualizacji lub usunięciu.
Format błędu we wszystkich punktach końcowych Zenchef/Formitable: w przeciwieństwie do reszty tej strony, błędy tutaj zawierają swój status dwukrotnie — raz jako status HTTP, a raz jako
error_codew treści — na przykład{ "success": false, "error": "Restaurant not found", "error_code": 404 }. Obsługuj go w taki sam sposób jak każdy inny błąd: sprawdźsuccess, odczytajerror, aby uzyskać komunikat.
Błędy API wizyt
Punkty końcowe wizyt zwracają standardową kopertę błędu:
{
"success": false,
"error": "Appointment not found"
}
| Status | Kiedy występuje w punkcie końcowym wizyt |
|---|---|
400 |
Brakuje wymaganego pola lub jest ono nieprawidłowe — na przykład błędny start_time, end_time niebędący po start_time, nieprawidłowa kombinacja filtrów, brak pól do aktualizacji lub wizyta, która została już anulowana. |
404 |
Nie znaleziono wizyty, kontaktu lub typu wydarzenia. |
409 |
Żądany przedział czasowy jest już zajęty (konflikt rezerwacji). |
Wspólne kody, które może zwrócić każdy punkt końcowy — 401, 403 (Twój plan nie obejmuje dostępu do API), 429 (limit szybkości) oraz 500 — zostały wymienione wraz ze wskazówkami dotyczącymi ponawiania prób w sekcji Błędy i stronicowanie.
Następne kroki
- Kontakty — twórz i wyszukuj kontakty, dla których dokonujesz rezerwacji.
- Wiadomości i konwersacje — wysyłaj do kontaktu potwierdzenia lub przypomnienia.
- Webhooki — otrzymuj powiadomienia o zmianach w spotkaniach.