Tidvis
Utviklere · Enterprise

Tidvis Sign Public API

REST API v1 og webhooks for å bygge egne integrasjoner mot Tidvis Sign. OAuth2 client credentials, signerte webhooks og fullt avtaleløp.

Hurtigstart

Base URL: https://tidvis.se/api/public/v1. Alle kall bruker JSON. Public API er del av Enterprise-planen.

  1. 1. Opprett en API-klient under Sign → Innstillinger → API og lagre client_id og client_secret.
  2. 2. Bytt dem mot et access_token via OAuth2 client credentials.
  3. 3. Opprett en avtale, last opp en PDF, legg til deltakere og send.
curl -X POST https://tidvis.se/api/public/v1/oauth/access-token \
  -H "Content-Type: application/json" \
  -d '{"client_id":"tvc_...","client_secret":"tvs_..."}'

Autentisering

OAuth2 client credentials. Bytt client_id+client_secret mot en JWT som er gyldig i 1 time. Send Authorization: Bearer <access_token> på alle påfølgende kall.

POST/oauth/access-token

Hent et access token (1t TTL).

{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "expires_at": "2026-06-07T13:00:00.000Z"
}
DELETE/oauth/access-token

Tilbakekall gjeldende token (krever Authorization-header).

Avtaler

POST/agreements

Opprett et avtaleutkast (status: draft).

curl -X POST https://tidvis.se/api/public/v1/agreements \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Arbeidsavtale Anna","expires_in_days":14,"bankid_required":true}'
GET/agreements

List avtaler. Støtter ?status, ?limit, ?cursor.

GET/agreements/:id

Hent en avtale med deltakere og status.

GET/agreements/:id/events

Audit-spor (sent, viewed, signed, completed...).

GET/agreements/:id/download

Hent signert PDF (returnerer signed URL eller binært innhold).

Deltakere

POST/agreements/:id/participants

Legg til en signatar (kun i draft-tilstand).

{
  "name": "Anna Andersson",
  "email": "anna@example.com",
  "role": "signer"
}

PDF-dokumenter

PUT/agreements/:id/documents/main

Last opp hoveddokumentet. Støtter application/pdf (binært) eller JSON med base64.

# JSON / base64
curl -X PUT https://tidvis.se/api/public/v1/agreements/$ID/documents/main \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"filename":"avtale.pdf","content_base64":"JVBERi0..."}'

# Eller binært
curl -X PUT https://tidvis.se/api/public/v1/agreements/$ID/documents/main \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/pdf" \
  --data-binary @avtale.pdf

Livssyklus

POST/agreements/:id/lifecycle

Send eller avbryt en avtale.

{"action": "send"}   // eller "cancel"

BankID

Du kan kreve svensk BankID-signering per avtale. Sett bankid_required: true ved opprettelse (eller via PATCH før sending). Når avtalen sendes signerer hver deltaker med BankID på mobil eller desktop i stedet for å tegne sin signatur.

Krav

  • Kontoen må ha planen Sign Pro og tillegget BankID aktivert.
  • Pris: 100 BankID-signaturer inkludert per måned, deretter 5 SEK/signatur.
  • Uten tillegget returnerer POST /agreements/:id/lifecycle med action: "send" feilen 402 bankid_disabled.

Opprett BankID-avtale

curl -X POST https://tidvis.se/api/public/v1/agreements \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Arbeidsavtale Anna",
    "bankid_required": true
  }'

Svar (forkortet):

{
  "id": "agr_...",
  "status": "draft",
  "bankid_required": true,
  "document": { "uploaded": false, "sha256": null },
  "participants": []
}

Webhook-payload når BankID brukes

For avtaler med bankid_required: true berikes agreement.signed-hendelsen med en signature-blokk. Av personvernhensyn eksponeres verken personnummer, sertifikater eller OCSP-svar via API-et eller webhooks.

{
  "event": "agreement.signed",
  "agreement_id": "agr_...",
  "participant": { "id": "p_...", "email": "anna@example.com" },
  "signature": {
    "method": "bankid",
    "signer_name": "Anna Andersson",
    "signed_at": "2026-06-11T08:42:11.000Z"
  }
}

Webhooks

Tidvis leverer hendelser til din URL via POST JSON. Hvert kall er signert med HMAC-SHA256 i headeren X-Tidvis-Signature: sha256=<hex> basert på din signing_secret og raw body. Mislykkede leveranser forsøkes på nytt med eksponentiell backoff i opptil 24t.

POST/webhooks

Registrer en webhook.

{
  "client_id": "<api_client uuid>",
  "url": "https://din-app.no/webhooks/tidvis",
  "events": ["agreement.sent","agreement.signed","agreement.completed"]
}
GET/webhooks

List registrerte webhooks.

DELETE/webhooks/:id

Slett en webhook.

Hendelser

  • agreement.sent
  • agreement.viewed
  • agreement.signed
  • agreement.completed
  • agreement.cancelled
  • agreement.expired

For avtaler med bankid_required: true inkluderer agreement.signed/agreement.completed også en signature-blokk. Se BankID.

Verifiser signatur (Node.js)

import { createHmac, timingSafeEqual } from "node:crypto";

function verify(rawBody, header, secret) {
  const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
  const given = (header || "").replace(/^sha256=/, "");
  return timingSafeEqual(Buffer.from(expected), Buffer.from(given));
}

Feilkoder

HTTPCodeBetydning
400invalid_requestFeil input.
401unauthorizedMangler/ugyldig token.
402plan_requiredKontoen mangler Enterprise-plan. Inkluderer upgrade_url.
402bankid_disabledAvtalen har bankid_required: true men kontoen mangler BankID-tillegget.
403forbiddenMangler rettigheter til ressursen.
404not_foundRessursen ble ikke funnet.
409conflictUgyldig tilstandsovergang (f.eks. sende allerede sendt avtale).
429rate_limitedFor mange kall.
500server_errorServerfeil – prøv igjen.

Rate-grenser

Standardgrense: 60 kall/minutt per klient og 600/time for opplastinger. Ved overskridelse får du 429 rate_limited med Retry-After-header. Trenger du mer? Kontakt oss.

MCP & AI-agenter

Tidvis Sign eksponerer en Model Context Protocol-server slik at AI-agenter (ChatGPT, Claude Desktop, egne agenter) kan opprette, sende og spore avtaler med ett enkelt verktøykall. Discovery-manifest finnes på /.well-known/mcp.json. En dedikert landingsside ligger på /no/utviklere/mcp.

Endepunkt

POST https://tidvis.se/api/mcp
Authorization: Bearer <access_token>
Content-Type: application/json
Accept: application/json, text/event-stream

Scopes

API-tokens kan begrenses til spesifikke scopes. For MCP kreves mcp:connect + valgfri kombinasjon av:

  • agreements:read – hent avtaler & events
  • agreements:create – opprett utkast & deltakere
  • agreements:send – send avtaler til signering
  • agreements:cancel – avbryt avtaler
  • billing:checkout – generer checkout-lenke
  • mcp:connect – kreves for MCP-tilgang

Tilgjengelige verktøy

  • tidvis_sign_create_agreement
  • tidvis_sign_add_participant
  • tidvis_sign_upload_pdf
  • tidvis_sign_send_agreement
  • tidvis_sign_cancel_agreement
  • tidvis_sign_get_agreement
  • tidvis_sign_list_events
  • tidvis_sign_create_checkout

Claude Desktop-konfigurasjon

{
  "mcpServers": {
    "tidvis-sign": {
      "url": "https://tidvis.se/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_ACCESS_TOKEN" }
    }
  }
}

Agent-checkout & betal-per-avtale

To måter en agent kan la sluttkunden betale:

  • Sign Pro (abonnement) – månedsavgift per sete, ubegrenset antall avtaler. Bruk tidvis_sign_create_checkout med product: "sign_pro_monthly" og ønsket antall seter.
  • Betal per avtale – 19 SEK/avtale som forhåndsbetalte kreditter, perfekt for lavvolums-agenter. Bruk product: "sign_per_agreement" og antall kreditter (1–500). Kreditter trekkes automatisk når send_agreement kjøres på free-plan-kontoer.

Checkout-verktøyet returnerer en Stripe-hostet URL som agenten viser til sluttkunden. Ved 402 plan_requiredsend_agreement mangler kontoen både kreditter og Sign Pro – svaret inneholder en upgrade_url agenten kan lenke til.

Klar til å se Tidvis?

Bestill en uforpliktende demo. Vi viser systemet tilpasset din virksomhet, uten salgspress.