🙆‍♀️

楽天APIが突然動かなくなった話

に公開

楽天APIが突然動かなくなった話──2026年2月移行でハマった3つの罠

「昨日まで動いてたのに…」

ある日突然、楽天商品検索APIが wrong_parameter を返すようになった。

{
  "error": "wrong_parameter",
  "error_description": "specify valid applicationId"
}

アプリIDは正しいはずなのに。コードも変えていないのに。
原因を調べていくと、楽天ウェブサービスが2026年2月に大規模な移行を実施していたことがわかった。

この記事では、その移行で実際にハマった3つの罠を整理する。同じエラーで詰まっている人の時間を少しでも節約できれば幸いだ。


何が起きたか:2026年2月の移行

楽天ウェブサービスは2026年2月10日、セキュリティ・パフォーマンス強化を目的としたインフラアップグレードを実施した。

変更点は大きく3つ:

  1. APIドメインの変更app.rakuten.co.jpopenapi.rakuten.co.jp
  2. 認証システムの刷新(既存のAPIキーが非推奨、アプリの再登録が必要)
  3. 旧APIバージョンの廃止

移行期間は 2026年2月10日〜5月13日。5月14日以降は旧ドメイン・旧APIが完全停止する。

今まさにこのエラーに遭遇しているなら、まだ間に合う。


罠① エンドポイントのドメインとパスが変わった

変更内容

# 旧
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706

# 新
https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601

ドメインだけでなく、パス構造とAPIバージョンも変わっている点に注意。
/services/api//ichibams/api/ というパスの変化を見落としがちだ。

対処法

エンドポイントを上記の新URLに書き換える。バージョンも 2017070620220601 に更新すること。


罠② applicationId の形式が変わり、accessKey が追加必須になった

これが一番ハマりやすい罠だった。

変更内容

項目
applicationId の形式 数字のみ(例: 1013710578357821951 UUID形式(例: e5e2671a-b454-4e6f-xxxx-xxxxxxxxxxxx
認証に必要なパラメータ applicationId だけでOK applicationIdaccessKey両方が必須

エラーの症状

// applicationId だけ送った場合
{ "error": "wrong_parameter", "error_description": "accessKey must be present" }

// accessKey だけ送った場合
{ "error": "wrong_parameter", "error_description": "applicationId must be present" }

どちらか片方だけでは動かない。両方必要だ。

対処法

楽天Developer Dashboard(https://webservice.rakuten.co.jp/app/list)でアプリを**再登録**して新しいIDを取得する。旧アカウントで発行したIDは使えない。

取得したら両方をクエリパラメータに含める:

?applicationId=YOUR_UUID&accessKey=YOUR_ACCESS_KEY&...

罠③ GASはReferer/Originヘッダーが必須になった

GAS(Google Apps Script)から叩いている場合、ドメインと認証を直しても 403エラー が返ってくることがある。

403: REQUEST_CONTEXT_BODY_HTTP_REFERRER_MISSING

原因

新APIはブラウザからのリクエストを想定した設計になっており、Refererヘッダーが必須になった。
GASの UrlFetchApp はサーバーサイドで動作するためデフォルトではRefererを送らない。

さらに、楽天アプリ設定の「許可されたWebサイト」に呼び出し元のドメインを登録しておく必要もある。

対処法

コード側: fetchオプションにヘッダーを追加する

var response = UrlFetchApp.fetch(url, {
  muteHttpExceptions: true,
  headers: {
    'Referer': 'https://script.google.com/',
    'Origin':  'https://script.google.com'
  }
});

楽天管理画面側: アプリ設定の「許可されたWebサイト」に script.google.com を追加する。


ボーナス:レート制限も厳しくなった

新APIは旧APIより制限が厳しい。ループで複数商品を検索する場合、リクエスト間隔を1.5秒以上空けないと 429 Too Many Requests が返ってくる。

Utilities.sleep(1500); // 1000だと429になることがある

動作確認済みの最小構成(GAS)

上記3つの対処をすべて反映した最小構成コードを示す。

var APP_ID     = 'YOUR_UUID_APP_ID';
var ACCESS_KEY = 'YOUR_ACCESS_KEY';

function searchRakuten(keyword) {
  var endpoint = 'https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601';
  var params = [
    'applicationId=' + APP_ID,
    'accessKey='     + ACCESS_KEY,
    'keyword='       + encodeURIComponent(keyword),
    'hits=1',
    'sort=%2BitemPrice',
    'format=json'
  ].join('&');

  var res = UrlFetchApp.fetch(endpoint + '?' + params, {
    muteHttpExceptions: true,
    headers: {
      'Referer': 'https://script.google.com/',
      'Origin':  'https://script.google.com'
    }
  });

  var code = res.getResponseCode();
  if (code !== 200) {
    Logger.log('Error ' + code + ': ' + res.getContentText());
    return null;
  }

  var json = JSON.parse(res.getContentText());
  if (!json.Items || json.Items.length === 0) return null;

  var item = json.Items[0].Item;
  return {
    price: item.itemPrice,
    url:   item.affiliateUrl || item.itemUrl
  };
}

まとめ

症状 対処
① ドメイン変更 wrong_parameter エンドポイントを openapi.rakuten.co.jp/ichibams/api/... に変更
② 認証の二重化 accessKey must be present アプリ再登録し、UUID形式ID + accessKey の両方を送る
③ Refererヘッダー必須 403 REFERRER_MISSING fetchヘッダーに Referer/Origin を追加、管理画面で許可ドメイン登録
ボーナス 429 sleep(1500) 以上に設定

移行期限は 2026年5月13日。まだ旧APIで動いている場合も、5月14日以降は完全停止するので早めの対応を推奨する。


参考リンク

Discussion