Templates API

Reusable documents with placeholders instead of recipients.

Updated

On this page

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_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"