メインコンテンツへスキップ
Certyneo
パブリックAPI v1

電子署名をシステムに統合

エンベロープ送信、署名追跡、ウェブフック受信。シンプルなREST API、OpenAPI 3.0、curl/Node/Pythonの例 — Certyneoを数時間でHRIS、CRM、業務システムに統合できます。

クイックスタート

エンベロープ

cURLbash
# 1. Upload the PDF (multipart) and capture the returned document id.
DOC_ID=$(curl -s -X POST https://certyneo.com/api/v1/documents \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@contrat.pdf" | jq -r .id)

# 2. Create a DRAFT envelope referencing the uploaded document.
ENV_ID=$(curl -s -X POST https://certyneo.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d "{
    \"subject\": \"Contrat de prestation\",
    \"documentIds\": [\"$DOC_ID\"],
    \"recipients\": [
      { \"email\": \"client@example.com\", \"name\": \"Marie Dubois\", \"role\": \"SIGNER\" }
    ]
  }" | jq -r .id)

# 3. Dispatch the envelope — this sends the invitation email/SMS.
curl -X POST https://certyneo.com/api/v1/envelopes/$ENV_ID/send \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"
JavaScript / Nodets
// Plain fetch, no SDK to install.
const auth = { Authorization: `Bearer ${process.env.CERTYNEO_API_KEY}` };

// 1. Upload the PDF (multipart).
const fd = new FormData();
fd.append("file", new Blob([pdfBuffer], { type: "application/pdf" }), "contrat.pdf");
const doc = await fetch("https://certyneo.com/api/v1/documents", {
  method: "POST", headers: auth, body: fd,
}).then((r) => r.json());

// 2. Create the DRAFT envelope.
const envelope = await fetch("https://certyneo.com/api/v1/envelopes", {
  method: "POST",
  headers: { ...auth, "Content-Type": "application/json" },
  body: JSON.stringify({
    subject: "Contrat de prestation",
    documentIds: [doc.id],
    recipients: [
      { email: "client@example.com", name: "Marie Dubois", role: "SIGNER" },
    ],
  }),
}).then((r) => r.json());

// 3. Dispatch — this triggers the invitation channel for every recipient.
await fetch(`https://certyneo.com/api/v1/envelopes/${envelope.id}/send`, {
  method: "POST", headers: auth,
});
console.log(envelope.id);
Pythonpython
import os, requests

auth = {"Authorization": f"Bearer {os.environ['CERTYNEO_API_KEY']}"}

# 1. Upload the PDF (multipart).
with open("contrat.pdf", "rb") as f:
    doc = requests.post(
        "https://certyneo.com/api/v1/documents",
        headers=auth,
        files={"file": ("contrat.pdf", f, "application/pdf")},
    ).json()

# 2. Create the DRAFT envelope.
envelope = requests.post(
    "https://certyneo.com/api/v1/envelopes",
    headers={**auth, "Content-Type": "application/json"},
    json={
        "subject": "Contrat de prestation",
        "documentIds": [doc["id"]],
        "recipients": [
            {"email": "client@example.com", "name": "Marie Dubois", "role": "SIGNER"},
        ],
    },
).json()

# 3. Dispatch — this triggers the invitation channel for every recipient.
requests.post(
    f"https://certyneo.com/api/v1/envelopes/{envelope['id']}/send",
    headers=auth,
)
print(envelope["id"])

ツールからAPIを試す

PostmanコレクションとRapidAPI仕様書はOpenAPI仕様から生成されており、この仕様書はこのページも文書化しています。3つはすべてエンドポイントごとに実際のAPIと一致したままであり、最初の追加で分岐することはありません。

Postmanコレクション

25のリクエストがドメイン別に整理されています — エンベロープ、ドキュメント、テンプレート、シール、ウェブフック — それぞれについてリクエスト本体と応答の例が付属しています。コレクション内のapiKey変数にキーを貼り付けてから、GET /healthを実行します。このエンドポイントは認証を必要とせず、最初の認証付きリクエストの前にご使用の設定が正常であることを確認します。

RapidAPI仕様書

同じエンドポイントカタログで、ブラウザから直接試用できます。テストベンチは2つの異なるヘッダーを待ちます。プラットフォームが割り当てるRapidAPIキーと、AuthorizationヘッダーのCertyneoキー — 2番目のキーが実際にコールを認可します。

作成、送信、ステータス追跡、キャンセル。エンベロープは複数のドキュメントと複数の署名者(並列または順序付き)に対応します。

ウェブフック

`envelope.created`、`envelope.completed`、`envelope.declined`をご指定のURLで受信します。各ペイロードにHMAC SHA-256署名を付与し、発信元を検証できます。

すべてのエンベロープおよび受信者イベント(`envelope.sent`、`recipient.signed`、`envelope.completed`など)が選択したURLに配信されます — 完全なリストは/developers/webhooksを参照。各ペイロードに対するHMAC SHA-256により、出所を検証します。

簡易認証

ベアラートークン。環境ごと(テスト/本番)に1つの鍵。即時失効可能。制限は1鍵あたり1分あたり100リクエスト、バースト200、Retry-Afterヘッダー付きで429。

全署名サイクルをカバーする12ルート:エンベロープ、ドキュメント、ウェブフック、APIキー。すべてのルートはベアラートークンを受け入れ、JSONを返します。

53個の公開ルート:アカウント、ドキュメント、エンベロープ、テンプレート、ウェブフック、電子印鑑、APIキーおよび請求。すべてBearerトークンを受け入れ、JSONを返します。

メソッドパス説明
GET/api/v1/account/me認証済み呼び出し元の身元(ID、メール、プラン):スコープ不要の識別子テスト
GET/api/v1/sandboxテストキーで作成したデータを集計(30 日後に自動削除)
DELETE/api/v1/sandboxテストキーで作成したすべてのデータを削除(実データには影響なし)
POST/api/v1/documentsPDFをアップロード(マルチパート):ドキュメントIDを返す
GET/api/v1/documentsドキュメント一覧表示
GET/api/v1/documents/{id}ドキュメントのメタデータを読み取る
DELETE/api/v1/documents/{id}ドキュメント削除
GET/api/v1/envelopesエンベロープ一覧表示(?status=および?limit=でフィルター)
POST/api/v1/envelopesエンベロープ作成(ステータスDRAFT):templateIdから、またはdocumentIdsとオプションのfieldsアレイから
GET/api/v1/envelopes/{id}エンベロープステータス読み取り
PATCH/api/v1/envelopes/{id}DRAFTエンベロープ修正
DELETE/api/v1/envelopes/{id}DRAFTエンベロープ削除(送信後は409:代わりにキャンセル)
POST/api/v1/envelopes/{id}/sendDRAFTエンベロープ送信:招待状を発送
POST/api/v1/envelopes/{id}/void送信済みでまだ完全に署名されていないエンベロープをキャンセル:保留中の署名者に通知
POST/api/v1/envelopes/{id}/remind送信済みエンベロープの署名待ち中の署名者に再通知を送信する(オプションで特定の受取人)
GET/api/v1/envelopes/{id}/audit-traileIDAS監査ログPDFをダウンロード
POST/api/v1/envelopes/{id}/embed-url受信者の署名URLを返します。要求されたオリジンに対するフレーミング許可が付与されます。クリック時に呼び出してください。許可は2時間有効です。
GET/api/v1/audit-anchors/{root}公開:アンカー済み監査バッチのメタデータ、または?format=otsのプルーフファイル.ots(認証なし)
POST/api/v1/audit-anchors/verify公開:監査エントリとそのプルーフをアンカー済みMerkleルートに対して検証(認証なし、何も漏らさない)
GET/api/v1/envelopes/{id}/signed-document署名済みPDFをダウンロード(COMPLETED後)
GET/api/v1/envelopes/bulk大量送信一覧表示
POST/api/v1/envelopes/bulk一括送信:テンプレートとCSVからN個のエンベロープを作成(Standard/Businessのみ)
GET/api/v1/envelopes/bulk/{id}一括送信の進捗:カウンター、行単位での失敗、作成されたエンベロープ
GET/api/v1/templates再利用可能なエンベロープテンプレートをリストアップ
POST/api/v1/templatesテンプレートを作成(ドキュメント、役割、配置されたフィールド)
GET/api/v1/workspacesエンベロープを作成できるワークスペースを一覧表示する
POST/api/v1/sepa-mandatesSEPAマンデートのPDFおよびそのDRAFTエンベロープを生成、フィールドは既に配置済み
POST/api/v1/payroll-adapters/normalize給与CSVを正規化(Silae、Sage Paie、PayFit、Lucca)を一括送信形式に
POST/api/v1/ag-copropriete分譲住宅管理組合の総会エンベロープを作成(決議および議決権比率)
POST/api/v1/ag-copropriete/{envelopeId}/votes区分所有者の総会決議に対する投票を記録
POST/api/v1/ag-copropriete/{envelopeId}/tally総会を開票:決議ごとの結果、議決権比率で加重
GET/api/v1/videos/{videoId}保管された身元確認ビデオをダウンロード:RGPD アクセス権(第15条)
GET/api/v1/webhookswebhookをリストアップ
POST/api/v1/webhookswebhookを登録:署名シークレットを1回のみ返す
GET/api/v1/webhooks/{id}webhook購読を読み取る
PATCH/api/v1/webhooks/{id}URL、イベント、またはアクティブな状態を変更
DELETE/api/v1/webhooks/{id}webhookを登録解除
POST/api/v1/sealsドキュメントに適格電子シールを押印
GET/api/v1/seals/{id}シールのステータスを読み取る
GET/api/v1/seals/{id}/certificateシールの証明書をダウンロード
GET/api/v1/payslips/workspaces給与明細書:このキーが配布、保有、または委任する顧客(会計事務所、給与管理者)のスペース
GET/api/v1/payslips/employees給与明細書:従業員レジスタ、電子交付を拒否した者を含む(用紙給与明細書が必要)
PUT/api/v1/payslips/employees給与明細:レジスターから従業員を追加または更新(削除しない)
POST/api/v1/payslips給与明細(PDF)を従業員のロッカーに提出:封印、50年間保管、重複なしの再試行
GET/api/v1/payslips提出された給与明細を一覧表示、確認証明付き
GET/api/v1/keysAPIキーを一覧表示
POST/api/v1/keysAPIキーを作成:シークレットは1回だけ表示
PATCH/api/v1/keys/{id}キーの名前変更または取り消し
DELETE/api/v1/keys/{id}キーを削除
GET/api/v1/billing/usage当期の消費および予想コスト
GET/api/v1/statusサービスステータス
GET/api/v1/healthヘルスチェック:データベース、キュー、オブジェクトストレージ
GET/api/v1/openapi機械が読み込み可能なOpenAPI仕様

封筒のテンプレート

テンプレートは、PDFと役割、および署名フィールドの位置を一度だけ保存し、送信するたびに再利用します。documentIdsの代わりにtemplateIdで識別子を渡すと、配置されたフィールドが作成されたエンベロープにコピーされます。

  • • テンプレートはダッシュボードから作成します(テンプレート → 新しいテンプレート)。ここでドキュメントをアップロードしてマウスでフィールドを配置します — これが最も簡単な方法です。APIではPOST /api/v1/templatesでも作成でき、ドキュメント、役割、フィールドを提供します。ただし、フィールドは絶対座標(ページ、x、y、幅、高さ)で位置付けられるため、PDFのレイアウトを知っている必要があります。
  • • テンプレートをまだ保存していないアカウントでは、GET /api/v1/templatesは空のリストを返します。これは正常な動作であり、認証の欠陥ではありません。
  • • リストには、APIキーを所有するユーザーに属するテンプレートのみが含まれます。同僚が作成したテンプレートは、共有ワークスペース内でも表示されません。テンプレートを所有するアカウントからキーを生成してください。
  • • templateIdとdocumentIdsは相互に排他的です。どちらか一方を送信してください。両方または両方とも送信しないでください。
  • • テンプレートが持つ署名者ロールと同じ数以上のSIGNER受信者を提供してください。そうしないと、作成は400で拒否されます。リストから返されるsignerCountフィールドは期待される数を示しています。
  • • テンプレートの署名レベルはエンベロープに継承されます。ただし、リクエストで明示的にsignatureLevelを渡す場合を除きます。
cURLbash
# 1. Discover the templates saved on this account.
curl -s https://certyneo.com/api/v1/templates \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

# {
#   "data": [
#     { "id": "cmdq7f4k80001s6y2h1xa9pl3", "name": "Contrat de prestation",
#       "signerCount": 2, "documentCount": 1, "signatureLevel": "SIMPLE" }
#   ],
#   "pagination": { "page": 1, "pageSize": 20, "total": 1, "pages": 1 }
# }
#
# An empty "data" array means no template exists on this account yet —
# create one from the dashboard, it is not an authentication problem.

# 2. Create the envelope FROM the template: no documentIds and no field
#    coordinates, both are carried by the template. Pass one SIGNER
#    recipient per signer role, in the template's role order.
curl -X POST https://certyneo.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Contrat de prestation",
    "templateId": "cmdq7f4k80001s6y2h1xa9pl3",
    "recipients": [
      { "email": "client@example.com", "name": "Marie Dubois", "role": "SIGNER" },
      { "email": "legal@example.com", "name": "Paul Martin", "role": "SIGNER" }
    ]
  }'

# 3. The envelope is DRAFT at this point — POST /envelopes/{id}/send
#    dispatches it, exactly as in the quick-start above.

Power AutomateまたはZapierから

当社のノーコードコネクタの「エンベロープを作成」アクションはテンプレートパスのみをサポートしています。「テンプレート」フィールドは必須です。実行するたびに異なるアドホックドキュメントの場合は、「ドキュメントをアップロード」アクションと、返されたdocumentIdsを渡してPOST /api/v1/envelopesへの生HTTPアクションを使用してください。

ドキュメントの送信: 2 つの形式が許可されています

POST /api/v1/documents は 2 つの方法でファイルを受け入れます。どちらの場合も同じ制御が適用されます: 許可されるタイプ、50 MB の上限、バイナリ署名の検証、ウイルス対策分析。

  • • multipart/form-data で、file という名前の部分。これは従来の形式で、curl -F とほとんどのライブラリで使用されます。
  • • 生のボディで: ファイルのオクテットはリクエストのボディを構成し、Content-Type ヘッダーはそのタイプを指定します (例: application/pdf)。リクエストをラップせずにコンテンツをそのまま送信するツールから便利です。これは Power Automate コネクタが行うことです。
  • • 生のボディでは、ファイル名がボディに記載される場所はありません。X-File-Name ヘッダーまたは ?fileName= パラメーターで指定してください。ない場合、ドキュメントはそのタイプに基づいて名前が付けられます。
  • • サポートされていないタイプは 415 で応答し、2 つの許可された形式を示します。multipart として宣言されているが読み取り不可のボディは 400 で応答します。どちらもサーバーエラーではありません。
cURLbash
# a. multipart/form-data — the classic shape.
curl -X POST https://certyneo.com/api/v1/documents \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@contrat.pdf;type=application/pdf"

# b. raw body — the file bytes ARE the body, typed by Content-Type.
#    The filename has nowhere to live in the body, so pass it as a header
#    (or ?fileName=). Without it the document is named after its type.
curl -X POST https://certyneo.com/api/v1/documents \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/pdf" \
  -H "X-File-Name: contrat.pdf" \
  --data-binary "@contrat.pdf"

# Both return the same 201 with the document id to pass as documentIds.

署名フィールドの配置

テンプレートなしで、documentIdsから作成されたエンベロープには事前に配置されたフィールドがありません。署名者は署名する場所がないドキュメントを受け取ります。同じ作成呼び出しで送信されるfieldsアレイは、各フィールドを正確に配置します — これはAPIサイドで、テンプレートが一度だけ保存するのと同等です。

  • • 座標はPDFポイント単位で、原点はページの左上、Y軸は下向きです(A4ページは595×842ポイントを測定します)。xとyはフィールドの左上隅を示し、widthとheightはそのサイズを示します。
  • • pageNumber は 1 から始まり、documentIndex は 0 から始まります。ドキュメントを超えたページ番号は作成時に拒否されません。署名時にこのフィールドは無視され、どこにも表示されません。フィールドが呼び出しに見当たらない場合は、まずこの点を確認してください。
  • • recipientEmail は、大文字と小文字の区別なく、同じ呼び出しの受信者の 1 人と一致する必要があります。一致しない場合、作成は失敗し、すべての誤りのある行をリストアップします。これにより、1 つずつ修正する手間が省けます。
  • • fields と templateId は相互に排他的です。テンプレートは既に独自のレイアウトを含んでいます。したがって、fields 配列は documentIds を使用する場合にのみ使用されます。
  • • 許可されるタイプ: SIGNATURE、INITIALS、DATE_SIGNED、TEXT、CHECKBOX、RADIO_GROUP。required は既定で true です。placeholder と dateFormat はオプションであり、options は RADIO_GROUP にのみ適用されます。
  • • エンベロープは最大 100 個のフィールド、20 個のドキュメント、50 人の受信者を受け入れます。ただし、ご利用のプランの制限はより低い可能性があります。
cURLbash
# Ad-hoc envelope WITH pre-placed fields — no template involved.
# Coordinates are PDF points, origin TOP-LEFT of the page, +Y downwards
# (A4 = 595 x 842 pt). x / y are the field box's top-left corner.
#
# The last field is positioned by ANCHOR instead of by eye: the server
# locates "Signature du client" in the PDF and computes the spot. x / y
# stay required there — they are the fallback if the text is not found.
curl -X POST https://certyneo.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Contrat de prestation",
    "documentIds": ["cmdq7f4k80001s6y2h1xa9pl3"],
    "recipients": [
      { "email": "client@example.com", "name": "Marie Dubois", "role": "SIGNER" }
    ],
    "fields": [
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "SIGNATURE",
        "x": 90, "y": 640, "width": 180, "height": 44 },
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "DATE_SIGNED",
        "x": 320, "y": 640, "width": 140, "height": 30,
        "dateFormat": "DD/MM/YYYY" },
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "TEXT",
        "x": 90, "y": 700, "width": 200, "height": 30,
        "placeholder": "Fonction", "required": false },
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "SIGNATURE",
        "anchorText": "Signature du client", "anchorPlacement": "below",
        "anchorIndex": 0,
        "x": 90, "y": 640, "width": 180, "height": 44 }
    ]
  }'

# The envelope is DRAFT at this point — POST /envelopes/{id}/send
# dispatches it, exactly as in the quick-start above.

テキストアンカー: 座標を知らずにフィールドを配置する

座標の代わりに、フィールドはドキュメントに印刷されたテキストを参照できます。anchorText はこれを PDF で検出し、サーバーは作成時に位置を計算します。ドキュメントが送信のたびに再生成される場合、これが推奨される方法です。差し込み印刷、契約書ジェネレーター。レイアウトは変わりますが、「顧客の署名」という記載は残ります。anchorPlacement はテキストの側面を示します (既定は right、下方は below、上方は above、左方は left)。anchorIndex はテキストが複数回現れるときに出現回数を選択します。

アンカーを使用する場合でも、x と y は必須です。フォールバックとして機能します。見つからないアンカーは作成を失敗させません。フィールドは、提供した文字通りの位置を保持し、応答にエラーや警告はありません。したがって、0,0 ではなく妥当なフォールバックを指定し、最初の送信でレンダリングを確認してください。

統合署名:アプリケーションを離れずに署名

クライアントがご自身のインターフェイスからドキュメントを確認および署名します。セレモニーはページ上のウィンドウで開き、完了後は自動的にご自身のページに戻ります。サーバー側では、redirectUrlを指定してエンベロープを通常通り作成してから、SDKに受信者の署名URLを委託します。

  • • クリックハンドラー内で直接Certyneo.sign()を呼び出し、getUrlを使用してサーバー呼び出しを渡します。sign()の前にawaitするとユーザージェスチャーから外れるため、SafariおよびFirefoxがウィンドウをブロックします。SDKはすぐにウィンドウを開き、プロミスが解決されたときにロードします。
  • • redirectUrlはリターンチャネルです。certyneo_status(completedまたはdeclined)とcertyneo_envelopeを追加して、署名者をそこにリダイレクトします。このリターンページで同じスクリプトを読み込んでください。背後に開いたままのポータルウィンドウに通知するスクリプトです。
  • • 統合モードでは、当社独自のコールトゥアクション表示は非表示になります。お客様は Certyneo アカウント作成への招待を一度も見ることはありません。
  • • ブラウザがウィンドウを拒否した場合、SDK は自動的にフルページリダイレクトに切り替わります。署名者の利用フローは同じであり、お客様のリターンページはまったく同じパラメータを受け取ります。
  • • 意図的に「ユーザーが中止した」というコールバックは存在しません。ウィンドウの状態はお客様のページから読み取ることができず、そのようなコールバックは誤って発火するでしょう。到達しない署名は webhook まで保留中のままになります。
JavaScriptjavascript
// 1. Your server creates and sends the envelope, then hands the browser the
//    recipient's signing URL. Nothing new on the API side:
//      POST /api/v1/envelopes        { …, "redirectUrl": "https://your-app.com/quote/42/signed" }
//      POST /api/v1/envelopes/{id}/send   → recipients[].accessToken
//      signingUrl = "https://certyneo.com/sign/" + accessToken

// 2. On your quote page — load the SDK once:
//      <script src="https://certyneo.com/embed.js"></script>

document.querySelector("#sign").addEventListener("click", () => {
  Certyneo.sign({
    // Called AFTER the window is already open, so no popup blocker ever
    // sees a delay between the click and window.open.
    getUrl: () =>
      fetch("/api/quote/42/signature", { method: "POST" })
        .then((r) => r.json())
        .then((d) => d.signingUrl),

    onCompleted: (e) => showConfirmation(e.envelopeId),
    onDeclined: () => showDeclined(),
    onError: (e) => showError(e),
  });
});

// 3. On https://your-app.com/quote/42/signed — your return page — load the
//    same script and render a short confirmation. It relays the outcome to
//    the portal window behind it, then closes itself.

ブラウザイベントは署名の証拠ではありません。

onCompleted はブラウザが発行する表示信号であるため、誰でもコンソールから改ざんすることができます。このベースに基づいてドキュメントを「署名済み」に切り替えてはいけません。画面を更新するために使用してください。サーバーが受け取った webhook 署名付き envelope.completed に基づいて実際の状態を確認してください。これは支払い統合の典型的な落とし穴であり、ここで全く同じように繰り返されます。

お客様のコンピュータで開発する

テストキーを使用すると、redirectUrlはhttp://localhost(および127.0.0.1)を受け入れます。本番環境に展開する前に、マシン上で全体のジャーニーを構築できます。実際のキーはこれを拒否するため、本番環境のエンベロープが自分のものではないマシンに本当の署名者をリダイレクトすることはありません。

ページ内で署名式を表示する

フレームモードは、署名をウィンドウなしでインターフェース内に表示します。ウィンドウモードより1つ多い手順が必要です:署名式を表示するサイトがあなたのものであることを証明することです。これにより、第三者があなたの顧客を欺くために当社の署名式をフレーム化することを防止できます。

  • • 設定 → 統合署名でサイトを登録し、その後表示されたDNSレコードを公開します。正確なアドレスが必要です。サブドメインまたは異なるポートは別のサイトとして扱われます。
  • • 各署名のたびに、POST /api/v1/envelopes/{id}/embed-urlに対して新鮮なURLをリクエストします。これは表示権限を含んでおり、2時間有効です。これはエンベロープの作成時ではなく、クリック時の時間に対応しています。
  • • 2つの流れはフレーム内で実行できません。認定署名(本人確認がフレーム化を拒否します)と署名時支払いです。どちらの場合でも署名者は完全なウィンドウにリダイレクトされます。
  • • 「Certyneo提供」の表示はBusiness プランからフレーム内で消えます。フレームモード自体はStandardプランから含まれています。
JavaScriptjavascript
// Mode cadre : la cérémonie s'affiche DANS votre page.
//
// 1. Déclarez votre site une fois pour toutes dans Réglages → Signature
//    intégrée, et publiez l'enregistrement DNS qu'on vous y donne.
//
// 2. À chaque signature, votre serveur demande une URL fraîche. Elle porte
//    l'autorisation qui permet au navigateur d'afficher la cérémonie chez
//    vous, et vaut deux heures :
//
//      POST /api/v1/envelopes/{id}/embed-url
//      { "origin": "https://portail.exemple.fr" }
//      -> { "signingUrl": "…", "expiresAt": "…" }

Certyneo.sign({
  mode: "iframe",
  el: "#zone-signature",        // sélecteur ou nœud de votre page

  getUrl: () =>
    fetch("/api/devis/42/signature", { method: "POST" })
      .then((r) => r.json())
      .then((d) => d.signingUrl),

  onCompleted: (e) => afficherConfirmation(e.envelopeId),
  onDeclined: () => afficherRefus(),
});

// Le cadre parle à votre page par postMessage — pas besoin de page de retour,
// contrairement au mode fenêtre.

メール送信なしで署名させる

自社でセレモニーを表示するポータルは、多くの場合、当社の招待が不要です。招待は独自のユーザージャーニーと並行して到着し、必要としていないクライアントにアカウントを提案します。受信者の通知チャネルの値をNONEに設定すると、何も送信されません。お客様がユーザーを署名ページに導きます。

  • • この設定はエンベロープ単位ではなく受信者単位です。ホストしているクライアントには通知を送らず、外部の副署者には メール送信を続けることができます。副署者にはポータルがないため、メール送信が必要です。
  • • これは署名者と承認者に限定されます。これらは提供する必要があるリンクが存在する唯一のロールです。作成・送信レスポンスからリンクを読み取るか、POST /api/v1/envelopes/{id}/embed-url でクリック時に新しいURLをリクエストしてください。
  • • この受信者への自動催促は自動的に停止されます。当社は送信したことがなく、催促から始めることはありません。その他の受信者は通常通り催促されます。
  • • 署名証明書にこれが記載されます。受信者ごとに記載されます。これについて沈黙している証拠ファイルは、この署名者が当社から実在しない招待を受け取ったという印象を与えます。
JSONjson
POST /api/v1/envelopes

{
  "subject": "Mandat de gestion",
  "documentIds": ["doc_8f2c1a4b9e7d"],
  "recipients": [
    {
      "email": "client@exemple.fr",
      "name": "Camille Client",
      "role": "SIGNER",
      "notificationChannel": "NONE"
    },
    {
      "email": "notaire@exemple.fr",
      "name": "Maître Notaire",
      "role": "SIGNER"
    }
  ]
}

// La réponse rend le lien de chaque signataire :
//
//   "recipients": [
//     { "email": "client@exemple.fr",  "accessToken": "…",
//       "notificationChannel": "NONE"  },
//     { "email": "notaire@exemple.fr", "accessToken": "…",
//       "notificationChannel": "EMAIL" }
//   ]
//
// Le client ne reçoit rien : vous l'emmenez sur sa signature depuis votre
// portail. Le notaire, lui, reçoit son invitation comme d'habitude.

クライアント名を送信者として表示

デフォルトでは、署名者はAPI キーの保有者の名前を読みます。複数の企業のドキュメントに単一のキーで署名させる場合は、エンベロープ作成時に sender フィールドを渡してください。署名ページと招待メール及びリマインダーメールに該当する企業名が表示されます。

  • • Business プラン以上で利用可能です。下位プランでは、署名者が予期した名前以外の名前を読む可能性があるため、作成が拒否されます。
  • • 名前は表示のみです。証明書と監査証跡には実際の送信者が保持され、メールは常に Certyneo から送信されます。
  • • アドレスはオプションです。アドレスがない場合、署名者は名前のみを表示し、API キーの保有者のアドレスは表示されません。
JSONjson
POST /api/v1/envelopes

{
  "subject": "Devis 2026-118",
  "documentIds": ["doc_8f2c1a4b9e7d"],
  "recipients": [
    { "email": "client@exemple.fr", "name": "Camille Client", "role": "SIGNER" }
  ],
  "sender": {
    "name": "1.2.3. Panneaux Solaires",
    "email": "devis@123-panneaux-solaires.fr"
  }
}

認証

各呼び出しはAuthorizationヘッダーにAPIキーを含みます。キーは設定 → APIキーから生成され、一度だけ表示されます。

HTTPhttp
GET /api/v1/account/me HTTP/1.1Host: certyneo.com
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx

# 200 OK
{ "data": { "id": "usr_…", "email": "you@example.com", "plan": "BUSINESS", "environment": "live" } }
  • • 形式:本番環境ではsk_live_…、サンドボックスではsk_test_…。ヘッダー:Authorization: Bearer <キー>。
  • • スコープ:envelopes、documents、webhooks、seals — 読み取り(:read)または書き込み(:write)。書き込みは読み取りを含みます。スコープ*はすべての権限を与えます。
  • • sk_test_キーはサンドボックスでリソースを作成し、クォータと請求から除外されます。受信者のアドレスが送信アカウント自身のメールアドレスと一致しない限り、実際のメールは送信されません — フロー全体を自分自身でテストするのに便利です。
  • • エラー:401無効なキー、403スコープ不足、429レート制限超過、402月間クォータ達成。

回答の形式

クライアントを作成する前に知っておくべき点:コレクションはdataオブジェクト内にカプセル化されますが、単一リソースは平坦に返されます。単一リソースでresponse.data.dataを読み込むとundefinedが返されます。

収集 — 封入json
// GET /api/v1/envelopes
// Collections are WRAPPED in a "data" array.
{
  "data": [
    { "id": "env_abc123", "subject": "Contrat", "status": "SENT" }
  ]
}
単一リソース — 平坦json
// GET /api/v1/envelopes/{id}
// Single resources are returned FLAT — no "data" envelope.
{
  "id": "env_abc123",
  "subject": "Contrat",
  "status": "COMPLETED",
  "recipients": [ /* … */ ]
}

レート制限はすべてのクライアントに安定したサービス品質を保証します。より高い制限が必要な場合はお問い合わせください。

これらの制限により、すべてのお客様に安定したサービス品質を保証します。これ以上の容量が必要な場合は、弊社までお問い合わせください。

  • • APIキーあたり1分間に100件のリクエスト
  • • 10秒以内に最大200件のリクエストまでのバースト負荷に対応
  • • 秒単位の遅延を示す Retry-After ヘッダー付きの 429 レスポンス

さらに詳しく