Bắt đầu nhanh
Hướng dẫn này đưa một mẫu đã xuất bản đến một tệp PDF đã ký và niêm phong. Hướng dẫn dùng khóa thử nghiệm, nên không có gì bị tính phí
và mọi tài liệu đều có hình mờ TEST.
-
Tạo khóa API
Phần tiêu đề “Tạo khóa API”Khóa API được tạo trong bảng điều khiển, tại Settings › API keys. Chọn Test cho hướng dẫn này: khóa bắt đầu bằng
bf_test_. Khóa đầy đủ chỉ hiển thị một lần; hãy lưu nó dưới dạng biến môi trường.Terminal window export BONA_FIDE_API_KEY=bf_test_…Mọi yêu cầu đều gửi khóa dưới dạng
Authorization: Bearer …(hoặcx-api-key: …). Xem Xác thực. -
Tìm mẫu của bạn
Phần tiêu đề “Tìm mẫu của bạn”Mẫu được thiết kế trong bảng điều khiển (tải lên tài liệu PDF hoặc Word rồi đặt các trường, hoặc soạn ở chế độ Document) và sau đó được xuất bản. Liệt kê các mẫu để lấy id:
Terminal window curl https://api.bonafidesign.com/v1/templates \-H "Authorization: Bearer $BONA_FIDE_API_KEY"const res = await fetch('https://api.bonafidesign.com/v1/templates', {headers: { Authorization: `Bearer ${process.env.BONA_FIDE_API_KEY}` },});const { data } = await res.json(); // [{ id: 'tpl_…', name: 'Mutual NDA', latestVersion: 3, … }]import os, requestsAPI = "https://api.bonafidesign.com"headers = {"Authorization": f"Bearer {os.environ['BONA_FIDE_API_KEY']}"}templates = requests.get(f"{API}/v1/templates", headers=headers).json()["data"]GET /v1/templates/{id}/versions/latesttrả vềroles,fieldscủa phiên bản và JSON Schema củavariables. Trang của mẫu trong bảng điều khiển cũng có bảng Use in API với một yêu cầu dựng sẵn cho đúng phiên bản đó. -
Tạo phong bì
Phần tiêu đề “Tạo phong bì”POST /v1/envelopeskết xuất mẫu với các biến của bạn, cố định phiên bản và bắt đầu chuyển tiếp. Cung cấp một người nhận cho mỗi vai trò (vai trò CC là tùy chọn). Gửi kèmIdempotency-Keyđể một lần thử lại không thể gửi hai lần.Terminal window curl https://api.bonafidesign.com/v1/envelopes \-H "Authorization: Bearer $BONA_FIDE_API_KEY" \-H "Content-Type: application/json" \-H "Idempotency-Key: onboarding-8841" \-d '{"template": "tpl_…","version": "latest","variables": {"client": { "name": "Acme Robotics, Inc." },"effective_date": "2026-10-13"},"recipients": [{ "role": "client", "name": "Jane Doe", "email": "jane@acme.dev" }],"delivery": "embedded","externalId": "user_8841","dedupeOn": "external_id"}'const res = await fetch('https://api.bonafidesign.com/v1/envelopes', {method: 'POST',headers: {Authorization: `Bearer ${process.env.BONA_FIDE_API_KEY}`,'Content-Type': 'application/json','Idempotency-Key': 'onboarding-8841',},body: JSON.stringify({template: 'tpl_…',version: 'latest',variables: { client: { name: 'Acme Robotics, Inc.' }, effective_date: '2026-10-13' },recipients: [{ role: 'client', name: 'Jane Doe', email: 'jane@acme.dev' }],delivery: 'embedded',externalId: 'user_8841',dedupeOn: 'external_id',}),});if (res.status === 422) {// RFC 9457 problem: one entry per error, each with a JSON Pointer such as /variables/client/nameconsole.error((await res.json()).errors);}const envelope = await res.json(); // { id: 'env_…', status: 'sent', recipients: [{ id: 'rcp_…', … }] }res = requests.post(f"{API}/v1/envelopes",headers={**headers, "Idempotency-Key": "onboarding-8841"},json={"template": "tpl_…","version": "latest","variables": {"client": {"name": "Acme Robotics, Inc."}, "effective_date": "2026-10-13"},"recipients": [{"role": "client", "name": "Jane Doe", "email": "jane@acme.dev"}],"delivery": "embedded","externalId": "user_8841","dedupeOn": "external_id",},)if res.status_code == 422:print(res.json()["errors"]) # [{"pointer": "/variables/client/name", "message": "…"}]envelope = res.json()Phản hồi là
201 Createdkèm phong bì:{"id": "env_8Gm2kQ4rT1","organization": "org_…","template": "tpl_…","templateVersion": 3,"status": "sent","seal": "not_started","testMode": true,"recipients": [{"id": "rcp_5Jw0pLs9Xe","role": "client","name": "Jane Doe","email": "jane@acme.dev","order": 1,"status": "sent","verification": "email_otp","completedAt": null}],"documentHash": "9f2c…","sealedDocumentHash": null,"externalId": "user_8841","metadata": {},"createdAt": "2026-10-13T13:58:04.512Z","completedAt": null}deliveryquyết định cách liên hệ với người nhận:email(mặc định) gửi email liên kết ký cho từng người nhận khi đến lượt họ;embeddedvànonekhông gửi email nào, và bạn tự mở các phiên ký (bước tiếp theo). -
Để người nhận ký
Phần tiêu đề “Để người nhận ký”Tạo một phiên ký cho người nhận từ backend của bạn. Phiên có thời hạn ngắn (
ttlSeconds, từ 60 đến 3600, mặc định 600) và chỉ dùng được một lần.Terminal window curl https://api.bonafidesign.com/v1/envelopes/env_8Gm2kQ4rT1/sessions \-H "Authorization: Bearer $BONA_FIDE_API_KEY" \-H "Content-Type: application/json" \-d '{"recipient": "rcp_5Jw0pLs9Xe","mode": "embedded","allowedOrigins": ["https://app.example.com"]}'Chuyển
tokenđược trả về (bfs_…) cho trang của bạn và kết xuất web component:<script type="module" src="https://js.bonafidesign.com/v1"></script><bf-signing session="bfs_…"></bf-signing><script>document.querySelector('bf-signing').addEventListener('completed', (e) => console.log('signed', e.detail.envelope));</script>Bản bao cho React và Vue, sự kiện và mô hình bảo mật: Ký nhúng.
Terminal window curl https://api.bonafidesign.com/v1/envelopes/env_8Gm2kQ4rT1/sessions \-H "Authorization: Bearer $BONA_FIDE_API_KEY" \-H "Content-Type: application/json" \-d '{ "recipient": "rcp_5Jw0pLs9Xe", "mode": "hosted", "returnUrl": "https://app.example.com/done" }'Chuyển hướng người ký đến
urlđược trả về (https://sign.bonafidesign.com/s/bfs_…). Trang lưu trữ sẵn được thiết kế ưu tiên thiết bị di động và không cần tài khoản.Với phương thức xác minh mặc định
email_otp, người ký xác nhận một mã gồm sáu chữ số được gửi đến email của họ trước khi gửi. Ở chế độ thử nghiệm, email chỉ được gửi đến thành viên trong tổ chức của bạn, vì vậy hãy dùng địa chỉ của chính bạn khi thử nghiệm. -
Nhận thông báo khi hoàn tất
Phần tiêu đề “Nhận thông báo khi hoàn tất”Đăng ký một endpoint webhook tại Settings › Webhooks (hoặc bằng
POST /v1/webhook-endpoints) và giữ lại secretwhsec_…. Khi người nhận cuối cùng ký, bạn nhận đượcenvelope.completed, với mọi biến và giá trị đã nhập trongdata.values. Tệp PDF đã niêm phong đến sau cùngenvelope.sealed.import express from 'express';import { Webhook } from 'standardwebhooks';const wh = new Webhook(process.env.BONA_FIDE_WEBHOOK_SECRET!);const app = express();app.post('/hooks/bona-fide', express.raw({ type: 'application/json' }), async (req, res) => {const event = wh.verify(req.body, req.headers as Record<string, string>) as { type: string; data: any };if (event.type === 'envelope.completed') await saveValues(event.data.envelope.id, event.data.values);if (event.type === 'envelope.sealed') await fetchSealedPdf(event.data.envelope.id);res.sendStatus(204);});Tải xuống tệp PDF đã niêm phong (tài liệu kèm chứng nhận hoàn tất, có dấu thời gian):
Terminal window curl -o signed.pdf "https://api.bonafidesign.com/v1/envelopes/env_8Gm2kQ4rT1/document?version=sealed" \-H "Authorization: Bearer $BONA_FIDE_API_KEY"Danh sách sự kiện đầy đủ, cơ chế thử lại và xác minh thủ công: Webhook.
Chuyển sang chạy thật
Phần tiêu đề “Chuyển sang chạy thật”Thay khóa thử nghiệm bằng khóa bf_live_. Phong bì ở chế độ trực tiếp không có hình mờ, email được gửi đến mọi người nhận, và
các phong bì đã hoàn tất được tính vào gói của bạn (Gói và giới hạn). Mọi thứ một khóa tạo ra đều mang
chế độ của khóa đó, danh sách của khóa chỉ hiển thị chế độ đó, và phong bì thử nghiệm chỉ thông báo đến các endpoint webhook ở chế độ thử nghiệm, vì vậy hãy đăng ký
thêm một endpoint ở chế độ trực tiếp.