API Dazr Sign: dokumentace pro vývojáře
Připravujte a odesílejte dokumenty k podpisu z vlastního softwaru, jménem lidí, kteří ho používají. Podepisující podepisují v Dazr Sign jako obvykle: přihlášení přes Dazr Identity, postupně, jednou.
- Rychlý start
- Textové značky
- Vyskakovací okna
- Kvalifikované podpisy
- Webhooky
- Reference
- Chyby a limity
- Převody
Rychlý start
- Zapněte API Dazr Sign. V portálu Sign otevřete Vývojáři a pro svou aplikaci zvolte Zapnout API Dazr Sign. Jsou tam uvedeny všechny aplikace vaší organizace, stejně jako v konzoli Dazr Identity, se stejným client ID a tajemstvím; každé API se zapíná zvlášť. Můžete tam také zaregistrovat novou aplikaci.
- Požádejte o rozsah
sign. Pošlete lidi obvyklým tokem Přihlášení přes Dazr Identity sscope=openid sign(pro obnovovací token přidejteoffline_access). Obrazovka souhlasu uvádí, že vaše aplikace může jejich jménem připravovat a odesílat dokumenty k podpisu a vidět jejich stav. Funguje to jen se zapnutým API Dazr Sign; žádat i o údaje lidí (profile,emaila další) vyžaduje navíc zapnuté API Dazr Identity. - Volejte API s přístupovým tokenem. Základní adresa je
https://sign.dazr.eu/api/sign/v1. PosílejteAuthorization: Bearer <access token>a JSON. - Vytvořte a odešlete dokument. Nahrajte PDF s textovými značkami a seznamem příjemců a pak ho odešlete, nebo otevřete okno přípravy, aby pole umístila daná osoba.
// Node 18+: create a document from a PDF with text tags, then send it
import fs from 'node:fs';
const api = 'https://sign.dazr.eu/api/sign/v1';
const headers = { Authorization: 'Bearer ' + accessToken, 'Content-Type': 'application/json' };
let res = await fetch(api + '/documents', {
method: 'POST',
headers: { ...headers, 'Idempotency-Key': 'order-1042' },
body: JSON.stringify({
title: 'Service agreement',
file: fs.readFileSync('agreement.pdf').toString('base64'),
recipients: [
{ name: 'Alex Example', email: 'alex@example.eu' },
{ name: 'Sam Client', email: 'sam@client.example' },
],
}),
});
const { document } = await res.json();
res = await fetch(api + '/documents/' + document.id + '/send', { method: 'POST', headers });
console.log((await res.json()).document.status); // "sent"
Textové značky
Pole napište do PDF jako text. Každá značka se nahradí polem stejné nebo větší velikosti a text značky se přemaluje, takže ho podepisující nikdy nevidí.
| Značka | Pole |
|---|---|
{{signature:1}} | Podpis prvního příjemce |
{{initials:2}} | Iniciály druhého příjemce |
{{name:1}} {{date:1}} | Jméno a datum podpisu, vyplní Dazr Sign |
{{text:2:Company}} | Textové pole s popiskem Firma |
{{checkbox:2:Terms:optional}} | Nepovinné zaškrtávací políčko |
{{company:1}} | Název firmy (vyplní se, když osoba podepisuje za organizaci) |
Číslo je pozice příjemce v recipients, počínaje 1. Značka pro příjemce, kterého jste neuvedli, přidá prázdného příjemce k doplnění v okně přípravy. Pošlete "text_tags": false, chcete-li značky ignorovat. Můžete také poslat fields s pozicemi v bodech (1/72 palce) od levého horního rohu stránky: { "recipient": 1, "type": "signature", "page": 1, "x": 72, "y": 600, "width": 180, "height": 48 }. value u textového pole, pole firmy nebo zaškrtávacího políčka hodnotu zafixuje: podepisující ji vidí a nemůže ji změnit.
Vyskakovací okna: příprava a podpis
Vytvořte koncept s "prepare": { "origin": "https://app.example.eu" } a dostanete prepare_url. Otevřete ho ve vyskakovacím okně: osoba v kompaktním editoru umístí příjemce a pole a pak klikne na Odeslat nebo Uložit jako šablonu. Pro podepisujícího, který je na řadě, dá POST /documents/{id}/recipients/{recipient_id}/signing_url vyskakovací okno pro podpis. Oba odkazy platí 10 až 15 minut a fungují jednou. Osoba se ve vyskakovacím okně v případě potřeby přihlásí přes Dazr Identity, a to adresou, na kterou byl dokument odeslán.
Po dokončení vyskakovací okno pošle { type: 'dazr-sign', event, document_id, template_id, recipient_id, state } pomocí postMessage stránce, která ho otevřela, jen pokud je tato stránka na jednom z originů vyskakovacích oken vaší aplikace (ve výchozím stavu originy vašich URI pro přesměrování), a zavře se. event je sent, saved, cancelled, signed nebo declined. S redirect_uri (jedním z vašich registrovaných URI pro přesměrování) a state se vyskakovací okno, které ztratilo svého otvíratele, vrátí tam se stejnými hodnotami jako parametry dotazu.
<script src="https://sign.dazr.eu/sdk.js"></script>
<script>
document.querySelector('#sign').addEventListener('click', async () => {
// Ask your server for the URL after the click: the popup opens at once.
const url = fetch('/my-server/prepare-url').then(r => r.json()).then(j => j.prepare_url);
const result = await DazrSign.open(url);
if (result.event === 'sent') showSent(result.document_id);
// 'closed': the window was closed; check the status with the API or a webhook
});
</script>
Pokud vaše stránka posílá Cross-Origin-Opener-Policy: same-origin, použijte místo toho same-origin-allow-popups, jinak vyskakovací okno nemůže odpovědět.
Kvalifikované podpisy
Každý podepisující má level: "advanced" (výchozí: e-mailová adresa je potvrzena přihlášením přes Dazr Identity) nebo "qualified". Podepisující s kvalifikovaným podpisem stáhne PDF v Dazr Sign, podepíše ho vlastním kvalifikovaným elektronickým podpisem (elektronický občanský průkaz, podpisová aplikace jako itsme, kvalifikovaný certifikát v Adobe Acrobat Reader) a nahraje podepsaný soubor. Dazr Sign ho ověří podle důvěryhodných seznamů EU a přijme ho, jen pokud jde o kvalifikovaný podpis přesně na souboru, který vydal. Dazr kvalifikované podpisy nevydává.
Úroveň nastavte pro každého příjemce: { "name": "Mario Rossi", "email": "mario@example.eu", "level": "qualified" }. Podepisující s kvalifikovaným podpisem nemá pole pro iniciály. name_rule u dokumentu určuje, co se stane, když se jméno v certifikátu liší od jména příjemce: "warn" (výchozí: přijato, s name_matches false) nebo "block" (odmítnuto). Šablony si uchovávají úroveň každé role a from_template může roli zvýšit na "qualified".
Každý podpis zůstává platný: pozdější podpisy a závěrečná pečeť Dazr se přidávají jako přírůstkové aktualizace a auditní stopa takového dokumentu je samostatné zapečetěné PDF na GET /documents/{id}/audit.pdf. Příjemci v dokumentech a webhoocích mají level a poté, co podepisující s kvalifikovaným podpisem podepíše, i certificate: subject (common_name, given_name, surname, serial_number, country, organization, organization_identifier), issuer, serial, sha256, trust_service_provider, trusted_list_country, signing_time, trusted_timestamp, format (PAdES nebo CAdES) a name_matches. Jakákoli jiná hodnota level vrátí 400 invalid_level.
Webhooky
Nastavte URL webhooku pro svou aplikaci v portálu Sign v části Vývojáři. Podpisové tajemství dostanete jednou. Dazr Sign posílá sign.document.sent, viewed, signed, completed, declined, voided a expired pro dokumenty, které vaše aplikace vytvořila, se stavem dokumentu a jeho příjemců, nikdy s jeho obsahem. Neúspěšná doručení se opakují po 5 minutách, 30 minutách, 2, 6, 12 a 24 hodinách; protokol doručení ukazuje každý pokus a umožňuje jedno znovu odeslat.
// Node: check the Dazr-Signature header (t=<unix time>,v1=<HMAC-SHA256 hex>)
import crypto from 'node:crypto';
export function verify(rawBody, header, secret) {
const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || '');
if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
const want = crypto.createHmac('sha256', secret).update(m[1] + '.' + rawBody).digest();
return crypto.timingSafeEqual(want, Buffer.from(m[2], 'hex'));
}
// The body: { id, type: 'sign.document.completed', created, data: { document: { id, status, recipients: [...] } } }
Reference
Všechny cesty začínají https://sign.dazr.eu/api/sign/v1. Časy jsou ve formátu ISO 8601 v UTC.
| Požadavek | Co dělá |
|---|---|
POST /documents | Vytvoří koncept z PDF: file v base64, nahrání multipart (file plus data jako JSON) nebo upload_id. Volitelné: title, message, recipients, fields, signing_order, deadline_days, reminder_days, send, prepare. |
POST /documents/from_template | Vytvoří koncept ze šablony: template_id, recipients jako { role, name, email }, values podle ID pole nebo popisku. |
GET /documents | Vypíše dokumenty vaší aplikace pro tuto osobu, od nejnovějších: limit (až 100), cursor, status. |
GET /documents/{id} | Dokument s jeho stavem, příjemci a poli. |
POST /documents/{id}/send | Odešle koncept. |
POST /documents/{id}/remind | Připomene se podepisujícím, kteří jsou na řadě (nejvýše jednou za hodinu). |
POST /documents/{id}/void | Zruší dokument odeslaný k podpisu, s volitelným reason. |
DELETE /documents/{id} | Smaže koncept nebo uzavřený dokument. |
POST /documents/{id}/prepare_url | Nové okno přípravy pro koncept: origin, redirect_uri, state. |
POST /documents/{id}/recipients/{recipient_id}/signing_url | Okno pro podpis pro podepisujícího, který je na řadě: origin, redirect_uri, state. |
GET /documents/{id}/original.pdf | PDF tak, jak bylo odesláno. |
GET /documents/{id}/signed.pdf | Zapečetěná kopie, jakmile všichni podepíšou. |
GET /documents/{id}/audit.json | Auditní stopa: události, hashe a podepisující. |
GET /documents/{id}/audit.pdf | Samostatná zapečetěná auditní stopa dokumentu s podepisujícími s kvalifikovaným podpisem, jakmile všichni podepíšou. |
POST /uploads | Zahájí nahrávání po částech pro PDF větší než 4 MB: size. Poté PUT /uploads/{upload_id}/parts/{n} se surovými bajty každé části. |
GET /templates | Šablony osoby s jejich rolemi a poli. |
GET /templates/{id} | Jedna šablona. |
POST /templates | Uloží jeden z dokumentů vaší aplikace jako šablonu: document_id, name. |
DELETE /templates/{id} | Smaže šablonu. |
Při vytváření dokumentu pošlete hlavičku Idempotency-Key: stejný klíč a tělo během 24 hodin vrátí stejný dokument (hlavička Idempotent-Replayed: true) místo druhého.
Chyby a limity
Chyby mají stav HTTP a tělo jako { "error": { "code": "not_found", "message": "..." } }, někdy s podrobnostmi, například index.
| Status | Kódy |
|---|---|
400 | invalid_field, invalid_recipients, invalid_email, not_pdf, pdf_unreadable, pdf_encrypted, invalid_origin, invalid_redirect_uri, unknown_role, unknown_field |
401 | unauthenticated, invalid_token (vypršel nebo byl zneplatněn, nebo osoba vaši aplikaci odebrala) |
403 | insufficient_scope, sign_api_disabled |
404 | not_found (i pro dokumenty, které vaše aplikace nevytvořila), template_not_found |
409 | not_draft, not_sent, not_your_turn, not_signable, signer_without_fields, no_signers, void_first, idempotency_in_progress |
413 | pdf_too_large, too_large, quota |
422 | idempotency_key_reused |
429 | rate_limited, s hlavičkou Retry-After |
- PDF do 25 MB a 200 stran, bez hesla. Požadavky do 4 MB; větší PDF jdou přes
/uploads. - Až 20 příjemců a 400 polí na dokument, 100 šablon na osobu. Dokumenty a šablony se započítávají do úložiště Dazr dané osoby.
- 120 požadavků za minutu pro každou osobu a aplikaci, 30 nových dokumentů za 10 minut a 30 odeslání za hodinu.
- Přístupové tokeny platí 10 minut. K získání nového použijte obnovovací token (
offline_access).
Převod aplikace
Aplikace se může přesunout k jiné organizaci registrované v Dazr, v části Převést aplikaci v nastavení aplikace. Se zapnutým API Dazr Sign se může přesunout jen k ověřené organizaci a vlastník nebo administrátor tam musí převod do 14 dnů přijmout. Každý krok popisuje dokumentace pro vývojáře Dazr Identity.
- Dokumenty, které vaše aplikace vytvořila před převodem, zůstávají lidem, kterým patří. Aplikace je přes API už nevidí a neposílají se pro ně žádné webhooky.
- URL webhooku a originy vyskakovacích oken zůstávají. Podpisové tajemství webhooku se obnoví a zobrazí jednou administrátorovi, který převod přijme.
- Přístupové a obnovovací tokeny vydané před převodem přestanou fungovat a lidé aplikaci při příštím přihlášení znovu schválí. Šablony patří lidem a nejsou dotčeny.
- Počty dokumentů v portálu Sign se převodem začínají počítat znovu.