Your AI Connector Docs

エラーとページネーション

このページでは、すべての統合で処理が必要となる2つの事項、つまり失敗したリクエストがどのようなものか、およびリストを返すエンドポイントのページネーション方法について説明します。


エラーエンベロープ

リクエストが失敗した場合、レスポンスは常に同じ形式のJSONとなります。つまり、successフラグがfalseに設定され、人間が読めるerrorメッセージが含まれ、HTTPステータスと一致する数値のerror_codeが含まれます。

{
  "success": false,
  "error": "Invalid cursor",
  "error_code": 400
}

successとerror_codeは常に存在するため、必要に応じて生のHTTPステータスコードを検査することなく、それらに基づいて分岐処理を行うことができます。成功したレスポンスには常にsuccess: trueが含まれます。


ステータスコード

ステータス error_code 意味 対処方法
200 — 成功 レスポンスデータを読み取ってください。
201 — リソース作成済み 返されたID(例: campaign_id、contactId)を保存してください。
400 400 不正なリクエスト パラメータが不足しているか、無効です。error メッセージを読み、リクエストを修正してください。
401 401 認証失敗 APIキーが不足しているか、無効です。キーを確認し、送信方法が正しいか確認してください。詳細は 認証 を参照してください。
403 403 禁止 ご利用のプランにはAPIアクセスが含まれていません。APIアクセス を確認するか、hi@youraiconnector.com までお問い合わせください。
404 404 見つかりません リソース(例: 連絡先、キャンペーン、タスクID)がアカウント内に存在しません。
409 409 競合 リソースが既に存在します。例えば、既にアカウントに登録されている電話番号を持つ連絡先を作成しようとした場合などが該当します。
429 429 レート制限 1分間に300リクエスト(またはアカウント全体で1分間に1,200リクエスト)の上限を超えました。しばらく待ってから再試行してください。
500 500 サーバーエラー 弊社側で問題が発生しました。少し待ってから再試行してください。問題が解決しない場合は hi@youraiconnector.com までメールでご連絡ください。

これらが実際にどのように表示されるかの例をいくつか示します。

{
  "success": false,
  "error_code": 401,
  "error": "Invalid API key"
}
{
  "success": false,
  "error": "A contact with this phone number already exists",
  "error_code": 409
}
{
  "success": false,
  "error_code": 429,
  "error": "Rate limit exceeded. Please try again later."
}

エラーの適切な処理

  • データを読み取る前にsuccess(またはステータスコード)を確認してください。 レスポンスボディに期待するフィールドが含まれていると想定しないでください。
  • 429と500は短いバックオフ(待機時間)を置いて再試行してください。 つまり、少し待ってから再度試してください。400、401、403、404、または409の場合は再試行しないでください。これらはリクエストを変更しない限り失敗し続けます。
  • errorメッセージを読み取ってください。 通常、どのフィールドが間違っているかが正確に示されます。

ページネーション

リストエンドポイント(GET /contacts、GET /campaigns、GET /tasksなど)は結果をページ単位で返すため、1回の呼び出しでアカウント全体を読み込む必要はありません。ページネーションには不透明なカーソルを使用します。

これを制御するクエリパラメータは2つあります。

パラメータ 説明
limit 1ページあたりに返すアイテム数。デフォルトはエンドポイントによって異なります(多くの場合50)。最大値は100です。
cursor 次のページへの不透明なポインタ。最初のページでは指定しないでください。

各ページには、レスポンス内にnext_cursorフィールドが含まれています。

  • next_cursor が文字列の場合、さらに結果が存在します。次のリクエストでそれを cursor として渡してください。
  • next_cursor が null の場合、最後のページに到達しています。終了してください。

連絡先の1ページ分は以下のようになります:

{
  "success": true,
  "contacts": [
    { "id": "abc123", "first_name": "Jane", "phone_number": "+15551234567" },
    { "id": "def456", "first_name": "John", "phone_number": "+15557654321" }
  ],
  "next_cursor": "eyJsYXN0IjoiZGVmNDU2In0"
}

注意: カーソルは不透明な値です。解析、構築、変更は行わないでください。以前のレスポンスから受け取った next_cursor 値をそのまま渡すようにしてください。


すべての連絡先をページングする

リスト全体を取得するには、カーソルなしで開始し、next_cursor が null になるまで呼び出しを続けてください。

cURL

この例では、最初の2ページを手動で辿ります。最初の呼び出しを実行し、そのレスポンスから next_cursor をコピーして CURSOR に設定し、2回目の呼び出しを実行します。next_cursor が null になるまで繰り返してください。

# First page
curl "https://api.youraiconnector.com/v1/contacts?apiKey=YOUR_API_KEY&limit=100"

# Next page — paste the next_cursor from the previous response
CURSOR="eyJsYXN0IjoiZGVmNDU2In0"
curl "https://api.youraiconnector.com/v1/contacts?apiKey=YOUR_API_KEY&limit=100&cursor=$CURSOR"

JavaScript

async function getAllContacts() {
  const all = [];
  let cursor = null;

  do {
    const url = new URL("https://api.youraiconnector.com/v1/contacts");
    url.searchParams.set("limit", "100");
    if (cursor) url.searchParams.set("cursor", cursor);

    const res = await fetch(url, {
      headers: { "X-API-Key": "YOUR_API_KEY" },
    });
    const data = await res.json();

    if (!data.success) throw new Error(data.error);

    all.push(...data.contacts);
    cursor = data.next_cursor;
  } while (cursor);

  return all;
}

Python

import requests

def get_all_contacts():
    all_contacts = []
    cursor = None

    while True:
        params = {"limit": 100}
        if cursor:
            params["cursor"] = cursor

        res = requests.get(
            "https://api.youraiconnector.com/v1/contacts",
            params=params,
            headers={"X-API-Key": "YOUR_API_KEY"},
        )
        data = res.json()

        if not data["success"]:
            raise Exception(data["error"])

        all_contacts.extend(data["contacts"])
        cursor = data["next_cursor"]

        if not cursor:
            break

    return all_contacts

同じループがすべてのページネーション対応エンドポイントで機能します。パスとレスポンスから読み取るフィールド(campaigns、tasks など)を変更するだけです。


次のステップ

  • 認証 — キーを送信する4つの方法。
  • 連絡先 — 上記の例で使用されている完全な連絡先エンドポイント。
  • APIキー — 429 を回避するために、現在のレート制限の使用状況を確認してください。