APIリファレンス
すべてのエンドポイントの説明・パラメータ・例と、本番の実際の応答(抜粋)です。ベースURLは https://michiyomi.dev、キーは要りません。
基本
- ベースURL
https://michiyomi.dev- 認証
- ありません。登録・APIキーも要りません。
- メソッド
- 読み取りだけです。
GETのほかは、座標を本文で送るPOST /amenities/searchとPOST /mcpだけ。/v1への書き込み系のメソッドは 405 です。 - 形式
- JSON(UTF-8)。観測の文章は日本語です(
data_language: "ja")。 - 回数の上限
- IP アドレスごとに REST は60秒あたり300回、MCP は120回。超えると
429とretry-after: 60。 - CORS
- すべてのオリジンに開いています(
access-control-allow-origin: *)。 - ID
- 写真のID(Mapillary の image ID)は文字列のまま扱ってください。数値にすると桁が落ちることがあります。
- 0件
- 0件でも
200で返り、多くはnoteに理由が入ります。「何もない」ではなく「収録がない」という意味です。 - ページ送り
- ありません。近くを引くのは1回50件までで、広い範囲は中心や半径を変えて引きます。
共通の項目
/v1 の成功した応答には、次の項目が共通して入ります。下の各エンドポイントの例では省いています。
| フィールド | 型 | 説明 |
|---|---|---|
| api_version | "v1" | |
| data_language | string | 観測の文章の言語。いまは常に "ja"(OpenAPI 定義には未記載) |
| snapshot | string | null | 公開(なければstaged)最新リリースの release_id |
| request_id | string(uuid) | crypto.randomUUID()。全応答とログに載る。 |
| data_as_of | string | null | |
| quality_policy | object | |
| license | object | 応答の中身の層ごとの条件。製品(シーン系・通りと辺・町丁目・学校)で値が変わる。説明は https://michiyomi.dev/docs/license/ |
| note | string | 正直性のための注記(experimental混入・0件・被覆不足・データ不整合など)。「0件だから変化が無かった」という断定は行わない。 |
| warnings | string[] | 受理したが無視した旧パラメータなど |
GET /v1/meta の応答の先頭そのまま開く ↗{
"api_version": "v1",
"data_language": "ja",
"snapshot": "2026-09-13-r1",
"request_id": "b44f51c0-382e-445b-9013-a3f9e7ed500e",
"data_as_of": "2026-09-13",
"quality_policy": { "requested": "released", "generation": null, "experimental_included": false },
"license": {
"schema_version": 2,
"id": "LicenseRef-michiyomi-layered",
"url": "https://michiyomi.dev/docs/license/",
"policy_version": "2026-10-03",
"summary": "観測データ(本文・構造化JSON・機械層の値・経年変化)は CC BY 4.0 で使えます。AIの回答・分析・アプリの表示・個別の転記には、出典もロゴも要りません。データとして配り直すとき(ファイル・データベース・第三者向けの API など…",
"summary_en": "Observation data (text, structured JSON, machine features, changes) is available under CC BY 4.0. No credit or logo is n…",
"obligations": {
"use_in_results": ["none"],
"display_or_quote_records": ["none"],
"redistribute_as_data": ["attribution", "upstream_not_licensed_if_bulk", "source_notice_if_bulk"]
},
"notices": [
"mapillary_reference_not_licensed",
"photos_not_included",
… ほか 4 件
],
"layers": {
"observation": "CC-BY-4.0",
"mapillary_reference": "NOASSERTION",
"public_sector": "CC-BY-4.0"
},
"linked_only": { "photo": "CC-BY-SA-4.0" },
"attribution": "出典: みちよみ(michiyomi.dev、Mapillary の街路写真より)、CC BY 4.0(https://creativecommons.org/licenses/by/4.0/)",
"attribution_en": "Source: michiyomi (michiyomi.dev), from Mapillary street-level photos, CC BY 4.0 (https://creativecommons.org/licenses/b…",
… ほか 8 項目
}
}エラー
4xx・5xx は共通の形の JSON を返します。パラメータが原因のときは field で対象が分かります。内部のパスや SQL は返しません。
| code | HTTP | 意味 |
|---|---|---|
invalid_parameter | 400 | パラメータが不正(範囲外・未知の値・数でない文字列など) |
not_found | 404 | 対象が無い |
method_not_allowed | 405 | 読み取り専用のため、そのメソッドは使えない |
payload_too_large | 413 | 本文が大きすぎる(/mcp は64KB、/amenities/search は2048バイトまで) |
rate_limited | 429 | 回数の上限を超えた。retry-after 秒待つ |
internal | 500 | サーバー側の問題。request_id を添えて問い合わせてください |
lat=135 を送ったとき · HTTP 400{
"error": {
"code": "invalid_parameter",
"message": "lat must be between -90 and 90",
"request_id": "3c3760d3-c98e-4c66-bf6b-de444f8af988",
"field": "lat"
}
}場所の様子(写真1枚ずつ)
写真1枚(シーン)ごとのAIの読み取りです。まず coverage で収録を確かめ、scenes/nearby で近くの写真を引き、scenes/{id} で全文を読みます。
GET/v1/coverage
地点の被覆申告(正直性ツール)
「この地点にどれだけ根拠があるか」を返す。0件は0件として返し、収録の欠如を現地の状態の否定にすり替えない。
scenes_by_year / scenes_by_generation / scenes_total は指定 quality で畳んだ結果。 released_count / experimental_count は品質ポリシーに関わらず「この半径に実在する言語化」の実数。n_changes は status='supported' のみ。すべて quarantine 除外。 year_from / year_to はシーンの撮影年だけを絞る。n_changes は全年の件数であり、変化の期間を絞るには /v1/changes/nearby の年パラメータを使う。
openapi.yaml では
year_from・year_to の下限が2000ですが、本番は1970から受け付けます。パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
radius_m | クエリ | integer | 既定 300 ・ 範囲 1〜1000 |
quality | クエリ | string | 言語化世代の品質ポリシー。
"released" ・ 値 released include_experimental experimental_only |
generation | クエリ | string | 世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字 |
year_from | クエリ | integer | 範囲 1970〜2100 |
year_to | クエリ | integer | year_from <= year_to でなければ400範囲 1970〜2100 |
互換のため受け付ける旧パラメータ(非推奨): radius(旧パラメータ。radius_m の alias(両方あれば radius_m が優先))
例
// 共通の項目(snapshot・license など)は省略 { "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 300, "year_from": null, "year_to": null }, "scenes_total": 2312, "scenes_by_year": { "2010": 2, "2013": 4, "2015": 25, "2016": 324, "2017": 321, "2018": 581, "2019": 324, "2020": 51, "2022": 125, "2023": 206, "2024": 89, "2025": 67, "2026": 193 }, "scenes_by_generation": { "gen2-qwen-local": 1429, "gen1-codex": 883 }, "released_count": 2312, "experimental_count": 0, "latest_year": 2026, "n_changes": 5, "candidate_truncated": false, "counting_notes": { "released_count": "この半径に released世代の言語化を持つシーン数(品質ポリシーに関わらず実数)", "experimental_count": "この半径に experimental世代の言語化を持つシーン数(同上)", "n_changes": "status='supported' の経年変化を全年で数えた件数(year_from/year_toはシーンの撮影年にのみ適用)", "quarantine": "この地点クエリは capture_time_quality異常(quarantined=1)のシーンを全ての集計から除外している(/v1/meta のリ…" } }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| scenes_total | integer | |
| scenes_by_year | object<integer> | キーは撮影年、または撮影年不明を表す "unknown" |
| scenes_by_generation | object<integer> | |
| released_count | integer | |
| experimental_count | integer | |
| latest_year | integer | null | |
| n_changes | integer | |
| candidate_truncated | boolean | |
| counting_notes | object<string> |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
GET/v1/scenes/nearby
近傍シーン検索
cell の y帯を検索中心の緯度に近い順に1帯ずつ取得し、Haversineで正確な円形フィルタをかける。順序は 丸め前のHaversine実距離 ASC → 実距離同値時 capture_year DESC → id ASC。 distance_m はレスポンス表示用にのみ整数化する。
候補が上限(帯内8000/累積8000)に達した場合は candidate_truncated=true。打ち切られるのは常に検索中心から遠い帯なので、密集地でも真の最近傍は失われない。 quarantined=1 のシーンは返らない。
openapi.yaml では
year_from・year_to の下限が2000ですが、本番は1970から受け付けます。パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
radius_m | クエリ | integer | 検索半径(m)。整数のみ。既定 150 ・ 範囲 1〜1000 |
limit | クエリ | integer | 返す件数。scenes既定10 / changes既定20。範囲 1〜50 |
quality | クエリ | string | 言語化世代の品質ポリシー。
"released" ・ 値 released include_experimental experimental_only |
generation | クエリ | string | 世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字 |
year_from | クエリ | integer | 範囲 1970〜2100 |
year_to | クエリ | integer | year_from <= year_to でなければ400範囲 1970〜2100 |
互換のため受け付ける旧パラメータ(非推奨): radius(旧パラメータ。radius_m の alias(両方あれば radius_m が優先)) ・ gen(旧パラメータ。generation の alias) ・ era(旧パラメータ。受理するが結果には影響しない。) ・ min_score(旧パラメータ。era と同様、受理するが結果には影響しない)
例
// 共通の項目(snapshot・license など)は省略 { "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 150, "limit": 2, "year_from": null, "year_to": null }, "count": 2, "results": [ { "id": "964535250779795", "distance_m": 3, "capture_year": 2019, "ward": "中央区", "view_class": "全方位(パノラマ)", "generation": { "id": "gen1-codex", "status": "released", "version": 1 }, "model": "gpt-5.6-sol", "summary": "施設: 一般道路 / 歩道: 左=あり(分離歩道,5m), 右=あり(分離歩道,4m), 有効幅約4m, 点字ブロックあり, 車道幅約12m / 舗装:…", "image_page": "https://www.mapillary.com/app/?pKey=964535250779795", … ほか 8 項目 }, { "id": "328331618839370", "distance_m": 4, "capture_year": 2018, "ward": "中央区", "view_class": "前方視", "generation": { "id": "gen1-codex", "status": "released", "version": 1 }, "model": "gpt-5.6-terra", "summary": "施設: 一般道路 / 歩道: 左=あり(分離歩道,3m), 右=あり(分離歩道,4m), 有効幅約2.5m, 車道幅約10.5m / 舗装: アスファル…", "image_page": "https://www.mapillary.com/app/?pKey=328331618839370", … ほか 8 項目 } ], "candidate_truncated": false }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| query.lat | number | |
| query.lon | number | |
| query.radius_m | integer | |
| query.limit | integer | |
| query.year_from | integer | null | |
| query.year_to | integer | null | |
| count | integer | |
| results | object[] | |
| results[].id | string | Mapillary image ID。number に変換しないこと。 |
| results[].distance_m | integer | |
| results[].lat | number | |
| results[].lon | number | |
| results[].position_source | string | 代表座標の出所。computed は Mapillary の推定補正位置、raw は GPS生値。値 mapillary_computed mapillary_raw |
| results[].capture_year | integer | null | |
| results[].year | integer | null | capture_year の別名(MCP/旧クライアント互換) |
| results[].ward | string | null | |
| results[].view_class | string | null | |
| results[].travel_bearing | number | null | |
| results[].is_pano | boolean | null | |
| results[].generation | object | |
| results[].model | string | null | |
| results[].prompt_version | string | null | |
| results[].summary | string | |
| results[].analysis_status | string | 値 ok invalid |
| results[].image_page | string(uri) | |
| candidate_truncated | boolean |
ステータスコード
- 200 OK(0件でも200)
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/scenes/{id}
シーン詳細
include 省略時は analysis(旧 /v1/node/{id} 互換)。
- 指定 quality に該当する言語化が無い場合も 200 を返し、
verbalization: null+note+available_generationsで状況を開示する(自動フォールバックはしない)。 analysisが壊れている場合は 500 にせずanalysis: null/analysis_status: "invalid"。quarantinedなシーンもIDの直接参照なら 200 で返る(capture_time_qualityとnote付き)。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
id必須 | パス | string | Mapillary image ID(string) |
include | クエリ | string | 追加取得する層のカンマ区切り。未知値・空文字は400。既定 "analysis" ・ 例 analysis metadata,machine,analysis |
quality | クエリ | string | 言語化世代の品質ポリシー。
"released" ・ 値 released include_experimental experimental_only |
generation | クエリ | string | 世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字 |
互換のため受け付ける旧パラメータ(非推奨): gen(旧パラメータ。generation の alias)
例
// 共通の項目(snapshot・license など)は省略 { "scene": { "id": "1499911054492109", "lat": 35.688942434653, "lon": 139.72195407201, "position_source": "mapillary_computed", "capture_year": 2025, "capture_time_quality": "ok", "ward": "新宿区", "quarantined": false }, "image_page": "https://www.mapillary.com/app/?pKey=1499911054492109", "available_generations": [ { "id": "gen2-qwen-local", "status": "released", "version": 2 } ], "include": ["analysis", "machine", "metadata"], "verbalization": { "generation": { "id": "gen2-qwen-local", "status": "released", "version": 2 }, "model": "sakamakismile/Qwen3.8-27B-MTP-NVFP4", "prompt_version": "v3.5a-tf-nothink", "generated_at": "2026-08-15T19:53:11Z", "summary": "施設: 一般道路 / 歩道: 左=あり(路側帯,1.5m), 右=画角外不明, 有効幅約1.5m, 車道幅約4m / 舗装: アスファルト・標示摩耗車線…", "analysis_status": "ok", "content_sha256": "d4b3fc750fc0542d5df071c7cfa54a65e9aa9801af02dfacd11846e06c6db2cb", "analysis": { "image_file": "image.png", "capture_meta": {…}, "road_context": "両側に木造の店舗・住居が立ち並ぶ狭い市街地の路地。路面はアスファルトで、中央に白い破線(車線境界線)が描かれている。", "road_structure": { "type": "平面", "facility_type": "一般道路", "grade_separated_crossing": "なし" }, "geometry": {…}, "pavement": {…}, "markings_wear": […], "infrastructure": {…}, "mobility": {…}, "accessibility": {…}, … ほか 9 項目 } }, "metadata": { "raw_lat": 35.6889384, "raw_lon": 139.7219968, "computed_lat": 35.688942434653, "computed_lon": 139.72195407201, "position_source": "mapillary_computed", "position_offset_m": 3.9, "raw_compass": 264.84407438728863, "computed_compass": 262.94484333912, "travel_bearing": 224.9, "view_class": "前方視", … ほか 11 項目 }, "machine": { "node_id": "1499911054492109", "feature_version": "ml-2026-09-13", "month": 10, "weekday": "火", "hour": 15, "season": "秋", "time_bucket": "昼", "heading": 262.94484333912, "heading8": "西", "left_side8": "南東", … ほか 7 項目 }, "machine_note": "機械層(画像処理由来の客観指標)。VLMによる言語化とは別namespaceであり、混ぜて解釈しないこと。" }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| scene | object | |
| scene.id | string | |
| scene.lat | number | |
| scene.lon | number | |
| scene.position_source | string | 値 mapillary_computed mapillary_raw |
| scene.capture_year | integer | null | |
| scene.capture_time_quality | string | 値 ok epoch_anomaly unknown |
| scene.ward | string | null | |
| scene.quarantined | boolean | |
| image_page | string(uri) | |
| available_generations | object[] | |
| available_generations[].id | string | |
| available_generations[].status | string | 値 experimental released deprecated |
| available_generations[].version | integer | |
| include | string[] | 値 metadata machine analysis |
| verbalization | null | object | |
| verbalization.generation | object | |
| verbalization.model | string | null | |
| verbalization.prompt_version | string | null | |
| verbalization.generated_at | string | null | |
| verbalization.summary | string | |
| verbalization.analysis_status | string | 値 ok invalid |
| verbalization.content_sha256 | string | |
| verbalization.analysis | object | null | 言語化全文(構造化JSON)。include に analysis がある場合のみ存在。 analysis_status = "invalid" のときは null(500にはしない)。 |
| metadata | object | include=metadata のときのみ |
| metadata.raw_lat | number | null | |
| metadata.raw_lon | number | null | |
| metadata.computed_lat | number | null | |
| metadata.computed_lon | number | null | |
| metadata.position_source | string | |
| metadata.position_offset_m | number | null | raw座標とcomputed座標の距離(m)。どちらか欠損なら null。 |
| metadata.raw_compass | number | null | |
| metadata.computed_compass | number | null | |
| metadata.travel_bearing | number | null | |
| metadata.view_class | string | null | |
| metadata.sequence_id | string | null | |
| metadata.is_pano | boolean | null | |
| metadata.quality_score | number | null | |
| metadata.camera_type | string | null | |
| metadata.width | integer | null | |
| metadata.height | integer | null | |
| metadata.captured_at_ms | integer | null | |
| metadata.captured_at_jst | string | null | |
| metadata.capture_time_quality | string | |
| metadata.cell_250m | integer | |
| metadata.position_note | string | |
| machine | null | object | include=machine のときのみ。機械層(画像処理由来の客観指標)。収録が無ければ null。VLM言語化とは別namespace であり混ぜて解釈しない。 |
| machine.node_id | string | |
| machine.feature_version | string | |
| machine.month | integer | null | |
| machine.weekday | string | null | |
| machine.hour | integer | null | |
| machine.season | string | null | |
| machine.time_bucket | string | null | |
| machine.heading | number | null | |
| machine.heading8 | string | null | |
| machine.left_side8 | string | null | |
| machine.right_side8 | string | null | |
| machine.abs_objects | | |
| machine.colorfulness | number | null | |
| machine.green_ratio | number | null | |
| machine.warm_ratio | number | null | |
| machine.dominant_colors | | |
| machine.color_status | string | null | |
| machine_note | string |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 404 対象が存在しない
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
通り(線)
名前のある通りの「通りのカルテ」と、名前の無い道の区間の数値です。読み方はデータの読み方へ。
GET/v1/streets/nearby
最寄りの通り(線)と名前の無い辺
座標から半径内の辺(OSM道路網を交差点で切った区間、シーン15枚以上)を探し、通り(同名の辺を区市町村内で束ねた単位)ごとに最短距離で返す。名前の無い道は unnamed_edges として辺単位で返す。通りの文章(カルテ)は /v1/streets/{street_id}。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
radius_m | クエリ | integer | 既定 60 ・ 範囲 1〜500 |
limit | クエリ | integer | 既定 5 ・ 範囲 1〜20 |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "la_counts": { "streets": 6248, "areas": 5256, "edges": 30362, "karte_streets": 3563, "karte_areas": 4734 }, "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 60, "limit": 5 }, "streets": [ { "street_id": 799, "name": "晴海通り", "ward": "中央区", "highway_class": "幹線", "length_m": 4480, "coverage_grade": "A", "n_scenes": 1739, "n_sequences": 121, "year_span": [2013, 2026], "bbox": [35.6575946, 139.7622352, 35.6730203, 139.7794593], "has_karte": true, "nearest_edge": { "edge_id": "884274229_3", "dist_m": 29 } }, { "street_id": 720, "name": "中央通り", "ward": "中央区", "highway_class": "幹線", "length_m": 5337, "coverage_grade": "A", "n_scenes": 2244, "n_sequences": 222, "year_span": [2010, 2026], "bbox": [35.6674922, 139.7611031, 35.6899098, 139.7746484], "has_karte": true, "nearest_edge": { "edge_id": "1026056857_1", "dist_m": 54.1 } } ], "unnamed_edges": [ { "edge_id": "522859644_1", "highway_class": "歩道・歩行者路", "length_m": 71, "n_scenes": 16, "dist_m": 50.5, "town_key": "13102003004", "ward": "中央区" } ], "n_edges_considered": 3, "notes": { "grade": "coverage_grade は被覆等級。A〜C のみカルテ(文章)があり、D は数値のみ。等級の規則は profile.coverage.rule を…", "rates": "率(sidewalk.rate など)は判定できた件数(judged)が分母。judged_rate が低い項目は根拠が薄い。", "years": "統計は複数年の集計。year_span を必ず添え、一時物(objects_temporary_latest)は最新年の記録のみ。", "sides": "通りの sides は軸に対する絶対方位の側(例: 北東側)。前方視・後方視の写真だけから合成しているため件数が少ないことがある。", "versions": "karte は主版(karte_provenance.model)。karte_versions に他のモデルの版がある場合、include=versi…", "license": "通り・町丁目の骨格は © OpenStreetMap contributors(ODbL 1.0)、町丁目の境界・人口は e-Stat 国勢調査2020…" } }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| streets | object[] | |
| streets[].street_id | integer | |
| streets[].name | string | |
| streets[].ward | string | null | |
| streets[].highway_class | string | null | 幹線・補助幹線・生活道路 など |
| streets[].length_m | integer | null | |
| streets[].coverage_grade | string | 値 A B C D |
| streets[].n_scenes | integer | |
| streets[].n_sequences | integer | null | |
| streets[].year_span | integer | null[] | |
| streets[].bbox | number | null[] | min_lat, min_lon, max_lat, max_lon の順 |
| streets[].has_karte | boolean | |
| streets[].nearest_edge | object | |
| unnamed_edges | object[] | |
| n_edges_considered | integer | |
| notes | object |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 404 対象が存在しない
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/streets/search
通り名の部分一致検索
OSMの通り名(NFKC正規化・空白除去)で部分一致。ward(区市町村名)で絞れる。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
q必須 | クエリ | string | 範囲 1〜60字 |
ward | クエリ | string | 最大 20字 |
limit | クエリ | integer | 既定 10 ・ 範囲 1〜50 |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "la_counts": {…}, "query": { "q": "晴海通り", "ward": null, "limit": 2 }, "count": 2, "results": [ { "street_id": 5755, "name": "晴海通り", "ward": "江東区", "highway_class": "幹線", "length_m": 5203, "coverage_grade": "A", "n_scenes": 1939, "n_sequences": 144, "year_span": [2016, 2026], "bbox": [35.6405864, 139.7903256, 35.659162, 139.8026981], "has_karte": true }, { "street_id": 799, "name": "晴海通り", "ward": "中央区", "highway_class": "幹線", "length_m": 4480, "coverage_grade": "A", "n_scenes": 1739, "n_sequences": 121, "year_span": [2013, 2026], "bbox": [35.6575946, 139.7622352, 35.6730203, 139.7794593], "has_karte": true } ], "notes": {…} }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| count | integer | |
| results | object[] | |
| results[].street_id | integer | |
| results[].name | string | |
| results[].ward | string | null | |
| results[].highway_class | string | null | 幹線・補助幹線・生活道路 など |
| results[].length_m | integer | null | |
| results[].coverage_grade | string | 値 A B C D |
| results[].n_scenes | integer | |
| results[].n_sequences | integer | null | |
| results[].year_span | integer | null[] | |
| results[].bbox | number | null[] | min_lat, min_lon, max_lat, max_lon の順 |
| results[].has_karte | boolean |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/streets/{street_id}
通りのカルテ(道カルテ)と素材束
通り単位の言語化。karte は素材束(profile=シーン言語化の集計。率は判定できた件数が分母、年幅つき)だけからローカルLLMが書き、数値・年・固有名が素材束に存在することを機械検証した文章。被覆等級(coverage_grade) D は karte を生成しない。include=profile,axis,edges で素材束・軸ポリライン・辺一覧を付ける。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
street_id必須 | パス | integer | 1以上 |
include | クエリ | string | profile,axis,edges,versions のカンマ区切り(versions=他モデル版のカルテ本文) |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "street_id": 799, "name": "晴海通り", "ward": "中央区", "highway_class": "幹線", "length_m": 4480, "coverage_grade": "A", "n_scenes": 1739, "year_span": [2013, 2026], "has_karte": true, "karte": { "street_id": "799", "name": "晴海通り(中央区)", "character": "区全体より幅の広い複数車線の車道が北西へ延び、両側に高層のオフィスビルやマンションが並ぶ通り。", "tsuranari": "2013〜2026年の記録では、始点側に20階以上の高層ビルが目立ち、Denny'sやスポーツクラブNASの看板が見える。始点寄りの一区間で車道が約7.…", "sides": "南西側・北東側とも歩道がほぼ途切れずに続き、幅はどちらも約2.5mで、左右の差はほとんどない。", "streetscape": "高層ビルの多くは築年の新しい外観で、築地場外市場に連なる小規模な店舗と中層の建物が並ぶ一角もある。緑視率は約2.9%で区とほぼ同じで、都全体より低い。", "walking": "判定できた1,906側のうち約98%に車道と分離された歩道があり、ひび割れはまれで、歩道通行可の標示や自転車の専用通行帯が写っている。無電柱化の率は約2…", "notable": "観測文には「複数車線」が都全体の約6.4倍、「バス」が約3.9倍の頻度で出る。銀座四丁目交差点の角で歩道が大きく広がる所や、白色の大きな側桁と支柱が続く…", "changes_summary": "裁定済みの変化は記録にない。", "coverage_note": "被覆はA(2013〜2026年、写真1,739枚・走行121本、延長の100%)。", "evidence_ids": [ "1516117756754071", … ほか 4 件 ] }, "karte_provenance": { "model": "opus55-v12-xhigh", "prompt": "prompt_street_v1_2.md", "generated_at": "2026-09-24 20:04:34", "note": "素材束(profile)だけから生成し、数値・年・固有名が素材束に存在することを機械検証した文章。等級Dは生成しない。" }, "karte_versions": [ { "tag": "fable-low", "model": "fable-low", "prompt": "prompt_street_v1_1.md", "generated_at": "2026-09-22 13:35:28" }, … ほか 2 件 ], … ほか 4 項目 }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| street_id | integer | |
| name | string | |
| ward | string | null | |
| highway_class | string | null | 幹線・補助幹線・生活道路 など |
| length_m | integer | null | |
| coverage_grade | string | 値 A B C D |
| n_scenes | integer | |
| n_sequences | integer | null | |
| year_span | integer | null[] | |
| bbox | number | null[] | min_lat, min_lon, max_lat, max_lon の順 |
| has_karte | boolean | |
| karte | object | null | 道カルテ(name/character/tsuranari/sides/streetscape/walking/notable/changes_summary/coverage_note/evidence_ids)。等級Dは null。 |
| karte_provenance | object | null | |
| karte_versions | object[] | カルテの版一覧(tag/model/prompt/generated_at。include=versions で karte 本文つき) |
| profile | object | 素材束(include=profile)。率は judged が分母、judged_rate が判定率。 |
| axis | number[][] | 軸ポリライン。各要素は lat, lon の順(include=axis) |
| edges | object[] |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 404 対象が存在しない
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/edges/{edge_id}
名前の無い道(辺)の数値
OSM way を交差点で切った区間(シーン15枚以上)の集計。文章のカルテは通り・町丁目の単位で提供する。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
edge_id必須 | パス | string | ^[0-9]+_[0-9]+$ |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "la_counts": {…}, "edge_id": "522859644_1", "street_id": null, "town_key": "13102003004", "name": null, "ward": "中央区", "highway_class": "歩道・歩行者路", "length_m": 71, "n_scenes": 16, "geom": [ [35.6720502, 139.7657558], [35.6715701, 139.7652352] ], "profile": { "edge_id": "522859644_1", "street_id": null, "name": null, "ward": "中央区", "town_key": "13102003004", "highway": "footway", "highway_class": "歩道・歩行者路", "length_m": 71, "stats": {…}, "evidence": […] }, … ほか 1 項目 }
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 404 対象が存在しない
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
町丁目(面)
国勢調査2020の小地域ごとの「町丁目のカルテ」です。
GET/v1/areas/at
地点を含む町丁目(面)
国勢調査2020小地域(町丁・字等)のうち座標を含むものを返す。地区のカルテは /v1/areas/{town_key}。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "la_counts": {…}, "query": { "lat": 35.6717, "lon": 139.7647 }, "area": { "town_key": "13102003004", "name": "銀座四丁目", "ward": "中央区", "coverage_grade": "A", "n_scenes": 1001, "n_sequences": 115, "year_span": [2010, 2026], "center": { "lat": 35.671029, "lon": 139.766331 }, "bbox": [35.66845943310958, 139.7626621643848, 35.67364263757046, 139.7695740383911], "has_karte": true }, "notes": {…} }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| area | object | null | |
| area.town_key | string | 国勢調査2020 小地域キー |
| area.name | string | |
| area.ward | string | |
| area.coverage_grade | string | 値 A B C D |
| area.n_scenes | integer | |
| area.n_sequences | integer | null | |
| area.year_span | integer | null[] | |
| area.center | object | |
| area.bbox | number | null[] | |
| area.has_karte | boolean |
ステータスコード
- 200 OK(該当なしは area=null)
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/areas/nearby
中心が近い町丁目
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
radius_m | クエリ | integer | 既定 800 ・ 範囲 1〜3000 |
limit | クエリ | integer | 既定 5 ・ 範囲 1〜20 |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "la_counts": {…}, "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 800, "limit": 2 }, "count": 2, "results": [ { "town_key": "13102003004", "name": "銀座四丁目", "ward": "中央区", "coverage_grade": "A", "n_scenes": 1001, "n_sequences": 115, "year_span": [2010, 2026], "center": { "lat": 35.671029, "lon": 139.766331 }, "bbox": [35.66845943310958, 139.7626621643848, 35.67364263757046, 139.7695740383911], "has_karte": true, "center_dist_m": 165 }, { "town_key": "13102003005", "name": "銀座五丁目", "ward": "中央区", "coverage_grade": "A", "n_scenes": 991, "n_sequences": 131, "year_span": [2010, 2026], "center": { "lat": 35.670158, "lon": 139.765335 }, "bbox": [35.667463339979385, 139.76039842376687, 35.67296422354896, 139.7683763995818], "has_karte": true, "center_dist_m": 181 } ], "notes": {…} }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| count | integer | |
| results | object[] | |
| results[].town_key | string | 国勢調査2020 小地域キー |
| results[].name | string | |
| results[].ward | string | |
| results[].coverage_grade | string | 値 A B C D |
| results[].n_scenes | integer | |
| results[].n_sequences | integer | null | |
| results[].year_span | integer | null[] | |
| results[].center | object | |
| results[].bbox | number | null[] | |
| results[].has_karte | boolean |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/areas/search
町丁目名の部分一致検索
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
q必須 | クエリ | string | 範囲 1〜60字 |
ward | クエリ | string | 最大 20字 |
limit | クエリ | integer | 既定 10 ・ 範囲 1〜50 |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "la_counts": {…}, "query": { "q": "銀座", "ward": null, "limit": 2 }, "count": 2, "results": [ { "town_key": "13102003008", "name": "銀座八丁目", "ward": "中央区", "coverage_grade": "A", "n_scenes": 1617, "n_sequences": 173, "year_span": [2013, 2026], "center": { "lat": 35.666841, "lon": 139.76345 }, "bbox": [35.663246854310266, 139.75849564746505, 35.67042470785432, 139.76595510852744], "has_karte": true }, { "town_key": "13102003001", "name": "銀座一丁目", "ward": "中央区", "coverage_grade": "A", "n_scenes": 1003, "n_sequences": 99, "year_span": [2015, 2026], "center": { "lat": 35.673638, "lon": 139.770276 }, "bbox": [35.671345054813635, 139.7652718203785, 35.6759623472913, 139.7725043952394], "has_karte": true } ], "notes": {…} }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| count | integer | |
| results | object[] | |
| results[].town_key | string | 国勢調査2020 小地域キー |
| results[].name | string | |
| results[].ward | string | |
| results[].coverage_grade | string | 値 A B C D |
| results[].n_scenes | integer | |
| results[].n_sequences | integer | null | |
| results[].year_span | integer | null[] | |
| results[].center | object | |
| results[].bbox | number | null[] | |
| results[].has_karte | boolean |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
GET/v1/areas/{town_key}
町丁目のカルテ(地区カルテ)と素材束
町丁目単位の言語化。karte の生成方法・等級の扱いは /v1/streets/{street_id} と同じ。include=profile,geometry で素材束・境界(GeoJSON geometry、簡略化)を付ける。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
town_key必須 | パス | string | ^[0-9]{9,12}$ |
include | クエリ | string |
例
// 共通の項目(snapshot・license など)は省略 { "la_release": "2026-10-03-la2", "town_key": "13102003004", "name": "銀座四丁目", "ward": "中央区", "coverage_grade": "A", "n_scenes": 1001, "year_span": [2010, 2026], "has_karte": true, "karte": { "town_key": "13102003004", "name": "銀座四丁目(中央区)", "character": "ガラス張りの高層オフィスビルと商業ビルが広い幹線沿いに連なり、ブランドの看板と幅の広い歩道が続く町。", "skeleton": "晴海通り・中央通り・昭和通りの幹線が骨格をなし、車道では幹線が約2,240mと生活道路の約1,453mより長い。延長は歩道・歩行者路が最も長く、写真には…", "streetscape": "2010〜2026年の記録では、10階以上のガラス張りのオフィスビルや商業ビルが並び、2000年代以降の外観の建物が大半を占める。TASAKI・NISS…", "walking": "判定できた1,224側のうち約99%に歩道があり、多くは車道と分かれた歩道で、幅の中央値は約3.0m。舗装はアスファルトが中心でブロック舗装も混じり、自…", "notable": "観測文には「高層商業」が都全体の約97.9倍、「ブランド」が約88.0倍の頻度で現れる。銀座四丁目交差点の角には地下鉄出入口を伴う広い歩道空間が広がり、…", "changes_summary": "裁定済みの変化は記録にない。", "compared_to": "車道幅の中央値は約12.0mで中央区・都全体のいずれより広く、無電柱化率も約44%で区・都全体を上回る。建物は10階以上が最も多い点で区と同じだが、都全…", "coverage_note": "等級A、写真約1,001枚・走行約115本、2010〜2026年の記録で、車道延長の約91%に写真がある。", "evidence_ids": [ "1244325431140140", … ほか 4 件 ] }, "karte_provenance": { "model": "opus55-v12-xhigh", "prompt": "prompt_area_v1_2.md", "generated_at": "2026-09-25 10:43:56", "note": "素材束(profile)だけから生成し、数値・年・固有名が素材束に存在することを機械検証した文章。等級Dは生成しない。" }, "karte_versions": [ { "tag": "fable-low", "model": "fable-low", "prompt": "prompt_area_v1_1.md", "generated_at": "2026-09-22 19:32:08" }, … ほか 2 件 ], … ほか 5 項目 }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| town_key | string | 国勢調査2020 小地域キー |
| name | string | |
| ward | string | |
| coverage_grade | string | 値 A B C D |
| n_scenes | integer | |
| n_sequences | integer | null | |
| year_span | integer | null[] | |
| center | object | |
| center.lat | number | |
| center.lon | number | |
| bbox | number | null[] | |
| has_karte | boolean | |
| karte | object | null | 地区カルテ(name/character/skeleton/streetscape/walking/notable/changes_summary/compared_to/coverage_note/evidence_ids)。等級Dは null。 |
| karte_provenance | object | null | |
| profile | object | |
| geometry | object | GeoJSON geometry(簡略化、include=geometry) |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 404 対象が存在しない
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
経年変化
同じ場所を別の年に撮った写真を比べ、反証を試みても崩れなかった変化だけを返します。
GET/v1/changes/nearby
近傍の裁定済み経年変化
既定は status=supported(反証優先の再検証を通過したもの)。 evidence は200字で打ち切り、evidence_truncated を立てる(全文は詳細エンドポイント)。座標は変化地点そのものではなく道路グループ(group_id)の中心。順序は distance_m ASC → year_b DESC → change_id ASC。
quality / generation は他の入口と同じ厳格さで検証する(未知値は400)が、経年変化は言語化世代とは別レイヤなので結果の絞り込みには使わない (quality_policy と field_notes.quality に反映するのみ)。
openapi.yaml では
year_from・year_to の下限が2000ですが、本番は1970から受け付けます。パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
radius_m | クエリ | integer | 既定 500 ・ 範囲 1〜3000 |
limit | クエリ | integer | 返す件数。scenes既定10 / changes既定20。範囲 1〜50 |
category | クエリ | string | 値 設備 建物 区画線・標示 舗装 沿道用途 植栽 その他 |
status | クエリ | string | 既定 "supported" ・ 値 supported refuted unverifiable withdrawn |
year_from | クエリ | integer | 範囲 1970〜2100 |
year_to | クエリ | integer | year_from <= year_to でなければ400範囲 1970〜2100 |
quality | クエリ | string | 言語化世代の品質ポリシー。
"released" ・ 値 released include_experimental experimental_only |
generation | クエリ | string | 世代IDを明示指定(quality より優先。存在しないIDは400)。最大 64字 |
互換のため受け付ける旧パラメータ(非推奨): radius(旧パラメータ。radius_m の alias(両方あれば radius_m が優先))
例
// 共通の項目(snapshot・license など)は省略 { "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 500, "limit": 2, "category": null, "status": "supported", "year_from": null, "year_to": null }, "count": 2, "results": [ { "change_id": "chg_4424424a5b4f", "group_id": 1670, "distance_m": 233, "lat": 35.669806875, "lon": 139.763595175, "year_a": 2017, "year_b": 2026, "category": "設備", "subject": "GINZA SIX前のタクシー関連標識", "evidence": "右側のGINZA SIX緑色外壁前にあり、上部に機器を備えた同位置の支柱を、2017年フレーム1〜3と2026年フレーム6で対応づけられる。2017年は…", "evidence_truncated": false, "segment_priority_score": 10, "status": "supported" }, { "change_id": "chg_e9d920b5c524", "group_id": 1670, "distance_m": 233, "lat": 35.669806875, "lon": 139.763595175, "year_a": 2017, "year_b": 2026, "category": "植栽", "subject": "GINZA SIX前を含む両側歩道の街路樹", "evidence": "2017年のフレーム1〜4と2026年のフレーム5〜8は、右側のGINZA SIX外壁、左側のDIANA・ユニクロ等を対応づけられる。2017年はGIN…", "evidence_truncated": false, "segment_priority_score": 10, "status": "supported" } ], "candidate_truncated": false, "field_notes": { "segment_priority_score": "道路区間の点検優先度ヒューリスティック(変化自体の危険度ではない)。多くの行でNULL。", "change_position": "lat/lon は変化地点そのものではなく、道路グループ(group_id)の中心座標。", "verification": "同一モデル系列の文脈分離した別セッションによる反証優先の再検証を通過した(verdict=supported)所見のみを収録。", "quality": "経年変化は言語化世代(generation)とは別レイヤ。quality/generation は検証するが結果の絞り込みには使われない。" } }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | object | |
| count | integer | |
| results | object[] | |
| results[].change_id | string | |
| results[].group_id | integer | 道路グループID(旧gid) |
| results[].distance_m | integer | |
| results[].lat | number | 道路グループ中心座標(変化地点そのものではない) |
| results[].lon | number | |
| results[].year_a | integer | |
| results[].year_b | integer | |
| results[].category | string | 値 設備 建物 区画線・標示 舗装 沿道用途 植栽 その他 |
| results[].subject | string | 変化の主題(旧what) |
| results[].evidence | string | null | 200字で打ち切り |
| results[].evidence_truncated | boolean | |
| results[].segment_priority_score | integer | null | 道路区間の点検優先度ヒューリスティック(旧max_risk)。 変化そのものの危険度ではない。 多くの行で null。 |
| results[].status | string | 値 supported refuted unverifiable withdrawn |
| candidate_truncated | boolean | |
| field_notes | object<string> |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
GET/v1/changes/{change_id}
経年変化の詳細
evidence 全文と verification(反証優先の再検証メタ)を返す。 scene_ids_a / scene_ids_b は元データに存在しないため本リリースでは全行 null (捏造しない。note で明示する)。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
change_id必須 | パス | string | ^chg_[0-9a-f]{12}$ |
例
// 共通の項目(snapshot・license など)は省略 { "change": { "change_id": "chg_4424424a5b4f", "group_id": 1670, "lat": 35.669806875, "lon": 139.763595175, "cell_1km": 174101796, "year_a": 2017, "year_b": 2026, "category": "設備", "subject": "GINZA SIX前のタクシー関連標識", "evidence": "右側のGINZA SIX緑色外壁前にあり、上部に機器を備えた同位置の支柱を、2017年フレーム1〜3と2026年フレーム6で対応づけられる。2017年は…", "scene_ids_a": null, "scene_ids_b": null, "segment_priority_score": 10, "status": "supported", "verification": { "method": "same-model independent-context adversarial review", "method_ja": "同一モデル系列の文脈分離した別セッションによる反証優先の再検証", "detector_model": "gpt-5.6-sol", "reviewer_model": "gpt-5.6-sol", "same_model_family": true, "verdict": "supported", "limitations": ["shared systematic errors may remain", "supported率は反証パスの生存率であり精度の下限保証ではない"] } }, "field_notes": { "segment_priority_score": "道路区間の点検優先度ヒューリスティック(変化自体の危険度ではない)。多くの行でNULL。", "change_position": "lat/lon は変化地点そのものではなく、道路グループ(group_id)の中心座標。", "verification": "同一モデル系列の文脈分離した別セッションによる反証優先の再検証を通過した(verdict=supported)所見のみを収録。" } }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| change | object | |
| change.change_id | string | |
| change.group_id | integer | 道路グループID(旧gid) |
| change.distance_m | integer | |
| change.lat | number | 道路グループ中心座標(変化地点そのものではない) |
| change.lon | number | |
| change.year_a | integer | |
| change.year_b | integer | |
| change.category | string | 値 設備 建物 区画線・標示 舗装 沿道用途 植栽 その他 |
| change.subject | string | 変化の主題(旧what) |
| change.evidence | string | null | 全文 |
| change.evidence_truncated | boolean | |
| change.segment_priority_score | integer | null | 道路区間の点検優先度ヒューリスティック(旧max_risk)。 変化そのものの危険度ではない。 多くの行で null。 |
| change.status | string | 値 supported refuted unverifiable withdrawn |
| change.cell_1km | integer | |
| change.scene_ids_a | string[] | null | 元データに存在しないため本リリースでは常に null(捏造しない) |
| change.scene_ids_b | string[] | null | |
| change.verification | object | null | 裁定メタ。method_ja は「同一モデル系列の文脈分離した別セッションによる反証優先の再検証」。 |
| field_notes | object<string> |
ステータスコード
- 200 OK
- 404 対象が存在しない
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。
設備
自販機・トイレ・ベンチが写った撮影地点です。画面では地図の「設備」の表示(/map/?view=facilities)で見られます。
GET/v1/amenities/nearby
近くの設備(自販機・トイレ・ベンチ)が写った撮影地点
設備(kind)が写った撮影地点を、直線距離の近い順に返します。座標と距離は撮影した位置のもので、設置された位置・いまあるか・使えるかは確かめていません。year_from を省くと全年。利用者の現在地を送るときは、座標が URL に残らない POST /amenities/search を使ってください。
openapi.yaml の
kind は vending_machine だけですが、本番は toilet・bench も受け付けます。パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | クエリ | number | 緯度(WGS84)。/^-?\d+(\.\d+)?$/ の厳格parse。範囲 -90〜90 |
lon必須 | クエリ | number | 経度(WGS84)範囲 -180〜180 |
kind | クエリ | string | 設備の種類。vending_machine(自販機)・toilet(トイレ)・bench(ベンチ)既定 "vending_machine" ・ 値 vending_machine toilet bench |
radius_m | クエリ | integer | 既定 1000 ・ 範囲 100〜3000 |
limit | クエリ | integer | 既定 3 ・ 範囲 1〜10 |
year_from | クエリ | integer | 範囲 2000〜2100 |
例
// 共通の項目(snapshot・license など)は省略 { "count": 2, "results": [ { "id": "bn_1470fb07087f1e7c", "lat": 35.67205272116, "lon": 139.76419890994, "position_basis": "capture_location", "scene_id": "529346588414766", "capture_year": 2019, "evidence": "ベンチ:良好", "object_position": "右", "object_distance_m_est": 10, "confidence": "high", "image_page": "https://www.mapillary.com/app/?pKey=529346588414766", "generation_id": "gen2-qwen-local", "ward": "中央区", "evidence_count": 1, "distance_m": 60 }, { "id": "bn_235844e9fd8e40d2", "lat": 35.672235417637, "lon": 139.76394183294, "position_basis": "capture_location", "scene_id": "2910127179305154", "capture_year": 2019, "evidence": "ベンチ:良好", "object_position": "中央", "object_distance_m_est": 5, "confidence": "high", "image_page": "https://www.mapillary.com/app/?pKey=2910127179305154", "generation_id": "gen2-qwen-local", "ward": "中央区", "evidence_count": 1, "distance_m": 91 } ], "dataset": { "kind": "bench", "source_snapshot": "2026-09-13-r1", "built_at": "2026-09-17T17:43:39.549691Z", "total_candidates": 16849, "min_year": 2006, "max_year": 2026 }, "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 1000, "limit": 2, "year_from": null, "kind": "bench" } }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| count | integer | |
| query | object | |
| dataset | object | |
| dataset.source_snapshot | string | |
| dataset.built_at | string | |
| dataset.total_candidates | integer | |
| dataset.min_year | integer | null | |
| dataset.max_year | integer | null | |
| results | object[] | |
| results[].id | string | |
| results[].scene_id | string | |
| results[].lat | number | |
| results[].lon | number | |
| results[].position_basis | "capture_location" | |
| results[].distance_m | integer | |
| results[].capture_year | integer | |
| results[].evidence | string | |
| results[].object_position | string | null | |
| results[].object_distance_m_est | number | null | |
| results[].confidence | string | 値 high medium |
| results[].image_page | string(uri) | |
| results[].generation_id | string | |
| results[].ward | string | null | |
| results[].evidence_count | integer |
ステータスコード
- 200 OK (Cache-Control is no-store)
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
POST/amenities/search
本文で座標を送る設備の検索
GET /v1/amenities/nearby と同じ結果を返します。座標を JSON の本文(2048バイトまで)で送るので、URL に残りません。データは書き込みません。openapi.yaml にはこの入口が別名の
/vending/search で載っています。どちらも同じ結果を返します。kind は toilet・bench も使えます。本文(JSON)
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
lat必須 | 本文 | number | 範囲 -90〜90 |
lon必須 | 本文 | number | 範囲 -180〜180 |
radius_m | 本文 | integer | 既定 1000 ・ 範囲 100〜3000 |
limit | 本文 | integer | 既定 3 ・ 範囲 1〜10 |
kind | 本文 | string | 既定 "vending_machine" ・ 値 vending_machine toilet bench |
year_from | 本文 | integer | null | 範囲 2000〜2100 |
例
// 共通の項目(snapshot・license など)は省略 { "count": 2, "results": [ { "id": "bn_1470fb07087f1e7c", "lat": 35.67205272116, "lon": 139.76419890994, "position_basis": "capture_location", "scene_id": "529346588414766", "capture_year": 2019, "evidence": "ベンチ:良好", "object_position": "右", "object_distance_m_est": 10, "confidence": "high", "image_page": "https://www.mapillary.com/app/?pKey=529346588414766", "generation_id": "gen2-qwen-local", "ward": "中央区", "evidence_count": 1, "distance_m": 60 }, … ほか 1 件 ], "dataset": { "kind": "bench", "source_snapshot": "2026-09-13-r1", "built_at": "2026-09-17T17:43:39.549691Z", "total_candidates": 16849, "min_year": 2006, "max_year": 2026 }, "query": { "lat": 35.6717, "lon": 139.7647, "radius_m": 1000, "limit": 2, "year_from": null, "kind": "bench" } }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| count | integer | |
| query | object | |
| dataset | object | |
| dataset.source_snapshot | string | |
| dataset.built_at | string | |
| dataset.total_candidates | integer | |
| dataset.min_year | integer | null | |
| dataset.max_year | integer | null | |
| results | object[] | |
| results[].id | string | |
| results[].scene_id | string | |
| results[].lat | number | |
| results[].lon | number | |
| results[].position_basis | "capture_location" | |
| results[].distance_m | integer | |
| results[].capture_year | integer | |
| results[].evidence | string | |
| results[].object_position | string | null | |
| results[].object_distance_m_est | number | null | |
| results[].confidence | string | 値 high medium |
| results[].image_page | string(uri) | |
| results[].generation_id | string | |
| results[].ward | string | null | |
| results[].evidence_count | integer |
ステータスコード
- 200 OK (Cache-Control is no-store)
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 413 Request body exceeds 2048 bytes
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
- 500 内部エラー。stack / SQL / 内部path は返さない。 詳細は
request_id付きでサーバログ(console.error)にのみ記録される。
学校
東京都の小学校の位置(国土数値情報P29)。名前から座標を引く起点に使います。
GET/v1/schools/search
小学校名の部分一致検索
q を NFKC → lower → 空白(半角/全角)除去 で正規化し、 % _ \ をエスケープした上で LIKE '%q%' ESCAPE '\' で照合する。 ORDER BY name_norm ASC, school_id ASC LIMIT 10。0件は 200 + 空配列。
パラメータ
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
q必須 | クエリ | string | 学校名の一部(1〜100文字)範囲 1〜100字 |
例
// 共通の項目(snapshot・license など)は省略 { "query": "明石", "normalized_query": "明石", "count": 1, "results": [ { "school_id": "sch_c75f0606e47b", "name": "中央区立明石小学校", "lat": 35.66885987315959, "lon": 139.77649718335653 } ], "source": "国土交通省 国土数値情報(P29 学校)を加工" }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| query | string | |
| normalized_query | string | |
| count | integer | |
| results | object[] | |
| results[].school_id | string | |
| results[].name | string | |
| results[].lat | number | |
| results[].lon | number | |
| source | string |
ステータスコード
- 200 OK
- 400 パラメータ不正(負数・NaN・Infinity・空文字・非数値文字列・未知enum・範囲外)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。
版・世代・来歴
公開中の版・件数・世代・来歴など、データそのものについての情報です。
GET/v1/meta
リリース件数と世代カタログ
公開中の版・件数・世代のカタログを返します。件数はリリース時に確定した release_stats から返し、問い合わせのたびに全件を数え直しません。processed_total と machine_feature_rows は隔離したシーンを含む処理済みの総数で、ほかの件数と year_min・year_max は隔離したシーンを除きます(counting_notes)。
openapi.yaml の説明(件数はすべて隔離を除く)と違い、
processed_total と machine_feature_rows は隔離したシーンを含みます(応答の counting_notes)。例
{
"api_version": "v1",
"data_language": "ja",
"snapshot": "2026-09-13-r1",
"request_id": "b44f51c0-382e-445b-9013-a3f9e7ed500e",
"data_as_of": "2026-09-13",
"quality_policy": { "requested": "released", "generation": null, "experimental_included": false },
"license": {
"schema_version": 2,
"id": "LicenseRef-michiyomi-layered",
"url": "https://michiyomi.dev/docs/license/",
"policy_version": "2026-10-03",
"summary": "観測データ(本文・構造化JSON・機械層の値・経年変化)は CC BY 4.0 で使えます。AIの回答・分析・アプリの表示・個別の転記には、出典もロゴも…",
"summary_en": "Observation data (text, structured JSON, machine features, changes) is avail…",
"obligations": {
"use_in_results": ["none"],
"display_or_quote_records": ["none"],
"redistribute_as_data": ["attribution", "upstream_not_licensed_if_bulk", "source_notice_if_bulk"]
},
"notices": [
"mapillary_reference_not_licensed",
… ほか 5 件
],
"layers": {
"observation": "CC-BY-4.0",
"mapillary_reference": "NOASSERTION",
"public_sector": "CC-BY-4.0"
},
"linked_only": { "photo": "CC-BY-SA-4.0" },
"attribution": "出典: みちよみ(michiyomi.dev、Mapillary の街路写真より)、CC BY 4.0(https://creativecommons.…",
"attribution_en": "Source: michiyomi (michiyomi.dev), from Mapillary street-level photos, CC BY…",
"public_sector_sources": ["「国土数値情報(行政区域データ)」(国土交通省)を加工して作成"],
"mapillary": "https://www.mapillary.com",
"ui_requirements": "テキストや数値を表示するだけなら、ロゴも出典も要りません。Mapillary の写真を表示する場合だけ、撮影者(画像ページへのリンクで可)と CC BY…",
"ui_requirements_en": "No logo or credit is needed to display text or values. Only when you show a …",
… ほか 4 項目
},
"release": {
"release_id": "2026-09-13-r1",
"status": "published",
"created_at": "2026-09-12T20:42:08.414276Z",
"published_at": "2026-09-12T22:00:00Z",
"data_as_of": "2026-09-13"
},
"counts": {
"processed_total": 1914490,
"served_total": 1914451,
"released_total": 1914451,
"experimental_total": 0,
"changes_total": 2522,
"schools_total": 1323,
"quarantined_total": 39,
"machine_feature_rows": 1914490,
"position_source": { "mapillary_computed": 1899940, "mapillary_raw": 14511 }
},
"machine_feature_coverage": {
"rows": { "count": 1914490, "denominator": 1914490, "ratio": 1 },
"served_columns": {
"travel_bearing": { "count": 1907664, "denominator": 1914451, "ratio": 0.996455 },
"abs_objects": { "count": 1650371, "denominator": 1914451, "ratio": 0.86206 },
"color_status_ok": { "count": 1914412, "denominator": 1914451, "ratio": 0.99998 },
"green_ratio": { "count": 1914412, "denominator": 1914451, "ratio": 0.99998 }
}
},
"years": { "min": 1986, "max": 2026 },
"sharding": {
"active": true,
"shard_count": 4,
"shards": ["s002", "s003", "s004", "s005"],
"routing": "longitude bands on cell_250m edges"
},
"generations": [
{
"id": "gen2-qwen-local",
"status": "released",
"version": 2,
"gen_id": "gen2-qwen-local",
"model_family": "qwen-local",
"model": "sakamakismile/Qwen3.8-27B-MTP-NVFP4 / nvidia/Qwen3.6-27B-NVFP4 / qwen-vlm",
"prompt_version": null,
"output_contract": "v2: 純粋視覚・カメラ基準左右・image_file付きJSON",
"released_at": "2026-08-22",
"notes": "ローカルVLMによる言語化。releasedは配信採用状態を示し、モデル・推論設定間の判定基準が同一であることを保証しません。",
"evidence": null,
"stats": {…}
},
… ほか 1 件
],
"metrics": {
"processed_total": 1914490,
"served_total": 1914451,
"released_total": 1914451,
"experimental_total": 0,
"changes_total": 2522,
"schools_total": 1323,
"position_source_computed": 1899940,
"position_source_raw": 14511,
"computed_discarded_outside_service": 183,
"machine_feature_rows": 1914490,
"machine_travel_bearing_nonnull": 1907664,
"machine_abs_objects_nonnull": 1650371,
"machine_color_status_ok": 1914412,
"machine_green_ratio_nonnull": 1914412,
"year_min": 1986,
"year_max": 2026,
… ほか 3 項目
},
"counting_notes": {
"source": "件数は release_stats(リリース時に確定した正本)から返す。リクエスト時の全表集計はしない。",
"quarantine": "processed_total / machine_feature_rows は隔離を含む処理済み総数。served_total / released_…",
"search_vs_release": "近傍検索・coverage は隔離シーンを常に除外するため、それらの合計は本エンドポイントの件数と一致しない。"
}
}応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| release | object | null | |
| release.release_id | string | |
| release.status | string | 値 building staged published withdrawn |
| release.created_at | string | |
| release.published_at | string | null | |
| release.data_as_of | string | |
| counts | object | |
| counts.processed_total | integer | null | |
| counts.served_total | integer | null | |
| counts.released_total | integer | null | |
| counts.experimental_total | integer | null | |
| counts.changes_total | integer | null | |
| counts.schools_total | integer | null | |
| counts.quarantined_total | integer | null | |
| counts.machine_feature_rows | integer | null | |
| counts.position_source | object | |
| machine_feature_coverage | object | 行収録率と、配信対象における主要機械特徴列の充足率 |
| years | object | |
| years.min | integer | null | |
| years.max | integer | null | |
| generations | object[] | |
| generations[].id | string | |
| generations[].status | string | 値 experimental released deprecated |
| generations[].version | integer | |
| generations[].gen_id | string | |
| generations[].model_family | string | null | |
| generations[].model | string | null | |
| generations[].prompt_version | string | null | |
| generations[].output_contract | string | |
| generations[].released_at | string | null | |
| generations[].notes | string | null | |
| generations[].evidence | object | null | |
| generations[].stats | object | |
| metrics | object<integer> | release_stats の生の metric→value マップ |
| counting_notes | object<string> |
ステータスコード
- 200 OK
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。
GET/v1/generations
言語化世代のカタログとガバナンス
例
// 共通の項目(snapshot・license など)は省略 { "default_generation": "gen2-qwen-local", "governance": "3層管理: ①行来歴(model/prompt_version/generated_at=不変の事実) ②世代(出力契約の単位。スキーマ・左右規約・純粋…", "generations": [ { "id": "gen2-qwen-local", "status": "released", "version": 2, "gen_id": "gen2-qwen-local", "model_family": "qwen-local", "model": "sakamakismile/Qwen3.8-27B-MTP-NVFP4 / nvidia/Qwen3.6-27B-NVFP4 / qwen-vlm", "prompt_version": null, "output_contract": "v2: 純粋視覚・カメラ基準左右・image_file付きJSON", "released_at": "2026-08-22", "notes": "ローカルVLMによる言語化。releasedは配信採用状態を示し、モデル・推論設定間の判定基準が同一であることを保証しません。", "evidence": null, "stats": {…} }, … ほか 1 件 ] }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| default_generation | string | null | |
| governance | string | |
| generations | object[] | |
| generations[].id | string | |
| generations[].status | string | 値 experimental released deprecated |
| generations[].version | integer | |
| generations[].gen_id | string | |
| generations[].model_family | string | null | |
| generations[].model | string | null | |
| generations[].prompt_version | string | null | |
| generations[].output_contract | string | |
| generations[].released_at | string | null | |
| generations[].notes | string | null | |
| generations[].evidence | object | null | |
| generations[].stats | object |
ステータスコード
- 200 OK
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。
GET/v1/provenance
リリースmanifestと来歴
provenance は Rootline ノード連鎖。released世代 gen1-codex に限った記録であり、 gen2-qwen-local には適用されない(provenance_scope で明示)。
例
// 共通の項目(snapshot・license など)は省略 { "release": { "release_id": "2026-09-13-r1", "status": "published", "data_as_of": "2026-09-13", "published_at": "2026-09-12T22:00:00Z", "manifest": {…} }, "provenance": { "dataset_node": "dc263171b410", "repository": "rootline (追記型来歴リポジトリ、全ノードverify=ビット同一再現を確認)", "nodes": […] }, "provenance_scope": "src/prov.json の来歴連鎖(Rootlineノード)は released世代 gen1-codex に限った記録であり、gen2-qwen-…", "verification_method": "経年変化(changes)の裁定は、同一モデル系列の文脈分離した別セッションによる反証優先の再検証。モデル系列そのものに由来する系統誤差は残りうるため、…" }
応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| release | object | null | |
| provenance | object | |
| provenance_scope | string | |
| verification_method | string |
ステータスコード
- 200 OK
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。
GET/v1
API自己記述JSON
エンドポイント一覧・alias・配信ポリシー・ライセンスを機械可読JSONで返す。
例
{
"api_version": "v1",
"name": "michiyomi API",
"description": "Read-only API for structured VLM descriptions of Mapillary street-level imag…",
"description_ja": "Mapillary街路画像をVLMで構造化テキスト化した『座標×言語化』の配信API。同一地点に複数の言語化世代が共存し、既定ではreleased世代の…",
"data_language": "ja",
"endpoints": {
"GET /v1/meta": "Authoritative release counts and verbalization-generation catalog",
"GET /v1/scenes/nearby": "Nearby scenes. Requires lat/lon; supports radius_m, limit, quality, generati…",
"GET /v1/amenities/nearby": "Nearby amenity observations (kind=vending_machine|toilet|bench), with captur…",
"POST /amenities/search": "Same amenity search with coordinates in a JSON body (keeps visitor locations…",
"GET /v1/scenes/{id}": "Scene detail. Select metadata, deterministic machine features, and/or Japane…",
"GET /v1/coverage": "Honest coverage report around a coordinate; zero means no recorded data, not…",
"GET /v1/changes/nearby": "Nearby adjudicated longitudinal change observations with category/status fil…",
"GET /v1/changes/{change_id}": "Full change evidence and verification metadata",
"GET /v1/schools/search": "Partial-name search for elementary schools (NFKC normalized; up to 10 result…",
"GET /v1/generations": "Verbalization-generation catalog and governance metadata",
"GET /v1/provenance": "Release manifest and gen1 provenance chain",
"POST /mcp": "Stateless MCP Streamable HTTP endpoint (2025-06-18 compatible; no SSE)"
},
"aliases": {
"GET /v1/nearby": "GET /v1/scenes/nearby",
"GET /v1/node/{id}": "GET /v1/scenes/{id}",
"GET /v1/prov": "GET /v1/provenance"
},
"policies": [
"The default is quality=released. Experimental generations are returned only …",
"Scenes with anomalous capture timestamps (quarantined=1) are excluded from n…",
… ほか 2 件
],
"policies_ja": [
"既定は quality=released。experimental世代は quality=include_experimental / experime…",
"撮影時刻が異常なシーン(quarantined=1)は近傍検索・統計から除外され、IDの直接参照でのみ取得できる。",
… ほか 2 件
],
"request_id": "71eea11c-97ba-4f03-bc98-0dc10136ac00",
"license": {
"schema_version": 2,
"id": "LicenseRef-michiyomi-layered",
"url": "https://michiyomi.dev/docs/license/",
"policy_version": "2026-10-03",
"summary": "観測データ(本文・構造化JSON・機械層の値・経年変化)は CC BY 4.0 で使えます。AIの回答・分析・アプリの表示・個別の転記には、出典もロゴも…",
"summary_en": "Observation data (text, structured JSON, machine features, changes) is avail…",
"obligations": {
"use_in_results": ["none"],
"display_or_quote_records": ["none"],
"redistribute_as_data": ["attribution", "upstream_not_licensed_if_bulk", "source_notice_if_bulk"]
},
"notices": [
"mapillary_reference_not_licensed",
"photos_not_included",
… ほか 4 件
],
"layers": {
"observation": "CC-BY-4.0",
"mapillary_reference": "NOASSERTION",
"public_sector": "CC-BY-4.0"
},
"linked_only": { "photo": "CC-BY-SA-4.0" },
"attribution": "出典: みちよみ(michiyomi.dev、Mapillary の街路写真より)、CC BY 4.0(https://creativecommons.…",
"attribution_en": "Source: michiyomi (michiyomi.dev), from Mapillary street-level photos, CC BY…",
"public_sector_sources": ["「国土数値情報(行政区域データ)」(国土交通省)を加工して作成"],
"mapillary": "https://www.mapillary.com",
… ほか 6 項目
}
}応答のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| name | string | |
| description | string | |
| endpoints | object<string> | |
| aliases | object<string> | |
| policies | string[] |
ステータスコード
- 200 OK
MCP
AIエージェント向けの、場所で引く MCP サーバーです。つなぎ方・ツールの使い方はAIから使うへ。言葉の印象で風景を探す MCP(/explore/mcp)は別のサーバーで、この定義には含まれません。
POST/mcp
MCP (Model Context Protocol) Streamable HTTP
stateless Streamable HTTP。SSEもセッションIDも使わず、JSON単発応答のみを返す。プロトコルは 2025-06-18 互換。
ツール(11個): get_metadata、find_school、coverage、describe_location、get_scene、changes_near、find_amenities、describe_street、describe_area、find_street、find_area。使い方は AIから使うへ。
initialize は このサーバが実際に話せるバージョン (2025-06-18 / 2025-03-26 / 2024-11-05)を要求されたときだけそれをエコーし、それ以外は 2025-06-18 を返す(未確認の将来仕様への対応は宣言しない)。
制限:
| 条件 | 応答 |
|---|---|
| body > 64KB | HTTP 413 payload_too_large |
| malformed JSON | HTTP 400 / JSON-RPC -32700 |
| 空batch | HTTP 400 / JSON-RPC -32600 |
| batch > 20 | HTTP 400 / JSON-RPC -32600 |
batch内の tools/call N件 | MCP の回数の上限を N 回分使う(1つでも超過なら HTTP 429) |
id メンバー無し(通知) | HTTP 202(本文なし)・ツールは実行されない |
| unknown method | JSON-RPC -32601 |
| unknown tool | result.isError = true(データベースには問い合わせない) |
エラーに stack / SQL / 内部path は含めない。
openapi.yaml の説明にはツールが5つだけ載っていますが、本番は11個です(上の一覧は本番の
tools/list から)。本文(JSON)
| 名前 | 場所 | 型 | 説明 |
|---|---|---|---|
jsonrpc必須 | 本文 | "2.0" | |
id | 本文 | string | integer | null | "id" メンバーが無いものが通知(JSON-RPC 2.0 §4.1)。サーバは一切応答せず、 tools/call であってもツールは実行されない(HTTP 202・本文なし)。 "id": null は「idメンバーがある」= リクエストであり、null がエコーされる。 |
method必須 | 本文 | string | 例 initialize ping tools/list tools/call notifications/initialized |
params | 本文 | object |
例
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "get_metadata",
"description": "Read the current published snapshot, authoritative counts, recorded capture-…",
"inputSchema": {…},
"annotations": { "readOnlyHint": true, "destructiveHint": false, "openWorldHint": true },
"outputSchema": {…}
},
{
"name": "find_school",
"description": "Search the recorded Tokyo elementary-school name catalog, including 23 wards…",
"inputSchema": {…},
"annotations": { "readOnlyHint": true, "destructiveHint": false, "openWorldHint": true },
"outputSchema": {…}
},
… ほか 9 件
]
}
}ステータスコード
- 200 JSON-RPC応答(単発またはbatch)
- 202 通知のみのため本文なし
- 400 parse error / invalid request(JSON-RPCエラー形)
- 405 read専用API。
/v1への POST/PUT/DELETE/PATCH とGET /mcpは常に405。 admin/write エンドポイントは存在しない。 - 413 リクエストボディが64KBを超えた
- 429 レート制限超過。REST: 300req/60s/IP、MCP: 120req/60s/IP。
互換の別名
古いクライアントのために、次の別名も受け付けます。新しく書くときは右の名前を使ってください。
| 別名 | 同じもの |
|---|---|
GET /v1/nearby | GET /v1/scenes/nearby |
GET /v1/node/{id} | GET /v1/scenes/{id} |
GET /v1/prov | GET /v1/provenance |
このページは tools/gen_api_reference.py が api/openapi.yaml と本番の応答から作りました。