https://www.helprange.com/api/v2/signature-requestsSends a document from a folder you can open for e-signature (plans with e-signature). A signature page with a block per signer is added at the end; every recipient gets an e-mail with a signing link (counted in the team's API e-mail budget). Form posts can pass repeated signer_email fields instead of signers.
Plans: Max, Unlimited, Deal Room Pass, trial. Auth: Authorization: Bearer hr_live_… (team key), X-API-Key, Authorization: Api-Key <key> or an OAuth Bearer token. Scope: documents:write. Operation id: createSignatureRequest
Content types: application/json, application/x-www-form-urlencoded.
| Field | Type | Description |
|---|---|---|
document_id required | integer | A document in a folder you can open. |
signers required | array of object | Recipients in signing order. (min items 1, max items 20) |
title | string | Default: the file name. |
message | string | Shown in the e-mail. |
sequential | boolean | true: sign one after another. |
expires_on | string (date) | YYYY-MM-DD (default: 30 days). |
curl -X POST https://www.helprange.com/api/v2/signature-requests \
-H "X-API-Key: $HELPRANGE_API_KEY" \
-H 'Content-Type: application/json' \
--data-binary '{"document_id": 250, "title": "Mutual NDA", "signers": [{"name": "Anna Client", "email": "anna@client.com"}, {"name": "Legal", "email": "legal@client.com", "action": "review"}], "sequential": true}'
const res = await fetch('https://www.helprange.com/api/v2/signature-requests', {
method: 'POST',
headers: {'X-API-Key': process.env.HELPRANGE_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({
"document_id": 250,
"title": "Mutual NDA",
"signers": [
{
"name": "Anna Client",
"email": "anna@client.com"
},
{
"name": "Legal",
"email": "legal@client.com",
"action": "review"
}
],
"sequential": true
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${res.status}: ${data.error || data.message || data.reason}`);
console.log(data);
import os
import requests
r = requests.post(
'https://www.helprange.com/api/v2/signature-requests',
headers={'X-API-Key': os.environ['HELPRANGE_API_KEY']},
json={
"document_id": 250,
"title": "Mutual NDA",
"signers": [
{
"name": "Anna Client",
"email": "anna@client.com",
},
{
"name": "Legal",
"email": "legal@client.com",
"action": "review",
},
],
"sequential": True,
},
timeout=60,
)
r.raise_for_status()
print(r.json())
The samples read the key from the HELPRANGE_API_KEY environment variable.
| Status | Description |
|---|---|
201 | Created and sent |
400 | Invalid input – the message says which parameter. |
401 | Missing or invalid API key / OAuth token. Team keys: code invalid_key, key_revoked, key_expired or key_owner_removed. |
402 | Your plan does not include the REST API (or this feature). |
403 | The team API key lacks the scope this endpoint needs. |
404 | Not found – or not yours (the API never says which). |
405 | Wrong HTTP method for this endpoint. |
429 | A usage limit was reached – wait Retry-After seconds. |
{
"id": "9f1c2e7a4b",
"title": "Mutual NDA",
"status": "sent",
"status_label": "Sent",
"sender": "Ann Admin",
"document_id": 250,
"data_room": null,
"created_at": "2026-11-10T08:00:00+00:00",
"sent_at": "2026-11-10T08:00:02+00:00",
"expires_at": "2026-12-10T22:59:59+00:00",
"completed_at": null,
"ended_at": null,
"signed": 0,
"recipients_count": 2,
"url": "https://www.helprange.com/user/signature-doc?signatureId=9f1c2e7a4b",
"sent": true
}
Uses your real account. The request goes from your browser straight to www.helprange.com with your API key and acts as you – this POST changes data and may e-mail people. The key stays in this page (in this tab's session storage only if you tick the box), is never put in a URL and is not sent to analytics. Do not paste a key on a shared computer.