いぬねこ帳簿 連携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/animalsanimals:read個体の一覧(status・purpose で絞り込み)。基本情報だけで、購入者の情報は返しません
GET/api/partner/v1/animals/:idanimals:read1匹の基本情報と、健康記録の要約(種類・日付)
POST/api/partner/v1/health-recordshealth:write健康記録の送信。Idempotency-Key ヘッダーが必要
GET/api/partner/v1/reports/:fyreports: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":"..."}} の形です。