Janji Temu
API Janji Temu memungkinkan Anda membuat janji temu untuk kontak Anda pada jenis acara Anda, kemudian mengambil, mencantumkan, memperbarui, membatalkan, atau menghapusnya. API ini juga menjawab pertanyaan yang muncul pertama kali dalam sebagian besar alur pemesanan — waktu mana yang benar-benar kosong — dan mencakup sisi kalender: mencantumkan Kalender Google yang telah Anda hubungkan dan mengimpor acara yang sudah ada di dalamnya. Saat koneksi Kalender Google aktif, acara kalender yang cocok akan dibuat dan disinkronkan secara otomatis di latar belakang. Restoran yang menggunakan Zenchef atau Formitable untuk sistem reservasi mereka sendiri juga dapat diverifikasi dan dihubungkan di sini, sehingga Agen AI dapat memesan meja sungguhan alih-alih janji temu internal.
Semua jalur di halaman ini relatif terhadap URL dasar https://api.youraiconnector.com/v1. Setiap permintaan memerlukan kunci API Anda — lihat Autentikasi untuk daftar lengkap cara mengirimkannya. Contoh di bawah menggunakan header X-API-Key, dengan satu contoh cURL yang juga menunjukkan formulir kueri ?apiKey=.
Acara vs. janji temu: Jenis acara adalah definisi slot yang dapat dipesan (jenis pertemuan, durasinya, ruangannya). Janji temu adalah satu instans yang dipesan dari jenis acara untuk kontak tertentu. Anda memesan janji temu dengan mereferensikan kontak dan jenis acara tersebut.
Objek janji temu
Setiap endpoint yang mengembalikan janji temu menggunakan bentuk yang sama:
| Bidang | Deskripsi |
|---|---|
id |
ID unik janji temu. |
contact_id |
ID kontak yang dipesan untuk janji temu. |
event_id |
ID jenis acara tempat janji temu dipesan. |
status |
Confirmed atau Canceled. |
start_time |
Waktu mulai janji temu, ISO 8601 dalam UTC. |
end_time |
Waktu berakhir janji temu, ISO 8601 dalam UTC. |
created_at |
Kapan janji temu dibuat. |
last_modified_at |
Kapan janji temu terakhir diubah. |
room_name |
Ruangan atau sumber daya tempat janji temu dipesan, saat jenis acara menggunakan ruangan. |
description |
Deskripsi janji temu dalam bentuk bebas. |
summary |
Ringkasan atau judul singkat. |
cancelation_reason |
Alasan yang diberikan saat janji temu dibatalkan, jika ada. |
google_calendar_event_id |
ID acara Google Kalender yang ditautkan. Ditetapkan setelah sinkronisasi kalender selesai; null saat tidak ada kalender yang terhubung atau saat sinkronisasi masih berlangsung. |
calendar_synced |
true setelah janji temu ditautkan ke acara kalender. |
imported |
true saat janji temu diimpor dari kalender eksternal, bukan dipesan secara langsung. |
is_recurring |
true saat janji temu merupakan bagian dari seri berulang. |
recurrence_frequency |
Seberapa sering janji temu berulang, saat berulang. |
recurring_event_id |
ID seri berulang tempat janji temu ini berada. |
recurring_interval |
Interval antar pengulangan, saat berulang. |
recurring_sequence |
Posisi janji temu ini dalam seri berulangnya. |
end_after_x_occurrences |
Jumlah kejadian setelah seri berulang berakhir. |
booking_provider |
Sistem sumber asal pemesanan, saat dipesan melalui penyedia reservasi yang terhubung. |
Tentang sinkronisasi kalender: Tepat setelah Anda memesan atau mengubah janji temu,
google_calendar_event_idmungkin masihnulldancalendar_syncedmungkinfalsekarena sinkronisasi berjalan di latar belakang beberapa saat kemudian. Ambil kembali janji temu tersebut beberapa saat kemudian untuk melihat bidang kalender yang telah terisi.
Temukan slot yang tersedia
GET /appointments/available-slots
Mengembalikan waktu yang benar-benar kosong pada satu jenis acara di antara dua momen. Ini biasanya merupakan panggilan pertama dalam alur pemesanan: tampilkan slot ini, biarkan orang tersebut memilih satu, lalu kirim waktu yang dipilih ke Buat janji temu.
Jawaban tersebut sudah memperhitungkan jam buka dan durasi slot jenis acara itu sendiri, ruangannya, janji temu yang sudah Anda buat, dan semua yang diblokir di Kalender Google yang terhubung — jadi slot yang dikembalikan di sini adalah slot yang dapat Anda pesan.
| Parameter kueri | Wajib | Deskripsi |
|---|---|---|
event_id |
Ya | Jenis acara yang akan diperiksa. Harus milik akun Anda. |
start_time |
Ya | Awal jendela waktu yang Anda inginkan slotnya, tanggal-waktu ISO 8601. |
end_time |
Ya | Akhir jendela waktu, tanggal-waktu ISO 8601. Seluruh hari terakhir disertakan. |
Hasil dikembalikan dikelompokkan berdasarkan hari — dan, jika jenis acara menggunakan ruangan, satu grup per ruangan per hari:
| Bidang | Deskripsi |
|---|---|
date |
Hari yang dicakup oleh grup, ditulis DD/MM/YYYY. |
day |
Nama hari kerja dalam huruf kecil, contohnya monday. |
room_name |
Ruangan atau sumber daya milik grup ini, jika jenis acara menggunakan ruangan. |
available_slots |
Blok yang dapat dipesan pada hari itu, diurutkan dari yang paling awal. |
Setiap entri dalam available_slots memiliki:
| Bidang | Deskripsi |
|---|---|
start_time |
Awal blok sebagai HH:mm. |
end_time |
Akhir blok sebagai HH:mm. |
available |
true — hanya waktu kosong yang dikembalikan. |
spots_left |
Berapa banyak pemesanan yang masih muat di blok ini. Hanya ada pada jenis acara yang menerima lebih dari satu pemesanan per slot. |
Waktu bersifat lokal untuk jenis acara, bukan UTC.
date,start_time, danend_timeadalah nilai jam dinding di zona waktu jenis acara itu sendiri (penggantiannya, atau zona waktu akun Anda jika tidak ada). Buat janji temu mengharapkan instan UTC ISO 8601, jadi konversikan slot yang Anda pilih sebelum mengirimnya.
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"])
Respons (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 }
]
}
]
}
Hari yang tidak memiliki waktu kosong tidak akan muncul. event_id, start_time, atau end_time yang hilang akan mengembalikan 400; jenis acara yang tidak ada di akun Anda akan mengembalikan 404.
Pesan janji temu
POST /appointments
Memesan janji temu baru untuk kontak pada salah satu jenis acara Anda. Waktu berakhir dihitung secara otomatis dari durasi slot jenis acara tersebut.
Pemesanan diperiksa konfliknya: jika slot yang diminta tumpang tindih dengan janji temu yang sudah dikonfirmasi pada jenis acara yang sama, permintaan akan gagal dengan 409 dan tidak ada yang dibuat.
| Bidang | Wajib | Deskripsi |
|---|---|---|
contact_id |
Ya | ID kontak yang akan dipesan. Harus milik akun Anda. |
event_id |
Ya | ID jenis acara untuk dipesan. Harus milik akun Anda. |
start_time |
Ya | Waktu mulai yang diinginkan sebagai tanggal-waktu ISO 8601. |
room_name |
Tidak | Nama ruangan atau sumber daya, saat jenis acara menggunakan ruangan. |
cURL (menggunakan formulir kueri ?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"])
Respons (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
}
}
Mendapatkan janji temu
GET /appointments/{appointmentId}
Mengembalikan satu janji temu berdasarkan ID-nya, termasuk status sinkronisasi kalendernya.
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"])
Respons (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
}
}
Mencantumkan janji temu
GET /appointments
Mencantumkan janji temu untuk akun Anda, yang terbaru terlebih dahulu, dengan penomoran halaman berbasis kursor.
| Parameter kueri | Wajib | Deskripsi |
|---|---|---|
contact_id |
Tidak | Hanya mengembalikan janji temu untuk kontak ini. Daftar yang difilter berdasarkan kontak hanya menyertakan janji temu yang dikonfirmasi saja. |
date |
Tidak | Hanya mengembalikan janji temu pada hari kalender ini (YYYY-MM-DD). Memerlukan contact_id. |
status |
Tidak | Filter berdasarkan Confirmed atau Canceled. Hanya tersedia tanpa contact_id. |
limit |
Tidak | Ukuran halaman, bilangan bulat antara 1 dan 100. Default 50. |
cursor |
Tidak | Nilai next_cursor dari respons sebelumnya. |
Beberapa aturan yang perlu diingat:
- Tanpa filter, Anda mendapatkan setiap janji temu di akun, halaman demi halaman.
- Berdasarkan kontak — atur
contact_iduntuk melihat janji temu yang dikonfirmasi dari satu kontak. Anda dapat mempersempitnya ke satu hari dengan juga menyertakandate. - Berdasarkan status — atur
status(tanpacontact_id) untuk mencantumkan hanya janji temuConfirmedatau hanyaCanceleddi seluruh akun. - Filter
datetanpacontact_id, ataustatus=Canceledbersama dengancontact_id, mengembalikan400.
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"])
Respons (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
}
Untuk menelusuri hasil, teruskan next_cursor dari satu respons sebagai cursor untuk permintaan berikutnya. Lanjutkan sampai next_cursor bernilai null. Lihat Error & Penomoran Halaman untuk pola penomoran halaman bersama.
Memperbarui janji temu
PUT /appointments/{appointmentId}
Jadwalkan ulang janji temu atau ubah detailnya. Kirim hanya kolom yang ingin Anda ubah — setidaknya satu kolom wajib diisi. Gabungan waktu mulai dan berakhir harus tetap dalam urutan kronologis (end_time harus setelah start_time). Perubahan akan disinkronkan ke acara kalender yang tertaut secara otomatis.
| Bidang | Deskripsi |
|---|---|
start_time |
Waktu mulai baru, tanggal-waktu ISO 8601. |
end_time |
Waktu akhir baru, tanggal-waktu ISO 8601. Harus setelah waktu mulai. |
room_name |
Nama ruangan atau sumber daya baru. |
description |
Deskripsi baru, atau null untuk menghapusnya. |
summary |
Ringkasan baru, atau null untuk menghapusnya. |
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"])
Respons (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
}
}
Membatalkan janji temu
POST /appointments/{appointmentId}/cancel
Membatalkan janji temu yang telah dikonfirmasi, dengan opsi untuk mencatat alasannya. Janji temu akan tetap ada di akun Anda dengan status Canceled, dan acara kalender yang tertaut akan dihapus secara otomatis di latar belakang. Membatalkan janji temu yang sudah dibatalkan akan mengembalikan 400.
| Bidang | Wajib | Deskripsi |
|---|---|---|
cancellation_reason |
Tidak | Alasan pembatalan, disimpan pada janji temu. |
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"])
Respons (200 OK):
{
"success": true,
"appointment_id": "aBcD1234eFgH5678"
}
Menghapus janji temu
DELETE /appointments/{appointmentId}
Menghapus janji temu dan referensinya secara permanen. Jika Anda hanya ingin membatalkan pemesanan namun tetap menyimpan catatannya, gunakan batal sebagai gantinya.
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"])
Respons (200 OK):
{
"success": true
}
Cantumkan Kalender Google Anda yang terhubung
GET /appointments/google-calendars
Mengembalikan Kalender Google yang tersedia di akun ini, langsung dari Google — berguna untuk menampilkan pemilih kalender kepada pemilik akun untuk menentukan kalender mana yang akan diimpor dari bawah, atau sekadar untuk mengonfirmasi bahwa koneksi sudah aktif.
Ini hanya berfungsi setelah akun menghubungkan Google Kalender (Pengaturan → Integrasi) dengan setidaknya akses baca. Jika belum, atau akses yang diberikan tidak lagi menyertakan cakupan baca-kalender, Anda akan mendapatkan 400 yang meminta Anda untuk (menghubungkan) kembali.
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"])
Respons (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"
}
]
}
Setiap entri adalah bentuk CalendarListEntry milik Google sendiri, jadi nama bidang mengikuti camelCase Google, bukan snake_case API ini yang biasanya digunakan — itu adalah data Google yang diteruskan apa adanya, bukan data kami. Koneksi yang hilang atau dicabut akan mengembalikan 400 dengan kesalahan yang menjelaskan bahwa Google Kalender perlu (dihubungkan) kembali.
Impor acara dari Google Kalender
POST /appointments/import-calendar-events
Menarik acara yang sudah ada di Google Kalender kampanye atau Agen AI yang terhubung dan mengubahnya menjadi janji temu — berguna saat pertama kali Anda menghubungkan kalender yang sudah memiliki pemesanan. Proses ini mungkin memakan waktu (setiap acara melalui ekstraksi untuk mengetahui untuk siapa acara tersebut), jadi proses ini tidak pernah berjalan secara inline: permintaan akan mengantrekan pekerjaan latar belakang dan memberikan Anda job_id untuk melakukan polling.
| Bidang | Wajib | Deskripsi |
|---|---|---|
campaign_id |
Salah satu dari keduanya | Kampanye yang kalender terhubungnya akan diimpor. |
agent_id |
Salah satu dari keduanya | Agen AI yang kalender terhubungnya akan diimpor. |
identifier |
Ya | "EMAIL" atau "PHONE_NUMBER" — bagian informasi kontak mana yang akan diekstrak dari setiap acara kalender untuk mencocokkan atau membuat kontak yang memilikinya. |
Kirim tepat satu dari campaign_id / agent_id, jangan pernah keduanya dan jangan pernah tidak keduanya — kombinasi apa pun akan mengembalikan 400. Mana pun yang Anda kirim harus milik akun Anda, atau Anda akan mendapatkan 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"])
Respons (202 Accepted):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "queued",
"campaign_id": null,
"agent_id": "agent_abc123"
}
campaign_id dan agent_id akan menggemakan kembali mana pun yang Anda kirim; yang lainnya akan selalu null.
Polling pekerjaan impor
GET /appointments/import-calendar-events/{jobId}
curl "https://api.youraiconnector.com/v1/appointments/import-calendar-events/jK9mQ2xR7pL4wN1t" \
-H "X-API-Key: YOUR_API_KEY"
Respons (200 OK):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "completed",
"message": "Imported 12 events as appointments.",
"error": null
}
status |
Arti |
|---|---|
queued |
Belum diambil. Terus lakukan polling. |
processing |
Impor sedang berjalan. Terus lakukan polling. |
completed |
Selesai — message memiliki ringkasan singkat yang dapat dibaca manusia. |
failed |
Terjadi kesalahan — error berisi alasannya. |
GET pada jobId yang tidak ada (atau milik akun lain) akan mengembalikan 404.
Integrasi pemesanan restoran (Zenchef / Formitable)
Zenchef dan Formitable adalah sistem reservasi restoran tempat Agen AI Anda dapat memesan meja secara nyata. Masing-masing memiliki widget pemesanan publik tanpa autentikasi (https://api.youraiconnector.com/v1/zenchef-widget/... dan https://api.youraiconnector.com/v1/formitable-widget/...) yang ditampilkan di dalam obrolan untuk pelanggan — rute widget tersebut adalah halaman HTML biasa yang dimaksudkan untuk dibuka di browser, bukan titik akhir API JSON, jadi tidak didokumentasikan di sini. Berikut ini adalah titik akhir manajemen akun: memverifikasi ID restoran milik pemegang akun, lalu menambah, memperbarui, atau menghapusnya.
Zenchef
Menghubungkan restoran Zenchef memerlukan verifikasi dua langkah, sehingga pemilik akun membuktikan bahwa mereka benar-benar mengelola restoran tersebut sebelum dihubungkan ke bot: pertama, periksa apakah ID ada (tanpa mengungkapkan namanya), kemudian minta mereka mengetikkan nama restoran sendiri dan verifikasi apakah cocok.
Langkah 1 — Periksa apakah ID restoran ada
POST /appointments/zenchef-restaurants/check
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_id |
Ya | ID restoran Zenchef yang akan diperiksa. |
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" }'
Respons (200 OK):
{
"success": true,
"data": { "exists": true, "requiresNameVerification": true }
}
exists: false berarti tidak ada restoran Zenchef yang memiliki ID tersebut — tidak ada lagi yang perlu dilakukan. Dibatasi hingga 10 pemeriksaan per 5 menit per akun; melebihi batas akan mengembalikan 429.
Langkah 2 — Verifikasi nama restoran
POST /appointments/zenchef-restaurants/verify-name
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_id |
Ya | ID restoran Zenchef dari langkah 1. |
user_input_name |
Ya | Nama yang diketikkan oleh pemilik akun — dibandingkan dengan nama asli restoran di Zenchef (tidak peka terhadap huruf besar/kecil/spasi). |
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" }'
Respons (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 berarti nama tidak cocok — restaurantDetails dihilangkan, minta pemilik akun untuk mencoba lagi. Dibatasi hingga 3 percobaan per 5 menit (lebih ketat daripada pemeriksaan keberadaan, karena ini adalah langkah pembuktian yang sebenarnya). restaurant_id yang tidak lagi dapat diselesaikan di Zenchef akan mengembalikan 404.
Langkah 3 — Simpan restoran
POST /appointments/zenchef-restaurants
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_id |
Ya | 1–64 karakter, huruf/angka/garis bawah/tanda hubung. |
restaurant_name |
Ya | Nama restoran terverifikasi dari langkah 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" }'
Respons (201 Created):
{ "success": true, "data": { "restaurantId": "12345" } }
Perbarui restoran Zenchef yang disimpan
PUT /appointments/zenchef-restaurants/{restaurantId}
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_name |
Tidak | Nama tampilan baru. |
is_active |
Tidak | Atur false untuk menghentikan bot agar tidak melakukan pemesanan pada restoran ini tanpa menghapusnya. |
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 }'
Respons (200 OK): bentuk yang sama seperti respons simpan di atas.
Hapus restoran 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"
Respons (200 OK): { "success": true, "data": { "restaurantId": "12345" } }
restaurantId yang saat ini tidak ada di akun akan mengembalikan 404 saat diperbarui atau dihapus.
Formitable
Formitable tidak memerlukan bukti nama dua langkah seperti Zenchef — ID restorannya sudah dicakup per bisnis, jadi satu panggilan verifikasi sudah cukup. Formitable juga memiliki pencarian detail yang digunakan untuk menyimpan URL situs web restoran selama penyiapan.
Verifikasi ID restoran
POST /appointments/formitable-restaurants/verify
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_id |
Ya | ID restoran Formitable. |
language |
Tidak | Tag bahasa untuk permintaan probe. Defaultnya adalah "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" }'
Respons (200 OK):
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "the-blue-door",
"productCount": 4,
"sampleProductTitle": "Dinner for two",
"language": "en"
}
}
}
restaurant_id yang tidak dikenali oleh Formitable akan mengembalikan 404. Dibatasi hingga 10 percobaan per 5 menit per akun.
Dapatkan detail restoran
GET /appointments/formitable-restaurants/{restaurantId}/details?language=en
Mengambil profil publik restoran dari Formitable, termasuk situs webnya — digunakan untuk menyimpan URL situs web saat menyiapkan restoran. language adalah parameter kueri opsional, dengan default "en".
curl "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door/details?language=en" \
-H "X-API-Key: YOUR_API_KEY"
Respons (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"
}
}
Simpan restoran
POST /appointments/formitable-restaurants
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_id |
Ya | 1–64 karakter, huruf/angka/garis bawah/tanda hubung. |
restaurant_name |
Ya | Nama tampilan. |
language |
Ya | Tag bahasa ISO, contoh "en" atau "en-GB". |
website_url |
Tidak | Situs web restoran, dari pencarian detail di atas. Harus berupa 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"
}'
Respons (201 Created): { "success": true, "data": { "restaurantId": "the-blue-door" } }
Perbarui restoran Formitable yang disimpan
PUT /appointments/formitable-restaurants/{restaurantId}
| Bidang | Wajib | Deskripsi |
|---|---|---|
restaurant_name |
Tidak | Nama tampilan baru. |
language |
Tidak | Tag bahasa ISO baru. |
is_active |
Tidak | Atur false untuk menghentikan bot agar tidak melakukan pemesanan pada restoran ini tanpa menghapusnya. |
website_url |
Tidak | URL situs web baru. |
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 }'
Respons (200 OK): bentuk yang sama seperti respons simpan di atas.
Hapus restoran 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"
Respons (200 OK): { "success": true, "data": { "restaurantId": "the-blue-door" } }
restaurantId yang saat ini tidak ada di akun akan mengembalikan 404 saat diperbarui atau dihapus.
Bentuk kesalahan pada semua endpoint Zenchef/Formitable: tidak seperti bagian lain di halaman ini, kesalahan di sini membawa statusnya dua kali — sekali sebagai status HTTP dan sekali sebagai
error_codedi dalam isi — contohnya{ "success": false, "error": "Restaurant not found", "error_code": 404 }. Tangani dengan cara yang sama seperti kesalahan lainnya: periksasuccess, bacaerroruntuk pesannya.
Kesalahan API Janji Temu
Endpoint janji temu mengembalikan amplop kesalahan standar:
{
"success": false,
"error": "Appointment not found"
}
| Status | Kapan ini terjadi pada endpoint janji temu |
|---|---|
400 |
Bidang yang diperlukan tidak ada atau tidak valid — contohnya start_time yang buruk, end_time yang tidak setelah start_time, kombinasi filter yang tidak valid, tidak ada bidang untuk diperbarui, atau janji temu yang sudah dibatalkan. |
404 |
Janji temu, kontak, atau jenis acara tidak ditemukan. |
409 |
Slot waktu yang diminta sudah terisi (konflik pemesanan). |
Kode bersama yang dapat dikembalikan oleh setiap endpoint — 401, 403 (paket Anda tidak menyertakan akses API), 429 (batas kecepatan) dan 500 — tercantum beserta panduan percobaan ulang di Kesalahan & Penomoran Halaman.
Langkah berikutnya
- Kontak — buat dan cari kontak yang Anda buatkan pemesanannya.
- Pesan & Percakapan — kirim konfirmasi atau pengingat kepada kontak.
- Webhook — dapatkan pemberitahuan saat janji temu berubah.