Jmty (ジモティー) API & Scraper
The Jmty API returns ジモティー — Japan's largest local classifieds board — as clean JSON, in five actions: search, listing, seller, categories and locations.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Jmty is not one marketplace but eleven, and the API treats them as eleven: second-hand goods for sale and for free (32,059,984 ads on 2026-10-02, of which 6,909,491 are giveaways at 0 yen), part-time jobs (5,133,768), property to rent and to buy (3,273,333), used cars (1,194,859), community and member recruitment (1,123,618), full-time jobs (694,461), neighbourly help requests (579,716), events (543,632), local services (274,400), classes and schools (266,052) and pet rehoming (211,166). search picks one of those spaces and narrows it by keyword, the site's three-level category tree (space, category slug, numeric genre), its three-level location tree (prefecture, city or ward, train station), a yen price band, giveaways-only and online-payment-only; it returns 50 ads per page with the site's own matching total on every response. Every row carries the ad id, the public ad URL, the title, the description snippet, the prefecture, city and nearest station, the category and genre, the posting and update day, the favourite count, a photo — and headline, which is the exact line Jmty prints on the row. That last field matters because the line means something different in each space: an item price in goods, a monthly rent in units of 10,000 yen in property, an hourly or daily or monthly wage in jobs, and an event date, a city, a station or an animal's age in the five spaces that publish no money at all. So the API also returns price_jpy, price_display, price_kind (free, fixed or not_priced) and price_basis (item, monthly_rent, hourly_wage, daily_wage, monthly_wage, annual_wage or reward) — and in the five non-money spaces price_display is null rather than a station name dressed up as a price. listing adds the full description, every photo, the attribute block Jmty publishes for that kind of ad (mileage, model year and frame number for a car; rent, layout, floor, deposit and building age for a flat; pay, company and address for a job; sex, age, neutering and vaccination for a pet), the map coordinates, the inquiry and favourite counts, and the poster's public profile: display name, good, neutral and bad review counts, ID, phone, antique-dealer and company-document verification badges, and up to twenty other ads they have live. seller opens that profile page on its own: badges, review counts, registration date, stated area and occupation. categories and locations return the live taxonomies, so no id ever has to be guessed. Verified on 2026-10-02 across two separate runs: 52 of 52 live search calls and 15 of 15 detail calls succeeded, all eleven ad spaces returned 50 rows AND resolved their first row to a full detail record, 14 of 14 error cases returned the right code, every one of the 12 exposed filters measurably narrowed the same-run control, and price_jpy matched the figure Jmty itself prints 101 of 101 times with zero mismatches — cross-checked on a second, independent page of the site for three of them. No Jmty account — one ReefAPI key and the standard { ok, data, meta, error } envelope.
The eleven ad spaces — live counts on 2026-10-02
One call each, read off the live index. These move as ads are posted and expire; every search response carries the matching total for your own filters in the response body. The last column is the one to read before you touch `headline`: five of the eleven spaces publish no money at all.
| group | what it is | live ads | what the headline line is |
|---|---|---|---|
| sale | Second-hand goods for sale or free (中古あげます・譲ります) | 32,059,984 | item price in yen — 0 means a giveaway |
| rec | Part-time jobs (アルバイト・パート) | 5,133,768 | hourly or daily wage |
| est | Property, rent and sale (不動産) | 3,273,333 | monthly rent, printed in units of 10,000 yen |
| car | Used cars (中古車) | 1,194,859 | price + mileage + model year in one line |
| com | Members and community (メンバー募集) | 1,123,618 | nearest station — no price |
| job | Full-time jobs (正社員の求人) | 694,461 | monthly or annual salary |
| coop | Neighbourly help (助け合い) | 579,716 | a reward the poster typed by hand |
| eve | Events (イベント情報) | 543,632 | the event dates — no price |
| ser | Local services and ads (広告の無料掲載) | 274,400 | nearest station — no price |
| les | Classes and schools (教室・スクール) | 266,052 | a city name — no price |
| pet | Pet rehoming (里親募集) | 211,166 | sex and age — no price |
Giveaways are the thing this site is known for and the numbers bear it out: of the 32,059,984 second-hand ads, 6,909,491 are listed at 0 yen and 25,150,494 carry a price — and those two add up to the unfiltered total exactly, which is why the API treats 0 as a real free ad and never as a missing price. 🔴 Paging stops at 1,000 pages of 50 rows: 50,000 ads are reachable per filter set however large the total is, and page 1,001 is a genuine 404 rather than a repeat of page 1,000. Narrowing gets you the rest — the same keyword search drops from 921,446 to 13,967 ads with one price filter, and prefecture, category, genre, city and station all narrow further. There is also no sort control anywhere on the site's list pages, so the order is Jmty's own and the API does not pretend otherwise.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/jmty/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"group": "sale",
"max_results": 20
}
}{
"ok": true,
"meta": {
"api": "jmty",
"endpoint": "search",
"mode": "live",
"latency_ms": 1917.8,
"record_count": 50,
"bytes": 320418,
"cache_hit": false,
"upstream_requests": 1,
"charged_credits": 1,
"version": "1.0.0",
"request_id": "113ee7fb90c243ce"
},
"data": {
"total_results": 32060884,
"source_window": {
"total": 32060884,
"from": 1,
"to": 50
},
"page": 1,
"page_size": 50,
"page_count": 1000,
"page_ceiling": 1000,
"reachable_rows": 50000,
"returned": 50,
"promoted_count": 2,
"dropped_partner_tiles": 7,
"has_more": true,
"category_group": "sale",
"category_group_name": "中古あげます・譲ります",
"prefecture": null,
"category": null,
"genre_id": null,
"keyword": null,
"filters": {},
"source_url": "https://jmty.jp/all/sale",
"listings": [
{
"listing_id": "1s8adz",
"url": "https://jmty.jp/kagoshima/sale-fur/article-1s8adz",
"title": "ソファー",
"headline": "2,000円",
"price_jpy": 2000,
"price_display": "2,000円",
"price_kind": "fixed",
"price_basis": "item",
"prefecture_name": "鹿児島",
"prefecture": "kagoshima",
"city_name": "出水市",
"station_name": null,
"genre_name": "ベッド",
"genre_id": 1236,
"keyword_tags": [],
"category": "fur",
"category_group": "sale",
"description_excerpt": "ベッドです 譲り受けた物なので使い方が分かりませんが",
"updated_label": null,
"created_label": "10月2日",
"favorite_count": null,
"image_thumbnail": "https://cdn.jmty.jp/articles/images/6abefc37ccd60d73abc046b5/thumb_m_file.jpg",
"promoted": false,
"highlighted": false
},
{
"listing_id": "1s8adx",
"url": "https://jmty.jp/yamagata/sale-fur/article-1s8adx",
"title": "電気傘",
"headline": "500円",
"price_jpy": 500,
"price_display": "500円",
"price_kind": "fixed",
"price_basis": "item",
"prefecture_name": "山形",
"prefecture": "yamagata",
"keyword_tags": [
"よろしくお願いします"
],
"city_name": "東根市",
"station_name": "さくらんぼ東根駅",
"genre_name": "照明器具",
"genre_id": 1297,
"category": "fur",
"category_group": "sale",
"description_excerpt": "大きさ45×45です。 使用していたものです。 気にならない方連絡ください。 よろしくお願いします。",
"updated_label": "10月2日",
"created_label": "10月2日",
"favorite_count": null,
"image_thumbnail": "https://cdn.jmty.jp/articles/images/6abefbe6e3dfc702eadccd8b/thumb_m_1790901221995.jpg",
"promoted": false,
"highlighted": false
},
{
"listing_id": "1s2gj1",
"url": "https://jmty.jp/yamaguchi/sale-ele/article-1s2gj1",
"title": "【美品・2022年製】アイリスオーヤマ 274L ノンフロン冷凍...",
"headline": "28,800円",
"price_jpy": 28800,
"price_display": "28,800円",
"price_kind": "fixed",
"price_basis": "item",
"prefecture_name": "山口",
"prefecture": "yamaguchi",
"city_name": "山口市",
"station_name": "上山口駅",
"genre_name": "キッチン家電",
"genre_id": 1102,
"keyword_tags": [],
"category": "ele",
"category_group": "sale",
"description_excerpt": "【美品・2022年製】アイリスオーヤマ 274L ノンフロン冷凍冷蔵庫(IRSN-27A-W) ご覧いただきありがとうございます! 引越しに伴い、使用しなくなるため出品いたします。 アイリスオーヤマの大容量274L冷凍冷蔵...",
"updated_label": "10月2日",
"created_label": "10月2日",
"favorite_count": 3,
"image_thumbnail": "https://cdn.jmty.jp/articles/images/6ab4fe9ca9cdc5dac543ce99/thumb_m_file.jpg",
"promoted": false,
"highlighted": false
}
],
"promoted": [
{
"listing_id": "1mxkch",
"url": "https://jmty.jp/tokyo/sale-bik/article-1mxkch",
"title": "東京バイク売ります🛵お支払い来月から分割も可能!",
"headline": "40,000円",
"price_jpy": 40000,
"price_display": "40,000円",
"price_kind": "fixed",
"price_basis": "item",
"prefecture_name": "東京",
"prefecture": "tokyo",
"keyword_tags": [
"役所"
],
"city_name": "小平市",
"station_name": "小平駅",
"genre_name": "バイク",
"genre_id": null,
"category": "bik",
"category_group": "sale",
"description_excerpt": "レッツ2 シルバー 8522キロ(例) これからの文章が長くなるのでお電話にて対応も可能です。 メッセージにて 『電話希望』 とお伝えください! 当店ご来店の際は予約制となっておりますので必ず電話、もし...",
"updated_label": "9月30日",
"created_label": "9月30日",
"favorite_count": 1083,
"image_thumbnail": "https://cdn.jmty.jp/articles/images/6a426ce0e721e466c91206a1/thumb_m_file.jpg",
"promoted": true,
"highlighted": false
},
{
"listing_id": "1r9i14",
"url": "https://jmty.jp/chiba/sale-hom/article-1r9i14",
"title": "酒瓶 昭和レトロ 骨董",
"headline": "10,000円",
"price_jpy": 10000,
"price_display": "10,000円",
"price_kind": "fixed",
"price_basis": "item",
"prefecture_name": "千葉",
"prefecture": "chiba",
"keyword_tags": [
"レトロ"
],
"city_name": "旭市",
"station_name": "干潟駅",
"genre_name": "その他",
"genre_id": 1428,
"category": "hom",
"category_group": "sale",
"description_excerpt": "配達可⭕️ 千葉1000円 関東3000円 その他県4000円〜 酒瓶など昭和レトロな物です。有名どころ?の酒瓶などもあります。 時代物なのでヨゴレ、キズ気にならない方 購入して下さい。 ※1点お譲り...",
"updated_label": "9月17日",
"created_label": "9月17日",
"favorite_count": 48,
"image_thumbnail": "https://cdn.jmty.jp/articles/images/6aab43bed46252d279db93bb/thumb_m_1000005810.jpg",
"promoted": true,
"highlighted": false
}
]
}
}What the Jmty (ジモティー) API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search one of jmty's eleven ad spaces. `group` is required — it picks the marketplace, and every other filter narrows inside it: keyword, prefecture, category slug, numeric genre id, city/ward id, train-station id, a yen price band, giveaways only, online-payment only. Returns the source's own total (`total_results`) and its own printed window, 50 ads per page, up to its own page-1000 ceiling. Promoted ads the source injects above the window come back in a separate `promoted[]` array, and the staffing-agency tiles it injects from a partner site every eighth row are dropped and counted in `dropped_partner_tiles` — they are not jmty ads and their 'price' is an hourly wage. | Price-intelligence teams call search to search one of jmty's eleven ad spaces. | group, keyword, prefecture, category, genre_id, ... |
| listing | Full detail of one ad. Send `url` (what `search` returns) or `listing_id` together with `group` and `category` — an ad key alone cannot be resolved because the source's ad path carries the group. Returns the complete description, every photo, the attribute block the source publishes for that kind of ad (mileage/model year/frame number for a car, rent/layout/floor/age for a flat, pay/company/working hours for a job, sex/age/vaccination for a pet), coordinates, view and inquiry counts, and the poster's public profile. An ad that has been closed or deleted is an ANSWER, not an error: it comes back with `status` set to closed or deleted. An unknown key returns NOT_FOUND. | Classifieds aggregators call listing to get full detail of one ad. | url, listing_id, group, category |
| seller | One poster's public profile page: nickname, which verification badges they hold, their good/normal/bad review counts, when they registered, the area they live in, their stated occupation, and the ads of theirs the page lists. Takes the `seller.seller_id` that `listing` returns. The site publishes no separate seller-listing feed, so `listings[]` here is what that one page shows, not the poster's whole history — `listings_sampled` says how many that was. | Resale and arbitrage tools call seller to get one poster's public profile page. | seller_id |
| categories | The live category tree for one ad space, read from the source's own search form: category slugs with their Japanese names, and under each one the numeric genre ids `search` accepts. Also returns the table of all eleven ad spaces with a flag saying whether that space publishes money at all — which is the one thing you need before reading a `headline`. | Lead-generation teams call categories to get the live category tree for one ad space, read from the source's own search form. | group |
| locations | The live location tree: all 47 prefectures with their romanised slug and the numeric city/ward ids underneath them, as the source's own search form publishes them. These are the values `search` takes for `prefecture` and `city_id`. | Price-intelligence teams call locations to get the live location tree. | none |
Call search from your stack
curl -X POST https://api.reefapi.com/jmty/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"group":"sale","max_results":20}'import requests
r = requests.post(
"https://api.reefapi.com/jmty/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"group": "sale",
"max_results": 20
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/jmty/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"group": "sale",
"max_results": 20
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.jmty.search with {"group":"sale","max_results":20}.Who uses this API and why
- Track Japan's reuse and giveaway economy with real numbers: 6,909,491 items listed at 0 yen on 2026-10-02 against 25,150,494 priced ones, filterable by prefecture, ward and category, each with the full description and photos.
- Price used stock for a Japanese resale or repair business: pull the same category across millions of second-hand ads, keep Jmty's own printed figure beside our parsed yen value, and narrow by ward or train station to compare local markets rather than national averages.
- Watch private rental supply outside the big portals: 3,273,333 property ads with rent, layout, floor area, deposit and key money, building age and map coordinates, filtered by prefecture, ward or nearest station.
- Feed a Japanese local-jobs product: 5,133,768 part-time and 694,461 full-time posts with the wage and its basis separated (hourly, daily, monthly, annual) and the company name and work address on the detail record.
- Vet a counterparty before you deal: every ad resolves to the poster's public profile with good, neutral and bad review counts kept apart, their registration date, their verification badges including the antique-dealer and real-estate licences, and the other ads they have live.
Questions developers ask before integrating
Is a price of 0 yen a free item, or a missing price?
A free item, and on this site that is the whole point: ジモティー's goods section is literally "selling / giving away". The site's own counters prove there is no third state — 32,059,984 second-hand ads in total, 6,909,491 at 0 yen and 25,150,494 priced, which add up to the total exactly, with nothing left over. So a 0 comes back as price_jpy 0 with price_kind free, never as null and never hidden. Set free_only to true for giveaways only (6,909,491 ads) or false for priced ads only (25,150,494). In the five spaces that genuinely publish no money — events, classes, pets, services, community — price_jpy is null and price_kind is not_priced, which is a different answer and is labelled as one.
Why is there a `headline` field as well as a price?
Because Jmty prints one "most important" line per row and it means eleven different things. Measured on the first page of every space on 2026-10-02: goods print "0円" or "70,000円"; used cars print "1,150,000円64,000km 2009年" — price, mileage and year run together; property prints "2.2万円", a monthly rent in units of 10,000 yen; part-time jobs print "時給1,500円" or "日給10,160円"; full-time jobs print "年収4,500,000円" or "月収190,000円"; help requests print "報酬:10.000", typed by hand; and events print "開催日:10/1-10/31", classes print a city name, pets print "オス 0才2ヶ月", services and community print a station name. headline is that line, verbatim, always. price_jpy, price_display and price_basis are only filled where the line really is money, so you never get a station name served to you as a price.
Is the rent figure correct? "2.2万円" is not 2.2.
It is converted, and we checked it against a second page of the site rather than trusting our own arithmetic. 万 means 10,000, so 7.5万円 is 75,000 yen — and the poster's own profile page prints that same ad as "75,000円" in plain yen. We compared three ads across three spaces in both runs: goods 6,000 against 6,000, property 75,000 against 75,000 and 85,000 against 85,000, used car 320,000 against 320,000. Three for three in each run. Across 220 sampled rows, price_jpy matched the string Jmty prints on the row 101 of 101 times where a price exists, with zero mismatches. price_display always carries the source's own text next to the number so you can check any row yourself.
Are there job ads mixed into the used-goods results?
Jmty injects them, and this API removes them and tells you how many. Every eighth row of a list page is a staffing-agency job ad fed in from a partner site, carrying an hourly wage where the price would be — on page one of a goods search there were 7 of them, and up to 16 on a used-car page. They are not Jmty ads, they have no Jmty ad id, and left in they would put "時給1,500円" into a sofa search. They are dropped and counted in dropped_partner_tiles. Separately, Jmty injects up to two paid-placement ads above the result window; those are real Jmty ads, so they come back in their own promoted[] array with promoted_count, and listings[] holds exactly the 50 organic rows the page's own counter claims.
How many rows per page, and how deep can I page?
Fifty organic rows per page, and it is fixed — measured at exactly 50 on the first page of all eleven spaces and on every filtered search across two runs. Paging stops at page 1,000: page 1,000 returns its 50 rows and page 1,001 is a real HTTP 404, not a silent repeat, so 50,000 ads are reachable per filter set. The API returns page_ceiling and reachable_rows on every response next to the site's own total so the gap is visible rather than surprising. Consecutive pages can share a row or two — Jmty re-floats refreshed ads, so page 1 and page 2 of the same search shared 0 ids in one run and 1 of 50 in the other, with no duplicates inside a page.
Do the filters actually do anything?
Every filter we expose was measured against the same-run unfiltered control, and only the ones that moved the total are offered. From a control of 32,059,984 goods ads: keyword 921,446 · prefecture=tokyo 5,838,002 · category=fur 7,388,851 · price band 1,000-2,000 yen 5,561,375 · free_only 6,909,491 · priced-only 25,150,494. From the 7,388,851 furniture control: genre 1245 (chairs) 491,337 · city 276 (Adachi-ku) 52,985 · station 2,418. From the 5,838,002 Tokyo control: online payment only 386,312. Keyword plus a price floor: 921,446 to 13,967. Property with a 20,000-40,000 yen rent band: 3,273,329 to 557,486. Twelve for twelve. One filter the site's own form offers is deliberately NOT exposed: delivery_method left the total at 5,838,002, exactly the unfiltered figure, so it is accepted and ignored — and a handle that does nothing is worse than no handle.
How do I find the right category, genre, prefecture or city id?
You never have to guess one. categories takes a group and returns that space's category slugs with their Japanese names and, under each, the numeric genre ids search accepts — 20 categories and 235 genres in the goods space alone. locations returns all 47 prefectures with their romanised slug and the 1,246 city and ward ids underneath them. Both are live reads of the site's own search form, not a frozen snapshot. Every search row also echoes the ids it matched, so you can go finer from any result.
Can I filter by city and by station at the same time?
No, and the API refuses instead of guessing. Jmty's URL carries one location level, so asking for both would silently drop one — a filter that quietly becomes a different question is worse than an error. Send prefecture plus either city_id or station_id. A city or station filter also needs a category, because the site answers 404 for a city filter on a bare space, and the API says exactly that rather than reporting the site's 404 as something mysterious.
What does `listing` add over a search row?
The full description instead of the snippet, every photo, the map coordinates, the inquiry and comment counts, the ad's status, and the attribute block Jmty publishes for that specific kind of ad — which is different in every space: mileage, model year, frame number and inspection status for a used car; rent, management fee, deposit and key money, layout and floor area, floor, building age and address for a flat; pay, company name, address and working pattern for a job; sex, age, neutering, vaccination and why the animal needs rehoming for a pet. We counted them on one live detail per space: 9 attributes on a property ad, 7 on a pet ad, 6 on a service, 4 on an event. It also adds the poster's profile and up to twenty other ads they have live. An id taken from search resolved to the same record — same id, same title, same price — on every detail call in both runs.
What do I get about the poster?
What the ad page and the profile page themselves show, unmodified: display name, profile link, the good, neutral and bad review counts separately (one sampled poster had 185 good, 10 neutral, 6 bad), their rating, how many ads they have posted, their self-written profile text, their profile photo, and the verification badges Jmty grants — SMS verified, ID verified, company documents verified, business account, antique-dealer licence and real-estate licence. The seller action opens the profile page on its own and adds their registration date, the area they live in and their stated occupation. 🔴 That page lists ten of their ads however many they have — one sampled account declared 3,648 posts and the page showed ten — and Jmty publishes no seller-ad feed, so listings_sampled tells you what you actually got. For everything a poster has live in one space, use search instead.
Are phone numbers included?
Only where Jmty itself prints one on the public ad page, and then exactly as printed. Most ads have none — the field came back null on the large majority of details we sampled — but some posters, typically classes and businesses, put a number in the ad and the API returns it rather than pretending it is not there. Nothing is fetched from behind a login or a click-to-reveal.
What happens if I ask for an ad that has been taken down?
You get NOT_FOUND with a message saying the ad does not exist in that space or has been removed, never a blank success you have to interpret — measured on both runs with a nonsense id. An ad that is still on the site but closed or deleted by its poster is a different thing and is treated as an answer, not an error: it comes back as a normal record with status set to closed or deleted and the site's own message, because "this is gone" is information you asked for. A search that genuinely matches nothing returns ok with zero rows and the site's own total of 0.
Can I look up an ad from just its id?
You need the space it lives in as well, and the API says so instead of failing vaguely. A Jmty ad URL is /{prefecture}/{group}-{category}/article-{id}, and the id is global — the same id fetched through a deliberately wrong prefecture and a deliberately wrong category returned the identical ad, same title and same price, on every attempt in both runs — but the space is load-bearing: asking for a goods id as a job ad is a 404 on the site itself. So pass the url that search returns (always works), or pass listing_id together with group and category. Ask with listing_id alone and you get MISSING_PARAM naming exactly what else to send.
Can I sort the results?
No, and we would rather say that than offer a knob that does nothing. Jmty's list pages carry no sort control at all — no dropdown, no sort link, no ordering text — and the two separate "cheapest" and "ranking" pages it does have are different page types that return no rows in the result grid. So the order is Jmty's own, roughly newest-first, and every row carries created_label and updated_label so you can order them yourself.