Marketing Cloud Engagement の Web API 利用を安定運用するための留意点を解説します。散発的に発生しうる一時的なエラーに備える自動リトライの重要性や、各種タイムアウト調整、ログ取得、問い合わせ時に必要な情報など、API を安定稼働させるための方法について記載します。
本ドキュメントでは、Marketing Cloud Engagement の API 連携を安定的に実行するための設計指針をまとめました。
API リクエストに対して、一時的なエラー(主にHTTP Status Code が 500や 429 など)が応答される場合があります。その要因は API サービスの一時的な負荷などに加え、インターネット経路上の問題などさまざまですが、実際の利用では少なからず一時的なエラーは不可避で必ず不定期的に遭遇します。そのため、一時的なエラーが発生することをあらかじめ想定しておき、リトライの仕組みを実装する必要があります。
具体的には API リクエストを発行するアプリケーションで、想定しうるエラーハンドリングの処理を追加します。そして、500番台のエラーが発生したときに適切な回数・タイミングで API リクエストのリトライを自動で行う仕組みを実装します。このときリクエストを再送する際には、前後の処理を含め二重で処理実行してしまわないか、想定した結果から変わってしまわないかと言った観点でのハンドリングが不可欠です。
一方で、400 Bad Request や 401 Unauthorized といった、クライアント側のリクエスト内容に問題があるケースでは、何度リトライしても基本的に成功することはありません。この場合は自動リトライを停止し、エラーメッセージを元にリクエスト内容を修正した上で再送してください。
APIリクエストがエラーとなった際の原因調査を迅速かつ正確に行うため、APIクライアント側で詳細な通信ログを記録する設計にしてください。ただし、セキュリティとプライバシー保護の観点から、残すべき情報と残してはいけない情報を明確に区別する必要があります。
ログに記録すべき情報(極力割愛せずに残す)
実行日時、HTTPメソッド、リクエストURL、HTTPステータスコード
リクエストおよびレスポンスの「ヘッダー」と「ボディ」(ただし個人情報を除いたもの)
ログに記録してはいけない情報(マスキング必須)
以下の情報がログに平文で残ると、不正アクセスや情報漏洩のリスクを招きます。必ずログ出力前にマスキング(*** などで置換)やハッシュ化を実施してください。お問合せ時にも含まれないようにご注意ください。
アクセストークン、クライアントシークレットなどの認証情報
個人情報(メールアドレス、電話番号、氏名などの値)
400番台エラー発生時の対応とサポート起票について
400 Bad Request などの400番台のエラーは、リクエスト内容に問題があることを示唆しています。まずはレスポンスボディ内に示されるエラー詳細を参照し、参考情報:API Errorsをもとにリクエスト内容を精査してください。
もしリクエストに問題が見受けられず、当社サポートへ調査を依頼される場合は、秘密情報をマスキングした上で、リクエスト/レスポンスのすべてのデータをご提供ください。
※独自のアプリケーションログや、過度に加工・割愛された情報のみをご提供いただいた場合、MCE側の正確な挙動が把握できず、適切な見解や解決策をご提示できない可能性があります。
1 つの処理を実行するたびにトークンの取得 (POST /v2/token) を行うと、リクエスト数が単純に約 2 倍になり全体のリクエスト数を無駄に増加させる原因となります。リクエスト数が多いと、一時的なエラーやリクエスト制限に抵触しやすくなります。当社APIのアクセストークンは 20 分の有効期限 があるため、取得したトークンを有効期限内で可能な限り再利用することを検討します。
クライアントシークレットは生成から180日で失効します。計画的に更新するため、利用箇所(サーバー、SSJS等)、インストール済みパッケージ名、有効期限などを整理・管理し、定期的な更新を計画してください。
また、クライアントシークレットをコード内に直接記述すると、MCE管理者やAPIアプリケーション開発者や管理者への露出、シークレット更新時の修正漏れなどのリスクがあります。アプリなら設定ファイルや管理サービス、SSJSならDE上に暗号化した値で格納して参照するなどの管理方法を検討してください。
ブラウザやモバイルアプリ端末から直接 API を実行する構成は、以下例のような問題を伴うため、原則として「サーバーを中継する構成」を強く推奨します。
・セキュリティ : API を実行するための認証情報(クライアントIDやシークレット)をアプリ側に保持させることは、悪意のある第三者による「なりすまし」や「不正利用」のターゲットとなる高いリスクを伴います。一度アプリに埋め込まれたこれらの情報は容易に抽出でき、お客様側で完全に制御・隠蔽することは困難です。
・保守性の低下 : 当社APIの変更やバージョンアップが必要になった際、全てのユーザーに対してアプリのアップデートを強制しなければならず、移行完了までに多大な時間とコストを要します。この問題に対し、中継サーバーを介在させることでAPIの変更をサーバー側で吸収することが可能となり、クライアント側に依存しない柔軟なシステム改修を実現できます。また、Client Secret が180日で失効するという制約があり、クライアントが直接シークレットを保持する仕組みを一度採用してしまうと、モバイルユーザーは常に有効なシークレットを含む最新バージョンへ更新し続けなければなりません。これは、アプリ提供者側におけるリリース管理の煩雑化を招くだけでなく、エンドユーザーに対しても継続的なアップデートを強いることになります。
・エンドユーザー体験(UX)への悪影響 : ネットワークの瞬断や API サービス側のメンテナンス時に、端末から直接リクエストしていると、画面のフリーズや不整合なデータ表示が直接発生する可能性もあります。中継サーバー側でキャッシュの利用や、エラー時の代替表示の制御を行うことで、エンドユーザーへの影響を最小限に抑えることが可能です。
システム全体の安定稼働を維持するため、特定のアカウントから短期間に大量のリクエストが行われた場合、API は HTTP 429 Too Many Requests エラーを返し、一時的にリクエストを制限(スロットリング)します。この場合、以下を参考に可能な限り安定的な利用を検討します。
Retry-After ヘッダーを遵守する : 429 エラーが返された場合、レスポンスヘッダーに含まれる Retry-After の値(秒数)があるか確認してください。この時間を無視して即座にリトライを繰り返すと、繰り返し 429 が返される場合があります。
トラフィックの平準化(ピークの分散) API 制限のしきい値は動的です。全体の流量が上限以内であっても、特定の一瞬(例:毎時 00 分 00 秒など)にリクエストが集中するスパイクが発生すると、制限の対象となりやすくなります。処理の開始時間を意図的にずらすなどして負荷を平準化できないか検討します。
リクエスト回数の削減(バッチ化) :前述のアクセストークンを毎回取得しないことに加えて、可能なものについては一斉に送信できないか検討します。(例:Send email message to multiple recipients で複数の受信者を一括で送信するなど)
そのほか、下記のベストプラクティスもあわせて参照してください
Title : Prevent Rate-Limiting
API リクエストのエラーに関して当社サポートへ調査をご依頼(ケース起票)される際は、迅速かつ正確な原因特定のため、以下の情報をご提供ください。 複数回発生している場合は、同じエラーの代表的なものを 2〜3 件程度サンプリングしていただく形で構いません。
・リクエストの基本情報(日時・メソッド・URL)
いつ、どこに対して、どのような操作を行ったかを特定するために必要です。リクエスト日時(タイムゾーン含む)、URL、HTTPメソッドを添えてください。
・HTTP 通信ログの詳細(ヘッダー・ボディ)
リクエストとレスポンス双方の「全ヘッダー」および「ボディ」をご提供ください。これらはエラーの具体的要因(設定ミスや制限値への抵触など)を特定するための一次情報となります。
[NOTE]
・セキュリティ保護のため、アクセストークン、クライアントシークレット、個人情報は必ずマスキング(*** などで置換) やハッシュ化または削除してください。
・散発的な500 エラーの場合は後述通り、一時的な問題に起因することが多いため、直近で相対的に頻度が増えてきた場合に詳細調査の検討を推奨します。もし増加が見られる場合は、いつ頃からどの程度増加しているなどのおおよその傾向をご申告ください。
APIクライアント側で記録されたエラーの内容や発生回数と、当社(MCE)側で記録されているエラーの発生回数に差異が生じる場合があります。
【よくある例】
API クライアントでの 500 エラー記録数 = 10 回
当社(MCE)側での 500 エラー記録数 = 0 回
このようなケースでは、Point 2で触れた「貴社ネットワーク内のプロキシサーバー」や「経路上の中継機器(WAF、API Gatewayなど)」がタイムアウト等の理由で独自にエラーを発生させ、当社に到達する前に通信を遮断している可能性が極めて高いです。エラーの発生源が当社か中継機器かを見分けるため、Point 3で取得を推奨している「詳細な通信ログ」が役立ちます。例えば、レスポンスボディの形式が当社APIが返すエラーではあまりみられないような何らかのNW機器固有の情報が含まれているケースです。このような特徴が確認された場合は、当社へお問い合わせいただく前に、貴社のネットワーク管理者様へ経路上の機器のログをご確認いただくことを推奨します。
HTTP 500 エラーは、当社サービス内部の一時的な問題だけでなく、インターネット経路上の不安定な状態、中継機器の瞬断、あるいはクライアント側のタイムアウト設定など、多岐にわたる外部要因によって誘発される場合があります。
これらの中には、原因の特定が困難、あるいは特定できても対策が「再試行」以外にないケースが多く含まれます。より重要なエラーに集中して対応を優先づけできるよう、調査をご依頼いただく前に以下の基準での切り分けをお願いしております。
ネットワーク経路上の一時的な混雑など、「一定の確率で不可避に発生する」エラーです。これらは事後調査を行っても、ログに明確なエビデンスが残らず「原因特定不能」という回答に至る可能性が極めて高いものです。
発生傾向の例:
低頻度・非連続: 数分間に数リクエストのみ失敗する、または数日間に数回程度、不規則に発生する。
非再現性: 同一条件で再試行(リトライ)を実行すると正常に成功する。
本ケースへの考え方: 低頻度で散発的に発生する事象は、膨大なシステムログの中から特定の通信を追跡する作業に多大な工数を要する一方、その多くはシステム障害など MCE の恒常的な問題に起因するものではありません。 そのため、個別調査を行っても「原因特定不能」あるいは「不可避な一過性の外部要因」「局所的な過負荷」という結論に至る可能性が高く、多くのケースでは回答までにお時間をいただき、また回避策はリトライを推奨する旨のご案内となります。
推奨される対策: クライアント側アプリケーションにて、指数バックオフ等のアルゴリズムを用いた自動リトライ処理の実装を検討してください。エラーを自動回復させることで、業務影響を最小限にし、安定した利用継続が可能となります。また、個々の成否のみを断片的に追跡せず、エラー発生数の推移をモニタリングし、「以前より明らかに増加傾向にないか」「これまでみたことがないようなエラー内容が応答されていないか」といった全体的な傾向や変化に着目することを推奨します。(これにより次項のような対応を要する事象かどうかの切り分けにもつながります)
明確な異常傾向が確認され、サーバー側の問題や処理の精査によって原因を特定できる可能性が高いケースです。
発生傾向の例:
高頻度・持続性: HTTP 500 エラーの発生率が平時より明らかに上昇し、自然復旧せず継続している。
完全な再現性: 特定の操作やパラメータの組み合わせにおいて、100%(または高確率)でエラーが再現する。
本ケースへの考え方: システム側の不具合やリソースの過負荷や、APIの論理的な誤りなど恒常的な問題が疑われます。速やかに原因を特定するため、前述の"問い合わせ起票時の提供推奨情報"をもとに情報を確認のうえ調査をご依頼ください。
*本セクションに記載の一時的なネットワークの散発的なエラーは、API に限らず SFTPなど Web を経由するあらゆる通信に共通します。(SFTPに関しての記事)
*お問い合わせいただいた場合、当社が提供している API 関連のサービスの問題有無の調査が主な対象となります。
Q) リトライ方式の推奨はありますか?
A) ケースバイケースですが、試行回数のたびに徐々に実行間隔を大きくしていく(例: 3 秒後、10 秒後、60 秒後…) 指数バックオフやランダムな遅延を取り入れることを推奨します。
また429 エラーで当社サーバーから Retry-After ヘッダー(再試行までの待機秒数)が返却された場合は、ご自身で計算したバックオフ時間よりも Retry-After の値を優先し、指定された時間を待機します。
Q) リクエスト数上限やタイムアウトなどの制限について教えてください
A) 当社APIの基本的な制限事項は下記「API Limits and Guidelines」に記載されています。ただし、この制限内であっても、短期間に負荷の大きなリクエストを多数実行した場合は一時的な制限(429 Too Many Requests)がかかる場合があります。
参考1) API Limits and Guidelines
参考2) Rate Limiting Errors
Q) 429エラーが発生する具体的な「上限値」はいくつですか?
A) 固定の上限値は公開されていません。制限のしきい値は、その瞬間のシステム全体の負荷状況や、リクエストの処理内容(データベースへの負荷など)に応じて動的に変動します。そのため、通常と同程度の流量であっても状況により一時的に 429 が返される場合があります。 Point 4(トークンの再利用)や Point 7(ピークの分散)を実施しても明らかに頻発する場合は、発生状況と詳細なログを添えてサポートへお問い合わせください。
Q) API クライアントの実装方法(PythonやcURLでの書き方や設定方法)についてサポートしてもらえますか?
A) プログラミング言語や外部ツールに依存する実装・記述方法については、サポートケースでの正式回答をいたしかねます。特定の実装に依存するエラーが MCE の挙動に起因する問題と思われる場合は、切り分け結果や、実際に送信された生のHTTPリクエスト/レスポンスログを添えてお問い合わせください。
001035940

We use three kinds of cookies on our websites: required, functional, and advertising. You can choose whether functional and advertising cookies apply. Click on the different cookie categories to find out more about each category and to change the default settings.
Privacy Statement
Required cookies are necessary for basic website functionality. Some examples include: session cookies needed to transmit the website, authentication cookies, and security cookies.
Functional cookies enhance functions, performance, and services on the website. Some examples include: cookies used to analyze site traffic, cookies used for market research, and cookies used to display advertising that is not directed to a particular individual.
Advertising cookies track activity across websites in order to understand a viewer’s interests, and direct them specific marketing. Some examples include: cookies used for remarketing, or interest-based advertising.