API トークン
外部システム (勤怠 / CRM 等) からこの代理店のデータを操作するための長命トークンです。 Secret は発行直後の 1 度だけ表示されます — その場で安全に保管してください。
📚 API 利用サンプル集
発行したトークンを使って実際にデータを取得・登録するパターン集です。
$RSU_TOKEN はお手元で発行した
rsu_xxxxxxxx_xxxxx... 全体に置き換えてください。
export API='https://api.your-domain.jp/api/v1'
export RSU_TOKEN='rsu_a1B2c3D4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
① 電気 / 水道 / ガス / 温水 — メーター種別ごとの月次収集
meter_type で絞り込めます (electricity / water / gas / hot_water)。
物件 1 棟ぶんの当月検針値を一括 CSV で落とすのが一番簡単です。
# 物件 12 の 2026-04 ぶん、電気だけ CSV
curl -s "$API/properties/12/meters/export.csv?month=2026-04&meter_type=electricity" \
-H "Authorization: Bearer $RSU_TOKEN" \
-o "elec_2026-04.csv"
# 水道
curl -s "$API/properties/12/meters/export.csv?month=2026-04&meter_type=water" \
-H "Authorization: Bearer $RSU_TOKEN" -o "water_2026-04.csv"
# ガス
curl -s "$API/properties/12/meters/export.csv?month=2026-04&meter_type=gas" \
-H "Authorization: Bearer $RSU_TOKEN" -o "gas_2026-04.csv"
プレビュー: elec_2026-04.csv
| 場所 | 月 | 使用量 | 料金 |
|---|---|---|---|
| 101号室 | 2026-04 | 142.5 kWh | ¥4,118 |
| 102号室 | 2026-04 | 98.2 kWh | ¥3,070 |
| 201号室 | 2026-04 | 175.8 kWh | ¥4,956 |
| 共用廊下 | 2026-04 | 22.1 kWh | ¥745 |
そのまま会計ソフト / Excel に取り込み可能
CSV ではなく JSON で扱いたい場合は
GET /properties/{pid}/meters?meter_type=electricity
で ID を引いてから
GET /meters/{mid}/readings を回します。
② 個別収集 — 特定の世帯 / メーターだけ取る
「101号室の電気使用量」「特定メーターの過去 24 ヶ月」だけ欲しいケース。
# 世帯 88 のメーター一覧 (電気・水道・ガスすべて)
curl -s "$API/units/88/meters" \
-H "Authorization: Bearer $RSU_TOKEN" | jq
# メーター 301 の検針履歴 (直近 24 ヶ月)
curl -s "$API/meters/301/readings?months=24" \
-H "Authorization: Bearer $RSU_TOKEN" | jq '.items[] | {billing_month, usage, calculated_charge}'
# 世帯 88 の月次レポート CSV (期間指定)
curl -s "$API/units/88/meters/export.csv?from=2026-01&to=2026-04" \
-H "Authorization: Bearer $RSU_TOKEN" -o "unit88.csv"
プレビュー: JSON レスポンス
{
"meter_id": 301,
"items": [
{
"billing_month": "2026-04-01",
"reading_value": "13245.0",
"previous_value": "13105.0",
"usage": "140.0",
"unit_price": "27.50",
"basic_charge": "880.00",
"calculated_charge": "4730.00"
},
{ "billing_month": "2026-03-01",
"usage": "132.0",
"calculated_charge": "4510.00" }
]
}
usage と calculated_charge はサーバ側で自動計算済
③ cron で毎月 1 日に自動収集 (Python + crontab)
毎月 1 日 02:00 に「先月ぶんの全物件・全メーター」を取得し、社内サーバの CSV に追記する例。 BI ツールの ETL バッチや会計連携の典型パターンです。
collect_meters.py
#!/usr/bin/env python3
"""毎月 1 日に動かす検針データ収集バッチ。"""
import os, csv, datetime as dt
from pathlib import Path
import requests
API = os.environ["RSU_API"] # https://api.your-domain.jp/api/v1
TOKEN = os.environ["RSU_TOKEN"]
HEAD = {"Authorization": f"Bearer {TOKEN}"}
OUT = Path("/var/data/meters")
OUT.mkdir(parents=True, exist_ok=True)
# 「先月」を YYYY-MM で
today = dt.date.today()
first = today.replace(day=1)
target = (first - dt.timedelta(days=1)).strftime("%Y-%m")
props = requests.get(f"{API}/properties/", headers=HEAD, timeout=30).json()["items"]
rows = []
for p in props:
meters = requests.get(
f"{API}/properties/{p['id']}/meters",
headers=HEAD, timeout=30,
).json()["items"]
for m in meters:
hist = requests.get(
f"{API}/meters/{m['id']}/readings",
headers=HEAD, params={"months": 1}, timeout=30,
).json()["items"]
for r in hist:
if not r["billing_month"].startswith(target):
continue
rows.append({
"property": p["name"],
"location": m.get("location_label") or m.get("common_area_label"),
"meter_type": m["meter_type"],
"month": r["billing_month"],
"usage": r["usage"],
"charge": r["calculated_charge"],
})
out_file = OUT / f"meters_{target}.csv"
with out_file.open("w", newline="", encoding="utf-8-sig") as f:
w = csv.DictWriter(f, fieldnames=list(rows[0].keys()) if rows else [])
w.writeheader()
w.writerows(rows)
print(f"✓ {len(rows)} rows -> {out_file}")
crontab -e
# 毎月 1 日 02:00 に先月ぶんを収集
0 2 1 * * RSU_API=https://api.your-domain.jp/api/v1 \
RSU_TOKEN=rsu_xxxxxxxx_yyyyyyy... \
/usr/bin/python3 /opt/rsu/collect_meters.py >> /var/log/rsu_collect.log 2>&1
プレビュー: 実行イメージ & ログ
$ tail /var/log/rsu_collect.log ✓ 47 rows -> /var/data/meters/meters_2026-04.csv
④ 別サイトの入力フォームから検針値を POST する (write スコープ)
自社の社内ツールや別ドメインの巡回スタッフ用フォームから、検針値をこのシステムに書き戻すパターン。
スコープに write を含めて発行したトークンが必要です。
▼ サーバ側 (PHP プロキシ) — token をブラウザに見せないため、必ずバックエンド経由で叩く
<?php
// /your-internal-site/api/post_reading.php
header('Content-Type: application/json');
$token = getenv('RSU_TOKEN'); // .env から読む
$api = 'https://api.your-domain.jp/api/v1';
$body = json_decode(file_get_contents('php://input'), true);
$meter_id = (int)($body['meter_id'] ?? 0);
$payload = [
'reading_date' => $body['reading_date'], // "2026-04-25"
'reading_value' => $body['reading_value'], // 13245.0
'billing_month' => $body['billing_month'], // "2026-04-01"
'note' => $body['note'] ?? null,
];
$ch = curl_init("$api/meters/$meter_id/readings");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
http_response_code(curl_getinfo($ch, CURLINFO_HTTP_CODE));
▼ フロント (HTML) — 巡回スタッフが手入力するフォーム
<form id="readingForm">
<input name="meter_id" placeholder="メーターID" required>
<input name="reading_date" type="date" required>
<input name="reading_value" type="number" step="0.1" required placeholder="現在値">
<input name="billing_month" type="month" required>
<textarea name="note" placeholder="備考 (任意)"></textarea>
<button type="submit">送信</button>
</form>
<script>
document.getElementById('readingForm').addEventListener('submit', async (e) => {
e.preventDefault();
const f = new FormData(e.target);
const body = {
meter_id: Number(f.get('meter_id')),
reading_date: f.get('reading_date'),
reading_value: Number(f.get('reading_value')),
billing_month: f.get('billing_month') + '-01', // YYYY-MM-DD に揃える
note: f.get('note') || null,
};
const res = await fetch('/api/post_reading.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
const data = await res.json();
alert(res.ok
? `✓ 登録しました (使用量 ${data.usage} ${data.unit_label || ''})`
: `✗ エラー: ${data.detail || res.status}`);
});
</script>
プレビュー: 巡回スタッフ用入力画面
⑤ メーター写真を送って OCR で検針値を読ませる
スマホアプリ等から写真を投げて自動で数値化したい場合。OCR は確定前のサジェスト値を返すだけなので、
続けて ④ の POST /meters/{mid}/readings で確定する 2 段構えになります。
# 写真 (multipart) を OCR に投げる
curl -s -X POST "$API/meters/301/readings/ocr" \
-H "Authorization: Bearer $RSU_TOKEN" \
-F "file=@./meter_photo.jpg" | jq
# 戻り値の例
# {
# "ocr_value": 13245.0,
# "confidence": 0.92,
# "raw_text": "13245",
# "photo_path": "meters/.../meter_photo.jpg"
# }
# 値を確認したうえで確定保存
curl -s -X POST "$API/meters/301/readings" \
-H "Authorization: Bearer $RSU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reading_date": "2026-04-25",
"billing_month": "2026-04-01",
"reading_value": 13245.0,
"photo_path": "meters/.../meter_photo.jpg"
}'
プレビュー: OCR の流れ
meter_photo.jpg
→ 確認後に POST /readings で確定
⑥ よく使うエンドポイント早見表
| 目的 | メソッド | パス | 必要スコープ |
|---|---|---|---|
| 物件一覧 | GET | /properties/ | read |
| 物件配下のメーター | GET | /properties/{pid}/meters?meter_type=electricity | read |
| 世帯のメーター | GET | /units/{uid}/meters | read |
| メーター詳細 | GET | /meters/{mid} | read |
| 検針履歴 | GET | /meters/{mid}/readings?months=12 | read |
| 物件 CSV | GET | /properties/{pid}/meters/export.csv?month=YYYY-MM | read |
| 世帯 CSV | GET | /units/{uid}/meters/export.csv?from=YYYY-MM&to=YYYY-MM | read |
| OCR 写真投稿 | POST | /meters/{mid}/readings/ocr | write |
| 検針値の登録 | POST | /meters/{mid}/readings | write |
| 検針値の修正 | PATCH | /readings/{rid} | write |
⑦ ハマりどころ TOP 3
-
401 Unauthorized — ヘッダ書式は
Authorization: Bearer rsu_...(Bearer の後ろは半角スペース 1 つ。コロン不要) -
403 / scope error — 検針値の 書き込み は
トークンに
writeスコープが必須。発行時に外していると失敗する - 404 で物件が見えない — トークンは発行した代理店のデータ専用。 テナント越境はできない仕様