API documentation

Kleevo integrations API

Use the Kleevo v1 API to upload documents, create signing requests, track documents, send reminders, and cancel or delete documents from your own systems.

Get an API key

Sign in to Kleevo, open Settings, and create a key in the API keys section. Give the key a name that identifies the system using it, such as Production CRM or Staging.

The full key is shown only once when it is created. Store it in your server-side secret manager and do not expose it in browser code, mobile apps, or public repositories.

Authentication

Send the API key with every v1 request using either theX-API-Keyheader or a bearer token header.

X-API-Key: kleevo_sk_your_key_here

# or
Authorization: Bearer kleevo_sk_your_key_here

API keys act as the user who created them. Documents created through the API appear in that user's Kleevo dashboard.

Base URL

https://api.kleevo.se/v1

Send a document

The v1 API uses the same upload-session flow as the Kleevo web app. First create an upload session, then upload the document to the returned pre-signed URL, then create the signing request with the upload session ID.

For interactive integrations, start the upload as soon as the user selects a PDF instead of waiting for the final Send action. While the user fills in recipients, message, expiration, and other required fields, your system can create the upload session and upload the document in the background. This makes the final send step feel much faster.

If the user cancels or leaves the flow before creating the signing request, discard the pending upload session withDELETE /v1/uploads/{id}. Pending uploaded documents are also automatically deleted after 30 minutes if they are not used.

1. Create an upload session

curl -X POST https://api.kleevo.se/v1/uploads \
  -H "X-API-Key: kleevo_sk_your_key_here"
{
  "id": "4b77f61d-6a4e-4f64-9292-f6ee7fd11423",
  "contentType": "application/pdf",
  "uploadUrl": "https://...",
  "createdAt": "2026-06-29T08:15:00Z",
  "expiresAt": "2026-06-29T08:45:00Z"
}

2. Upload the document

curl -X PUT "https://returned-upload-url" \
  -H "Content-Type: application/pdf" \
  --data-binary @employment-agreement.pdf

3. Create the signing request

curl -X POST https://api.kleevo.se/v1/documents \
  -H "X-API-Key: kleevo_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "uploadSessionId": "4b77f61d-6a4e-4f64-9292-f6ee7fd11423",
    "documentName": "Employment agreement.pdf",
    "sender": {
      "name": "Anna Andersson",
      "email": "anna@example.com",
      "timeZoneId": "Europe/Stockholm",
      "organization": {
        "name": "Example AB",
        "number": "559000-0000",
        "address": "Kungsgatan 1",
        "zipcode": "111 43",
        "city": "Stockholm"
      }
    },
    "signers": [
      {
        "name": "Erik Svensson",
        "email": "erik@example.com",
        "phone": "+46701234567"
      }
    ],
    "signingOrder": "AnyOrder",
    "signingMethod": "Draw",
    "excludeSocialSecurityNumber": false,
    "sendCompletedDocumentToSigners": true,
    "expiresAt": "2026-07-29",
    "message": "Please review and sign."
  }'

UseSequentialwhen signers must sign one at a time. UseBankIdas the signing method when BankID signing is enabled for your flow.

Send request fields

uploadSessionIdRequired

The ID returned byPOST /v1/uploadsafter the document has been uploaded.

documentNameRequired

The filename shown to senders and signers. Include the.pdfextension.

sender.nameRequired

Name of the person or account sending the document.

sender.emailRequired

Sender email address.

sender.timeZoneIdOptional

IANA timezone fallback for unauthenticated sends, for exampleEurope/Stockholm. API key sends use the account timezone from settings. Missing unauthenticated values default toUTCwhen omitted.

sender.organizationOptional

Optional company details shown in the signing certificate and communication. Each nested field is optional:name,number,address,zipcode, andcity.

signersRequired

One or more signers. Every signer requiresname. Provideemailfor email invitations andphonewhen SMS or BankID flows need a phone number.

signingOrderRequired

UseAnyOrderorSequential. WithSequential, signers are invited in the same order they appear in thesignersarray. The next signer is invited only after the current signer has completed signing. If there is only one signer, Kleevo treats the document asAnyOrder.

signingMethodRequired

UseDraworBankId.

excludeSocialSecurityNumberRequired

Boolean value used by BankID signing flows.

sendCompletedDocumentToSignersRequired

Boolean value that controls whether signers receive a download link for the finalized PDF. The sender always receives the completed document email.

expiresAtRequired

Expiry date inYYYY-MM-DDformat.

messageOptional

Optional message included with signing invitations.

Endpoints

POST/v1/uploads

Create a temporary document upload session and receive a pre-signed upload URL.

GET/v1/uploads/{id}

Read metadata for a pending upload session.

DELETE/v1/uploads/{id}

Discard a pending upload session.

GET/v1/documents

List documents created by the API key's user.

POST/v1/documents

Send a document for signing using an uploaded document session.

GET/v1/documents/{id}

Get document details and signer links.

POST/v1/documents/{id}/reminders

Send reminders to eligible pending signers.

POST/v1/documents/{id}/cancel

Cancel a pending document.

DELETE/v1/documents/{id}

Delete a document and its stored artifacts.

Rate limits

API requests are rate-limited to protect service reliability. Limits may vary by endpoint and account configuration, so clients should be prepared to retry requests with backoff.

When a limit is reached, the API returns429 Too Many Requestswith a JSON response body. When available, the response also includes aRetry-Afterheader indicating how many seconds to wait before retrying.

{
  "message": "Too many requests. Please try again later."
}

Errors and expiry

If you send a document after its upload session expires, create a new upload session, upload the document again, and retry the document request.

{
  "code": "upload_session_expired",
  "message": "The temporary document upload expired."
}

A409response means the upload is missing, incomplete, expired, or no longer usable. A400response means the request body failed validation.