公開データ仕様
Chiinavi が公開している求人・自治体データのスキーマと、既存の公開 API の入出力を記述します。 外部開発者向けの公開 API(API キー方式)は まだ提供していません。 ここに書いてあるエンドポイントは Chiinavi の Web UI と同オリジン前提でのみ呼ばれます。
1. データプロダクトの概要
Chiinavi は全国の自治体サイトと移住ポータルをクロールし、地域おこし協力隊・移住関連求人を AI+ルールベースで抽出して Cloudflare D1 に正規化したデータプロダクトです。
ここに掲載するスキーマは D1 上の 公開対象列 のみ。原文 PDF・スクレイプ生テキスト・ AI への入力プロンプト・AI の生応答・連絡先などの個人情報は公開しません (§5)。
2. 公開 D1 スキーマ
job_details(公開対象列)
実装は src/lib/db/schema.ts を参照。ここでは公開対象に限定して再掲します。
| カラム | 型 | 説明 |
|---|---|---|
| id | TEXT (PK) | 求人詳細の識別子。URL パス /jobs/[id] と一致 |
| title | TEXT | 求人タイトル |
| description | TEXT | NULL | 募集要項の本文(AI 抽出後の整形済みテキスト) |
| prefecture | TEXT | 都道府県名(municipalities と一致) |
| municipality_name | TEXT | 自治体名(municipalities.name から join) |
| salary_monthly | INTEGER | NULL | 月給(円)。給与未記載なら NULL |
| salary_daily | INTEGER | NULL | 日給(円) |
| salary_hourly | INTEGER | NULL | 時給(円) |
| salary_annual | INTEGER | NULL | 年収(円) |
| salary_details | TEXT | NULL | 給与に関する補足説明(手当・賞与など) |
| deadline | TEXT (YYYY-MM-DD) | NULL | 応募締切(推定含む) |
| application_period_start | TEXT (YYYY-MM-DD) | NULL | 応募受付開始日 |
| application_period_end | TEXT (YYYY-MM-DD) | NULL | 応募受付終了日。deadline より優先 |
| employment_type | TEXT | NULL | 雇用形態(FULL_TIME / PART_TIME / CONTRACTOR / INTERN / VOLUNTEER ほか) |
| is_internship | INTEGER (0/1) | インターン求人か |
| has_selection_internship | INTEGER (0/1) | 選考過程にインターン期間を含むか |
| tags | JSON TEXT (string[]) | AI 抽出タグ。例: ["農業", "観光"] |
| url | TEXT | 自治体側の原典 URL(公式募集ページ) |
| created_at | TEXT (UTC datetime) | Chiinavi に取り込まれた日時 |
| updated_at | TEXT (UTC datetime) | 最終更新日時(再抽出・ライフサイクル更新で進む) |
municipality(公開対象列)
| カラム | 型 | 説明 |
|---|---|---|
| id | TEXT (PK) | 自治体の識別子 |
| code | TEXT | 全国地方公共団体コード(5 桁) |
| name | TEXT | 自治体名 |
| prefecture | TEXT | 都道府県名 |
| prefecture_code | TEXT | 都道府県コード(2 桁) |
| latitude | REAL | NULL | 代表点緯度(求人マップで使用) |
| longitude | REAL | NULL | 代表点経度 |
| is_active | INTEGER (0/1) | 公開対象フラグ。0 は表示・集計から除外 |
3. 公開フィルタ(PUBLIC_JOB_DETAIL_FILTER)
Web UI と公開 API は 常に 以下の SQL 条件で job_details を絞り込みます。 実装は src/lib/server/db/queryHelpers.ts。
(dup_status IS NULL OR dup_status NOT IN ('merged', 'auto_merged'))
AND recruitment_status = 'open' - dup_status は重複ライフサイクル列。手動でマージ済み(merged)、 外部サイト由来の自動マージ済み補助レコード(auto_merged)を除外します。 NULL / primary / candidate は表示対象(candidate は人間レビュー前の候補で、 誤検出の可能性があるため非表示にはしません)。
- recruitment_status は募集ライフサイクル列。明示的終了・404 検出・ deadline 超過・手動 close により closed になった求人を除外します。
- サイトマップ(/sitemap.xml)と /about の集計値も同じフィルタを通します。 数字の出所はこの 1 条件に集約されています。
4. 既存公開 API: GET /api/map/municipality-jobs
Chiinavi の求人マップが自治体ピンをクリックしたときに呼ぶエンドポイントです。 Web UI と同オリジン前提で公開されています。 外部開発者向けの公開 API キー方式はまだ提供していません。
クエリパラメータ
| name | 必須 | 意味 |
|---|---|---|
| municipality | 必須 | 自治体 ID。未指定なら 400 |
| q | 任意 | キーワード(title / description / tags 部分一致) |
| tag | 任意 (repeat) | タグ完全一致。複数指定で AND 結合 |
| salary_min | 任意 | 月給換算の下限(円) |
| salary_max | 任意 | 月給換算の上限(円) |
curl サンプル
<base-url> は実行環境のオリジンに置き換えてください
(例: https://chiinavi.com または http://localhost:5173)。
curl '<base-url>/api/map/municipality-jobs?municipality=mun_aichi_toyota' レスポンス例
{
"jobs": [
{
"id": "job_abc123",
"title": "地域おこし協力隊(観光振興)",
"prefecture": "愛知県",
"municipality_name": "豊田市",
"salary": "月給 200,000円〜",
"salary_monthly": 200000,
"salary_daily": null,
"salary_hourly": null,
"salary_annual": null,
"created_at": "2026-04-15 09:30:21"
}
],
"totalCount": 3
} 各 jobs[] 要素は §2 の job_details 公開列のサブセットです。
ポップアップ表示用に上位 5 件+ totalCount に丸めています。