Signuj.cz API v1

API Dokumentace

Programové rozhraní pro vytváření požadavků na elektronický podpis dokumentů bankovní identitou.

Obsah

  1. Jak to funguje
  2. Autentizace
  3. Endpoint
  4. Parametry
  5. Formát podpisů
  6. Odpověď
  7. Chybové stavy
  8. Příklady
  9. Životní cyklus požadavku + status endpoint
  10. Limity

1. Jak to funguje

API požadavekPOST /api/v1/sign
PlatbaBankovní převod
Výzvy k podpisuEmail podepisujícím
PodpisBankovní identita
HotovoPDF s podpisy
  1. Odešlete PDF dokument s pozicemi podpisů a emaily podepisujících.
  2. API vrátí platební údaje (účet, VS, QR kód). Zadavateli odešleme email s údaji k platbě.
  3. Po připsání platby automaticky rozešleme podepisujícím osobám výzvu k podpisu emailem.
  4. Každá podepisující osoba se podepíše přes svou bankovní identitu.
  5. Po podpisu všemi účastníky obdrží všichni finální PDF s podpisy.

2. Autentizace

Každý požadavek musí obsahovat HTTP hlavičku Authorization s platným API klíčem:

Authorization: Bearer VAS_API_KLIC
API klíč uchovávejte v bezpečí. Nikdy ho nevkládejte do klientského kódu (JavaScript, mobilní aplikace). Vždy volajte API ze serveru.

Pro získání API klíče nás kontaktujte na info@signuj.cz.

3. Endpoint

POST https://signuj.cz/api/v1/sign

Typ obsahu: multipart/form-data (kvůli nahrávání PDF souboru).

4. Parametry

Povinné parametry

ParametrTypPopis
pdf povinný file PDF dokument k podpisu. Max 25 MB.
signatures povinný string (JSON) JSON pole podpisů. Min 1, max 4. Viz formát podpisů.
email povinný string Email zadavatele. Na tento email zašleme platební údaje a finální podepsaný dokument.

Volitelné parametry

ParametrTypPopis
company volitelný string Celé jméno nebo název firmy (pro fakturaci).
ic volitelný string IČ (7–9 číslic).
dic volitelný string DIČ (formát CZ/SK + 7–9 číslic).
street volitelný string Ulice a č.p.
city volitelný string Město.
zip volitelný string PSČ (5 číslic).
pdf_name volitelný string Vlastní název dokumentu. Pokud neuvedete, použije se název souboru.
doc_password volitelný string Heslo pro přístup k dokumentu při podepisování (4–16 znaků). Heslo musíte podepisujícím doručit sami (např. SMS).

5. Formát podpisů

Parametr signatures je JSON pole objektů. Každý objekt definuje jeden podpis:

[
  {
    "email": "jan.novak@firma.cz",
    "page":  1,
    "rect": {
      "x": 50,
      "y": 100,
      "w": 190,
      "h": 50
    }
  },
  {
    "email": "petra.svobodova@firma.cz",
    "page":  2,
    "rect": {
      "x": 300,
      "y": 680,
      "w": 190,
      "h": 50
    }
  }
]
PoleTypPopis
email string Emailová adresa podepisující osoby.
page integer Číslo stránky (od 1).
rect object Pozice a rozměry podpisu v PDF bodech.
rect.x number Horizontální pozice levého dolního rohu (od levého okraje).
rect.y number Vertikální pozice levého dolního rohu (od spodního okraje).
rect.w number Šířka podpisu.
rect.h number Výška podpisu.
PDF body (points) — 1 bod = 1/72 palce. Standardní stránka A4 = 595 × 842 bodů. Souřadnice x, y začínají v levém dolním rohu stránky. Doporučená velikost podpisu: 190 × 50 bodů.

6. Odpověď

Úspěšná odpověď 200

{
  "ok": true,
  "id": "a1b2c3d4e5f6a1b2c3d4e5f6",
  "status": "new",
  "signatures_count": 2,
  "price": {
    "per_signature_czk": 9,
    "total_czk": 18
  },
  "payment": {
    "account": "2102763112/2010",
    "iban": "CZ6320100000002102763112",
    "bic": "FIOBCZPP",
    "variable_symbol": "7712345678",
    "amount_czk": 18,
    "message": "Signuj.cz a1b2c3d4e5f6a1b2c3d4e5f6",
    "qr_url": "https://api.paylibo.com/..."
  },
  "ready_url": "https://signuj.cz/ready.php?id=a1b2c3d4e5f6a1b2c3d4e5f6",
  "status_url": "https://signuj.cz/sign_status.php?id=a1b2c3d4e5f6a1b2c3d4e5f6"
}
PolePopis
idUnikátní identifikátor požadavku.
statusnew — čeká na platbu.
price.per_signature_czkCena za jeden podpis v Kč.
price.total_czkCelková cena v Kč.
payment.accountČíslo účtu pro platbu.
payment.ibanIBAN pro zahraniční platby.
payment.bicBIC/SWIFT kód banky.
payment.variable_symbolVariabilní symbol — nutný pro spárování platby.
payment.amount_czkČástka k platbě v Kč.
payment.qr_urlURL obrázku QR kódu pro platbu (300×300 px).
ready_urlOdkaz na stránku s nastavením a platbou (pro uživatele).
status_urlURL pro dotazování na aktuální stav požadavku (GET).
Na email zadavatele automaticky odešleme platební údaje. Po připsání platby se automaticky rozešlou výzvy k podpisu — není potřeba žádná další akce.

7. Chybové stavy

HTTP kódPříčina
400Chybné nebo chybějící parametry (podrobnosti v error).
401Chybí hlavička Authorization.
403Neplatný nebo deaktivovaný API klíč.
405Použita jiná HTTP metoda než POST.
413PDF soubor je příliš velký (max 25 MB).
500Interní chyba serveru.

Chybová odpověď vždy vrací JSON:

{
  "ok": false,
  "error": "Popis chyby v češtině"
}

8. Příklady

cURL

# Odeslání dokumentu s jedním podpisem
curl -X POST https://signuj.cz/api/v1/sign \
  -H "Authorization: Bearer VAS_API_KLIC" \
  -F "pdf=@smlouva.pdf" \
  -F 'signatures=[{"email":"jan@firma.cz","page":1,"rect":{"x":50,"y":100,"w":190,"h":50}}]' \
  -F "email=zadavatel@firma.cz" \
  -F "company=Firma s.r.o." \
  -F "ic=12345678"

cURL — dva podpisy na různých stranách

curl -X POST https://signuj.cz/api/v1/sign \
  -H "Authorization: Bearer VAS_API_KLIC" \
  -F "pdf=@smlouva.pdf" \
  -F 'signatures=[
    {"email":"jan@firma.cz","page":3,"rect":{"x":50,"y":100,"w":190,"h":50}},
    {"email":"petra@firma.cz","page":3,"rect":{"x":300,"y":100,"w":190,"h":50}}
  ]' \
  -F "email=admin@firma.cz" \
  -F "pdf_name=Nájemní smlouva 2026"

PHP

// PHP s cURL
$ch = curl_init('https://signuj.cz/api/v1/sign');

$signatures = json_encode([
    [
        'email' => 'jan@firma.cz',
        'page'  => 1,
        'rect'  => ['x' => 50, 'y' => 100, 'w' => 190, 'h' => 50],
    ],
]);

curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer VAS_API_KLIC'],
    CURLOPT_POSTFIELDS     => [
        'pdf'        => new CURLFile('/cesta/k/smlouva.pdf', 'application/pdf'),
        'signatures' => $signatures,
        'email'      => 'zadavatel@firma.cz',
        'company'    => 'Firma s.r.o.',
    ],
]);

$response = curl_exec($ch);
$data = json_decode($response, true);

if ($data['ok']) {
    echo "ID: " . $data['id'] . "\n";
    echo "Cena: " . $data['price']['total_czk'] . " Kč\n";
    echo "VS: " . $data['payment']['variable_symbol'] . "\n";
}

JavaScript (Node.js)

const fs = require('fs');

const form = new FormData();
form.append('pdf', fs.createReadStream('smlouva.pdf'));
form.append('email', 'zadavatel@firma.cz');
form.append('signatures', JSON.stringify([
  { email: 'jan@firma.cz', page: 1, rect: { x: 50, y: 100, w: 190, h: 50 } }
]));

const res = await fetch('https://signuj.cz/api/v1/sign', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer VAS_API_KLIC' },
  body: form,
});

const data = await res.json();
console.log(data);

Python

import requests, json

signatures = json.dumps([
    {"email": "jan@firma.cz", "page": 1,
     "rect": {"x": 50, "y": 100, "w": 190, "h": 50}}
])

resp = requests.post(
    "https://signuj.cz/api/v1/sign",
    headers={"Authorization": "Bearer VAS_API_KLIC"},
    files={"pdf": open("smlouva.pdf", "rb")},
    data={
        "signatures": signatures,
        "email": "zadavatel@firma.cz",
    },
)

data = resp.json()
print(data)

9. Životní cyklus požadavku

StatusPopis
newPožadavek vytvořen, čeká na platbu.
paidPlatba přijata. Výzvy k podpisu budou automaticky odeslány.
sentVýzvy k podpisu odeslány, čeká se na podpisy.
signedVšichni podepsali. Finální dokument odeslán všem.

Zjištění stavu — status_url

Pro zjištění aktuálního stavu požadavku použijte status_url vrácenou v odpovědi. Vyžaduje autentizaci API klíčem stejně jako ostatní endpointy.

GET https://signuj.cz/sign_status.php?id={id}
Authorization: Bearer VAS_API_KLIC

Odpověď status endpointu 200

{
  "ok": true,
  "status": "signed",
  "signatures_count": 2,
  "price_czk": 18,
  "signers": [
    {
      "signature_no": 1,
      "email": "jan@firma.cz",
      "status": "signed",
      "signed_at": "2026-03-22 14:30:00"
    },
    {
      "signature_no": 2,
      "email": "petra@firma.cz",
      "status": "signed",
      "signed_at": "2026-03-22 15:12:00"
    }
  ]
}
PolePopis
statusAktuální stav požadavku: new, paid, sent, signed.
signatures_countCelkový počet podpisů v dokumentu.
price_czkCelková cena v Kč (0 u free API).
signersPole s detaily jednotlivých podepisujících.
signers[].signature_noPořadové číslo podpisu (1–4).
signers[].emailEmail podepisující osoby.
signers[].statusStav podpisu: pending, sent, signed.
signers[].signed_atDatum a čas podpisu (pouze pokud již podepsáno).
Pro polling doporučujeme interval 30–60 sekund. Status signed znamená, že dokument je kompletně podepsán a byl odeslán všem účastníkům.

Chybové stavy status endpointu

HTTP kódPříčina
401Chybí hlavička Authorization.
403Neplatný nebo deaktivovaný API klíč.
404Požadavek s daným id nebyl nalezen.

Příklady — zjištění stavu

cURL

curl -H "Authorization: Bearer VAS_API_KLIC" \
  https://signuj.cz/sign_status.php?id=a1b2c3d4e5f6a1b2c3d4e5f6

PHP

// Zjištění stavu požadavku
$id = 'a1b2c3d4e5f6a1b2c3d4e5f6';

$ch = curl_init('https://signuj.cz/sign_status.php?id=' . urlencode($id));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer VAS_API_KLIC'],
]);

$response = curl_exec($ch);
$data = json_decode($response, true);

if ($data['ok'] && $data['status'] === 'signed') {
    echo "Dokument je kompletně podepsán.\n";
} else {
    echo "Stav: " . $data['status'] . "\n";
}

JavaScript (Node.js)

const id = 'a1b2c3d4e5f6a1b2c3d4e5f6';

const res = await fetch(
  `https://signuj.cz/sign_status.php?id=${id}`,
  { headers: { 'Authorization': 'Bearer VAS_API_KLIC' } }
);

const data = await res.json();
console.log(data.status);           // "new" | "paid" | "sent" | "signed"
console.log(data.signers);          // detail podepisujících

Python

import requests

id = "a1b2c3d4e5f6a1b2c3d4e5f6"

resp = requests.get(
    f"https://signuj.cz/sign_status.php?id={id}",
    headers={"Authorization": "Bearer VAS_API_KLIC"},
)

data = resp.json()
print(data["status"])    # "new" | "paid" | "sent" | "signed"
print(data["signers"])   # detail podepisujících

10. Limity

LimitHodnota
Max velikost PDF25 MB
Max počet podpisů na dokument4
Max počet stránek2 000
Cena za podpis9 Kč
Podporovaná měnaCZK