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_hereAPI 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/v1Send 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.pdf3. 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
uploadSessionIdRequiredThe ID returned byPOST /v1/uploadsafter the document has been uploaded.
documentNameRequiredThe filename shown to senders and signers. Include the.pdfextension.
sender.nameRequiredName of the person or account sending the document.
sender.emailRequiredSender email address.
sender.timeZoneIdOptionalIANA timezone fallback for unauthenticated sends, for exampleEurope/Stockholm. API key sends use the account timezone from settings. Missing unauthenticated values default toUTCwhen omitted.
sender.organizationOptionalOptional company details shown in the signing certificate and communication. Each nested field is optional:name,number,address,zipcode, andcity.
signersRequiredOne or more signers. Every signer requiresname. Provideemailfor email invitations andphonewhen SMS or BankID flows need a phone number.
signingOrderRequiredUseAnyOrderorSequential. 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.
signingMethodRequiredUseDraworBankId.
excludeSocialSecurityNumberRequiredBoolean value used by BankID signing flows.
sendCompletedDocumentToSignersRequiredBoolean value that controls whether signers receive a download link for the finalized PDF. The sender always receives the completed document email.
expiresAtRequiredExpiry date inYYYY-MM-DDformat.
messageOptionalOptional message included with signing invitations.
Endpoints
/v1/uploadsCreate a temporary document upload session and receive a pre-signed upload URL.
/v1/uploads/{id}Read metadata for a pending upload session.
/v1/uploads/{id}Discard a pending upload session.
/v1/documentsList documents created by the API key's user.
/v1/documentsSend a document for signing using an uploaded document session.
/v1/documents/{id}Get document details and signer links.
/v1/documents/{id}/remindersSend reminders to eligible pending signers.
/v1/documents/{id}/cancelCancel a pending document.
/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.