Bulk sends API
Send one or more templates to many recipients from a CSV.
Updated
On this page
6 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
/bulk_sendsList bulk sends - POST
/bulk_sendsStart a bulk send - GET
/bulk_sends/csv_templateGet a CSV template - POST
/bulk_sends/validate_csvValidate a bulk send CSV - GET
/bulk_sends/{id}Get a bulk send - GET
/bulk_sends/{id}/documentsList a bulk send's documents
GET /bulk_sends
List bulk sends
Every bulk send in the workspace, newest first, up to 200. The body is a bare array,
not a data envelope, and takes no pagination parameters.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Responses
| Status | Description |
|---|---|
200 | The bulk sends. |
401 | Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.… |
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/bulk_sends \
-H "X-Api-Key: $SIGNCLAD_API_KEY" POST /bulk_sends
Start a bulk send
Sends one or more templates to every row of a CSV. The CSV columns are
<placeholder_name>_<field_label>, plus a name and email column per placeholder; fetch
a matching header row from GET /bulk_sends/csv_template.
The response status starts at Enqueuing while rows are turned into documents.
- 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 |
|---|---|---|---|
bulk_send_csv | string | Required | The CSV, base64-encoded. Columns are <placeholder_name>_<field_label>, plus a name and email column per placeholder. |
template_ids | array of string (uuid) | Required | The templates to compose for every row, in order. |
api_application_id | string (uuid) | Optional | |
apply_signing_order | boolean | Optional | |
custom_requester_email | string (email) | Optional | |
custom_requester_name | string | Optional | |
message | string | Optional | |
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 | What to call this run in the web app. |
skip_row_errors | boolean | Optional | Send every valid row and report the rest, instead of refusing the whole file when any row is bad. |
subject | string | Optional | |
test_mode | boolean | Optional |
Responses
| Status | Description |
|---|---|
201 | The bulk send. |
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/bulk_sends \
-H "X-Api-Key: $SIGNCLAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Q3 onboarding",
"template_ids": [
"3f1c9a2e-6b7d-4c8e-9a0b-1c2d3e4f5a6b"
],
"bulk_send_csv": "U2lnbmVyX05hbWUsU2lnbmVyX0VtYWlsCkphbmUgRG9lLGphbmVAZXhhbXBsZS5jb20K",
"skip_row_errors": false,
"subject": "Please sign your onboarding packet",
"message": "<p>This takes about two minutes.</p>",
"apply_signing_order": true
}' Example response (201)
{
"id": "b1e2c3d4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"name": "Q3 onboarding",
"status": "Enqueuing",
"documents_count": 42,
"documents_completed": 0,
"documents_not_completed": 42,
"test_mode": false,
"templates": [
{
"id": "3f1c9a2e-6b7d-4c8e-9a0b-1c2d3e4f5a6b",
"name": "Onboarding agreement",
"status": "Available"
}
],
"created_at": "2026-09-09T17:44:10Z",
"updated_at": "2026-09-09T17:44:10Z"
} GET /bulk_sends/csv_template
Get a CSV template
Returns the header row for the given templates: a <Placeholder>_Name and
<Placeholder>_Email column per placeholder, then one <Placeholder>_<field label>
column per fillable field. Signature, initials, autofill_*, and locked date fields get
no column — nothing in the CSV could fill them.
The CSV form carries a UTF-8 byte-order mark so spreadsheet software opens it correctly;
the base64 form does not.
- Base URL
https://api.signclad.com/api/v1- Authentication
- API key or OAuth 2.1 access token
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
template_ids[] | array of string (uuid) | Required | One or more template ids, in the order they will be composed. |
base64 | boolean | Optional | Return the CSV base64-encoded inside a JSON object instead of raw text. |
Responses
| Status | Description |
|---|---|
200 | The CSV 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 GET https://api.signclad.com/api/v1/bulk_sends/csv_template \
-H "X-Api-Key: $SIGNCLAD_API_KEY" POST /bulk_sends/validate_csv
Validate a bulk send CSV
Dry run. Parses the CSV against the templates and reports per-row errors without creating anything.
- 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 |
|---|---|---|---|
bulk_send_csv | string | Required | |
template_ids | array of string (uuid) | Required |
Responses
| Status | Description |
|---|---|
200 | The validation result. |
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 POST https://api.signclad.com/api/v1/bulk_sends/validate_csv \
-H "X-Api-Key: $SIGNCLAD_API_KEY" Example response (200)
{
"valid": false,
"rows_count": 42,
"valid_rows_count": 41,
"row_errors": [
{
"row": 17,
"column": "Signer_Email",
"error": "is not a valid email address",
"errors": {
"Signer_Email": "is not a valid email address"
}
}
]
} GET /bulk_sends/{id}
Get a bulk send
Counts and status for one bulk send, plus the templates it used.
- 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 bulk send's id. |
Responses
| Status | Description |
|---|---|
200 | The bulk send. |
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 GET https://api.signclad.com/api/v1/bulk_sends/{id} \
-H "X-Api-Key: $SIGNCLAD_API_KEY" GET /bulk_sends/{id}/documents
List a bulk send's documents
The documents a bulk send produced, page by page. This is the one paginated compatibility endpoint and it uses page numbers, not cursors.
- 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 bulk send's id. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | Optional | Documents per page. |
page | integer | Optional | 1-based page number. |
Responses
| Status | Description |
|---|---|
200 | A page of documents. |
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 GET https://api.signclad.com/api/v1/bulk_sends/{id}/documents \
-H "X-Api-Key: $SIGNCLAD_API_KEY" Example response (200)
{
"documents": [
{
"id": "8f14e45f-ea8f-4b2c-9f0e-1b2c3d4e5f60",
"status": "Sent",
"name": "Onboarding agreement",
"created_at": "2026-09-09T17:44:11Z"
}
],
"current_page": 1,
"next_page": 2,
"previous_page": null,
"total_count": 42,
"total_pages": 5
}