楽天APIが新しくなるので色々修正変更した話【2026年2月】
楽天ウェブサービスのAPI(以下 楽天API と記述)が新しいドメインに移行するようです。2026年2月10日にお知らせが公開されていました。
また、楽天市場APIなどの旧バージョンが廃止になるようです。
今回は最新のAPIに対応するために行った作業等について備忘録を書いていこうと思います。
私は2/16に楽天APIの操作をしていてお知らせに気付いたのですが、Xで検索するとRakuten Developerからメールが届いた方もいるようですね。私には届いていなかった…なぜ… その時はアプリIDのシークレットキーを変更しようとして管理画面から編集しようとしていたのですが、何故か編集ボタンが押せなくなっていて、「マニュアルには編集できると書いてあるのに何故?」と調べ始めてお知らせに気付きました。 案内を読んでいくと「新しいアプリIDの登録が必要」とのこと。 新しい認証システムへの更新: 強化されたセキュリティシステムを導入します。これに伴い、既存のAPIキーは全て非推奨となります。 新しい認証情報を取得するため、アプリを再登録していただく必要があります。 シークレットキーを変更したかったのでちょうど良いタイミングでした。早速新しいアプリIDを登録。登録する際に入力する項目が増えている気がしましたが、特に問題なく完了しました。 .envファイルにアプリIDとアフィリエイトIDを記載していたので、それらの値を変更しました。 また、入力パラメーターで新しく アクセスキー(accessKey) という値を使うようになったので、その値を追記しました。 楽天商品検索APIの詳細ページに載っていたのですが、この↓ページに記載されているリクエストURLは旧パージョンのままですね…(2026/2/17現在) 新しいリクエストURLは、以下の「openapi.rakuten.co.jp」ドメインのものなので、これに変更します。 https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601? 一応APIテストフォームで確認できるので、そちらのURLも貼っておきます。 これが今回一番苦戦したところです。 先程記載したAPIの詳細ページに「入力ヘッダー」という項目が追加されていました。 アクセスキートークン:Authorization HTTPヘッダーの形式はBearer {アクセスキー}です どうすれば良いのか分からなかったのでGeminiに聞いてコードを修正したのですが… 『”ヘッダーまたはパラメータとして指定できます”と書いてあるので、パラメータにアクセスキーを設定すれば良い』というGeminiの助言を頼りに修正したのですが、以下の403エラーが出てしまいました。 REQUEST_CONTEXT_BODY_HTTP_REFERRER_MISSING リクエストに「Referer」を設定すれば良いのかなと思い試行錯誤していたのですが解決せず… エラーコードで検索したら以下のサイト様を発見しました。 「Referer」じゃなくて「Origin」!? これについてもGeminiに聞いてみると以下の回答でした。 エラーメッセージには「REFERRER(リファラー)」と出ていますが、なぜ「Origin(オリジン)」で解決したのか、その違いをざっくりと整理します。 Referer(リファラー):手紙の「詳しい差出人住所」です。 例:https://test.com/test/page.php (どのページの、どのURLから来たかまで詳細に送る) Origin(オリジン):手紙の「差出人の会社名(大枠のサイト名)」です。 例:https://test.com (ドメイン部分だけを送る) 最近のWebセキュリティの潮流では、プライバシー保護の観点から「どのページ(Referer)から来たか」という細かい情報より、「どのサイト(Origin)から来たか」という大枠のドメイン情報を使って身元確認を行うことが主流になっています。楽天APIの新しいシステムも、この「Origin」を強く確認する仕様になっていると考えられます。 なるほどー! 早速 Origin に変更したところ無事動作しました。 ということで完成したコードがこちら↓ BASE_URL はローカル環境にも対応できるようにしています。また、アプリID登録時の「許可されたWebサイト」にもローカル環境でのドメインを登録しておきました。 ちなみに入力パラメーターにアクセスキーが無いと400エラーがでました。アプリIDとアクセスキーはセットで必須のようです。詳細ページを読むと「ヘッダーまたはパラメータ」どちらかに設定すれば良いような書き方に見えますが… とりあえずヘッダーには記載せずパラメータのみに記載することにしました。 本当に数日前にお知らせが出たばかりで情報も少なく、エラー解決に少し時間がかかってしまいました。 一応2026/5/13までは旧ドメイン・旧システムでも動くとのことでしたが、早めに対応できてよかったです。2026/2/10に案内が公開されていたらしい
新しいアプリIDの登録が必要
リクエストURLとパラメータの変更
「403エラー」とHTTPヘッダーの設定
ヘッダーまたはパラメータとして指定できます
アプリIDと共に必須です【楽天API詳細エラー】: {
"errors": {
"errorCode": 403,
"errorMessage": "REQUEST_CONTEXT_BODY_HTTP_REFERRER_MISSING"
}
}
完成したコード(一部抜粋)
※一部抜粋して記載しています。$query = [
'applicationId' => 'アプリID',
'accessKey' => 'アクセスキー',
'affiliateId' => 'アフィリエイトID',
'keyword' => '検索キーワード',
'hits' => 30,
'sort' => 'standard',
'imageFlag' => 1,
'availability' => 1,
'format' => 'json',
];
$fullUrl = "https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601?" . http_build_query($query);
// cURLによる通信処理(より安定した通信のため)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $fullUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$myOriginUrl = defined('BASE_URL') ? BASE_URL : 'サイトのURL';
$headers = [
'User-Agent: アプリ名',
'Origin: ' . $myOriginUrl
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200 || !$response) {
$curlError = curl_error($ch);
error_log("【楽天API詳細エラー】: " . $response);
error_log("楽天API通信エラー。HTTPコード: {$httpCode} / cURLエラー: {$curlError} / キーワード: {$keyword}");
return [];
}
// $response にJSONデータが入るので、あとは json_decode() で処理最後に
