Blog
Virksomhed1. august 2026 10 min🇩🇰 Danmark

API-integration for revisionsfirmaer

Lær, hvordan dit revisionsfirma integrerer LegalDocks API og begynder at generere juridiske dokumenter programmatisk. Guide med curl og TypeScript.

Karoline, Dokumentkonsulent

Skrevet efter dansk ret og dansk kontraktpraksis.

Moderne revisionsfirmaer digitaliserer i stigende grad. Klienter forventer hurtige svar, og de interne systemer, fra bogholderisoftware til klientportaler, skal hænge bedre sammen. Juridiske dokumenter er det næste led i den digitale kæde.

LegalDocks API giver revisionsfirmaer mulighed for at generere, udfylde og sende juridiske dokumenter programmatisk, direkte fra jeres eget system. Ingen manuel kopiering, ingen forældede Word-skabeloner og ingen printede underskrifter.

Denne guide viser dig, hvordan du integrerer LegalDock API.

Hvad kan LegalDock API?

LegalDocks REST API giver adgang til:

Funktion Beskrivelse
Dokumentgenerering Udfyld en skabelon med felter og modtag en færdig PDF
Digital underskrift Send dokumentet til underskrift via MitID
Webhooks Modtag events, når dokumentet underskrives, afvises eller udløber
Skabelonliste Hent alle tilgængelige skabeloner og feltbeskrivelser
Dokumentarkiv Hent, download og administrér oprettede dokumenter

Alle kald sker over HTTPS. Autentificering bruger API-nøgler (Bearer token). Rate limits afhænger af din plan.

Forudsætninger

Inden du begynder:

  1. LegalDock Partner-konto med API-adgang
  2. API-nøgle, som hentes under Indstillinger, API, Generér nøgle
  3. HTTP-klient, curl til test og Node.js 18+ til TypeScript-eksemplerne

Trin 1: Verificer forbindelsen

curl https://api.legaldock.org/v1/ping \
  -H "Authorization: Bearer DIN_API_NOEGLE"

Forventet svar:

{ "status": "ok", "version": "1.0" }

En 401 Unauthorized-fejl betyder, at API-nøglen er ugyldig eller udløbet. Generér en ny under Indstillinger.

Trin 2: Hent tilgængelige skabeloner

curl https://api.legaldock.org/v1/templates \
  -H "Authorization: Bearer DIN_API_NOEGLE"
{
  "templates": [
    { "id": "ansaettelseskontrakt", "name": "Ansaettelseskontrakt" },
    { "id": "nda-standard", "name": "NDA Fortrolighedsaftale" },
    { "id": "lejekontrakt-erhverv", "name": "Erhvervslejekontrakt" },
    { "id": "aktionaeroverenskomst", "name": "Aktionaeroverenskomst" },
    { "id": "konsulentaftale", "name": "Konsulentaftale" }
  ]
}

Inspicér en skabelon for at se feltlisten:

curl https://api.legaldock.org/v1/templates/nda-standard \
  -H "Authorization: Bearer DIN_API_NOEGLE"

Trin 3: Generér et dokument

curl -X POST https://api.legaldock.org/v1/documents \
  -H "Authorization: Bearer DIN_API_NOEGLE" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "nda-standard",
    "fields": {
      "part1Navn": "TechStart ApS",
      "part2Navn": "Udvikler A/S",
      "formaal": "Droeftelse af muligt teknologisamarbejde",
      "varighed": "2 aar",
      "dato": "2026-06-01"
    },
    "meta": {
      "reference": "klient-456-nda-2026"
    }
  }'

Svar:

{
  "documentId": "doc_xyz789",
  "status": "draft",
  "downloadUrl": "https://api.legaldock.org/v1/documents/doc_xyz789/pdf",
  "previewUrl": "https://app.legaldock.org/preview/doc_xyz789"
}

Tip: Brug meta.reference til at gemme jeres interne klient- eller sagsnummer. Det gør det muligt at finde dokumentet fra jeres eget system og koble API-svaret til den rigtige klientjournal.

Trin 4: Anmod om digital underskrift

curl -X POST https://api.legaldock.org/v1/documents/doc_xyz789/sign \
  -H "Authorization: Bearer DIN_API_NOEGLE" \
  -H "Content-Type: application/json" \
  -d '{
    "signers": [
      { "name": "Klaus Jensen", "email": "kj@techstart.dk", "role": "party1" },
      { "name": "Sara Holm", "email": "sh@udvikler-as.dk", "role": "party2" }
    ],
    "deadline": "2026-06-15",
    "notifyOnSigned": "webhook",
    "webhookUrl": "https://jeres-system.dk/webhooks/legaldock"
  }'

LegalDock sender e-mail til begge parter med et signeringslink. Begge underskriver via MitID på desktop eller mobil.

TypeScript-integration

Eksempel på en genbrugelig hjælpeklasse til Node.js og TypeScript:

// src/legaldock.ts
const BASE = 'https://api.legaldock.org/v1';

interface CreateDocumentPayload {
  templateId: string;
  fields: Record<string, string | number>;
  reference: string;
}

interface Signer {
  name: string;
  email: string;
  role: string;
}

export async function createDocument(
  apiKey: string,
  payload: CreateDocumentPayload
): Promise<{ documentId: string; downloadUrl: string }> {
  const res = await fetch(`${BASE}/documents`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${apiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      templateId: payload.templateId,
      fields: payload.fields,
      meta: { reference: payload.reference },
    }),
  });

  if (!res.ok) {
    const { message } = await res.json() as { message: string };
    throw new Error(`LegalDock createDocument: ${message}`);
  }

  return res.json() as Promise<{ documentId: string; downloadUrl: string }>;
}

export async function requestSignature(
  apiKey: string,
  documentId: string,
  signers: Signer[],
  webhookUrl: string,
  deadline?: string
): Promise<{ signingSessionId: string }> {
  const res = await fetch(`${BASE}/documents/${documentId}/sign`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${apiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      signers,
      deadline,
      notifyOnSigned: 'webhook',
      webhookUrl,
    }),
  });

  if (!res.ok) {
    const { message } = await res.json() as { message: string };
    throw new Error(`LegalDock requestSignature: ${message}`);
  }

  return res.json() as Promise<{ signingSessionId: string }>;
}

Integrér i din eksisterende kodebase:

import { createDocument, requestSignature } from './src/legaldock';

const API_KEY = process.env.LEGALDOCK_API_KEY!;
const WEBHOOK = process.env.LEGALDOCK_WEBHOOK_URL!;

// Kaldt naar revisor onboarder ny klient-medarbejder
export async function issueEmploymentContract(
  employeeName: string,
  employeeEmail: string,
  employerName: string,
  employerEmail: string,
  startDate: string,
  monthlySalary: number,
  clientRef: string
) {
  const doc = await createDocument(API_KEY, {
    templateId: 'ansaettelseskontrakt',
    fields: {
      medarbejdernavn: employeeName,
      virksomhedsnavn: employerName,
      startdato: startDate,
      maanedsloen: monthlySalary,
      arbejdssted: 'Se separat bilag',
    },
    reference: clientRef,
  });

  await requestSignature(
    API_KEY,
    doc.documentId,
    [
      { name: employeeName, email: employeeEmail, role: 'employee' },
      { name: employerName, email: employerEmail, role: 'employer' },
    ],
    WEBHOOK,
    '2026-07-01'
  );

  return doc.documentId;
}

Webhooks: modtag events automatisk

Undgå manuel polling, og brug webhooks til at opdatere jeres system, når dokumenter underskrives.

// Express webhook handler
import express from 'express';
import crypto from 'crypto';

const router = express.Router();

router.post('/webhooks/legaldock', express.json(), (req, res) => {
  const sig = req.headers['x-legaldock-signature'] as string;
  const expected = crypto
    .createHmac('sha256', process.env.LEGALDOCK_WEBHOOK_SECRET!)
    .update(JSON.stringify(req.body))
    .digest('hex');

  if (sig !== expected) {
    return res.status(401).json({ error: 'Invalid signature' });
  }

  const { event, documentId, reference } = req.body as {
    event: string;
    documentId: string;
    reference: string;
  };

  if (event === 'document.signed') {
    // Opdater klientjournal, send bekraeftelse, arkiver PDF
    console.log(`Underskrevet: ${documentId} (klient ref: ${reference})`);
  }

  res.json({ ok: true });
});

export default router;

Bedste praksis for revisionsfirmaer

Brug sandbox til test. Hvis LegalDock tilbyder et sandbox-miljø, så brug det under integrationen, så testdokumenter ikke tæller mod kvoten og ikke sender rigtige e-mails.

Gem altid PDF lokalt. Download og arkivér PDF-filen i jeres eget system straks efter underskrift. Brug downloadUrl fra API-svaret.

Sæt en deadline på underskriftsanmodninger. En NDA, der ikke underskrives i tide, skaber forvirring. Brug deadline-feltet til forventningsafstemning.

Overvåg fejlrate. Log alle API-kald, og overvåg 4xx- og 5xx-svar. En pludselig stigning i 429-fejl (rate limit) signalerer, at I skal opgradere planen eller implementere backoff.

Fejlhåndtering: referencetabel

HTTP-kode Årsag Løsning
400 Ugyldige felter Tjek feltnavne mod skabelonens specifikation
401 Ugyldig API-nøgle Generér en ny nøgle under Indstillinger
403 Planbegrænsning Opgradér din plan
404 Ressource ikke fundet Tjek templateId eller documentId
429 Rate limit Implementér exponential backoff
500 Serverfejl Kontakt LegalDock-support

Klar til at integrere?

Opret en partnerkonto med API-adgang, generér din API-nøgle under indstillingerne, og læs den fulde API-reference i LegalDocks dokumentation, inden du går i gang. Har du brug for hjælp, kan du kontakte partnersupport.


Denne guide er teknisk vejledning og udgør ikke juridisk rådgivning. Kontakt en advokat for rådgivning om de dokumenter, du genererer.

Indholdet i denne artikel er vejledende og udgør ikke individuel juridisk rådgivning. LegalDocks dokumenter er skabeloner — kontakt en advokat ved tvivl om din konkrete situation.