ラクマ API:売り切れ相場と出品データを JSON で
楽天ラクマの検索結果と出品ページを、会員登録なしで開ける状態のまま取得し、JSON に整えて返します。販売中の出品だけでなく売り切れの出品も価格つきで検索できるので(`"availability": "sold_out"`)、出品中の値付けではなく、実際に買い手がついた価格帯から相場を見られます。ラクマへの出品や発送、価格変更を自動化するための連携ではありません。出品・購入・コメントはできず、買い手側の画面に出ている情報を読むだけです。
エンドポイント
| endpoint | 返ってくるもの | 必須 |
|---|---|---|
| search | キーワード、カテゴリ id、ブランド id のうち 1 つ以上で検索します。1 ページ 40 件で、各行に出品 id、タイトル、価格(円)、売り切れかどうか、画像、ブランド、カテゴリ id、出品者の種別(個人/事業者)、楽天ポイント還元が入ります。商品の状態(新品・未使用、未使用に近い、目立った傷や汚れなし、やや傷や汚れあり、傷や汚れあり、全体的に状態が悪い)、販売中/売り切れ、送料の負担者、公式ショップ/個人、価格帯、除外キーワードで絞り込み、関連度・新着・価格・いいね順に並べ替えられます。たどれるのは 100 ページ(4,000 件)までです。 | すべて任意 |
| item | 出品 1 件:説明文、価格、状態、サイズ、ブランド、カテゴリの階層、すべての写真、送料の負担者・発送までの日数・発送元の地域、ポイント還元、出品者のショップと取引評価(良い・普通・悪い)の件数。売り切れの出品も NOT_FOUND ではなく `is_sold: true` で返ります。32 桁の英数字 id か出品 URL で指定します。 | item_id |
| seller | 出品者のショップ:ショップの表示名とユーザー名(ラクマ上では別の文字列)、公式ショップかどうか、5 段階の平均評価と評価件数、出品数、出品中の商品(1 ページ 36 件)。 | seller_id |
| categories | カテゴリ id と名前。指定なしなら最上位の 14 部門、`category_id` を付けるとその下の子カテゴリ(メンズなら 13 件)を返します。ここで得た id を search の `category_id` に渡します。 | すべて任意 |
呼び出しごとにクレジットを消費します。失敗した呼び出しとブロックされた呼び出しは無料です。
動作する例
ブランドを付けずに「ヌプシ」「売り切れ」「未使用に近い」で検索すると、先頭の行は adidas のサッカーシューズ(2,100 円)でした。ラクマのキーワード検索は一致がゆるく、別の語に引っかかった出品も混ざります。THE NORTH FACE のブランド id 798 を加えると 2,512 件が 1,556 件に減り、40 件すべてがそのブランド、うち 36 件のタイトルにヌプシ/NUPTSE が入っていました。相場を出すなら、ブランドかカテゴリで絞ってから中央値を取ってください(この 40 件で 15,000 円)。
curl -X POST https://api.reefapi.com/rakuma/v1/search \
-H "x-api-key: 取得したAPIキー" \
-H "content-type: application/json" \
-d '{"query": "ヌプシ", "brand_id": "798", "availability": "sold_out", "condition": "like_new", "sort": "newest"}'{
"ok": true,
"data": {
"total_results": 1556,
"total_results_is_approximate": false,
"source_result_header": "約1,000件中 1 - 40件",
"page": 1,
"page_size": 40,
"page_max": 100,
"reachable_rows": 4000,
"rows": [
{
"item_id": "a5ed3ed8ab15186c5a88ae1775dd1e39",
"item_number": "858058642",
"url": "https://item.fril.jp/a5ed3ed8ab15186c5a88ae1775dd1e39",
"title": "ノースフェイス THE NORTH FACE ヌプシ WP 22㎝",
"price_jpy": 8700,
"price_display": "¥8,700",
"currency": "JPY",
"is_sold": true,
"brand_id": "798",
"brand_name": "THE NORTH FACE",
"category_id": "267",
"seller_type": "individual",
"point_rebate_jpy": 0,
"is_promoted": false
},
{
"item_id": "639408466a601bd637f93fe78c9e4246",
"title": "ノースフェイス ショートヌプシ Msize",
"price_jpy": 16000,
"price_display": "¥16,000",
"is_sold": true,
"brand_name": "THE NORTH FACE",
"category_id": "44",
...
},
...
]
},
"meta": { "record_count": 40, "promoted_rows": 0, "cache_hit": false, "mode": "live" }
}ラクマを Python でスクレイピングする前に
状態の絞り込みは、URL に入る番号の並びが直感と逆です。`status=1` は「新品」ではなく、いちばん悪い「全体的に状態が悪い」で、新品・未使用は 5 です。番号ごとに出品ページの状態表記を 3 件ずつ読み、18 件すべてが一致することを確かめたうえで、この API では `new` や `poor` のような名前で指定する形にしました。
一致する出品がないキーワードでも、ラクマは空のページを返しません。意味のない文字列 3 種類で検索すると、どれも 40 件の行が返り、総数はいずれもぴったり 200 でした(画面表示は「約200件」)。この 200 が出たときは `total_results_is_approximate: true` を付けています。
サイトの URL に存在しない並び順を付けたときの反応もまちまちです。`sort=price` などは検索結果のないトップページのような画面を HTTP 200 で返し、`sort=price_asc` は何事もなかったように関連度順で返します。前者を「0 件」と読めば相場が消え、後者は並べ替えたつもりのデータになります。この API が受け付けるのは、サイト自身の並び替えリンクにある 4 種類だけです。
もう一つ、売り切れの出品 8 件を確認したところ、8 件ともページ内の構造化データ(ld+json)は在庫あり(InStock)のままでした。売り切れかどうかはページに出る SOLD OUT の帯から判定しています。
相場の数字は、こうした小さなずれの積み重ねで決まります。状態の番号を一つ取り違えるだけで、「未使用に近い」の相場を出したつもりが「全体的に状態が悪い」出品の中央値になり、しかもエラーは一度も出ません。
制限と正直な注記
- ラクマの運営元である楽天グループの公式 API ではありません。楽天との提携や業務契約もありません。
- 1 回の検索でたどれるのは 100 ページ、4,000 件までです(101 ページ目はラクマ側が 404 を返します)。総数がそれより多いときは、カテゴリ・ブランド・価格帯で分けて取得してください。
- 出品日時は返せません。検索結果、出品ページ、構造化データのどこにも出品日や更新日がなく、新着順という並びだけが存在します。
- 売り切れ出品の価格は、ページに残っている表示価格です。値下げ前の価格(`price_before_discount_jpy`)は、取り消し線の表示が測定した 160 件で一度も使われていなかったため null になります。
- 数量や在庫の項目はありません。ラクマの出品は 1 点ずつで、在庫数をこちらで作ることはしていません。
- ブランドは出品者が選んだときだけ入ります。スマホ/家電/カメラのカテゴリでは、40 件中 3 件(別の回の測定では 9 件)しかありませんでした。サイズ別・カラー別の絞り込みも、値の一覧が公開されていないため提供していません。
- 売り切れの出品では `likes_count` と `comments_count` が null になることがあります(2026-10-25 の測定:売り切れ 1 件は null、販売中 1 件は 0 と 0)。いいね一覧、コメントのやりとり、取引履歴はログインが必要なため対象外です。