curl --request POST \
--url https://www.presolve.com/api/v1/cases/{caseId}/esign-documents \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"templateLibraryFileId": "<string>",
"signers": [
{
"email": "jsmith@example.com",
"firstName": "<string>",
"lastName": "<string>",
"role": "<string>",
"signingOrder": 50
}
],
"type": "<string>",
"variables": {}
}
'const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
templateLibraryFileId: '<string>',
signers: [
{
email: 'jsmith@example.com',
firstName: '<string>',
lastName: '<string>',
role: '<string>',
signingOrder: 50
}
],
type: '<string>',
variables: {}
})
};
fetch('https://www.presolve.com/api/v1/cases/{caseId}/esign-documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.presolve.com/api/v1/cases/{caseId}/esign-documents"
payload = {
"templateLibraryFileId": "<string>",
"signers": [
{
"email": "jsmith@example.com",
"firstName": "<string>",
"lastName": "<string>",
"role": "<string>",
"signingOrder": 50
}
],
"type": "<string>",
"variables": {}
}
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}Create and send an e-sign document from a template
Duplicate in-flight documents for the same case + template return 409 DUPLICATE_ENTRY with the existing esignDocumentId. Sender attribution requires the key’s acting attorney.
Supports one selected organization via organizationId. Omit it to use the key’s organization. HQ descendant access requires an active acting attorney with hq:view_child_orgs, cases:view, cases:view_all, hq:view_all_cases, esign:view, hq:manage_child_orgs, esign:send. Existing key scopes still apply. The selector requires an integration API key; legacy partner/OIDC routing is unchanged. Repeat the selector on every cursor page, related mutation, upload completion, and detail/download request. Mutation key scopes, idempotency, revisions, and resource-specific eligibility still apply. See HQ authorization.
Requires the esign:write scope. Mutations require an X-Idempotency-Key header (responses are stored for replay; reusing a key with a different request returns 409 IDEMPOTENCY_CONFLICT). Rate tier: write.
curl --request POST \
--url https://www.presolve.com/api/v1/cases/{caseId}/esign-documents \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--header 'x-api-key: <api-key>' \
--data '
{
"templateLibraryFileId": "<string>",
"signers": [
{
"email": "jsmith@example.com",
"firstName": "<string>",
"lastName": "<string>",
"role": "<string>",
"signingOrder": 50
}
],
"type": "<string>",
"variables": {}
}
'const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
templateLibraryFileId: '<string>',
signers: [
{
email: 'jsmith@example.com',
firstName: '<string>',
lastName: '<string>',
role: '<string>',
signingOrder: 50
}
],
type: '<string>',
variables: {}
})
};
fetch('https://www.presolve.com/api/v1/cases/{caseId}/esign-documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://www.presolve.com/api/v1/cases/{caseId}/esign-documents"
payload = {
"templateLibraryFileId": "<string>",
"signers": [
{
"email": "jsmith@example.com",
"firstName": "<string>",
"lastName": "<string>",
"role": "<string>",
"signingOrder": 50
}
],
"type": "<string>",
"variables": {}
}
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}{
"success": false,
"error": "<string>",
"code": "<string>"
}Authorizations
Org-issued integration API key (service account credential). The plaintext secret is shown once at creation.
Headers
Stable caller-chosen key (max 200 chars) making the mutation safely retryable.
200Path Parameters
Case id
Query Parameters
Select one organization for this request. Defaults to the key organization. An HQ key may select an active descendant when its active acting attorney has the required HQ and resource permissions. Repeat the same organizationId on related mutations, upload completion, detail requests, and every cursor page. See /authorization.