Dla deweloperów
JSON na wejściu. Zapieczętowany PDF/A-3 na wyjściu. Gotowe.
Jedno wywołanie tworzy fakturę Factur-X, XRechnung lub Peppol BIS i sprawdza ją według wybranego profilu. 50 dokumentów miesięcznie za darmo.
Wyślij, śledź, pobierz.
# 1. Submit the invoice. The answer is { "jobId", "status", "statusUrl" }:
# 200 when the PDF is ready at once, 202 while it is still being processed.
# The same Idempotency-Key with the same body returns the same job;
# the same key with a different body is refused with 409.
curl -sS -X POST https://api.sealdoc.eu/api/invoices/generate \
-H "X-Api-Key: sd_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: invoice-2026-0042" \
-d '{
"seller": {
"name": "Acme B.V.", "vatNumber": "NL123456789B01",
"address": "Keizersgracht 1", "postalCode": "1015 AA", "city": "Amsterdam", "country": "NL"
},
"buyer": {
"name": "Globex GmbH", "vatNumber": "DE987654321",
"address": "Hauptstrasse 5", "postalCode": "10115", "city": "Berlin", "country": "DE"
},
"invoiceNumber": "2026-0042",
"invoiceDate": "2026-09-13",
"currency": "EUR",
"vatRate": 0.21,
"vatLabel": "VAT 21%",
"lines": [{ "description": "License", "quantity": 1, "unitPriceExclVat": 1000.00 }],
"profile": "Basic"
}'
# 2. Follow the job until "status" is "completed" (or "failed").
curl -sS https://api.sealdoc.eu/api/jobs/{jobId} -H "X-Api-Key: sd_live_..."
# 3. Download the PDF/A-3 with the invoice XML embedded.
curl -sS -o invoice.pdf https://api.sealdoc.eu/api/download/{jobId} -H "X-Api-Key: sd_live_..."const api = 'https://api.sealdoc.eu'
const headers = { 'X-Api-Key': 'sd_live_...' }
const invoice = {
"seller": {
"name": "Acme B.V.", "vatNumber": "NL123456789B01",
"address": "Keizersgracht 1", "postalCode": "1015 AA", "city": "Amsterdam", "country": "NL"
},
"buyer": {
"name": "Globex GmbH", "vatNumber": "DE987654321",
"address": "Hauptstrasse 5", "postalCode": "10115", "city": "Berlin", "country": "DE"
},
"invoiceNumber": "2026-0042",
"invoiceDate": "2026-09-13",
"currency": "EUR",
"vatRate": 0.21,
"vatLabel": "VAT 21%",
"lines": [{ "description": "License", "quantity": 1, "unitPriceExclVat": 1000.00 }],
"profile": "Basic"
}
// 1. Submit the invoice: 200 when the PDF is ready at once, 202 while it is processed.
const submitted = await fetch(api + '/api/invoices/generate', {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json', 'Idempotency-Key': 'invoice-2026-0042' },
body: JSON.stringify(invoice),
})
if (submitted.status === 409) throw new Error('This Idempotency-Key was used for a different invoice')
if (!submitted.ok) throw new Error('Submit failed: ' + submitted.status)
const { jobId, statusUrl, status: submittedStatus } = await submitted.json()
// 2. Follow the job until it is completed or failed.
let status = submittedStatus
while (status === 'queued' || status === 'processing') {
await new Promise(resolve => setTimeout(resolve, 2000))
const job = await (await fetch(api + statusUrl, { headers })).json()
status = job.status
}
// 3. Download the PDF/A-3 with the invoice XML embedded.
if (status === 'completed') {
const pdf = await (await fetch(api + '/api/download/' + jobId, { headers })).arrayBuffer()
}import json, time, requests
api = 'https://api.sealdoc.eu'
headers = {'X-Api-Key': 'sd_live_...'}
invoice = json.loads('''{
"seller": {
"name": "Acme B.V.", "vatNumber": "NL123456789B01",
"address": "Keizersgracht 1", "postalCode": "1015 AA", "city": "Amsterdam", "country": "NL"
},
"buyer": {
"name": "Globex GmbH", "vatNumber": "DE987654321",
"address": "Hauptstrasse 5", "postalCode": "10115", "city": "Berlin", "country": "DE"
},
"invoiceNumber": "2026-0042",
"invoiceDate": "2026-09-13",
"currency": "EUR",
"vatRate": 0.21,
"vatLabel": "VAT 21%",
"lines": [{ "description": "License", "quantity": 1, "unitPriceExclVat": 1000.00 }],
"profile": "Basic"
}''')
# 1. Submit the invoice: 200 when the PDF is ready at once, 202 while it is processed.
submitted = requests.post(
api + '/api/invoices/generate', json=invoice,
headers={**headers, 'Idempotency-Key': 'invoice-2026-0042'},
)
if submitted.status_code == 409:
raise RuntimeError('This Idempotency-Key was used for a different invoice')
submitted.raise_for_status()
job = submitted.json()
job_id, status_url = job['jobId'], job['statusUrl']
# 2. Follow the job until it is completed or failed.
while job['status'] in ('queued', 'processing'):
time.sleep(2)
job = requests.get(api + status_url, headers=headers).json()
# 3. Download the PDF/A-3 with the invoice XML embedded.
if job['status'] == 'completed':
pdf = requests.get(api + '/api/download/' + job_id, headers=headers).content Integracje
- REST API
- Dostępne
- Specyfikacja OpenAPI pod /openapi/v1.json
- Webhooks
- Dostępne
- Status zadania przez callback HTTPS
- n8n
- Dostępne
- npm: n8n-nodes-sealdoc
- Make
- Wczesny dostęp
- Dostęp przez nas
Na co możesz liczyć
- Klucze idempotencji
- Nagłówki limitów zapytań
- Webhooki z ponawianiem
- Specyfikacja OpenAPI i interaktywna dokumentacja
- Hosting w UE
Profile faktur
- Basic
- Factur-X 1.0 BASIC (CII)
- XRechnungDe
- XRechnung 3.0 (CII)
- PeppolBis3
- Peppol BIS Billing 3.0 (UBL)