MUSUBIMUSUBI sign APIキーを発行する

MUSUBI sign API

既存システムから、契約書の生成・署名依頼の送付・締結状況の取得を自動化できるREST APIです。 代理店契約やポスティング受託契約などを、自社の業務システムやCRMに組み込んで発行できます。 サーバーサイドからの呼び出しを想定しています(APIキーは公開しないでください)。

認証

すべてのリクエストに、発行したAPIキーをBearerトークンとして付与します。キーは設定 → API連携で発行・失効できます。キーごとにスコープ(権限)を持ちます。

Authorization: Bearer msk_live_xxxxxxxxxxxxxxxx
  • contracts:write — 契約書・契約セットの生成と送付
  • contracts:read — 状態・署名済みPDFの取得
  • webhooks:manage — Webhookの登録・削除

エンドポイント

ベースURL: https://sign.unser-inc.com

POST
/api/v1/contracts

契約書を1通生成して署名依頼を送付contracts:write

POST
/api/v1/contract-packages

契約セット(複数書類)をまとめて生成・送付contracts:write

GET
/api/v1/contracts/{id}

契約書のステータス・署名状況を取得contracts:read

GET
/api/v1/contracts/{id}/pdf

署名完了後の最終PDF(証明書込み)を取得contracts:read

POST
/api/v1/contracts/{id}/remind

未署名者へ署名依頼を再送contracts:write

GET
/api/v1/templates

利用可能なテンプレート/契約セットと入力項目の一覧

GET
/api/v1/webhooks

登録済みWebhook一覧webhooks:manage

POST
/api/v1/webhooks

Webhookエンドポイントを登録webhooks:manage

DELETE
/api/v1/webhooks/{id}

Webhookを削除webhooks:manage

機械可読な仕様: OpenAPI (openapi.json)

契約書を生成・送付する

template_id と当事者情報・条件を渡すと、PDFを生成し、相手方(send: true の場合)へ署名依頼メールを送ります。 利用可能な template_idform_values のキーは GET /api/v1/templates で取得できます。

curl -X POST https://sign.unser-inc.com/api/v1/contracts \
  -H "Authorization: Bearer msk_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "sales-agency",
    "my_role": "甲",
    "party_a": { "name": "UNSER合同会社", "representative": "在原 拓海", "address": "東京都港区南青山2-2-15" },
    "party_b": { "name": "株式会社ABC商事", "representative": "山田 太郎", "address": "東京都渋谷区...", "email": "yamada@abc.co.jp" },
    "form_values": {
      "contract_date": "2026-06-15",
      "start_date": "2026-06-15",
      "fee_appointment": "5,000円/件",
      "fee_meeting": "10,000円/件",
      "fee_closing": "成約金額の10%"
    },
    "special_terms": "1. 初回3ヶ月の成約報酬は15%とする。",
    "send": true
  }'

レスポンス(201):

{
  "id": "9da065e5-e742-4b4c-93cb-2eb4629a3dc0",
  "title": "営業代理店業務委託契約書 - 株式会社ABC商事",
  "status": "sent",
  "signing_url": "https://sign.unser-inc.com/sign/9da0...?token=..."
}

契約セットをまとめて発行する

package_id(例: agency-set = NDA+営業代理店業務委託、posting-client-set = NDA+業務委託)を指定すると、必要な書類一式を1回のリクエストでまとめて生成します。special_terms は全書類の特約事項として追加されます。

curl -X POST https://sign.unser-inc.com/api/v1/contract-packages \
  -H "Authorization: Bearer msk_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "package_id": "agency-set",
    "party_a": { "name": "UNSER合同会社", "representative": "在原 拓海", "address": "東京都港区南青山2-2-15" },
    "party_b": { "name": "株式会社ABC商事", "representative": "山田 太郎", "address": "...", "email": "yamada@abc.co.jp" },
    "form_values": { "contract_date": "2026-06-15", "start_date": "2026-06-15", "fee_closing": "成約金額の10%" },
    "send": true
  }'
# → NDA + 営業代理店業務委託契約 をまとめて生成・送付し、同じ package_id でグルーピング

ステータス・PDFを取得する

curl https://sign.unser-inc.com/api/v1/contracts/{id} \
  -H "Authorization: Bearer msk_live_xxxxxxxx"

# レスポンス
{
  "id": "9da0...",
  "status": "completed",            // draft / sent / completed
  "contract_status": "active",
  "counterparty_name": "株式会社ABC商事",
  "signers": [{ "email": "yamada@abc.co.jp", "name": "山田 太郎", "signed": true, "signed_at": "2026-06-16T..." }],
  "completed": true
}

締結(completed)後は GET /api/v1/contracts/{id}/pdf で署名・証明書込みの最終PDFをバイナリで取得できます。

Webhookで結果を受け取る

エンドポイントを登録すると、署名完了(contract.completed)・差し戻し(contract.rejected)・送付(contract.sent)のタイミングで、登録URLへPOSTが届きます。ポーリング不要でリアルタイムに締結を検知できます。

POST {あなたが登録したURL}
X-MUSUBI-Event: contract.completed
X-MUSUBI-Delivery: 1b2c3d...
X-MUSUBI-Signature: sha256=9f86d081884c7d659a2feaa0...

{
  "id": "1b2c3d...",
  "event": "contract.completed",
  "created_at": "2026-06-16T03:21:00.000Z",
  "data": {
    "document_id": "9da0...",
    "title": "営業代理店業務委託契約書 - 株式会社ABC商事",
    "status": "completed",
    "contract_status": "active",
    "counterparty_name": "株式会社ABC商事",
    "package_id": "..."
  }
}

署名検証(なりすまし防止・必須)

リクエストボディ(生のJSON文字列)を、登録時に発行された whsec_... でHMAC-SHA256したものが X-MUSUBI-Signature と一致することを確認してください。

import crypto from "crypto";

// 受信側(あなたのシステム)での署名検証
function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)   // 登録時に発行された whsec_... を使う
    .update(rawBody, "utf8")
    .digest("hex");
  // タイミング攻撃対策に timingSafeEqual を推奨
  return signatureHeader === expected;
}

エラー

エラーは HTTP ステータスと { "error": "..." } で返します。

  • 401 — キーが無効・失効済み・未指定
  • 403 — キーに必要なスコープがない
  • 400 — 必須パラメータ不足・不正なJSON
  • 404 — 対象の契約書が見つからない(他組織のものを含む)
  • 409 — PDF未完成・署名待ち者なし等の状態不整合

お問い合わせ: front@unser-inc.com / 提供: UNSER合同会社