Templates API
Reusable documents with placeholders instead of recipients.
Updated
On this page
- GET /document_templates
- POST /document_templates
- GET /document_templates/{id}
- PUT /document_templates/{id}
- PATCH /document_templates/{id}
- DELETE /document_templates/{id}
- POST /document_templates/documents
- POST /document_templates/{id}/duplicate
- POST /document_templates/{id}/embedded_edit_url
- PUT /document_templates/{id}/files/{position}
- GET /document_templates/{id}/revisions
- POST /document_templates/{id}/revisions/{number}/restore
12 operations, generated from
openapi/signclad.v1.yaml. Try them in the
interactive reference, browse
every endpoint group, or read the
guides for the prose version.
- GET
/document_templatesList templates - POST
/document_templatesCreate a template - GET
/document_templates/{id}Get a template - PUT
/document_templates/{id}Update template settings - PATCH
/document_templates/{id}Save a template editor snapshot - DELETE
/document_templates/{id}Delete a template - POST
/document_templates/documentsCreate a document from templates - POST
/document_templates/{id}/duplicateDuplicate a template - POST
/document_templates/{id}/embedded_edit_urlRegenerate a template builder URL - PUT
/document_templates/{id}/files/{position}Replace a file on a template - GET
/document_templates/{id}/revisionsList template revisions - POST
/document_templates/{id}/revisions/{number}/restoreRestore a template revision
GET /document_templates
List templates Extension
Cursor-paginated list of the workspace's templates. total_count counts every template
matching the filters so navigation badges do not need to fetch and serialize every row.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
status | string | Optional | Template status. |
label | string | Optional | Only records carrying this label. |
updated_since | string (date-time) | Optional | Only records changed at or after this time. The reliable way to poll: sort is by updated_at ascending when this is present. |
metadata | object | Optional | Exact match on stored metadata, expressed as metadata[key]=value. Several keys are combined with AND. |
q | string | Optional | Free-text search over name, subject, recipient names, and recipient emails. |
archived | boolean | Optional | Include archived records. Defaults to excluding them. |
cursor | string | Optional | Opaque cursor from a previous response's next_cursor. |
limit | integer | Optional | Items per page. |
Responses
| Status | Description |
|---|---|
200 | A page of templates. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X GET https://api.signclad.com/api/v1/document_templates \
-H "X-Api-Key: $SIGNCLAD_API_KEY" POST /document_templates
Create a template
Same shape as a document, with placeholders instead of recipients and
placeholder_id on fields. draft: false publishes the template; draft: true returns
an embedded_edit_url for the template builder.
The response carries the transient status Created in both cases. The settled status
(Draft or Available) appears on the next GET, and PUT {draft: false} moves a
draft to Available.
fields is accepted both as an array of arrays (one inner array per file) and as an
object keyed by file and field, for compatibility with clients that build it as a map.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
files | array of object | Required | |
placeholders | array of object | Required | |
allow_decline | boolean | Optional | |
allow_reassign | boolean | Optional | |
api_application_id | string (uuid) | Optional | Branding and embed origins to use for this document. |
apply_signing_order | boolean | Optional | Send to recipients in order; each is notified only once every earlier signer has signed. |
attachment_requests | array of object | Optional | |
cfr_part11 | boolean | Optional | 21 CFR Part 11 mode. It can also be switched on by the workspace or the account, so a request that never mentions it may still come back with it set.… |
cfr_part11_signing_mode | string or null | Optional | streamlined re-authenticates once for the session; per_signature re-authenticates for each signature or initials field. Asking for a mode without the plan feature is 422 not_available_on_plan. |
checkbox_groups | array of object | Optional | |
conditional_rules | array of object | Optional | |
copied_placeholders | array of object | Optional | |
custom_requester_email | string (email) | Optional | Reply-to address for the invitation. |
custom_requester_name | string | Optional | Name the invitation comes from. |
decline_redirect_url | string (uri) | Optional | Where a signer lands after declining. |
draft | boolean | Optional | Keep the document editable instead of sending it. A draft returns a document-level embedded_edit_url. |
embedded_signing | boolean | Optional | Return per-recipient embedded_signing_urls for use in an iframe. |
embedded_signing_notifications | boolean | Optional | Send Signclad's own emails even though the document is embedded. |
expires_in | integer or null | Optional | Days until the document expires. Defaults to the template's value, then the account's, which is 30. |
fields | one of: array of array of object, object | Optional | Fields per file. Either an array of arrays in files order, or an object whose keys are file keys and whose values are objects of fields. |
id_verification | object | Optional | Whether the signer must prove who they are with a government ID before signing, and through which provider. Set on a document for everybody, or on a single recipient. provider is absent, not null, when it was never named — the account default applies. |
labels | array of one of: string, object | Optional | |
language | string | Optional | Language for the signing experience and its emails. Arabic renders right to left. |
message | string | Optional | Body of the signing invitation. A safe subset of HTML is allowed. |
metadata | object | Optional | Up to 50 key/value pairs stored with the record and returned unchanged. Keys are under 40 characters, values under 500, and values must be strings — encode anything else yourself. |
name | string | Optional | Internal name. Defaults to the first file's name. |
redirect_url | string (uri) | Optional | Where a signer lands after finishing. |
reminders | boolean | Optional | Automatic reminders on days 3, 6, and 10. |
self_sign | boolean | Optional | The requester signs immediately rather than being emailed a link. |
skip_invalid_fields | boolean | Optional | Drop template_fields entries that cannot be applied and report them in warnings[] instead of failing the whole request. |
subject | string | Optional | Subject line of the signing invitation. |
test_mode | boolean | Optional | A test document is excluded from billing and is not legally binding. Sandbox API keys force this on. Test mode does not suppress delivery: a test document emails its recipients like any other, and an undeliverable address bounces.… |
text_tags | boolean | Optional | Parse Signclad [type|modifier] tags or legacy positional {{...}} tags in the uploaded files into fields. Both formats work for documents and templates and may be mixed in one file.… |
with_signature_page | boolean | Optional | Append a generated signature page listing every signer, each with a signature field, a locked date-signed field, and a name autofill. Those fields are addressable as SignaturePage_Signature_<recipient_id> and the page counts toward pages_number. |
Responses
| Status | Description |
|---|---|
201 | Created. |
400 | The request body could not be parsed as JSON. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
403 | Authenticated, but not allowed to do this: an insufficient role, a credential type the route refuses, an unenrolled second factor, or a signer acting out of turn. meta.error always says which.… |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X POST https://api.signclad.com/api/v1/document_templates \
-H "X-Api-Key: $SIGNCLAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Onboarding agreement",
"draft": true,
"text_tags": true,
"metadata": {
"s3_keys": "[\"2026/09/09/ws/files/file/originals/onboarding.pdf\"]"
},
"files": [
{
"name": "onboarding.pdf",
"file_url": "https://files.example.com/onboarding.pdf?X-Amz-Expires=7200&X-Amz-Signature=..."
}
],
"placeholders": [
{
"id": "borrower",
"name": "Borrower"
}
],
"fields": [
[
{
"api_id": "borrower_signature",
"type": "signature",
"placeholder_id": "borrower",
"page": 1,
"x": 375,
"y": 206,
"width": 180,
"height": 44
}
]
]
}' Example response (201)
{
"id": "3f1c9a2e-6b7d-4c8e-9a0b-1c2d3e4f5a6b",
"name": "Onboarding agreement",
"status": "Created",
"archived": false,
"created_at": "2026-09-01T12:00:00Z",
"updated_at": "2026-09-01T12:00:00Z",
"template_link": "https://app.signclad.com/t/3f1c9a2e6b7d",
"embedded_edit_url": "https://app.signclad.com/embed/templates/3f1c9a2e?token=eyJhbGciOi...",
"placeholders": [
{
"id": "borrower",
"name": "Borrower"
}
],
"files": [
{
"name": "onboarding.pdf",
"pages_number": 0,
"status": "processing"
}
],
"fields": [
[
{
"api_id": "borrower_signature",
"type": "signature",
"page": 1,
"placeholder_name": "Borrower",
"x": 375,
"y": 206,
"width": "180.0",
"height": "44.0",
"value": ""
}
]
]
} GET /document_templates/{id}
Get a template
The full template, including placeholders, copied_placeholders, template_link
(the public fill link, which works even while the template is still a draft) and a
single-use embedded_edit_url. fields is an array of arrays, one per file, and each
field carries placeholder_name — never placeholder_id.
This is where a template's settled status lives; a create answered Created.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Responses
| Status | Description |
|---|---|
200 | The template. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
403 | Authenticated, but not allowed to do this: an insufficient role, a credential type the route refuses, an unenrolled second factor, or a signer acting out of turn. meta.error always says which.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X GET https://api.signclad.com/api/v1/document_templates/{id} \
-H "X-Api-Key: $SIGNCLAD_API_KEY" Example response (200)
{
"id": "3f1c9a2e-6b7d-4c8e-9a0b-1c2d3e4f5a6b",
"name": "Onboarding agreement",
"status": "Available",
"archived": false,
"created_at": "2026-09-01T12:00:00Z",
"updated_at": "2026-09-08T09:31:44Z",
"template_link": "https://app.signclad.com/t/3f1c9a2e6b7d",
"embedded_edit_url": "https://app.signclad.com/embed/templates/3f1c9a2e?token=eyJhbGciOi...",
"subject": "Please sign your onboarding agreement",
"message": "<p>Welcome aboard.</p>",
"expires_in": 30,
"language": "en",
"current_revision": 7,
"placeholders": [
{
"id": "borrower",
"name": "Borrower",
"signing_order": 1
}
],
"copied_placeholders": [],
"files": [
{
"name": "onboarding.pdf",
"pages_number": 4,
"status": "ready"
}
],
"fields": [
[
{
"api_id": "borrower_date",
"type": "date",
"page": 1,
"placeholder_name": "Borrower",
"label": "Date signed",
"x": 375,
"y": 262,
"width": "120.0",
"height": "24.0",
"lock_sign_date": true,
"date_format": "MM/DD/YYYY",
"value": ""
},
{
"api_id": "borrower_signature",
"type": "signature",
"page": 1,
"placeholder_name": "Borrower",
"label": "Signature",
"x": 375,
"y": 206,
"width": "180.0",
"height": "44.0",
"lock_sign_date": false,
"value": ""
}
]
]
} PUT /document_templates/{id}
Update template settings
Settings only; files, placeholders, and fields are edited in the builder.
labels and checkbox_groups are replaced wholesale by what the request carries.
conditional_rules are upserted by id; send {"id": "...", "deleted": true} to
remove one.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
allow_decline | boolean | Optional | |
allow_reassign | boolean | Optional | |
api_application_id | string (uuid) | Optional | Branding and embed origins to use for this document. |
apply_signing_order | boolean | Optional | Send to recipients in order; each is notified only once every earlier signer has signed. |
cfr_part11 | boolean | Optional | 21 CFR Part 11 mode. It can also be switched on by the workspace or the account, so a request that never mentions it may still come back with it set.… |
cfr_part11_signing_mode | string or null | Optional | streamlined re-authenticates once for the session; per_signature re-authenticates for each signature or initials field. Asking for a mode without the plan feature is 422 not_available_on_plan. |
checkbox_groups | array of object | Optional | |
conditional_rules | array of object | Optional | |
custom_requester_email | string (email) | Optional | Reply-to address for the invitation. |
custom_requester_name | string | Optional | Name the invitation comes from. |
decline_redirect_url | string (uri) | Optional | Where a signer lands after declining. |
draft | boolean | Optional | Keep the document editable instead of sending it. A draft returns a document-level embedded_edit_url. |
embedded_signing | boolean | Optional | Return per-recipient embedded_signing_urls for use in an iframe. |
embedded_signing_notifications | boolean | Optional | Send Signclad's own emails even though the document is embedded. |
expires_in | integer or null | Optional | Days until the document expires. Defaults to the template's value, then the account's, which is 30. |
id_verification | object | Optional | Whether the signer must prove who they are with a government ID before signing, and through which provider. Set on a document for everybody, or on a single recipient. provider is absent, not null, when it was never named — the account default applies. |
labels | array of one of: string, object | Optional | |
language | string | Optional | Language for the signing experience and its emails. Arabic renders right to left. |
message | string | Optional | Body of the signing invitation. A safe subset of HTML is allowed. |
metadata | object | Optional | Up to 50 key/value pairs stored with the record and returned unchanged. Keys are under 40 characters, values under 500, and values must be strings — encode anything else yourself. |
name | string | Optional | Internal name. Defaults to the first file's name. |
redirect_url | string (uri) | Optional | Where a signer lands after finishing. |
reminders | boolean | Optional | Automatic reminders on days 3, 6, and 10. |
self_sign | boolean | Optional | The requester signs immediately rather than being emailed a link. |
skip_invalid_fields | boolean | Optional | Drop template_fields entries that cannot be applied and report them in warnings[] instead of failing the whole request. |
subject | string | Optional | Subject line of the signing invitation. |
test_mode | boolean | Optional | A test document is excluded from billing and is not legally binding. Sandbox API keys force this on. Test mode does not suppress delivery: a test document emails its recipients like any other, and an undeliverable address bounces.… |
text_tags | boolean | Optional | Parse Signclad [type|modifier] tags or legacy positional {{...}} tags in the uploaded files into fields. Both formats work for documents and templates and may be mixed in one file.… |
with_signature_page | boolean | Optional | Append a generated signature page listing every signer, each with a signature field, a locked date-signed field, and a name autofill. Those fields are addressable as SignaturePage_Signature_<recipient_id> and the page counts toward pages_number. |
Responses
| Status | Description |
|---|---|
200 | The updated template. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X PUT https://api.signclad.com/api/v1/document_templates/{id} \
-H "X-Api-Key: $SIGNCLAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Loan agreement (2026)",
"subject": "Your loan agreement",
"expires_in": 30,
"labels": [
"loans",
"onboarding"
]
}' PATCH /document_templates/{id}
Save a template editor snapshot
Saves fields and roles atomically with settings and a revision. Fields replace the entire field collection and address roles by placeholder_name or placeholder_id. Files are unchanged. draft true returns the template to Draft; false publishes it.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
fields | array of array of object | Required | |
placeholders | array of object | Required | |
allow_decline | boolean | Optional | |
allow_reassign | boolean | Optional | |
api_application_id | string (uuid) | Optional | Branding and embed origins to use for this document. |
apply_signing_order | boolean | Optional | Send to recipients in order; each is notified only once every earlier signer has signed. |
cfr_part11 | boolean | Optional | 21 CFR Part 11 mode. It can also be switched on by the workspace or the account, so a request that never mentions it may still come back with it set.… |
cfr_part11_signing_mode | string or null | Optional | streamlined re-authenticates once for the session; per_signature re-authenticates for each signature or initials field. Asking for a mode without the plan feature is 422 not_available_on_plan. |
checkbox_groups | array of object | Optional | |
conditional_rules | array of object | Optional | |
custom_requester_email | string (email) | Optional | Reply-to address for the invitation. |
custom_requester_name | string | Optional | Name the invitation comes from. |
decline_redirect_url | string (uri) | Optional | Where a signer lands after declining. |
draft | boolean | Optional | Keep the document editable instead of sending it. A draft returns a document-level embedded_edit_url. |
embedded_signing | boolean | Optional | Return per-recipient embedded_signing_urls for use in an iframe. |
embedded_signing_notifications | boolean | Optional | Send Signclad's own emails even though the document is embedded. |
expires_in | integer or null | Optional | Days until the document expires. Defaults to the template's value, then the account's, which is 30. |
id_verification | object | Optional | Whether the signer must prove who they are with a government ID before signing, and through which provider. Set on a document for everybody, or on a single recipient. provider is absent, not null, when it was never named — the account default applies. |
labels | array of one of: string, object | Optional | |
language | string | Optional | Language for the signing experience and its emails. Arabic renders right to left. |
message | string | Optional | Body of the signing invitation. A safe subset of HTML is allowed. |
metadata | object | Optional | Up to 50 key/value pairs stored with the record and returned unchanged. Keys are under 40 characters, values under 500, and values must be strings — encode anything else yourself. |
name | string | Optional | Internal name. Defaults to the first file's name. |
redirect_url | string (uri) | Optional | Where a signer lands after finishing. |
reminders | boolean | Optional | Automatic reminders on days 3, 6, and 10. |
self_sign | boolean | Optional | The requester signs immediately rather than being emailed a link. |
skip_invalid_fields | boolean | Optional | Drop template_fields entries that cannot be applied and report them in warnings[] instead of failing the whole request. |
subject | string | Optional | Subject line of the signing invitation. |
test_mode | boolean | Optional | A test document is excluded from billing and is not legally binding. Sandbox API keys force this on. Test mode does not suppress delivery: a test document emails its recipients like any other, and an undeliverable address bounces.… |
text_tags | boolean | Optional | Parse Signclad [type|modifier] tags or legacy positional {{...}} tags in the uploaded files into fields. Both formats work for documents and templates and may be mixed in one file.… |
with_signature_page | boolean | Optional | Append a generated signature page listing every signer, each with a signature field, a locked date-signed field, and a name autofill. Those fields are addressable as SignaturePage_Signature_<recipient_id> and the page counts toward pages_number. |
Responses
| Status | Description |
|---|---|
200 | The saved template. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
403 | Authenticated, but not allowed to do this: an insufficient role, a credential type the route refuses, an unenrolled second factor, or a signer acting out of turn. meta.error always says which.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
Example request
curl -X PATCH https://api.signclad.com/api/v1/document_templates/{id} \
-H "X-Api-Key: $SIGNCLAD_API_KEY" DELETE /document_templates/{id}
Delete a template
Documents already created from the template are unaffected.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Responses
| Status | Description |
|---|---|
204 | Deleted. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
403 | Authenticated, but not allowed to do this: an insufficient role, a credential type the route refuses, an unenrolled second factor, or a signer acting out of turn. meta.error always says which.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X DELETE https://api.signclad.com/api/v1/document_templates/{id} \
-H "X-Api-Key: $SIGNCLAD_API_KEY" POST /document_templates/documents
Create a document from templates
Creates a document from one template (template_id) or several composed in order
(template_ids). Exactly one of the two is required.
Recipients are assigned to placeholders by placeholder_name and inherit that
placeholder's fields and settings. files and fields are appended: they never
replace the template's files, and each inner fields array belongs to one appended
file.
Signatures and initials already applied on the template are copied in as content: they
stay visible, create no signing event, fire no document_signed, and do not change any
recipient's status. If the request adds new unsigned signature or initials fields for
the same signer, the pre-applied ones are cleared so that signer signs once.
The response carries the transient status Draft whatever draft was; the settled
status appears on the next GET.
On a composed document a field's identity is the pair (source template, api_id).
Nothing is renamed, every field in the response carries template_id, and rule and
group references resolve inside their source template. A template_fields entry may be
{api_id, value} when the api_id is unique across the templates, and must be
{template_id, api_id, value} when it is not; an ambiguous bare reference is 422
ambiguous_field_reference and lists the candidates.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
recipients | array of object | Required | Each recipient is assigned to a placeholder by placeholder_name and inherits that placeholder's fields and settings. |
allow_decline | boolean | Optional | |
allow_reassign | boolean | Optional | |
api_application_id | string (uuid) | Optional | Branding and embed origins to use for this document. |
apply_signing_order | boolean | Optional | Send to recipients in order; each is notified only once every earlier signer has signed. |
attachment_requests | array of object | Optional | |
cfr_part11 | boolean | Optional | 21 CFR Part 11 mode. It can also be switched on by the workspace or the account, so a request that never mentions it may still come back with it set.… |
cfr_part11_signing_mode | string or null | Optional | streamlined re-authenticates once for the session; per_signature re-authenticates for each signature or initials field. Asking for a mode without the plan feature is 422 not_available_on_plan. |
checkbox_groups | array of object | Optional | |
conditional_rules | array of object | Optional | |
conditional_rules_mode | string | Optional | What to do with the rules the templates carry: replace drops them and uses the request's, append keeps them and adds the request's, none clears every rule. |
copied_contacts | array of object | Optional | |
custom_requester_email | string (email) | Optional | Reply-to address for the invitation. |
custom_requester_name | string | Optional | Name the invitation comes from. |
decline_redirect_url | string (uri) | Optional | Where a signer lands after declining. |
draft | boolean | Optional | Keep the document editable instead of sending it. A draft returns a document-level embedded_edit_url. |
embedded_signing | boolean | Optional | Return per-recipient embedded_signing_urls for use in an iframe. |
embedded_signing_notifications | boolean | Optional | Send Signclad's own emails even though the document is embedded. |
exclude_placeholders | array of string | Optional | Placeholder names to drop, matched by name rather than id. Only roles without assigned fields may be excluded. Excluding a role with fields returns 422. |
expires_in | integer or null | Optional | Days until the document expires. Defaults to the template's value, then the account's, which is 30. |
fields | array of array of object | Optional | Fields for the appended files only, one inner array per entry in files. Fields on the template's own files come from the template. |
files | array of object | Optional | Extra files appended after the template's files. |
id_verification | object | Optional | Whether the signer must prove who they are with a government ID before signing, and through which provider. Set on a document for everybody, or on a single recipient. provider is absent, not null, when it was never named — the account default applies. |
labels | array of one of: string, object | Optional | |
language | string | Optional | Language for the signing experience and its emails. Arabic renders right to left. |
message | string | Optional | Body of the signing invitation. A safe subset of HTML is allowed. |
metadata | object | Optional | Up to 50 key/value pairs stored with the record and returned unchanged. Keys are under 40 characters, values under 500, and values must be strings — encode anything else yourself. |
name | string | Optional | Internal name. Defaults to the first file's name. |
redirect_url | string (uri) | Optional | Where a signer lands after finishing. |
reminders | boolean | Optional | Automatic reminders on days 3, 6, and 10. |
self_sign | boolean | Optional | The requester signs immediately rather than being emailed a link. |
skip_invalid_fields | boolean | Optional | Drop template_fields entries that cannot be applied and report them in warnings[] instead of failing the whole request. |
subject | string | Optional | Subject line of the signing invitation. |
template_fields | array of object | Optional | Values to prefill into the template's fields. |
template_id | string (uuid) | Optional | The template to use. |
template_ids | array of string (uuid) | Optional | Several templates composed into one document. Files concatenate in order, placeholders with the same name merge into one recipient, and settings come from the first template unless the request overrides them. |
test_mode | boolean | Optional | A test document is excluded from billing and is not legally binding. Sandbox API keys force this on. Test mode does not suppress delivery: a test document emails its recipients like any other, and an undeliverable address bounces.… |
text_tags | boolean | Optional | Parse Signclad [type|modifier] tags or legacy positional {{...}} tags in the uploaded files into fields. Both formats work for documents and templates and may be mixed in one file.… |
with_signature_page | boolean | Optional | Append a generated signature page listing every signer, each with a signature field, a locked date-signed field, and a name autofill. Those fields are addressable as SignaturePage_Signature_<recipient_id> and the page counts toward pages_number. |
Responses
| Status | Description |
|---|---|
201 | Created. |
400 | The request body could not be parsed as JSON. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
403 | Authenticated, but not allowed to do this: an insufficient role, a credential type the route refuses, an unenrolled second factor, or a signer acting out of turn. meta.error always says which.… |
422 | Validation failed. A single bad template_fields entry rejects the whole request with errors.template_fields, unless skip_invalid_fields: true was sent, in which case the bad entries are dropped… |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X POST https://api.signclad.com/api/v1/document_templates/documents \
-H "X-Api-Key: $SIGNCLAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template_id": "3f1c9a2e-6b7d-4c8e-9a0b-1c2d3e4f5a6b",
"draft": false,
"embedded_signing": true,
"recipients": [
{
"id": "signer-1",
"placeholder_name": "Borrower",
"name": "Jane Doe",
"email": "[email protected]",
"send_email": false
}
],
"exclude_placeholders": [
"Co-borrower"
],
"template_fields": [
{
"api_id": "borrower_full_name",
"value": "Jane Doe"
},
{
"api_id": "borrower_start_date",
"value": "2026-07-02T00:00:00Z"
}
],
"conditional_rules_mode": "append",
"skip_invalid_fields": true,
"metadata": {
"loan_id": "48213"
}
}' POST /document_templates/{id}/duplicate
Duplicate a template Extension
Copies files, placeholders, fields, checkbox groups, conditional rules, and settings
into a new template. Field api_ids are preserved, so field mappings keep working.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
include_labels | boolean | Optional | |
name | string | Optional | Name for the copy. Defaults to the original's name with a suffix. |
Responses
| Status | Description |
|---|---|
201 | The new template. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X POST https://api.signclad.com/api/v1/document_templates/{id}/duplicate \
-H "X-Api-Key: $SIGNCLAD_API_KEY" POST /document_templates/{id}/embedded_edit_url
Regenerate a template builder URL Extension
Issues a fresh single-use embedded_edit_url for the template builder.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
expires_in_minutes | integer | Optional | |
start | string | Optional | Which view the builder opens on. |
Responses
| Status | Description |
|---|---|
201 | A new builder URL. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X POST https://api.signclad.com/api/v1/document_templates/{id}/embedded_edit_url \
-H "X-Api-Key: $SIGNCLAD_API_KEY" PUT /document_templates/{id}/files/{position}
Replace a file on a template Extension
Swaps one file of a template and re-anchors its fields, producing a new template
revision. Dry run first, then commit with the expected_revision from the dry run;
a template that changed in between fails with 409 revision_mismatch.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
position | integer | 1-based position of the file within the document or template. |
Request body
application/json
| Property | Type | Required | Description |
|---|---|---|---|
strategy | string | Required | How fields find their place on the new file. keep_positions keeps page and coordinates; text_tags re-parses the tags and matches by api_id; anchors finds the words each field was placed next to and moves the field with them.… |
dry_run | boolean | Optional | Report what would happen and change nothing. |
expected_revision | integer | Optional | The revision the dry run reported. A commit against a stale revision is 409 revision_mismatch. |
file_base64 | string | Optional | |
file_id | string | Optional | |
file_url | string (uri) | Optional | |
name | string | Optional | |
scale_to_page | boolean | Optional | Scale coordinates when the new page size differs from the old one. |
Responses
| Status | Description |
|---|---|
200 | The replacement report. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
409 | The request is well formed; the resource is not in a state that allows it.… |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
429 | Rate limited. The message contains the literal 429 Too Many Requests for compatibility with clients that match on it.… |
Example request
curl -X PUT https://api.signclad.com/api/v1/document_templates/{id}/files/{position} \
-H "X-Api-Key: $SIGNCLAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"file_id": "file_01J9K3P2S5N7Q8R1T2V3W4X5",
"strategy": "anchors",
"scale_to_page": true,
"dry_run": false,
"expected_revision": 7
}' GET /document_templates/{id}/revisions
List template revisions Extension
Every saved revision, newest first, with the reason it was created and the hash of its
snapshot. current_revision is the number to pass as expected_revision when replacing
a file.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
Responses
| Status | Description |
|---|---|
200 | The revisions. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
Example request
curl -X GET https://api.signclad.com/api/v1/document_templates/{id}/revisions \
-H "X-Api-Key: $SIGNCLAD_API_KEY" POST /document_templates/{id}/revisions/{number}/restore
Restore a template revision Extension
Recreates an old snapshot as a new revision rather than rewinding history, so field layout and file always match and nothing that pinned an earlier revision changes under it.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Path parameters
| Name | Type | Description |
|---|---|---|
id | string (uuid) | The template's id. |
number | integer | The revision number to restore. |
Responses
| Status | Description |
|---|---|
200 | The template at its new revision. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
404 | No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative. |
422 | Validation failed. errors maps a field name to a message string, or to an object keyed by an error code or by a per-item key. Values are never arrays. |
Example request
curl -X POST https://api.signclad.com/api/v1/document_templates/{id}/revisions/{number}/restore \
-H "X-Api-Key: $SIGNCLAD_API_KEY"