【2026年3月最新】楽天API新仕様の完全移行ガイド

AI業務効率化

※ この記事にはアフィリエイトリンクが含まれています。リンク経由で購入しても読者の皆さんに追加費用は発生しません。収益は本サイトの運営費に充てています。

2026年2月10日、楽天ウェブサービスのAPIが全面刷新されました。エンドポイントのドメイン、認証方式、必須ヘッダーがすべて変更され、旧APIは2026年5月13日に完全停止します。この記事では、旧仕様から新仕様への変更点と移行手順を、TypeScriptの実装例付きで解説します。

こんな方に読んでほしい記事です:

  • 楽天APIを使っていたら突然動かなくなった
  • 403エラーや400エラーが出て原因が分からない
  • 新APIへの移行手順を体系的に知りたい
  • アフィリエイトサイトで楽天商品リンクを使っている

なぜ楽天APIは変わったのか

楽天ウェブサービスは「セキュリティ・パフォーマンス強化を目的としたインフラアップグレード」として、2026年2月10日に新システムへの移行を開始しました。

楽天ウェブサービストップページ(2026年3月時点)

背景として推測されるのは以下の点です。

  • セキュリティ強化:旧APIはapplicationIdだけで認証できたため、IDが漏洩すると誰でもリクエスト可能だった。新APIではaccessKeyを追加し、二重の認証に
  • 不正利用の防止Referer/Originヘッダーの必須化により、リクエスト元を特定できるように
  • パフォーマンス:ドメイン分離により、API専用のインフラで処理能力を最適化

旧API→新APIの変更点一覧

変更されたのは大きく4つです。

項目 旧仕様 新仕様(2026年2月〜)
ドメイン app.rakuten.co.jp openapi.rakuten.co.jp
パス /services/api/IchibaItem/Search/20170706 /ichibams/api/IchibaItem/Search/20220601
認証 applicationId のみ applicationId + accessKey(両方必須)
ヘッダー 不要 Referer または Origin が必須
applicationIdの形式 数字のみ UUID形式(例: 2fc160ec-26f2-...
APIバージョン 20170706 20220601
リクエスト間隔 明確な制限なし 最低1.5秒以上推奨(429エラー対策)

旧ドメイン(app.rakuten.co.jp)は2026年5月13日に完全停止します。移行期間は2026年2月10日〜5月13日。この期間は旧・新両方のシステムが稼働していますが、5月14日以降は新システムのみになります。

アプリの再登録手順(スクリーンショット付き)

新APIを使うには、アプリケーションの再登録が必要です。旧アプリのIDはそのまま使えません。

Step 1:楽天ウェブサービスにアクセス

楽天ウェブサービス(Rakuten Developers)にアクセスし、右上の「Sign In」からログインします。

Step 2:新しいアプリを作成

ログイン後、右上の「+ New App」をクリックします。

楽天ウェブサービス管理画面。右上にNew Appボタンがある

以下の項目を入力します。

項目 入力内容 備考
アプリ名 任意(例: blog-automation 管理用の名前。公開されない
アプリケーションURL 自分のサイトURL 例: https://ai-fukugyo-hack.com
Allow IP address 自分のIPアドレス 動的IPの場合はxxx.xxx.0.0/16でCIDR表記

Allow IP addressは最低1つ必須です。自宅のIPが動的に変わる場合は、/16のCIDR表記でプロバイダのIP範囲を許可するのが現実的です。

Step 3:applicationIdとaccessKeyを取得

アプリ作成後、以下の2つの値が発行されます。

  • applicationId:UUID形式(例: 2fc160ec-26f2-4a04-888f-4b6eb504b0e6
  • accessKeypk_で始まる文字列

この2つが新APIの認証に必要です。旧APIではapplicationIdだけで動きましたが、新APIでは両方をリクエストに含めないと400エラーになります。

新APIのTypeScript実装例

競合記事ではPHP、Python、GAS(Google Apps Script)の実装例が多いですが、TypeScriptの実装例はほとんどありません。以下はNode.jsのネイティブfetchを使った実装です。

最小構成のリクエスト

const params = new URLSearchParams({
  applicationId: "YOUR_APP_ID",      // UUID形式
  accessKey: "YOUR_ACCESS_KEY",       // pk_で始まる
  affiliateId: "YOUR_AFFILIATE_ID",   // アフィリエイトID
  keyword: "ワイヤレスイヤホン",
  hits: "5",
  format: "json",
});

const url = `https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601?${params}`;

const res = await fetch(url, {
  headers: {
    Referer: "https://your-site.com",  // 必須!
  },
});

const data = await res.json();
console.log(data.Items[0].Item.itemName);

ポイントは3つです。

  1. ドメインはopenapi.rakuten.co.jpapp.rakuten.co.jpではない
  2. パスは/ichibams/api//services/api/ではない
  3. Refererヘッダーが必須:これがないと403エラーになる

旧→新の書き換え例

// ❌ 旧API(2026年5月13日に停止)
const oldUrl = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706"
  + "?applicationId=123456789"
  + "&keyword=TypeScript";

// ✅ 新API
const newUrl = "https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601"
  + "?applicationId=2fc160ec-26f2-4a04-888f-4b6eb504b0e6"
  + "&accessKey=pk_VRRfvEWJXXT3..."
  + "&keyword=TypeScript";

// ✅ Refererヘッダーも追加
const res = await fetch(newUrl, {
  headers: { Referer: "https://your-site.com" },
});

アフィリエイトリンク付きで商品情報を取得する完全な例

interface RakutenItem {
  name: string;
  price: number;
  url: string;       // アフィリエイトリンク付きURL
  imageUrl: string;
  shopName: string;
}

async function searchRakuten(keyword: string): Promise<RakutenItem[]> {
  const params = new URLSearchParams({
    applicationId: process.env.RAKUTEN_APP_ID!,
    accessKey: process.env.RAKUTEN_ACCESS_KEY!,
    affiliateId: process.env.RAKUTEN_AFFILIATE_ID!,
    keyword,
    hits: "5",
    sort: "-reviewAverage",
    format: "json",
  });

  const url = `https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601?${params}`;

  const res = await fetch(url, {
    headers: {
      Referer: process.env.SITE_URL || "https://your-site.com",
    },
  });

  if (!res.ok) {
    throw new Error(`楽天API エラー: ${res.status} ${await res.text()}`);
  }

  const data = await res.json();

  return data.Items.map((item: any) => ({
    name: item.Item.itemName,
    price: item.Item.itemPrice,
    url: item.Item.affiliateUrl || item.Item.itemUrl,
    imageUrl: item.Item.mediumImageUrls?.[0]?.imageUrl || "",
    shopName: item.Item.shopName,
  }));
}

affiliateIdをパラメータに含めると、レスポンスのaffiliateUrlフィールドにアフィリエイトリンク付きURLが自動生成されます。これを記事やブログに埋め込めば、楽天アフィリエイトの収益化が可能です。

ハマりやすいエラー3パターンと対処法

楽天市場商品検索APIのドキュメントページ

400エラー:accessKey must be present

{"errors":{"errorCode":400,"errorMessage":"accessKey must be present as a query parameter or in the header"}}

原因accessKeyパラメータが不足。applicationIdだけでは認証が通りません。

対処:クエリパラメータにaccessKey=pk_...を追加してください。

403エラー:Referer/Originが不足

{"errors":{"errorCode":403,"errorMessage":"REQUEST_CONTEXT_BODY_HTTP_REFERRER_MISSING"}}

原因:リクエストにRefererまたはOriginヘッダーがない。新APIはリクエスト元の検証を行います。

対処:HTTPヘッダーにReferer: https://your-site.comを追加。GAS(Google Apps Script)の場合はUrlFetchAppのオプションでヘッダーを明示的に設定する必要があります。

429エラー:リクエスト頻度の超過

原因:リクエスト間隔が短すぎる。新APIでは最低1.5秒以上の間隔が推奨されています。

対処:リクエスト間にawait new Promise(r => setTimeout(r, 1500))等のウェイトを入れてください。

移行チェックリスト

移行が完了しているか、以下の項目で確認してください。

# 項目 確認方法
1 アプリを再登録した 管理画面でUUID形式のapplicationIdが発行されている
2 accessKeyを取得した pk_で始まるキーが管理画面に表示されている
3 ドメインを変更した リクエスト先がopenapi.rakuten.co.jpになっている
4 パスを変更した /ichibams/api/になっている(/services/api/ではない)
5 APIバージョンを更新した 20220601になっている(20170706ではない)
6 Referer/Originヘッダーを追加した リクエストヘッダーに自分のサイトURLが含まれている
7 accessKeyをパラメータに追加した クエリパラメータにaccessKey=pk_...が含まれている
8 リクエスト間隔を1.5秒以上空けた 連続リクエスト時にウェイトが入っている
9 Allow IP addressを設定した 管理画面でIPアドレスまたはCIDRが登録されている
10 新APIで正常にレスポンスが返る 商品データがJSON形式で返ってくる

アフィリエイター向け:楽天商品リンクへの影響

楽天アフィリエイトを利用しているブロガー・アフィリエイターにとって重要な点を整理します。

影響を受けるケース

  • 自前でAPIを叩いて商品リンクを生成している場合:ドメイン・パス・認証の変更対応が必要
  • GASやPythonスクリプトで商品情報を自動取得している場合:同上
  • WordPressプラグイン(Rinker、ポチップ等)を使っている場合:プラグイン側のアップデートで対応される可能性が高いが、アプリの再登録とキーの再設定は必要

影響を受けないケース

  • 楽天アフィリエイトの管理画面から直接リンクを取得している場合:APIを使っていないので影響なし
  • もしもアフィリエイト経由で楽天商品リンクを使っている場合:もしも側のシステムが対応するため、ユーザー側の対応は不要の可能性が高い(ただしもしも側の告知は確認すべき)

僕の対応

ブログの自動化パイプラインで楽天APIを使って商品リンクを自動生成しているため、今回の移行対応は必須でした。TypeScriptでの実装を新仕様に書き換え、accessKeyRefererヘッダーを追加して動作確認済みです。

楽天API関連の参考資料

楽天ウェブサービス利用ガイドページ

関連書籍

まとめ:5月13日までに対応必須

2026年5月13日を過ぎると旧APIは完全に停止します。楽天APIを使っているすべてのサービス・スクリプト・プラグインが影響を受けます。

対応は以下の3ステップです。

  1. アプリを再登録して新しいapplicationIdaccessKeyを取得
  2. エンドポイントを変更(ドメイン + パス + APIバージョン)
  3. Refererヘッダーを追加してリクエスト

移行チェックリストの10項目を確認すれば、対応漏れは防げるはずです。この記事が移行作業の参考になれば嬉しいです。

進展があればまたこのブログで報告します。

コメント

タイトルとURLをコピーしました