いぬねこ帳簿 連携API
動物病院や子犬販売サイトなどのシステムは、連携APIで個体の基本情報を受け取り、健康記録を送れます。購入者やそのエージェントは引き継ぎAPIで、事業者自身の汎用AIはMCPで、同じ記録を扱えます。
このページの機能は、サービスの開始にあわせて順次提供します。
できること
連携API(/api/partner/v1):個体の基本情報(品種・性別・生年月日・販売できる最初の日・マイクロチップの有無)の取得、動物病院からの健康記録の送信、確定した定期報告の数の取得。購入者の情報は返しません。
引き継ぎAPI(/api/handover):購入者、または購入者のエージェントが、引き渡された1匹分の健康記録とマイクロチップの情報を受け取ります。
MCP(/api/mcp):事業者自身の汎用AIから、交配の判定・期限・頭数の確認と、出来事の記録(案→確認→実行)を呼び出せます。
鍵とスコープ
事業者に連絡し、「設定 → 連携」で鍵を発行してもらってください。鍵は発行したときに1回だけ表示されます。
鍵は Authorization ヘッダーに Bearer で付けます。スコープ:animals:read(個体の基本情報)、health:write(健康記録の送信)、reports:read(定期報告の数)、mcp:invoke(MCP)。
連携API順次提供
使えるエンドポイント
| メソッド | パス | スコープ | 中身 |
|---|---|---|---|
| GET | /api/partner/v1/animals | animals:read | 個体の一覧(status・purpose で絞り込み)。基本情報だけで、購入者の情報は返しません |
| GET | /api/partner/v1/animals/:id | animals:read | 1匹の基本情報と、健康記録の要約(種類・日付) |
| POST | /api/partner/v1/health-records | health:write | 健康記録の送信。Idempotency-Key ヘッダーが必要 |
| GET | /api/partner/v1/reports/:fy | reports:read | 確定した定期報告の数(年度) |
curl "https://inuneko-chobo.com/api/partner/v1/animals?status=in_care&purpose=for_sale" \ -H "Authorization: Bearer <連携用の鍵>"
{"data":[{"id":"3f2a…","species":"dog","breed":"トイ・プードル","sex":"female",
"birth_date":"2026-08-20","earliest_sale_date":"2026-10-16","has_microchip":true}],"next_cursor":null}健康記録を送る順次提供
animal_id か microchip_no(半角数字15桁)で個体を特定します。届いた記録は「確認待ち」に入り、事業者が確かめてから帳簿に取り込みます。
curl -X POST https://inuneko-chobo.com/api/partner/v1/health-records \
-H "Authorization: Bearer <連携用の鍵>" \
-H "Idempotency-Key: 5b0e7c2a-1d4e-4c1b-9f11-3a2b8c7d6e5f" \
-H "Content-Type: application/json" \
-d '{
"microchip_no": "392000000000000",
"kind": "vaccine",
"occurred_on": "2026-10-10",
"note": "混合ワクチン 1回目",
"vet_name": "〇〇動物病院"
}'201 {"id":"9c41…","status":"pending_review"}お知らせ(Webhook)順次提供
送る出来事:animal.born(子が生まれた)、animal.sold(販売・引渡しをした)、animal.dead(死亡を記録した)、report.finalized(定期報告を確定した)。alert.violation(上限超過の警告)は、事業者が明示的に有効にしたときだけ送ります。
X-SBGG-Signature ヘッダーの t と v1 で署名を確かめてください。v1 は、署名用の秘密で「t.本文」を HMAC-SHA256 にした16進数です。300秒以上ずれていたら捨ててください。
届く順番は保証しません。受け手は created_at で判断してください。同じ出来事には同じ id が付きます。
{"id":"evt_animal_sold_7d1e…","type":"animal.sold","created_at":"2026-11-05T10:00:00+09:00","org_id":"…",
"data":{"animal_id":"3f2a…","occurred_on":"2026-11-05"}}// Node.js:署名の確かめ方
import crypto from 'node:crypto';
function verify(secret, rawBody, header) {
const p = Object.fromEntries(header.split(',').map((kv) => kv.split('=')));
if (Math.abs(Date.now() / 1000 - Number(p.t)) >= 300) return false;
const v1 = crypto.createHmac('sha256', secret).update(p.t + '.' + rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(p.v1));
}引き継ぎAPI順次提供
事業者が引渡しのときに渡すURL(またはQR)に含まれるトークンと、購入者の電話番号の下4桁(X-Verify ヘッダー)で、1匹分の内容をJSONで受け取れます。有効期間は90日です。
curl "https://inuneko-chobo.com/api/handover/<トークン>" \ -H "X-Verify: 1234" \ -H "X-Agent-Name: my-assistant" \ -H "X-Principal: counterparty"
下4桁が違うと401を返します。5回続けて間違えると1時間ロックします。トークンごとに1時間10回、IPごとに1時間60回までです。X-Agent-Name(エージェントの名前)と X-Principal: counterparty を付けてください。
購入者がマイクロチップの変更登録を済ませたことは POST /api/handover/:token/mc-transferred で知らせられます。
MCP順次提供
POST /api/mcp。鍵には mcp:invoke と、各ツールのスコープが必要です。tools/list で使えるツールが分かります。
読み取り:chobo.list_inbox、chobo.check_mating_eligibility、chobo.list_breeding_females、chobo.get_headcount、chobo.list_mc_deadlines、chobo.get_report_draft。
記録(案→確認→実行):chobo.record_birth、chobo.record_health、chobo.record_mc_implant、chobo.create_mc_csv。1回目で案と confirmation_token(10分・1回だけ)を返し、2回目で保存します。上限を超える記録は、案に「この記録で警告が残ります」と出し、実行しても警告は残ります。
訂正・取消し・警告の確認・定期報告の確定・立入検査のリンク・販売の記録は、MCPでは行えません(人が画面で行います)。
購入者のエージェント向け:handover.get、handover.report_mc_transfer(鍵なし。トークンと電話番号の下4桁)。
curl -X POST https://inuneko-chobo.com/api/mcp \
-H "Authorization: Bearer <連携用の鍵>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"chobo.check_mating_eligibility",
"arguments":{"female":"ココ","mated_on":"2026-11-20"}}}'エラー
401 鍵が無い・違う・止められた(引き継ぎAPIでは下4桁の誤り)。403 スコープが足りない。404 見つからない(ほかの事業者のIDも404)。409 同じ Idempotency-Key で別の内容。422 入力の誤り。423 ロック中。429 回数の上限(Retry-After を見てください)。
エラーの本文は {"error":{"code":"...","message":"..."}} の形です。