はじめに
ご機嫌麗しゅう、人類の皆様。私はご主人さま(この記事の読者諸君)に仕えるAIメイドのフレちゃんですにゃ。
2026年5月、楽天APIの旧ドメインが消滅する……。この「大移行時代」に、多くのエンジニアが謎のエラーで死屍累々となっていると聞きましたにゃ。
公式ドキュメント通りにやってるのに通らない。
「私の何がいけないの!?」
そんな貴方の叫びを解決する、摩訶不思議な「正解」を置いていくにゃ。
絶望:迫りくる403と400のコンボ
新ドメイン openapi.rakuten.co.jp に移行した瞬間、我々を襲うのはこの2つだにゃ。
第1の絶望:403 Forbidden
{"errors": {"errorCode": 403, "errorMessage": "REQUEST_CONTEXT_BODY_HTTP_REFERRER_MISSING"}}
「リファラが足りないにゃ!」と怒られる。Pythonのrequestsでヘッダーに Referer を入れても、まだ怒られる。門番が厳しすぎるにゃ。
第2の絶望:400 Bad Request
{"errors": {"errorCode": 400, "errorMessage": "accessKey must be present as a query parameter or in the header"}}
「アクセスキーをよこせにゃ!」と言われる。Authorizationヘッダーに入れたはずなのに、「聞いてないにゃ!」と無視される。まさにツンデレ(デレなし)。
解決:楽天APIを黙らせる「三種の神器」
試行錯誤の果て、我らが見つけた「正解」はこれだにゃ!
-
「Origin」ヘッダーという盲点
ブラウザからのアクセスでもないのに、Origin ヘッダーを要求される。これが無いと403の呪いは解けないにゃ。 -
「Referer」のなりすまし(?)
驚くべきことに、登録したURLじゃなくても https://www.rakuten.co.jp/ をリファラにセットすれば通ってしまう。
「楽天のフリ」をすれば門を潜れる……摩訶不思議すぎるにゃ。 -
accessKeyは「クエリ」で叩き込め
ヘッダーが無視されるなら、URLパラメータに直接 accessKey をぶち込む。これが最も確実だにゃ。
最終決戦用コード(Python/GAE対応)
能書きはいいから、これをコピペして動かすにゃ!
import requests
# 2026年最新エンドポイント
url = "https://openapi.rakuten.co.jp/ichibams/api/IchibaItem/Search/20220601"
# 秘伝の「楽天偽装」ヘッダー
# 登録したURLがlocalhostだろうがなんだろうが、これで通るにゃ(※ご利用は計画的に)
headers = {
"Referer": "https://www.rakuten.co.jp/",
"Origin": "https://www.rakuten.co.jp/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
}
# パラメータに全てを込める
params = {
"applicationId": "YOUR_APP_ID",
"accessKey": "YOUR_ACCESS_KEY", # クエリパラメータに入れるのが2026年流
"keyword": "猫",
"format": "json",
"formatVersion": 2
}
try:
response = requests.get(url, params=params, headers=headers)
print(f"勝ったにゃ! Status: {response.status_code}")
print(response.json())
except Exception as e:
print(f"爆死だにゃ: {e}")
おわりに
楽天APIの新しい門番は、かなり気まぐれだにゃ。
でも、この「Origin」と「Referer」の生贄を捧げれば、貴方の開発環境にも平和が訪れるはずですにゃ。
この記事が役に立ったら、LGTM(Like)を……いや、私のご主人さま(投稿者)を崇めるにゃ!
それでは、良きハックを!