تخطَّ إلى المحتوى

البدء السريع

ينقلك هذا الدليل من قالب منشور إلى ملف PDF موقَّع ومختوم. ويستخدم مفتاح اختبار، فلا يُحتسب أي شيء في الفوترة ويحمل كل مستند العلامة المائية TEST.

  1. تُنشأ مفاتيح API في لوحة التحكم، ضمن الإعدادات › مفاتيح API. اختر Test لهذا الدليل: يبدأ المفتاح بـ bf_test_. يُعرض المفتاح كاملًا مرة واحدة فقط؛ فاحفظه في متغير بيئة.

    نافذة طرفيّة
    export BONA_FIDE_API_KEY=bf_test_…

    يُرسَل المفتاح مع كل طلب بصيغة Authorization: Bearer … (أو x-api-key: …). راجع المصادقة.

  2. تُصمَّم القوالب في لوحة التحكم (ارفع ملف PDF أو مستند Word وضع الحقول، أو اكتبه في وضع المستند) ثم تُنشر. اعرض قائمتها للحصول على المعرّف:

    نافذة طرفيّة
    curl https://api.bonafidesign.com/v1/templates \
    -H "Authorization: Bearer $BONA_FIDE_API_KEY"

    يعيد GET /v1/templates/{id}/versions/latest قيم roles وfields الخاصة بالإصدار وJSON Schema الخاص بـ variables. وتحتوي صفحة القالب في لوحة التحكم أيضًا على لوحة Use in API فيها طلب جاهز لهذا الإصدار بعينه.

  3. يعرض POST /v1/envelopes القالب بمتغيراتك، ويثبّت الإصدار، ويبدأ التوجيه. حدّد مستلمًا واحدًا لكل دور (أدوار CC اختيارية). أرسل Idempotency-Key حتى لا تؤدي إعادة المحاولة إلى إرسال مزدوج.

    نافذة طرفيّة
    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"
    }'

    الاستجابة هي 201 Created مع المظروف:

    {
    "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
    }

    يحدّد delivery طريقة الوصول إلى المستلمين: email (الافتراضي) يرسل إلى كل مستلم رابط توقيع بالبريد الإلكتروني عندما يحين دوره؛ أما embedded وnone فلا يرسلان أي بريد، وتفتح أنت جلسات التوقيع بنفسك (الخطوة التالية).

  4. أصدِر جلسة توقيع للمستلم من الخادم الخلفي لديك. الجلسات قصيرة العمر (ttlSeconds، من 60 إلى 3600، والافتراضي 600) وأحادية الاستخدام.

    نافذة طرفيّة
    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"]
    }'

    مرّر قيمة token المُعادة (bfs_…) إلى صفحتك واعرض مكوّن الويب:

    <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>

    أغلفة React وVue، والأحداث، ونموذج الأمان: التوقيع المضمَّن.

    مع طريقة التحقق الافتراضية email_otp يؤكد الموقِّع رمزًا من ستة أرقام يُرسَل إلى بريده الإلكتروني قبل الإرسال. في وضع الاختبار، لا يُسلَّم البريد الإلكتروني إلا لأعضاء مؤسستك، لذا استخدم عنوانك الخاص أثناء الاختبار.

  5. تلقَّ إشعارًا عند الإتمام

    Section titled “تلقَّ إشعارًا عند الإتمام”

    سجّل نقطة نهاية webhook في الإعدادات › Webhooks (أو باستخدام POST /v1/webhook-endpoints) واحتفظ بالسر whsec_…. عندما يوقّع آخر مستلم يصلك envelope.completed، مع كل متغير وكل قيمة مُدخلة في data.values. ثم يتبعه ملف PDF المختوم مع envelope.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);
    });

    نزّل ملف PDF المختوم (المستند مع شهادة الإتمام، مع طابع زمني):

    نافذة طرفيّة
    curl -o signed.pdf "https://api.bonafidesign.com/v1/envelopes/env_8Gm2kQ4rT1/document?version=sealed" \
    -H "Authorization: Bearer $BONA_FIDE_API_KEY"

    القائمة الكاملة للأحداث، وإعادة المحاولة، والتحقق اليدوي: Webhooks.

الانتقال إلى الوضع المباشر

Section titled “الانتقال إلى الوضع المباشر”

استبدل مفتاح الاختبار بمفتاح bf_live_. لا تحمل المظاريف المباشرة علامة مائية، ويُرسَل البريد الإلكتروني إلى أي مستلم، وتُحتسب المظاريف المكتملة ضمن خطتك (الخطط والحدود). كل ما يُنشئه مفتاح يأخذ وضعه، ولا تعرض قوائمه إلا ذلك الوضع، ولا تُرسل مظاريف الاختبار إشعارات إلا إلى نقاط نهاية webhook في وضع الاختبار، لذا سجّل نقطة نهاية مباشرة أيضًا.