
【Apexエラー】「Too many callouts: 101」エラーの発生原因と対処法
SalesforceのApexコードで外部APIを呼び出す際に、「Too many callouts: 101」というエラーが発生することがあります。このエラーは、1つのトランザクション内でAPIコールアウト(外部HTTPリクエスト)の回数がSalesforceの制限である101回を超えた場合 に発生します。
本記事では、このエラーの原因と、適切な回避策について詳しく解説します。
1. エラーの概要
エラーメッセージ: "System.CalloutException: Too many callouts: 101"
原因: 1つのトランザクションで 101回以上のコールアウトを実行 した
影響: 外部APIとの連携処理が失敗し、データの送受信が正常に完了しない
Salesforceのコールアウト制限
処理タイプ 制限値 1トランザクション内の最大コールアウト数 100回 1回のコールアウトの最大レスポンスサイズ 6MB(同期)/12MB(非同期)
2. エラーが発生する主な原因
① ループ内でAPIコールアウトを実行している
for ループ内で HttpRequest を繰り返し呼び出すと、すぐに制限(100回)に達してしまう。
NG例(ループ内でコールアウトを実行)
trigger AccountTrigger on Account (after insert) {
for (Account acc : Trigger.new) {
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req); // 100件のレコードがあると100回コールアウトを実行 → エラー
}
}
② 非同期処理を適切に使用していない
@future や Queueable を使用せず、同期処理で一度に大量のコールアウトを実行しようとすると制限に達する。
③ APIコールアウトのレスポンス遅延による制限超過
外部APIのレスポンス速度が遅く、トランザクションが完了しないことでリトライが繰り返される。
3. エラーを回避するための修正方法
① ループの外でAPIコールアウトを一括実行する
修正後のコード(リストを利用してコールアウトをまとめる)
public class AccountCalloutHandler {
public static void makeBatchCallout(List<Account> accounts) {
Http http = new Http();
for (Account acc : accounts) {
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');
HttpResponse res = http.send(req);
}
}
}
改善点: コールアウトをループの外で一括処理する。
② Queueable Apex を利用する(推奨)
@future ではなく Queueable Apex を使用することで、より柔軟に非同期処理を管理できる。
修正後のコード(Queueable Apexを使用)
public class CalloutQueueable implements Queueable, Database.AllowsCallouts {
public void execute(QueueableContext context) {
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
}
}
System.enqueueJob(new CalloutQueueable());
改善点: コールアウトを Queueable Apex で非同期実行し、トランザクションを分割する。
③ @future メソッドを利用する
修正後のコード(@futureメソッドで非同期処理)
public class CalloutFuture {
@future(callout=true)
public static void sendCallout(String endpoint) {
HttpRequest req = new HttpRequest();
req.setEndpoint(endpoint);
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
}
}
trigger AccountTrigger on Account (after insert) {
for (Account acc : Trigger.new) {
CalloutFuture.sendCallout('https://api.example.com/data');
}
}
@future メソッドを利用することで、同期処理ではなく 非同期処理 によってコールアウトを実行できる。
4. まとめ & Udemy・会社HPの紹介
「Too many callouts: 101」エラーは、1トランザクション内で許容される外部APIコールアウトの回数が制限(100回)を超えた場合に発生 します。ループ内でのコールアウトを回避し、Queueable Apex や @future メソッド を活用することで、エラーを回避し、システムの安定性を向上させることができます。
🔹 Salesforceの詳細を学ぶならUdemy講座がおすすめ!
📌 Salesforce初級編:フローを使いこなして自動化を極めよう
https://www.udemy.com/course/salesforceflow/?referralCode=8F97869A4A6121086B88
📌 初心者向けSalesforce管理者ガイド:魅せるレイアウトで業務効率をアップしよう!
https://www.udemy.com/course/salesforce-basics-j/?referralCode=4200CF5D86BBE3ABF2D4
🔗 HPからご相談も可能
https://effinous.com/
さらに、無料でSalesforceのチェックリストを配布しています!Udemy講座を受講する前に、ぜひ「Salesforceフローの学習ロードマップ(PDF)」をダウンロードしてください。
Salesforceの外部APIコールアウトを適切に管理し、ガバナ制限を回避することで、業務の安定性と効率を向上させましょう!