Skip to main content
このページでは、コンテキストターゲティングAPIのエラーレスポンス、一括リクエストの結果の返し方、安全な再試行の方法、リクエストに適用される上限について説明します。

エラーレスポンス

失敗したリクエストには、HTTPのエラーステータスと、次のいずれかの形式のJSONボディが返されます。エラーはmessageの文言ではなく、HTTPステータスとerrorCodeで判別してください。

検証エラー

リクエストが処理の前に拒否された場合のエラーです。フィールドの不足や無効な値、ルールに反する名前やコンテキストID、定義されていないフィールド(作成リクエストの_idなど)、リクエストあたりの上限の超過が原因です。一括リクエストも含め、リクエストの内容は何も反映されません。 messageは、見つかったすべての問題を並べた配列です。
パスのIDが有効なULIDでない場合や、ボディが有効なJSONでない場合は、messageが1つの文字列になります。

ビジネスエラー

リクエストの形式は正しいものの、サーバーが処理できない場合のエラーです。たとえば、名前がすでに使われている場合や、ターゲティングが存在しない場合です。 別のコンテキストターゲティングがすでに使っている名前でターゲティングを作成した場合のレスポンスは、次のとおりです。
単一項目のエンドポイントは、その項目のエラーをそのままレスポンスとして返します。予期しないエラーで項目が失敗した場合は、代わりに502を返します。一括操作のエンドポイントは、項目ごとのエラーをresultsで返します。一括操作のレスポンスを参照してください。

認証エラーと権限エラー

401は、x-api-keyヘッダーがないか、キーが無効または廃棄済みであることを示します。403は、エンドポイントに必要なスコープをキーが持っていないことを示します。

リクエストボディのサイズ超過

413は、リクエストボディが8 MBを超えていることを示します。何も反映されません。

サーバーエラー

502は一時的なサーバーの問題でリクエストを完了できなかったことを、500は予期しないサーバーエラーを示します。どちらの場合も、リクエストが反映されている場合と、反映されていない場合があります。messageの文言は変わることがあります。再試行と重複リクエストを参照してください。

エラーコード

ステータス別のエラー

次のエラーにはerrorCodeがありません。

エラーコード別のエラー

TARGETING_CATEGORY_NOT_SUPPORTEDは、次の場合に発生します。
  • オプショングループに、下位オプションも自身のコンテキストIDもない場合
  • type: "atomic"と一緒にchildrenを送信した場合、または通常のオプションにexposeChildrenを送信した場合
  • オプションの追加で、parentをtype: "collection"、children、exposeChildrenのいずれかと一緒に送信した場合
  • parentが、最上位のオプショングループではないオプションを指している場合
  • 更新でオプショングループにparentを送信した場合。オプショングループは移動できません。
  • 移動、切り離し、削除によって、自身のコンテキストIDを持たないオプショングループから最後の下位オプションがなくなる場合
  • 更新によって、下位オプションを持たないオプショングループのコンテキストIDがすべてなくなる場合
  • オプション一覧の取得のparentクエリパラメータが、通常のオプションを指している場合
  • オプションが、APIで変更できない形式で保存されている場合(別のオプショングループの中にあるオプショングループなど)

detailフィールド


一括操作のレスポンス

POST /context-targeting/bulk/createやPOST /context-targeting/category/bulk/updateなどの一括操作のエンドポイントは、項目ごとに結果を返します。

レスポンスのフィールド

レスポンスのステータス

一括リクエストが処理されると、一部またはすべての項目が失敗した場合でも200が返されます。failed、または各項目のsuccessを確認してください。 次の場合は、リクエスト全体がresultsなしで失敗し、何も反映されません。
  • 400の検証エラー。たとえば、項目が多すぎる場合、コンテキストIDが合計10,000個を超える場合、オプションの一括更新に同じ_idが2回含まれる場合です。
  • オプションの一括削除での400 TARGETING_CATEGORY_TREE_ITEMS_LIMIT_EXCEEDED
  • 401、403、413
  • 404 PROJECT_NOT_FOUND
  • 409 CONTEXT_TARGETING_WRITE_IN_PROGRESS
500または502のレスポンスにもresultsは含まれませんが、この場合はリクエストが反映されている場合と、反映されていない場合があります。

項目の反映方法

  • オプションの一括更新は項目を並行して反映しますが、resultsはリクエストの順序どおりに並びます。1つのオプションへの変更は、すべて1つの項目にまとめてください。同じ_idが2回含まれると、リクエスト全体が拒否されます。
  • 名前変更または更新のリクエストでは、前の項目が名前を変更して空けた名前を、後の項目で使えます。前の項目が失敗した場合、後の項目は名前重複エラーで失敗します。

例

1つ目の項目は Sports にコンテキストIDを追加します。2つ目の項目は Tech の名前を、すでに使われている Sports に変更しようとします。
レスポンスのステータスは200です。

同時書き込み

API書き込みは、プロジェクトごとに1件ずつ処理されます。対象は、単一項目か一括かを問わず、プロジェクトのどのAPIキーから送信したものも含め、コンテキストターゲティングAPIのすべてのPOST、PATCH、DELETEリクエストです。GETリクエストは影響を受けず、異なるプロジェクトの書き込みどうしが互いを待つこともありません。 プロジェクトで別の書き込みを処理している間に書き込みが届くと、サーバーはその処理が終わるのを少しの間待ちます。それでも処理が続いている場合、リクエストは409 CONTEXT_TARGETING_WRITE_IN_PROGRESSで失敗し、リクエストの内容は何も反映されません。一括リクエストは、resultsなしで全体が失敗します。
このエラーには、次のように対処します。
  1. detail.retryAfterMsミリ秒待ちます。値は0〜2,000です。
  2. 同じリクエストを再送します。再び409が返された場合は、これを繰り返します。
プロジェクトへの書き込みは順番に送信してください。1つのリクエストのレスポンスを受け取ってから、次のリクエストを送信します。複数のプロセスやワーカーが同じプロジェクトに書き込む場合は、それぞれが409を受け取ったときに再試行するようにしてください。
まれに、処理が異常に長引いたリクエストの途中で、書き込みの順番が別のリクエストに移ることがあります。その場合、最初のリクエストがまだ反映していなかった項目は、resultsの中で、または単一項目のエンドポイントのレスポンスとして、同じ409で失敗します。このエラーになった項目は反映されていないため、それらの項目だけを再送してください。

再試行と重複リクエスト

リクエストがタイムアウトした場合や、502などの5xxステータスが返された場合は、リクエストが反映されたかどうかがわからないことがあります。サーバーが元のリクエストをまだ処理している可能性もあります。少し待ってから、同じリクエストを再送してください。元のリクエストがまだ処理中の場合、再送したリクエストは409 CONTEXT_TARGETING_WRITE_IN_PROGRESSで失敗します。少し待ってから、もう一度送信してください。 すでに成功していたリクエストを再送した場合の結果は、操作によって異なります。

作成リクエストの再送

IDは常にサーバーが生成し、作成リクエストに_idを含めると400で失敗します。すでに成功していた作成を再送した場合は、項目をもう一度作成するのではなく、409レスポンスに含まれるIDを使ってください。
  • ターゲティング:409 TARGETING_NAME_DUPLICATEが返されます。detail.existingIdがそのターゲティングのIDです。オプションのIDを取得するには、ターゲティングの取得を参照してください。
  • オプション:409 TARGETING_CATEGORY_NAME_DUPLICATEが返されます。detail.existingIdsに、その名前を持つオプションのIDが入ります。
  • 一括作成では、元のリクエストで作成された項目だけがこのように失敗します。ほかの項目は通常どおり処理されます。
detail.existingIdは、既存のターゲティングがコンテキストターゲティングの場合にのみ含まれます。オーディエンスターゲティングがその名前を使っている場合は、別の名前を選んでください。同じリクエストの中で名前が重複している場合は、代わりにdetail.duplicateOfIndexが返されます。その場合はリクエストを修正してください。 API書き込みはプロジェクトごとに1件ずつ処理されるため、同じ作成リクエストを同時に2件送信しても、両方で作成されることはありません。後のリクエストは、名前重複エラーまたは409 CONTEXT_TARGETING_WRITE_IN_PROGRESSで失敗します。

500または502が返された場合

  • 作成または削除の一括リクエストのresultsに500 UNCATCHEDがある場合:リクエストの内容は何も反映されていません。同じリクエストを再送してください。
  • 更新の一括リクエストのresultsに500 UNCATCHEDがある場合:その項目は失敗しています。その項目を再送してください。
  • 500または502のレスポンスが返された場合:リクエストが反映されている場合と、反映されていない場合があります。同じリクエストを再送し、その結果を上の表に従って扱ってください。
addとremoveの両方を含むオプションの更新が失敗した場合でも、addはすでに反映されていることがあります。同じ更新を再送しても問題ありません。

上限

  • 保存データの上限(オプションあたり、プロジェクトあたり、ターゲティングあたり、広告商品あたり)は、変更によって量が増える場合にのみ確認されます。コンテキストIDの削除など量を減らす変更は、データがすでに上限を超えていてもブロックされません。
  • 1回のリクエストに収まらない量をアップロードするには、これらの上限内のリクエストに分割し、1件ずつ順番に送信してください。たとえば、数万個のオプションは、1回あたり最大5,000項目のオプション一括追加リクエストに分けて追加します。
  • コンテキストIDが10,000個を超えるオプションのコンテキストIDを置き換える方法は、コンテキストIDの更新方法を参照してください。
  • リクエストボディを小さく保つため、韓国語の名前やコンテキストIDなどの非ASCII文字は、UTF-8のまま送信してください。

名前のルール

ターゲティング名とオプション名(オプショングループと下位オプションを含む)には、次のルールが適用されます。
  • 日本語や中国語の文字、_、.、括弧など、それ以外の文字は使用できません。
  • 1つのリクエストの中で繰り返される名前も、重複として扱われます。detailフィールドのduplicateOfIndexを参照してください。
  • 現在の名前への変更は、エラーになりません。
  • 異なるターゲティングのオプションには、同じ名前を付けられます。

コンソールと併用する場合

  • 同じデータ:コンソールとAPIは、同じコンテキストターゲティングを管理します。APIで作成したターゲティングとオプションはコンソールに表示され、コンソールで作成したものもAPIで取得できます。
  • コンテキストターゲティングのみ:オーディエンスターゲティングへのリクエストは404 TARGETING_NOT_FOUNDで、そのオプションへのリクエストは404 TARGETING_CATEGORY_NOT_FOUNDで失敗します。ただし、オーディエンスターゲティングの名前も名前の一意性の判定に含まれるため、同じ名前のコンテキストターゲティングを作成すると、detail.existingIdのない409 TARGETING_NAME_DUPLICATEで失敗します。
  • コンソールでの編集は順番待ちの対象外:1件ずつの処理が適用されるのは、API書き込みだけです。コンソールでの編集はAPI書き込みを待たず、409 CONTEXT_TARGETING_WRITE_IN_PROGRESSの原因にもならず、API書き込みもコンソールでの編集を待ちません。
  • 同時の変更による競合:コンソールとAPIが同じターゲティングを同時に変更すると、後から保存された変更が先の変更を上書きしたり、2つのターゲティングまたはオプションが同じ名前になったりすることがあります。自社のシステムがAPIでターゲティングに書き込んでいる間は、コンソールでそのターゲティングを編集しないでください。コンソールで変更された可能性がある場合は、書き込む前にターゲティングを取得し直してください。
  • 名前の重複:2つのターゲティングまたはオプションが同じ名前になった場合は、どちらかの名前を変更するか、どちらかを削除してください。オプションを削除する前に、広告商品とキャンペーンへの影響を確認してください。
  • 広告商品の設定:広告商品で 必須含む または 必須除外 に設定するオプションを変更するには、コンソールを使用してください。ターゲティングの販売を参照してください。