curl --request POST \
--url https://api.tomorro.com/v2/contracts/{id}/signed-version \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"files": [
{
"key": "signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5",
"name": "nda-signed.pdf",
"contentType": "application/pdf"
}
],
"signatureDate": "2026-09-07T10:15:00.000Z"
}
'import requests
url = "https://api.tomorro.com/v2/contracts/{id}/signed-version"
payload = {
"files": [
{
"key": "signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5",
"name": "nda-signed.pdf",
"contentType": "application/pdf"
}
],
"signatureDate": "2026-09-07T10:15:00.000Z"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
files: [
{
key: 'signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5',
name: 'nda-signed.pdf',
contentType: 'application/pdf'
}
],
signatureDate: '2026-09-07T10:15:00.000Z'
})
};
fetch('https://api.tomorro.com/v2/contracts/{id}/signed-version', 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.tomorro.com/v2/contracts/{id}/signed-version",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'files' => [
[
'key' => 'signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5',
'name' => 'nda-signed.pdf',
'contentType' => 'application/pdf'
]
],
'signatureDate' => '2026-09-07T10:15:00.000Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.tomorro.com/v2/contracts/{id}/signed-version"
payload := strings.NewReader("{\n \"files\": [\n {\n \"key\": \"signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5\",\n \"name\": \"nda-signed.pdf\",\n \"contentType\": \"application/pdf\"\n }\n ],\n \"signatureDate\": \"2026-09-07T10:15:00.000Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.tomorro.com/v2/contracts/{id}/signed-version")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"files\": [\n {\n \"key\": \"signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5\",\n \"name\": \"nda-signed.pdf\",\n \"contentType\": \"application/pdf\"\n }\n ],\n \"signatureDate\": \"2026-09-07T10:15:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tomorro.com/v2/contracts/{id}/signed-version")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"files\": [\n {\n \"key\": \"signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5\",\n \"name\": \"nda-signed.pdf\",\n \"contentType\": \"application/pdf\"\n }\n ],\n \"signatureDate\": \"2026-09-07T10:15:00.000Z\"\n}"
response = http.request(request)
puts response.read_bodyUpload signed contract version
Marks the contract as signed from PDFs signed in a third-party tool: attaches them as the signed files, moves the contract to signed and stamps signatureDate, which also sets the start date when the contract type derives it from the signature date. Accepted from draft, negotiating, or signing when the signature was sent through a third-party tool. First call POST /files/upload-url once per PDF, PUT each file body to the returned URL, then call this endpoint with the returned keys.
curl --request POST \
--url https://api.tomorro.com/v2/contracts/{id}/signed-version \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"files": [
{
"key": "signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5",
"name": "nda-signed.pdf",
"contentType": "application/pdf"
}
],
"signatureDate": "2026-09-07T10:15:00.000Z"
}
'import requests
url = "https://api.tomorro.com/v2/contracts/{id}/signed-version"
payload = {
"files": [
{
"key": "signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5",
"name": "nda-signed.pdf",
"contentType": "application/pdf"
}
],
"signatureDate": "2026-09-07T10:15:00.000Z"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
files: [
{
key: 'signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5',
name: 'nda-signed.pdf',
contentType: 'application/pdf'
}
],
signatureDate: '2026-09-07T10:15:00.000Z'
})
};
fetch('https://api.tomorro.com/v2/contracts/{id}/signed-version', 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.tomorro.com/v2/contracts/{id}/signed-version",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'files' => [
[
'key' => 'signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5',
'name' => 'nda-signed.pdf',
'contentType' => 'application/pdf'
]
],
'signatureDate' => '2026-09-07T10:15:00.000Z'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.tomorro.com/v2/contracts/{id}/signed-version"
payload := strings.NewReader("{\n \"files\": [\n {\n \"key\": \"signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5\",\n \"name\": \"nda-signed.pdf\",\n \"contentType\": \"application/pdf\"\n }\n ],\n \"signatureDate\": \"2026-09-07T10:15:00.000Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.tomorro.com/v2/contracts/{id}/signed-version")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"files\": [\n {\n \"key\": \"signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5\",\n \"name\": \"nda-signed.pdf\",\n \"contentType\": \"application/pdf\"\n }\n ],\n \"signatureDate\": \"2026-09-07T10:15:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tomorro.com/v2/contracts/{id}/signed-version")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"files\": [\n {\n \"key\": \"signedFiles/550e8400-e29b-41d4-a716-446655440000/files/b3b7bd7b-85f9-49e7-843d-71f656df5ca5\",\n \"name\": \"nda-signed.pdf\",\n \"contentType\": \"application/pdf\"\n }\n ],\n \"signatureDate\": \"2026-09-07T10:15:00.000Z\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
API key for authentication. Get your key at https://app.tomorro.com/settings/integrations?integration=api-key
Path Parameters
The unique identifier (UUID) of the contract
"550e8400-e29b-41d4-a716-446655440000"
Body
The signed PDFs (1–20), main document first, then its annexes.
1 - 20 elementsShow child attributes
Show child attributes
When the last signatory signed in the signature tool (ISO 8601), not when this call is made. Cannot be in the future.
"2026-09-07T10:15:00.000Z"
Response
Contract signed