予約
Appointments APIを使用すると、イベントタイプに基づいて連絡先の予約を登録したり、予約の取得、一覧表示、更新、キャンセル、削除を行ったりできます。また、ほとんどの予約フローで最初に発生する「実際に空いている時間はいつか」という疑問にも回答し、カレンダー側(接続済みのGoogleカレンダーの一覧表示や、既存のイベントのインポート)もカバーします。Googleカレンダーの接続が有効な場合、対応するカレンダーイベントが作成され、バックグラウンドで自動的に同期が維持されます。ZenchefやFormitableを独自の予約システムとして使用しているレストランもここで認証・接続できるため、AIエージェントは内部的な予約ではなく、実際のテーブルを予約します。
このページのすべてのパスは、ベースURL https://api.youraiconnector.com/v1 からの相対パスです。すべてのリクエストにはAPIキーが必要です。送信方法の全リストについては認証を参照してください。以下の例では X-API-Key ヘッダーを使用しており、1つのcURL例では ?apiKey= クエリ形式も示しています。
イベントと予約の違い: イベントタイプとは、予約可能なスロットの定義(会議の種類、長さ、部屋など)です。予約とは、特定の連絡先に対してイベントタイプを予約した1つのインスタンスです。連絡先とイベントタイプを参照することで予約を行います。
予約オブジェクト
予約を返す各エンドポイントは、同じ形式を使用します。
| フィールド | 説明 |
|---|---|
id |
予約の一意のID。 |
contact_id |
予約した連絡先のID。 |
event_id |
予約されたイベントタイプのID。 |
status |
Confirmed または Canceled。 |
start_time |
予約の開始日時(ISO 8601形式、UTC)。 |
end_time |
予約の終了日時(ISO 8601形式、UTC)。 |
created_at |
予約が作成された日時。 |
last_modified_at |
予約が最後に変更された日時。 |
room_name |
イベントタイプで部屋を使用している場合、予約された部屋またはリソース。 |
description |
予約の自由形式の説明。 |
summary |
短い概要またはタイトル。 |
cancelation_reason |
予約がキャンセルされた場合に提供された理由(ある場合)。 |
google_calendar_event_id |
リンクされたGoogleカレンダーイベントのID。カレンダー同期が完了すると設定されます。カレンダーが接続されていない場合や同期中の場合は null となります。 |
calendar_synced |
予約がカレンダーイベントにリンクされると true になります。 |
imported |
直接予約されたのではなく、外部カレンダーからインポートされた予約の場合に true となります。 |
is_recurring |
予約が定期的なシリーズの一部である場合に true となります。 |
recurrence_frequency |
定期的な予約の場合の繰り返し頻度。 |
recurring_event_id |
この予約が属する定期的なシリーズのID。 |
recurring_interval |
定期的な予約の場合の繰り返し間隔。 |
recurring_sequence |
定期的なシリーズ内でのこの予約の位置。 |
end_after_x_occurrences |
定期的なシリーズが終了するまでの発生回数。 |
booking_provider |
接続された予約プロバイダーを通じて予約された場合の、予約元のシステム。 |
カレンダー同期について: 予約の直後や変更直後は、同期がバックグラウンドで少し遅れて実行されるため、
google_calendar_event_idがnullのまま、calendar_syncedがfalseになっている場合があります。少し時間を置いてから予約を再度取得すると、カレンダーのフィールドが反映されていることが確認できます。
空き枠の検索
GET /appointments/available-slots
2つの時点の間で、特定のイベントタイプにおいて実際に空いている時間を返します。これは通常、予約フローにおける最初の呼び出しとなります。これらの枠を表示し、ユーザーに1つ選択してもらい、その選択された時間を予約の登録にPOSTします。
この回答には、イベントタイプ自体の営業時間と枠の長さ、部屋、すでに予約済みの予定、および接続されたGoogleカレンダーでブロックされているすべての予定がすでに考慮されています。そのため、ここで返される枠は予約可能なものとなります。
| クエリパラメータ | 必須 | 説明 |
|---|---|---|
event_id |
はい | 確認するイベントタイプ。アカウントに属している必要があります。 |
start_time |
はい | 枠を取得したい期間の開始日時(ISO 8601形式)。 |
end_time |
はい | 期間の終了日時(ISO 8601形式)。終了日全体が含まれます。 |
結果は日ごとにグループ化されて返されます。イベントタイプで部屋を使用している場合は、日ごと、かつ部屋ごとにグループ化されます。
| フィールド | 説明 |
|---|---|
date |
グループが対象とする日付(DD/MM/YYYY形式)。 |
day |
曜日の小文字表記(例: monday)。 |
room_name |
イベントタイプで部屋を使用している場合、このグループが属する部屋またはリソース。 |
available_slots |
その日の予約可能なブロック(早い順)。 |
available_slotsの各エントリには以下が含まれます。
| フィールド | 説明 |
|---|---|
start_time |
ブロックの開始時刻(HH:mm形式)。 |
end_time |
ブロックの終了時刻(HH:mm形式)。 |
available |
true — 空き時間のみが返されます。 |
spots_left |
このブロックにあと何件の予約が可能か。1つの枠で複数の予約を受け付けるイベントタイプの場合のみ表示されます。 |
時間はUTCではなく、イベントタイプのローカル時間です。
date、start_time、およびend_timeは、イベントタイプ自身のタイムゾーン(オーバーライド設定、または設定がない場合はアカウントのタイムゾーン)における時計の時刻です。予約の登録ではISO 8601形式のUTC時刻が期待されるため、選択した枠をPOSTする前に変換してください。
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"])
レスポンス (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 }
]
}
]
}
空きがない日は単純に表示されません。event_id、start_time、またはend_timeが欠落している場合は400が返されます。アカウントに存在しないイベントタイプを指定した場合は404が返されます。
予約の登録
POST /appointments
連絡先に対して、イベントタイプに基づいた新しい予約を登録します。終了時刻は、イベントタイプに設定されたスロット時間から自動的に計算されます。
予約には競合チェックが行われます。リクエストされたスロットが同じイベントタイプ上の既存の確定済み予約と重複する場合、リクエストは 409 で失敗し、何も作成されません。
| フィールド | 必須 | 説明 |
|---|---|---|
contact_id |
はい | 予約する連絡先のID。アカウントに属している必要があります。 |
event_id |
はい | 予約するイベントタイプのID。アカウントに属している必要があります。 |
start_time |
はい | 希望する開始日時(ISO 8601形式)。 |
room_name |
いいえ | イベントタイプで部屋を使用している場合の、部屋またはリソース名。 |
cURL (?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"])
レスポンス (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
}
}
予約の取得
GET /appointments/{appointmentId}
IDを指定して単一の予約を取得します。これにはカレンダーの同期状態も含まれます。
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"])
レスポンス (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
}
}
予約の一覧表示
GET /appointments
アカウントの予約を新しい順に一覧表示します。カーソルベースのページネーションを使用します。
| クエリパラメータ | 必須 | 説明 |
|---|---|---|
contact_id |
いいえ | 指定した連絡先の予約のみを返します。連絡先でフィルタリングされた一覧には確定済みの予約のみが含まれます。 |
date |
いいえ | 指定したカレンダーの日付(YYYY-MM-DD)の予約のみを返します。contact_idが必要です。 |
status |
いいえ | ConfirmedまたはCanceledでフィルタリングします。contact_idを指定していない場合のみ利用可能です。 |
limit |
いいえ | 1から100までの整数でページサイズを指定します。デフォルトは50です。 |
cursor |
いいえ | 前回のレスポンスから取得したnext_cursorの値です。 |
留意すべきいくつかのルール:
- フィルタなしの場合、アカウント上のすべての予約をページごとに取得します。
- 連絡先別 —
contact_idを設定すると、特定の連絡先の確定済み予約を表示できます。dateも併せて渡すことで、特定の日付に絞り込むことも可能です。 - ステータス別 —
statusを設定(contact_idは指定しない)すると、アカウント全体でConfirmedまたはCanceledの予約のみを一覧表示できます。 contact_idなしでのdateフィルタ、またはstatus=Canceledとcontact_idを組み合わせた場合は、400が返されます。
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"])
レスポンス (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
}
結果をページ送りするには、あるレスポンスのnext_cursorを次のリクエストのcursorとして渡します。next_cursorがnullになるまで繰り返します。共通のページネーションパターンについてはエラーとページネーションを参照してください。
予約の更新
PUT /appointments/{appointmentId}
予約の日時変更や詳細の変更を行います。変更したいフィールドのみを送信してください(少なくとも1つは必須です)。開始時刻と終了時刻を組み合わせた場合、時系列順である必要があります(end_timeはstart_timeより後である必要があります)。変更内容はリンクされたカレンダーイベントに自動的に同期されます。
| フィールド | 説明 |
|---|---|
start_time |
新しい開始日時(ISO 8601形式)。 |
end_time |
新しい終了日時(ISO 8601形式)。開始日時より後の時刻である必要があります。 |
room_name |
新しい会議室またはリソース名。 |
description |
新しい説明。クリアする場合は null を指定します。 |
summary |
新しい概要。クリアする場合は null を指定します。 |
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"])
レスポンス (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
}
}
予約のキャンセル
POST /appointments/{appointmentId}/cancel
確定済みの予約をキャンセルします(オプションで理由を記録可能)。予約はステータス Canceled としてアカウント内に保持され、リンクされているカレンダーイベントはバックグラウンドで自動的に削除されます。すでにキャンセル済みの予約をキャンセルしようとすると、400 が返されます。
| フィールド | 必須 | 説明 |
|---|---|---|
cancellation_reason |
いいえ | キャンセルの理由。予約情報に保存されます。 |
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"])
レスポンス (200 OK):
{
"success": true,
"appointment_id": "aBcD1234eFgH5678"
}
予約の削除
DELETE /appointments/{appointmentId}
予約とその参照情報を完全に削除します。記録を残したまま予約を取り消したい場合は、代わりに キャンセル を使用してください。
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"])
レスポンス (200 OK):
{
"success": true
}
接続済みGoogleカレンダーの一覧表示
GET /appointments/google-calendars
このアカウントで利用可能なGoogleカレンダーをGoogleから直接返します。これは、アカウント所有者にインポート元のカレンダーを選択させるピッカーを表示する場合や、接続が有効であることを確認する場合に便利です。
これは、アカウントが(設定 → 連携)からGoogleカレンダーに接続し、少なくとも読み取り権限が付与されている場合にのみ機能します。接続されていない場合、または付与された権限にカレンダーの読み取りスコープが含まれなくなった場合は、接続(または再接続)を促す400が返されます。
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"])
レスポンス (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"
}
]
}
各エントリはGoogle独自のCalendarListEntry形式であるため、フィールド名は本APIの一般的なsnake_caseではなく、GoogleのcamelCaseに従います。これはGoogleのデータをそのまま渡しているものであり、当社のデータではありません。接続が欠落しているか取り消されている場合は、Googleカレンダーの接続(または再接続)が必要であることを説明するエラーとともに400が返されます。
Googleカレンダーからイベントをインポートする
POST /appointments/import-calendar-events
キャンペーンまたはAIエージェントの接続済みGoogleカレンダーに既に存在するイベントを取得し、アポイントメントに変換します。これは、既に予約が入っているカレンダーを初めて接続する場合に便利です。各イベントの抽出処理(誰のための予約かを判断するため)に時間がかかる可能性があるため、インラインでは実行されません。リクエストはバックグラウンドジョブとしてキューに入れられ、ポーリング用のjob_idが返されます。
| フィールド | 必須 | 説明 |
|---|---|---|
campaign_id |
どちらか一方 | インポート元の接続済みカレンダーを持つキャンペーン。 |
agent_id |
どちらか一方 | インポート元の接続済みカレンダーを持つAIエージェント。 |
identifier |
はい | "EMAIL"または"PHONE_NUMBER" — 各カレンダーイベントから抽出して、所属する連絡先を照合または作成するために使用する連絡先情報。 |
campaign_idまたはagent_idのいずれか一方のみを送信してください。両方送信したり、どちらも送信しなかったりすると、400が返されます。送信するIDは、ご自身のアカウントに属している必要があります。そうでない場合は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"])
レスポンス (202 Accepted):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "queued",
"campaign_id": null,
"agent_id": "agent_abc123"
}
campaign_idとagent_idは送信した値をそのまま返します。もう一方は常にnullとなります。
インポートジョブをポーリングする
GET /appointments/import-calendar-events/{jobId}
curl "https://api.youraiconnector.com/v1/appointments/import-calendar-events/jK9mQ2xR7pL4wN1t" \
-H "X-API-Key: YOUR_API_KEY"
レスポンス (200 OK):
{
"success": true,
"job_id": "jK9mQ2xR7pL4wN1t",
"status": "completed",
"message": "Imported 12 events as appointments.",
"error": null
}
status |
意味 |
|---|---|
queued |
まだ処理されていません。ポーリングを続けてください。 |
processing |
インポートを実行中です。ポーリングを続けてください。 |
completed |
完了しました。messageに人間が読める形式の短い要約が含まれています。 |
failed |
何らかのエラーが発生しました。errorに理由が記載されています。 |
存在しない(または別のアカウントに属する)jobIdに対してGETを実行すると、404が返されます。
レストラン予約連携(Zenchef / Formitable)
ZenchefとFormitableは、AIエージェントが実際のテーブルを予約できるレストラン予約システムです。それぞれ、チャット内で利用者に表示される公開された認証不要の予約ウィジェット(https://api.youraiconnector.com/v1/zenchef-widget/...およびhttps://api.youraiconnector.com/v1/formitable-widget/...)を備えています。これらのウィジェットのルートはブラウザで開くことを目的としたプレーンなHTMLページであり、JSON APIエンドポイントではないため、ここでは説明しません。以下はアカウント管理用のエンドポイントです。レストランIDがアカウント所有者に属していることを確認し、追加、更新、削除を行うためのものです。
Zenchef
Zenchefレストランの接続は2段階の認証プロセスとなっており、ボットに接続する前に、アカウント所有者が実際にそのレストランを運営していることを証明する必要があります。まずIDが存在するかを確認し(名前は表示されません)、次にレストラン名を本人に入力してもらい、それが一致するかを検証します。
ステップ 1 — レストランIDの存在確認
POST /appointments/zenchef-restaurants/check
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_id |
はい | 確認するZenchefレストランID。 |
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" }'
レスポンス (200 OK):
{
"success": true,
"data": { "exists": true, "requiresNameVerification": true }
}
exists: falseは、そのIDを持つZenchefレストランが存在しないことを意味します。これ以上の操作は不要です。レート制限はアカウントごとに5分間で10回までです。これを超えると429が返されます。
ステップ 2 — レストラン名の検証
POST /appointments/zenchef-restaurants/verify-name
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_id |
はい | ステップ1で取得したZenchefレストランID。 |
user_input_name |
はい | アカウント所有者が入力した名前。Zenchef上の実際のレストラン名と照合されます(大文字小文字や空白は区別されません)。 |
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" }'
レスポンス (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は名前が一致しなかったことを意味します。restaurantDetailsは省略されるため、アカウント所有者に再試行を依頼してください。レート制限は5分間で3回までです(これが実際の証明ステップであるため、存在確認よりも厳しくなっています)。Zenchef上で解決できなくなったrestaurant_idは、404を返します。
ステップ 3 — レストランの保存
POST /appointments/zenchef-restaurants
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_id |
はい | 1〜64文字。英数字、アンダースコア、ハイフンが使用可能です。 |
restaurant_name |
はい | ステップ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" }'
レスポンス (201 Created):
{ "success": true, "data": { "restaurantId": "12345" } }
保存されたZenchefレストランの更新
PUT /appointments/zenchef-restaurants/{restaurantId}
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_name |
いいえ | 新しい表示名。 |
is_active |
いいえ | レストランを削除せずにボットによる予約を停止するには、false を設定します。 |
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 }'
レスポンス (200 OK): 上記の保存レスポンスと同じ形式。
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"
レスポンス (200 OK): { "success": true, "data": { "restaurantId": "12345" } }
アカウントに現在存在しない restaurantId を更新または削除しようとすると、404 が返されます。
Formitable
FormitableはZenchefのような2段階の名前確認を必要としません。レストランIDはすでにビジネスごとにスコープ設定されているため、1回の検証呼び出しで十分です。また、セットアップ中にレストランのウェブサイトURLをキャッシュするために使用される詳細ルックアップ機能もあります。
レストランIDの検証
POST /appointments/formitable-restaurants/verify
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_id |
はい | FormitableのレストランID。 |
language |
いいえ | プローブ要求の言語タグ。デフォルトは "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" }'
レスポンス (200 OK):
{
"success": true,
"data": {
"verified": true,
"restaurantDetails": {
"restaurantId": "the-blue-door",
"productCount": 4,
"sampleProductTitle": "Dinner for two",
"language": "en"
}
}
}
Formitableが認識できない restaurant_id は、404 を返します。レート制限は、アカウントごとに5分間で10回までです。
レストラン詳細の取得
GET /appointments/formitable-restaurants/{restaurantId}/details?language=en
Formitableからレストランの公開プロフィール(ウェブサイトを含む)を取得します。これは、レストランのセットアップ中にウェブサイトURLをキャッシュするために使用されます。language はオプションのクエリパラメータで、デフォルトは "en" です。
curl "https://api.youraiconnector.com/v1/appointments/formitable-restaurants/the-blue-door/details?language=en" \
-H "X-API-Key: YOUR_API_KEY"
レスポンス (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"
}
}
レストランを保存する
POST /appointments/formitable-restaurants
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_id |
はい | 1〜64文字。英数字、アンダースコア、ハイフンが使用可能です。 |
restaurant_name |
はい | 表示名。 |
language |
はい | ISO言語タグ(例: "en" や "en-GB")。 |
website_url |
いいえ | 上記の詳細検索で取得したレストランのウェブサイト。 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"
}'
レスポンス (201 Created): { "success": true, "data": { "restaurantId": "the-blue-door" } }
保存済みのFormitableレストランを更新する
PUT /appointments/formitable-restaurants/{restaurantId}
| フィールド | 必須 | 説明 |
|---|---|---|
restaurant_name |
いいえ | 新しい表示名。 |
language |
いいえ | 新しいISO言語タグ。 |
is_active |
いいえ | false を設定すると、レストランを削除せずにボットによる予約を停止できます。 |
website_url |
いいえ | 新しいウェブサイトURL。 |
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 }'
レスポンス (200 OK): 上記の保存レスポンスと同じ形式。
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"
レスポンス (200 OK): { "success": true, "data": { "restaurantId": "the-blue-door" } }
アカウントに現在存在しない restaurantId を更新または削除しようとすると、404 が返されます。
すべてのZenchef/Formitableエンドポイントのエラー形式: このページの他の部分とは異なり、ここでのエラーはステータスを2回保持します。1回目はHTTPステータスとして、2回目はボディ内の
error_codeとして保持されます(例:{ "success": false, "error": "Restaurant not found", "error_code": 404 })。他のエラーと同様に処理してください。successを確認し、メッセージについてはerrorを読み取ってください。
Appointments API エラー
Appointment エンドポイントは、標準的なエラーエンベロープを返します。
{
"success": false,
"error": "Appointment not found"
}
| ステータス | Appointment エンドポイントで発生する場合 |
|---|---|
400 |
必須フィールドが欠落しているか無効です。例:不正な start_time、start_time より後ではない end_time、無効なフィルターの組み合わせ、更新するフィールドがない、またはすでにキャンセル済みの予約など。 |
404 |
予約、連絡先、またはイベントタイプが見つかりませんでした。 |
409 |
要求された時間枠はすでに埋まっています(予約の競合)。 |
すべてのエンドポイントが返す共通コード(401、403(プランにAPIアクセスが含まれていない)、429(レート制限)、500)については、再試行のガイダンスと共にエラーとページネーションに記載されています。