OpenPOI API
日本全国のPOI検索API。Overture Maps と食品営業許可・届出オープンデータを統合した約337万件を検索する
APIを試す
本番APIをその場で叩く検索デモです。入力すると /v1/suggest の候補が下に出て、
Enter または候補の選択で確定検索(/v1/search)し、結果が地図にも表示されます。
概要
日本全国のPOI(Overture Maps 約249万件 + 全国の自治体が公開する食品営業許可・届出オープンデータ(Japan Food Facilities)約88万件、合計約337万件)を、キーワードと位置で検索する読み取り専用API。認証不要・CORS全オリジン許可。データのライセンスは元データの提供元ごとに異なり、利用時は出典表示が必要(各レコードの licenses / attributions を参照。JFF分の出典例: 出典:Japan Food Facilities(各自治体・厚生労働省のオープンデータを加工して作成))。提供元ごとの条件は license.url を参照。エンドポイントは /v1/ 配下でバージョニングされている(本仕様書自身の /openapi.json と MCP の /mcp はバージョンなしで固定。理由は各パスの説明を参照)。MCPエンドポイントは POST /mcp。
全国の食品営業許可・届出施設を、複数のオープンデータソースを統合したうえで キーワード・位置で検索できる読み取り専用APIです。 データソースは2つ(2026-09-20 実測件数):
| ソース | 件数 | ライセンス |
|---|---|---|
| 合計 | 3,372,487 件 | — |
| Overture Maps | 2,492,948 件 | CDLA-Permissive-2.0(Foursquare由来分はApache-2.0) |
| Japan Food Facilities(JFF) | 879,539 件 | CC BY 4.0系 + PDL1.0(自治体ごとに異なる) |
同一施設が複数ソースに存在する場合は1レコード(クラスタ)に統合され、
licenses / attributions は統合元全員分の和集合になります(詳細は
レスポンスの形)。
導入事例
このAPIを実際に使っているサービスです。
BA-SHARE
行ったお店や旅先の思い出を地図のピンに残して、URLひとつでシェアできる地図アプリです。
施設検索と入力補完(住所・お店の名前でのサジェスト)に、このAPIの /v1/search ・ /v1/suggest を利用しています。
エンドポイント一覧
以下は openapi.json から自動生成しています(このセクションを見て型やパラメータが古いと感じたら、まず openapi.json の更新を疑ってください)。
GET /v1/search
施設を検索する
キーワード・現在地(近い順)・矩形範囲で施設を検索する。q / center / bbox はすべて省略可能だが、実用上は最低 q を指定する。範囲は bbox > center+radius の優先順で使われ、center を指定した場合のみ結果が中心に近い順に並ぶ。
パラメータ
| 名前 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
q |
string | 任意 | — | 検索キーワード。スペース区切りで複数語可(各語をORで検索)。施設名・カナ・都道府県・市区町村・住所を横断検索。例: ラーメン、世田谷区 カフェ 例: ラーメン |
center |
string | 任意 | — | 中心座標「lng,lat」(経度が先)。指定すると radius 内に絞り、中心に近い順で返す。 例: 139.75,35.66 |
radius |
integer | 任意 | 50000 |
center からの半径(メートル)。center と併用。 |
bbox |
string | 任意 | — | 矩形範囲「minLng,minLat,maxLng,maxLat」。指定時は center+radius より優先。 例: 139.6,35.5,139.9,35.8 |
limit |
integer | 任意 | 50 |
返す最大件数(1〜200にクランプ)。 |
レスポンス
200検索結果 — SearchResponse400クエリの実行エラー — Error
GET /v1/suggest
入力途中のキーワードから候補を出す(入力補完)
検索ボックスに1文字ずつ入力しているあいだに呼ぶエンドポイント。GET /v1/search と違い、表記ゆれの吸収(全角半角・大文字小文字・ひらがなカタカナ)、複数語のAND判定、同一店舗の重複除去、並び替え(名前一致 > 前方一致 > 中心に近い > 精度が高い)をすべてサーバー側で終えた候補を返すため、呼び出し側は描画するだけでよい。探す範囲は2段階で、まず bbox(地図の表示範囲)の中を探し、0件のときだけ全国(名前・カナに一致するものだけ)へ広げる。どちらを使ったかは scope で分かる。2文字以下の語だけの入力は、範囲指定があるときのみ結果を返す(全国走査は入力補完には遅すぎるため)。
パラメータ
| 名前 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
q |
string | 任意 | — | 入力途中のキーワード。スペース区切りで複数語可(全語をANDで絞る)。施設名・カナ・都道府県・市区町村・住所を横断検索。省略時(空文字含む)は検索を行わず、`{ count: 0, scope: "view", suggestions: [] }` を返す(エラーにはならない)。 例: すたーば |
bbox |
string | 任意 | — | 地図の表示範囲「minLng,minLat,maxLng,maxLat」。まずこの中から候補を探す。 例: 139.6,35.5,139.9,35.8 |
center |
string | 任意 | — | 地図中心「lng,lat」(経度が先)。近い順の並び替えに使う。bbox 省略時は radius と組み合わせて表示範囲を作る。 例: 139.75,35.66 |
radius |
integer | 任意 | 50000 |
center からの半径(メートル)。bbox が無いときだけ使う。 |
limit |
integer | 任意 | 8 |
返す候補の最大件数(1〜20にクランプ)。 |
fields |
enum(full, minimal) | 任意 | full |
"minimal" を指定すると、候補1件ごとの category/business_type/source/licenses/attributions を省いた軽量なレスポンス(MinimalSuggestion。licenses/attributions はレスポンス直下に1回だけ載る)を返す。未指定・"full"・不明な値はすべて従来どおりの完全なレスポンスになる(後方互換)。 |
レスポンス
200候補(そのまま一覧に出せる並び) — SuggestResponse400クエリの実行エラー — Error
GET /
ランディング(目次JSON)
apex ドメインをブラウザで開いた人に検索結果の JSON が返るのを避けるための入口。検索結果ではなく、openapi.json へのリンクと主要エンドポイント一覧を返す。openapi.json と /mcp だけバージョンを付けていないのに対し、検索・入力補完は将来の破壊的変更に備えて/v1/ 配下に置いている。
GET /openapi.json
OpenAPI 3.1 定義を返す
このページの生成元でもある OpenAPI 定義そのもの。servers は固定値ではなく、リクエストされたホストがそのつど埋め込まれる。ChatGPT の Custom GPT (Actions)やコーディングエージェントにクライアントを生成させる場合はこの URL をそのまま渡せる。
POST /mcp
MCP サーバー(Streamable HTTP・ステートレス)
MCP(Model Context Protocol)サーバー。JSON-RPC 2.0 のメッセージを1リクエスト1レスポンス(application/json)で処理し、セッションID の発行や GET の SSE ストリームは提供しない(仕様上許容される最小構成)。公開ツールは2つ: search_facilities(q・center_lng/center_lat・radius_m・bbox・limit で施設検索。GET /v1/search と同じ検索結果を返す)と dataset_info(データセットの概要・出典・関連URLを返す)。Claude Code なら claude mcp add --transport http japan-facilities {SearchApiUrl}mcp で追加できる。対応プロトコルバージョン: 2025-06-18 / 2025-03-26 / 2024-11-05。
レスポンスの形
以下は openapi.json の components.schemas から自動生成しています
(実際のレスポンスと食い違っていると感じたら、まず openapi.json の更新を疑ってください)。
Facility
施設1件。1レコードは1件の営業許可・届出を表す(同一施設が業種違いで複数レコードになることがある)
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
name |
string | 任意 | 施設名 |
name_kana |
string | 任意 | 施設名カナ |
prefecture |
string | 任意 | 都道府県 |
city |
string | 任意 | 市区町村(正規化済み) |
address |
string | 任意 | 所在地 |
category |
string | 任意 | 正規化カテゴリ(複数ソース統合後の統一語彙)。データ提供元でカテゴリ情報が乏しいレコードでは "unknown" になる |
business_type |
string | 任意 | 営業許可・届出の業種(例: 飲食店営業)。category と同値(後方互換のため残している) |
lat |
number | string | 任意 | 緯度(WGS84)。座標が無い施設は空文字 |
lng |
number | string | 任意 | 経度(WGS84)。座標が無い施設は空文字 |
level |
integer | string | null | 任意 | ジオコーディング精度(1=都道府県 2=市区町村 3=町丁目 8=街区・地番。小さいほど大まか) |
source |
string | 任意 | 代表レコードの出所ソース識別子(例: "jff" / "overture")。複数ソースが統合された施設でも値は単一の文字列(配列ではない) |
licenses |
array<string> | 任意 | 出所元のライセンス一覧。複数ソースが統合された施設では和集合(重複除去済み) |
attributions |
array<string> | 任意 | 表示義務のある帰属表示の一覧。そのまま画面に表示すること。複数ソースが統合された施設では全ソース分を含む |
SearchResponse
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
count |
integer | 必須 | 返した件数 |
results |
array<> | 必須 |
Suggestion
入力補完の候補1件。表示(名前・住所)と地図移動(緯度経度)に必要な項目だけを持ち、座標が無い施設は含まれない
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
name |
string | 必須 | 施設名 |
address |
string | 必須 | 住所(都道府県から始まる形にそろえてある。そのまま1行で表示できる) |
prefecture |
string | 任意 | 都道府県 |
city |
string | 任意 | 市区町村(正規化済み) |
category |
string | 任意 | 正規化カテゴリ(複数ソース統合後の統一語彙)。データ提供元でカテゴリ情報が乏しいレコードでは "unknown" になる |
business_type |
string | 任意 | 営業許可・届出の業種(例: 飲食店営業)。category と同値(後方互換のため残している) |
lat |
number | 必須 | 緯度(WGS84) |
lng |
number | 必須 | 経度(WGS84) |
level |
integer | null | 任意 | ジオコーディング精度(1=都道府県 2=市区町村 3=町丁目 8=街区・地番。不明は null) |
source |
string | 任意 | 代表レコードの出所ソース識別子(例: "jff" / "overture")。複数ソースが統合された施設でも値は単一の文字列(配列ではない) |
licenses |
array<string> | 任意 | 出所元のライセンス一覧。複数ソースが統合された施設では和集合(重複除去済み) |
attributions |
array<string> | 任意 | 表示義務のある帰属表示の一覧。そのまま画面に表示すること。複数ソースが統合された施設では全ソース分を含む |
MinimalSuggestion
fields=minimal のときの候補1件。category/business_type/source/licenses/attributions を持たない(それらは SuggestResponse 直下の licenses/attributions を参照)
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
name |
string | 必須 | 施設名 |
address |
string | 必須 | 住所(都道府県から始まる形にそろえてある。そのまま1行で表示できる) |
prefecture |
string | 任意 | 都道府県 |
city |
string | 任意 | 市区町村(正規化済み) |
lat |
number | 必須 | 緯度(WGS84) |
lng |
number | 必須 | 経度(WGS84) |
level |
integer | null | 任意 | ジオコーディング精度(1=都道府県 2=市区町村 3=町丁目 8=街区・地番。不明は null) |
SuggestResponse
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
count |
integer | 必須 | 返した候補の件数 |
scope |
enum(view, nationwide) | 必須 | どの範囲で見つけたか。view = 指定された表示範囲の中、nationwide = 表示範囲で0件だったため全国へ広げた |
suggestions |
array<> | 必須 | 候補(良い順に並んでいる。呼び出し側での並び替えは不要)。fields=minimal のときは各要素が MinimalSuggestion になる。 |
licenses |
array<string> | 任意 | fields=minimal のときだけ存在する。返した suggestions 全件分のライセンス一覧(和集合・重複除去済み) |
attributions |
array<string> | 任意 | fields=minimal のときだけ存在する。返した suggestions 全件分の帰属表示一覧(和集合・重複除去済み)。そのまま画面に1回だけ表示すること |
Error
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
error |
string | 任意 | エラーメッセージ |
source(単数・代表ソースのみ)です。sources(複数形の配列)というフィールドは返しません。実際に動く例
すべて本番 API(https://api.openpoiapi.com)に 2026-09-22 に実際に curl して
得た結果です。
そのままコピペして手元で実行できます(日本語クエリの回は、読みやすさのため
# で始まる行に日本語そのままの形を添えていますが、これはシェルのコメントなので
2行まとめてコピペしても無視されます。実行される2行目は%エンコード済みです。
curl に日本語をそのまま渡すと、サーバー側がリクエストの時点で拒否して
{"message":"Bad Request"} を返すため)。
キーワード検索(JFF 由来がヒットする例)
# curl 'https://api.openpoiapi.com/v1/search?q=スターバックス&limit=1'
curl 'https://api.openpoiapi.com/v1/search?q=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9&limit=1'
{
"count": 1,
"results": [
{
"name": "1F スターバックスコーヒー",
"name_kana": "",
"prefecture": "東京都",
"city": "立川市",
"address": "東京都立川市曙町2丁目5番1号 伊勢丹立川店1F",
"category": "restaurant",
"business_type": "restaurant",
"lat": 35.699078325,
"lng": 139.413344581,
"level": 8,
"source": "jff",
"licenses": [
"CC BY 4.0"
],
"attributions": [
"東京都(保健医療局)食品関係営業許可台帳"
]
}
]
}
キーワード検索(Overture 由来がヒットする例。Foursquare 由来で Apache-2.0 の NOTICE 表示が要る例も含む)
# curl 'https://api.openpoiapi.com/v1/search?q=書店&limit=3'
curl 'https://api.openpoiapi.com/v1/search?q=%E6%9B%B8%E5%BA%97&limit=3'
{
"count": 3,
"results": [
{
"name": "ABC書店",
"name_kana": "",
"prefecture": "",
"city": "吾妻郡草津町",
"address": "",
"category": "retail_other",
"business_type": "retail_other",
"lat": 36.620447,
"lng": 138.594097,
"level": "",
"source": "overture",
"licenses": [
"CDLA-Permissive-2.0"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org"
]
},
{
"name": "Alfred Tea Room 梅田蔦屋書店",
"name_kana": "",
"prefecture": "",
"city": "大阪市北区",
"address": "",
"category": "restaurant",
"business_type": "restaurant",
"lat": 34.70309867,
"lng": 135.49489556,
"level": "",
"source": "overture",
"licenses": [
"CDLA-Permissive-2.0"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org"
]
},
{
"name": "BAKERY&CHANDELIER Eccentric 九大伊都 蔦屋書店",
"name_kana": "",
"prefecture": "福岡県",
"city": "福岡市",
"address": "",
"category": "bakery",
"business_type": "bakery",
"lat": 33.594428,
"lng": 130.229758,
"level": "",
"source": "overture",
"licenses": [
"Apache-2.0"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org / Copyright 2024 Foursquare Labs, Inc. (https://opensource.foursquare.com/places-notice-txt/)"
]
}
]
}
複数ソースが統合されたクラスタの例(bbox 検索)
curl 'https://api.openpoiapi.com/v1/search?bbox=139.6828,35.6499,139.6830,35.6501&limit=20'
3件目「#chord_」は JFF と Overture の両方に登録があり1クラスタに統合された施設。licenses / attributions がそれぞれ2件(和集合)になっている。
{
"count": 3,
"results": [
{
"name": "串むすび・ひいな",
"name_kana": "",
"prefecture": "東京都",
"city": "世田谷区",
"address": "東京都世田谷区池尻三丁目4番2号 -",
"category": "restaurant",
"business_type": "restaurant",
"lat": 35.649998728,
"lng": 139.682888842,
"level": 8,
"source": "jff",
"licenses": [
"CC BY 4.0"
],
"attributions": [
"東京都世田谷区食品衛生営業許可施設"
]
},
{
"name": "自律学習サカセル",
"name_kana": "",
"prefecture": "",
"city": "世田谷区",
"address": "",
"category": "service_other",
"business_type": "service_other",
"lat": 35.65003499,
"lng": 139.68286352,
"level": "",
"source": "overture",
"licenses": [
"CDLA-Permissive-2.0"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org"
]
},
{
"name": "#chord_",
"name_kana": "",
"prefecture": "東京都",
"city": "世田谷区",
"address": "東京都世田谷区池尻三丁目4番2号 SSビル B1F",
"category": "restaurant",
"business_type": "restaurant",
"lat": 35.649998728,
"lng": 139.682888842,
"level": 8,
"source": "jff",
"licenses": [
"CC BY 4.0",
"CDLA-Permissive-2.0"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org",
"東京都世田谷区食品衛生営業許可施設"
]
}
]
}
近傍検索(center + radius。東京駅周辺 300m、キーワードなし)
curl 'https://api.openpoiapi.com/v1/search?center=139.767052,35.681236&radius=300&limit=3'
{
"count": 3,
"results": [
{
"name": "Caffarel",
"name_kana": "",
"prefecture": "東京都",
"city": "千代田区",
"address": "",
"category": "restaurant",
"business_type": "restaurant",
"lat": 35.68127703842544,
"lng": 139.7670424591337,
"level": "",
"source": "overture",
"licenses": [
"Apache-2.0"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org / Copyright 2024 Foursquare Labs, Inc. (https://opensource.foursquare.com/places-notice-txt/)"
]
},
{
"name": "東京新幹線南乗換口店",
"name_kana": "トウキョウシンカンセンミナミノリカエクチテン",
"prefecture": "東京都",
"city": "千代田区",
"address": "東京都千代田区丸の内1-9-1JR東京駅構内",
"category": "unknown",
"business_type": "unknown",
"lat": 35.681236,
"lng": 139.767124,
"level": "",
"source": "jff",
"licenses": [
"公共データ利用規約(第1.0版, PDL1.0)"
],
"attributions": [
"厚生労働省 食品衛生申請等システム(オープンデータ)"
]
},
{
"name": "成城石井武蔵小金井店(催事)",
"name_kana": "セイジョウイシイムサシコガネイテン サイジ",
"prefecture": "東京都",
"city": "小金井市",
"address": "東京都小金井市本町6-14-29 JR駅構内コンコース",
"category": "unknown",
"business_type": "unknown",
"lat": 35.681236,
"lng": 139.767124,
"level": "",
"source": "jff",
"licenses": [
"公共データ利用規約(第1.0版, PDL1.0)"
],
"attributions": [
"厚生労働省 食品衛生申請等システム(オープンデータ)"
]
}
]
}
入力補完(/suggest)。3ソース統合クラスタが1位に来る例
# curl 'https://api.openpoiapi.com/v1/suggest?q=すたーば&bbox=139.6,35.5,139.9,35.8'
curl 'https://api.openpoiapi.com/v1/suggest?q=%E3%81%99%E3%81%9F%E3%83%BC%E3%81%B0&bbox=139.6,35.5,139.9,35.8'
1位「スターバックスコーヒー用賀店」は licenses / attributions がそれぞれ3件。厚労省データ・世田谷区データ・Overture の3系統が1クラスタに統合されている実例。
{
"count": 8,
"scope": "view",
"suggestions": [
{
"name": "スターバックスコーヒー用賀店",
"address": "東京都世田谷区瀬田五丁目39番22号 -",
"prefecture": "東京都",
"city": "世田谷区",
"category": "restaurant",
"business_type": "restaurant",
"lat": 35.626406,
"lng": 139.626422,
"level": 8,
"source": "jff",
"licenses": [
"CC BY 4.0",
"CDLA-Permissive-2.0",
"公共データ利用規約(第1.0版, PDL1.0)"
],
"attributions": [
"Overture Maps Foundation, overturemaps.org",
"厚生労働省 食品衛生申請等システム(オープンデータ)",
"東京都世田谷区食品衛生営業許可施設"
]
},
"… (他7件省略)"
]
}
利用上の注意(ライセンス)
レスポンスの attributions は、利用者側の画面に表示する義務があります。
クラスタが複数ソースを統合している場合は、
そのクラスタに含まれる全ソース分の attributions をすべて表示してください
(一部だけを選んで表示するのは不可)。
| データソース | ライセンス | 掲示義務 |
|---|---|---|
| Overture Maps(Places テーマ) | CDLA-Permissive-2.0 | 出典表示(attributionsをそのまま画面に出せば足りる) |
| Overture Maps 内 Foursquare 由来分 | Apache-2.0 | NOTICE の掲示が必要("Copyright 2024 Foursquare Labs, Inc." を含む attributions をそのまま表示すること) |
| Japan Food Facilities(JFF) | CC BY 4.0 系 + 公共データ利用規約(PDL1.0)が混在 | 出典表示(自治体ごとにライセンス文言が異なるため、レコードごとの attributions をそのまま使うこと) |
本APIは複数の出典データを統合するにあたり、名寄せ(正規化・重複排除)を行っています。 公共データ利用規約(PDL1.0)が対象コンテンツに求める「編集・加工を行ったこと及びその主体の記載」を含め、 コピー用の出典表示文・ライセンスごとの義務の詳細は 出典・ライセンスページにまとめています。
本サービスの利用規約・プライバシーポリシー・サポート窓口・稼働率(SLA)に関する方針は 利用規約・プライバシー・サポートページにまとめています。
エラーレスポンス
GET /v1/search ・ GET /v1/suggest はいずれも、内部で例外が発生した場合に
HTTPステータス 400、ボディ { "error": "..." }(openapi.json の
Error スキーマ)を返します。
実際に確認できた400の例
curl -i 'https://api.openpoiapi.com/v1/search?q=%00abc'
"q" にNULバイトを混ぜてクエリの構文が不正な状態を作ると再現する。通常のURLエンコード忘れや型の不一致(例: limit=abc)は例外にならず、既定値にフォールバックして 200 を返す。
HTTP/1.1 400
{
"error": "unterminated string"
}
既知の制約
- category / business_type の多くが "unknown"(実データで実測: 1,840,570件 / 全3,372,487件 ≈ 54.6%)。Overture 由来レコードで正規化カテゴリが未整備な語彙が多いため。