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