Преход към основното съдържание
Certyneo
Публичен API v1

Интегрирайте електронния подпис в вашия стек

Изпращайте плика, проследявайте подписите, получавайте webhooks. Прост REST API, OpenAPI 3.0, примери curl/Node/Python — всичко за свързване на Certyneo към вашия HRIS, CRM или бизнес софтуер за няколко часа.

Бързо начало

Три стъпки: създайте API ключ от настройките, кодирайте вашия PDF в base64, изпратете. Отговорът съдържа `signUrl`, който можете да споделите директно с получателя.

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, която документира и тази страница. Трите остават в синхрон с реалния API, endpoint по endpoint, вместо да се разминават при първото добавяне.

Колекция на Postman

25-те заявки организирани по домейн — пликове, документи, шаблони, печати, webhooks — с пример на тяло и отговор за всяка. Вставете вашия ключ в променливата apiKey на колекцията, след това стартирайте GET /health: тя не изисква никаква автентификация и потвърждава, че вашата конфигурация е добра преди първото автентифицирано обаждане.

Картата на RapidAPI

Същият каталог на endpoints, който може да се тества директно от браузъра. Полигонът очаква два различни хедъра: ключът на RapidAPI, който платформата ви издава, и вашия ключ на Certyneo в Authorization — вторият е този, който реално разрешава обаждането.

Плика

Създаване, изпращане, проследяване на състояние, отмяна. Плик може да съдържа множество документи и множество подписващи (паралелно или последователно).

Уебхукове

Всички събития на плик и получател (`envelope.sent`, `recipient.signed`, `envelope.completed`…) доставени на избрания от вас URL адрес — пълен списък на /developers/webhooks. HMAC SHA-256 на всеки payload за проверка на произхода.

Просто удостоверяване

Bearer token. Един ключ за среда (тест / prod). Моментално отозвамо. Лимит 100 заявки/мин/ключ, burst от 200, чист 429 с заглавие Retry-After.

Налични endpoints

52 публични маршрута : профил, документи, плик, шаблони, уебкукички, електронни печати, ключове на API и фактуриране. Всички приемат Bearer токен и връщат JSON.

МетодПътОписание
GET/api/v1/account/meИдентичност на удостоверения абонат (id, имейл, пакет) : тест на идентификатори без необходимост от scope
GET/api/v1/sandboxПреброяване на данните, създадени с тестови ключове (изтриват се автоматично след 30 дни)
DELETE/api/v1/sandboxИзтриване на всички данни, създадени с тестови ключове, без да се засягат реалните данни
POST/api/v1/documentsКачване на PDF (multipart) : връща 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}/sendИзпращане на плик DRAFT : отправя покани
POST/api/v1/envelopes/{id}/voidОтмяна на изпратен плик все още не напълно подписан : чакащите подписватели се уведомяват
GET/api/v1/envelopes/{id}/audit-trailИзтегляне на PDF на дневник на доказателство eIDAS
POST/api/v1/envelopes/{id}/embed-urlВръща URL адреса на подпис на получателя, придружен с разрешение за рамкиране за исканото начало. Трябва да се извика при клик: разрешението е валидно два часа.
GET/api/v1/audit-anchors/{root}Публично : метаданни на котва на партида за одит или доказателствено файл .ots с ?format=ots (без удостоверяване)
POST/api/v1/audit-anchors/verifyПублично : проверка на вход на одит и неговото доказателство срещу закотвена Меркелова корен (без удостоверяване, не разкрива нищо)
GET/api/v1/envelopes/{id}/signed-documentИзтегляне на подписан PDF (веднъж COMPLETED)
GET/api/v1/envelopes/bulkСписък на вашите масови изпращания
POST/api/v1/envelopes/bulkМасово изпращане: създаване на N пликове от шаблон и CSV (само Standard/Business)
GET/api/v1/envelopes/bulk/{id}Напредък на масово изпращане: броячи, неуспехи по ред, създадени пликове
GET/api/v1/templatesСписък на преизползваемите шаблони на пликове
POST/api/v1/templatesСъздаване на шаблон (документи, роли, позиционирани полета)
GET/api/v1/workspacesСписък на работните пространства, в които можете да създадете плик
POST/api/v1/sepa-mandatesГенериране на PDF на мандат SEPA и неговия 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/webhooksСписък на уебкуките
POST/api/v1/webhooksРегистриране на уебкука: връща тайната на подписа само веднъж
GET/api/v1/webhooks/{id}Прочитане на абонамент за уебкука
PATCH/api/v1/webhooks/{id}Изменяне на URL адреса, събитията или активното състояние
DELETE/api/v1/webhooks/{id}Отписване на уебкука
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/keysСписък на API ключовете
POST/api/v1/keysСоздаване на API ключ: тайната се показва само веднъж
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, ролите и местоположението на полетата за подписване, след което се преизползва при всяко изпращане: предайте неговия идентификатор в templateId вместо documentIds, и позиционираните полета се копират на създадения плик.

  • • Шаблоните се създават от таблото на управление (Шаблони → Нов шаблон), където депозирате документа и позиционирате полетата със мишката — това е най-простият път. 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

Действието "Създай плик" от нашите no-code конектори покрива само пътя чрез шаблон: полето Шаблон е там задължително. За ad hoc документ, който се променя при всяко изпълнение, използвайте действието "Качи документ" след което raw HTTP действие към POST /api/v1/envelopes, передавайки върнатия documentIds.

Изпращане на документ: две приемани форми

POST /api/v1/documents приема файла по два начина, по ваш избор. Едни и същи проверки се прилагат и в двата случая: разрешени типове, ограничение от 50 MB, проверка на двоичния подпис и антивирусен анализ.

  • • В multipart/form-data, с част, наречена file. Това е класическата форма, тази на curl -F и на повечето библиотеки.
  • • В сиров орган: байтовете на файла съставляват органа на заявката, и хедърът Content-Type дава неговия тип (например application/pdf). Полезно е от инструмент, който предава съдържанието както е, без да обвива заявката — това е това, което прави Power Automate конекторът.
  • • В сирово тяло, име на файла няма място в органа: посочете го чрез хедър X-File-Name или параметър ?fileName=. Без него документът е назван според неговия тип.
  • • Неподдържан тип отговаря с 415, назовавайки двете приемани форми, и орган, заявен като 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 трябва да съответства на един от получателите на същия призив, без разлика на главни и малки букви. В противен случай създаването не успява, като изброява всички дефектни редове, което избягва необходимостта да ги коригирате един по един.
  • • 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. Await преди sign() излиза от жеста на потребителя: 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): монтирате целия маршрут на вашата машина преди развертаване. Реален ключ го отказва, така че никакъв производствен плик да не върне истинския подписващ към машина, която не е неговата.

Показване на церемонията на вашата страница

Режимът на вграждане показва подписването вътре във вашия интерфейс, без отделен прозорец. Той изисква една допълнителна стъпка спрямо режима на прозорец: доказване, че сайтът, който го показва, принадлежи на вас. Това е това, което предотвратява трета страна да вгради нашите церемонии, за да измами вашите клиенти.

  • • Декларирайте вашия сайт в Настройки → Вградено подписване, след това публикувайте посочения DNS запис. Точен адрес: поддомейн или различен порт се считат за различен сайт.
  • • При всяко подписване поискайте пресен URL чрез POST /api/v1/envelopes/{id}/embed-url. Той носи разрешението за показване и е валиден два часа, което съответства на момента на щракване, а не на създаването на плика.
  • • Два пътя не могат да се развиват в рамка: квалифицираното подписване, чиято проверка на самоличност отказва да бъде вградена от своя страна, и плащането при подписване. И в двата случая подписващият е насочен към пълен прозорец.
  • • Надписът "Захранвано от 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 на канала за уведомление на получател и повече нищо не му се изпраща — вие го водите до неговия подпис.

  • • Настройката е по получател, не по плик: можете да замълчите клиента, който хостирате, и да запазите е-мейла за външен контрасигнатор, който няма портал.
  • • Той е запазен за подписващи и одобрители, единствените, към които имате линк за предоставяне. Го прочитате в отговора на създаването и изпращането, или поискате свежо URL адрес при клик към POST /api/v1/envelopes/{id}/embed-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.
  • • Адресата е факултативна. Без нея, подписващият вижда само името, никога адресата на притежателя на ключа.
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"
  }
}

Аутентифициране

Кожен извик съдържа ключ API в заглавието Authorization. Ключовете се генерират от Настройки → Ключове 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 <ключ>.
  • • Области: облекчения, документи, вебхуки, печати — четене (: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": [ /* … */ ]
}

Ограничения на дебита

Ограниченията гарантират стабилно качество на услугата за всички клиенти. Ако имате нужда от повече, свържете се с нас.

  • • 100 заявки в минута за API ключ
  • • Burst толериран до 200 заявки в по-малко от 10s
  • • Отговор 429 със заглавие Retry-After указващо забавянето в секунди

Продължете напред