curl --request POST \
--url https://api.mijnklantportaal.nl/v1/agreements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=Service contract' \
--form 'signerName=John Doe' \
--form 'signerSignatureData=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...' \
--form 'signers={
"firstName": "Dirk Jan",
"lastName": "Bakker",
"email": "dj.bakker@domain.com",
"shouldIdentify": true
}' \
--form 'documents=<string>' \
--form documents.items='@example-file'import requests
url = "https://api.mijnklantportaal.nl/v1/agreements"
files = { "documents.items": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Service contract",
"signerName": "John Doe",
"signerSignatureData": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...",
"signers": "{
\"firstName\": \"Dirk Jan\",
\"lastName\": \"Bakker\",
\"email\": \"dj.bakker@domain.com\",
\"shouldIdentify\": true
}",
"documents": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('name', 'Service contract');
form.append('signerName', 'John Doe');
form.append('signerSignatureData', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...');
form.append('signers', '{
"firstName": "Dirk Jan",
"lastName": "Bakker",
"email": "dj.bakker@domain.com",
"shouldIdentify": true
}');
form.append('documents', '<string>');
form.append('documents.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.mijnklantportaal.nl/v1/agreements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mijnklantportaal.nl/v1/agreements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mijnklantportaal.nl/v1/agreements"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mijnklantportaal.nl/v1/agreements")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mijnklantportaal.nl/v1/agreements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "agr_abc12346def678",
"name": "Service contract",
"status": "sent",
"signerName": "John Doe",
"signerSignature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...",
"signerSignatureHash": "PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P",
"signers": [
{
"id": "ags_abc12346def678",
"firstName": "Dirk Jan",
"lastName": "Bakker",
"email": "dj.bakker@domain.com",
"shouldIdentify": true,
"signature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...",
"signatureHash": "PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P",
"signedAt": "2025-09-13T17:23:14+02:00"
}
],
"documents": [
{
"id": "agd_abc12346def678",
"documentName": "Contract version_2.pdf",
"fileSize": 512,
"fileHash": "PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P"
}
],
"createdAt": "2025-09-13T17:23:14+02:00"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Create agreement
Creating a new agreement. Note: This endpoint accepts only multipart/form-data.
curl --request POST \
--url https://api.mijnklantportaal.nl/v1/agreements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=Service contract' \
--form 'signerName=John Doe' \
--form 'signerSignatureData=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...' \
--form 'signers={
"firstName": "Dirk Jan",
"lastName": "Bakker",
"email": "dj.bakker@domain.com",
"shouldIdentify": true
}' \
--form 'documents=<string>' \
--form documents.items='@example-file'import requests
url = "https://api.mijnklantportaal.nl/v1/agreements"
files = { "documents.items": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Service contract",
"signerName": "John Doe",
"signerSignatureData": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...",
"signers": "{
\"firstName\": \"Dirk Jan\",
\"lastName\": \"Bakker\",
\"email\": \"dj.bakker@domain.com\",
\"shouldIdentify\": true
}",
"documents": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('name', 'Service contract');
form.append('signerName', 'John Doe');
form.append('signerSignatureData', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...');
form.append('signers', '{
"firstName": "Dirk Jan",
"lastName": "Bakker",
"email": "dj.bakker@domain.com",
"shouldIdentify": true
}');
form.append('documents', '<string>');
form.append('documents.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.mijnklantportaal.nl/v1/agreements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mijnklantportaal.nl/v1/agreements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.mijnklantportaal.nl/v1/agreements"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mijnklantportaal.nl/v1/agreements")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mijnklantportaal.nl/v1/agreements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nService contract\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerName\"\r\n\r\nJohn Doe\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signerSignatureData\"\r\n\r\ndata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"signers\"\r\n\r\n{\r\n \"firstName\": \"Dirk Jan\",\r\n \"lastName\": \"Bakker\",\r\n \"email\": \"dj.bakker@domain.com\",\r\n \"shouldIdentify\": true\r\n}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "agr_abc12346def678",
"name": "Service contract",
"status": "sent",
"signerName": "John Doe",
"signerSignature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...",
"signerSignatureHash": "PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P",
"signers": [
{
"id": "ags_abc12346def678",
"firstName": "Dirk Jan",
"lastName": "Bakker",
"email": "dj.bakker@domain.com",
"shouldIdentify": true,
"signature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA...",
"signatureHash": "PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P",
"signedAt": "2025-09-13T17:23:14+02:00"
}
],
"documents": [
{
"id": "agd_abc12346def678",
"documentName": "Contract version_2.pdf",
"fileSize": 512,
"fileHash": "PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P"
}
],
"createdAt": "2025-09-13T17:23:14+02:00"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Name of the agreement
"Service contract"
Name of the signer in the name of the company of the portal
"John Doe"
Base64-encoded data-string of the signature image
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA..."
An array of objects with information about the needed signers. Per agreement, a maximum of 5 signers is permitted.
Show child attributes
Show child attributes
The documents which are part of this agreement. Maximum of 5 documents per agreement, upon a total of 5MB.
Response
Returning the created Agreement
Agreement with details
ID of the agreement, always starting with agr_.
"agr_abc12346def678"
Name of the agreement
"Service contract"
Status of the agreement. Can be sent or signed.
"sent"
Name of the person who signed in name of the company of the portal
"John Doe"
Base64-encoded string of the signature image
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAA..."
Hash of the signerSignature in combination with the signing datetime to ensure integrity
"PwZVOc2K5rqcpqljbM2xkzJub9FtmA307pvuoJXoiqHDuEyZB7NVqdKbb3SPXt1P"
An array with the signer(s) for this agreement
Show child attributes
Show child attributes
An array with the document(s) for this agreement
Show child attributes
Show child attributes
Date and time when the agreement is created in MijnKlantportaal, written in ATOM format.
"2025-09-13T17:23:14+02:00"
