API REFERENCE

APIリファレンス

コンプラチェック by MANDA の REST API です。基幹システム・CRM・与信ワークフローからチェックを起票し、結果を受け取れます。
ご不明な点は ご利用ガイド または画面のお問い合わせからご連絡ください。

目次

1. 認証

APIキーを Authorization ヘッダに付けてください。ヘッダを自由に足せないクライアント向けに X-API-Key でも受け付けます。

Authorization: Bearer ck_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

キーはアプリの 外部連携(API) タブから管理者が発行します。発行時に一度だけ表示され、あとから再表示はできません(当社側にもハッシュしか残していないためです)。漏えいが疑われる場合は同じ画面で失効させ、新しいキーを発行してください。

すべてのエンドポイントの基底URLは https://check.manda.bz です。

2. 基本の流れ

1件のチェックは、AIによるWeb調査を含むため 1〜2分 かかります。これをHTTPの応答時間で待つと連携先のタイムアウトに掛かりやすいため、起票と結果取得を分けています。

  1. POST /api/v1/checks で起票する → 202 とジョブIDが返る
  2. 結果を受け取る。いずれかの方法で:
    • Webhook(推奨)… 完了時にこちらから POST します
    • ポーリング … GET /api/v1/checks/{id} を10〜15秒間隔で
  3. 必要なら GET /api/v1/checks/{id}/report でレポート本体(HTML/PDF)を取得する

3. チェックの起票と取得

チェックを起票する

POST /api/v1/checks
項目型説明
companyNamestring会社名。people と併せてどちらか必須。
companyUrlstring会社HP。あれば法人の特定精度が上がります(英語表記も拾えるため制裁リスト照合も効きます)。
peoplearray[{ "name": "山田太郎", "role": "代表者" }]。最大10名。
corporateNumberstring13桁の法人番号。指定すると同名法人の取り違えが起きません。
prefecture / citystring法人番号が無いときの絞り込みに使います。
countrystring所在国のISOコード(例 VN)。指定すると現地語+英語で調査し、日本の公的DB照会は行いません。省略時は日本。対応国は GET /api/v1/countries。
quickModeboolean既定 true(短時間・要点重視)。false で詳細調査。
allowUnresolvedboolean法人を特定できなくても実行する。既定 false。
Idempotency-Key ヘッダを付けてください。 ネットワークエラーでの自動リトライが二重起票・二重課金にならないよう、同じキーの再送には前回のジョブをそのまま返します(このとき 202 ではなく 200 が返ります)。発注番号やレコードIDをそのまま使えます。
curl -X POST https://check.manda.bz/api/v1/checks \
  -H "Authorization: Bearer $CHECK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: account-00123" \
  -d '{
    "companyName": "株式会社サンプル",
    "companyUrl": "https://example.co.jp",
    "people": [{ "name": "山田太郎", "role": "代表者" }]
  }'
HTTP/1.1 202 Accepted
Location: /api/v1/checks/chk_1a2b3c4d5e6f7a8b9c0d1e2f

{
  "id": "chk_1a2b3c4d5e6f7a8b9c0d1e2f",
  "status": "queued",
  "target": { "companyName": "株式会社サンプル", "companyUrl": "https://example.co.jp",
              "people": [{ "name": "山田太郎", "role": "代表者" }], "country": null },
  "createdAt": "2026-09-18 04:12:07"
}

結果を取得する

GET /api/v1/checks/{id}
status意味
queued / running実行待ち/実行中。
succeeded完了。結果が入っています。残回数を1回消費します。
need_refine同名法人が複数あり特定できなかった。実行していないので消費しません。corporateNumber か prefecture を足して再実行してください。候補は candidates に入ります。
failed実行に失敗。消費しません。
{
  "id": "chk_1a2b3c4d5e6f7a8b9c0d1e2f",
  "status": "succeeded",
  "score": "caution",
  "risk": "中",
  "summary": {
    "overallScore": "caution",
    "overallRisk": "中",
    "overallComment": "…",
    "scoreReason": "…"
  },
  "checks": {
    "antisocial":     { "riskLevel": "低", "findings": [], "comment": "", "sources": [] },
    "closeAssociate": { "riskLevel": "低", "findings": [], "comment": "", "sources": [] },
    "criminal":       { "riskLevel": "低", "findings": [], "comment": "", "sources": [] },
    "administrative": { "riskLevel": "中", "findings": ["…"], "comment": "…", "sources": ["https://…"] },
    "financial":      { "riskLevel": "低", "findings": [], "comment": "", "sources": [] },
    "legal":          { "riskLevel": "低", "findings": [], "comment": "", "sources": [] },
    "media":          { "riskLevel": "中", "findings": ["…"], "comment": "…", "sources": ["https://…"] },
    "news":           { "riskLevel": "低", "findings": [], "comment": "", "sources": [] }
  },
  "peopleChecks": [{ "name": "山田太郎", "role": "代表者", "riskLevel": "低", "findings": [] }],
  "sanctionsWatchlist": {
    "checked": true, "found": false, "totalCount": 0, "hits": []
  },
  "historyId": 4821,
  "reportUrl": "https://check.manda.bz/api/v1/checks/chk_1a2b…/report",
  "createdAt": "2026-09-18 04:12:07",
  "finishedAt": "2026-09-18 04:13:41"
}
sanctionsWatchlist.checked を必ず見てください。false は「照合できなかった」で、「該当が無かった」ではありません。この2つを取り違えると、確認していないものを確認済みとして記録してしまいます。

レポート本体を取得する

GET /api/v1/checks/{id}/report

既定はHTML。?format=pdf でPDFを返します。完了前に呼ぶと 409 not_ready です。

curl -H "Authorization: Bearer $CHECK_API_KEY" \
  "https://check.manda.bz/api/v1/checks/chk_1a2b…/report?format=pdf" -o report.pdf

一覧

GET /api/v1/checks?limit=20&status=succeeded

起票したジョブを新しい順に返します(本文の結果は含みません)。

4. 制裁リストの即時照合

POST /api/v1/sanctions/screen

OFAC(米財務省)・EU統合リスト・財務省(外為法の資産凍結対象)への名称照合だけを行います。取り込み済みのリストへのローカル照合なので、AIも外部通信も使いません。応答は数十ms、残回数は消費しません。

取引先マスタの一括スクリーニングや、レコード作成時の即時チェックのように、頻度の高い用途に向いています。

curl -X POST https://check.manda.bz/api/v1/sanctions/screen \
  -H "Authorization: Bearer $CHECK_API_KEY" -H "Content-Type: application/json" \
  -d '{ "companyName": "株式会社サンプル", "englishName": "Sample Co., Ltd.",
        "people": [{ "name": "山田太郎", "role": "代表者" }] }'
{
  "checked": true, "found": false, "totalCount": 0, "exactCount": 0,
  "targets": ["株式会社サンプル", "Sample Co., Ltd.", "山田太郎"],
  "hits": [],
  "sources": [
    { "code": "ofac", "label": "OFAC(米財務省)", "count": 0, "publishedAt": "2026-09-16" },
    { "code": "eu",   "label": "EU 制裁リスト",    "count": 0, "publishedAt": "2026-08-05" },
    { "code": "mof",  "label": "財務省 資産凍結等", "count": 0, "publishedAt": "2026-09-01" }
  ],
  "lastSync": "2026-09-18 01:02:03", "entryCount": 28964, "elapsedMs": 118
}

漢字の商号が当たるのは和文表記を持つ財務省リストだけです。OFAC・EUはラテン文字表記のため、englishName を渡すと精度が上がります。照合できないとき(同期未完了など)は 503 watchlist_unavailable を返します。黙って「該当なし」にはしません。

5. 残回数の確認

GET /api/v1/account
{
  "organization": { "id": 12, "name": "株式会社サンプル" },
  "plan": "business", "planQuota": 100, "planRenewsAt": "2026-10-01 00:00:00",
  "balance": 63,
  "apiKey": { "id": 3, "name": "基幹システム連携" },
  "queue": { "running": 1, "queued": 0 }
}
GET /api/v1/countries

country に指定できる国コードの一覧を返します。

6. Webhook

アプリの 外部連携(API) タブで送信先URLを登録すると、完了時にこちらから POST します。送信先は https:// のみで、社内・プライベートアドレスは登録できません。

イベントタイミング
check.completedチェックが完了したとき
check.failed失敗したとき/法人を特定できなかったとき

本文は { "event": "...", "createdAt": "...", "data": { …GET /api/v1/checks/{id} と同じ形… } } です。

署名の検証(必須)

次のヘッダが付きます。

X-Check-Eventイベント名
X-Check-Delivery配信ID(再送でも同じ値。重複処理の判定に使えます)
X-Check-Timestamp送信時刻(UNIX秒)
X-Check-Signaturev1=<16進のHMAC>

署名は HMAC-SHA256(署名鍵, "<X-Check-Timestamp>.<リクエストボディ>") です。署名鍵は送信先ごとに発行され、同じ画面で確認できます。

// Node.js での検証例
const crypto = require('crypto');

function verify(req, rawBody, secret) {
  const ts  = req.headers['x-check-timestamp'];
  const sig = req.headers['x-check-signature'];
  // 古い本文の送り直しを弾く(5分より古いものは受け取らない)
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const expected = 'v1=' + crypto.createHmac('sha256', secret)
    .update(`${ts}.${rawBody}`).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}
ボディはパース前の生のまま署名対象にしてください。JSONを読み直して再度文字列化すると、キーの順序や空白が変わって一致しなくなります。

再送

2xx 以外、または10秒以内に応答が無い場合は失敗として、1分・5分・15分・1時間・3時間・6時間の間隔で最大7回まで再送します。受信側は X-Check-Delivery で重複を弾ける作りにしてください。配信状況はアプリの配信ログで確認できます。

7. エラー

エラーは常に次の形です。

{ "error": { "code": "no_balance", "message": "残回数がありません。…" } }
HTTPcode対処
400invalid_request必須項目が足りません。
400invalid_country未対応の国コードです。GET /api/v1/countries を参照してください。
401unauthorized / invalid_api_keyキーが無い/無効・失効しています。
402no_balance残回数がありません。プラン変更または追加購入を。
404not_foundIDが違うか、保存期間を過ぎています。
409not_readyまだレポートがありません。完了を待ってください。
429rate_limitedRetry-After 秒後に再試行してください。
503watchlist_unavailable制裁リストを照合できません。「該当なし」として扱わないでください。

8. 制限事項