Account API

The authenticated membership, its user, account, and workspace.

Updated

On this page

23 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 /me

Get the current membership

The membership the credential resolves to, with its user, account, workspace, and contact. Use it to check which workspace an API key belongs to.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Responses

Status Description
200 The membership.
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/me \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

Example response (200)

{
  "id": "2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e",
  "role": "owner",
  "archived": false,
  "user": {
    "id": "7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d",
    "name": "Bryce Matheson",
    "first_name": "Bryce",
    "last_name": "Matheson",
    "has_google_registration": false,
    "email": "[email protected]",
    "locale": "en",
    "timezone": "America/Denver"
  },
  "account": {
    "id": "9e0f1a2b-3c4d-5e6f-7a8b-9c0d1e2f3a4b",
    "plan_tier": "business",
    "active_templates": 12,
    "can_create_template": true,
    "can_create_tracking_document": true,
    "can_create_completion_document": true,
    "api_documents_included": 19,
    "active_users": [
      {
        "id": "7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d",
        "name": "Bryce Matheson",
        "email": "[email protected]",
        "role": "owner"
      }
    ]
  },
  "workspace": {
    "id": "4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a",
    "name": "Acme Lending",
    "test_mode": false
  },
  "contact": {
    "id": "6f7a8b9c-0d1e-2f3a-4b5c-6d7e8f9a0b1c",
    "name": "Bryce Matheson",
    "email": "[email protected]",
    "company": "Acme Lending",
    "title": "Operations",
    "phone": "+14155550142"
  }
}

PATCH /me

Update your profile Extension

Name, locale, and timezone. The address is not here — changing where sign-in links go goes through POST /me/email and needs the password. name and the two halves are kept consistent by one resolver: send first_name or last_name and they win, with name recomposed; send only name and the halves are re-derived by splitting on the first space. People only. Returns the same body as GET /me.

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
first_name string or null Optional
last_name string or null Optional
locale string or null Optional A language tag such as en or en-GB.
name string Optional
timezone string or null Optional An IANA name such as America/Denver.

Responses

Status Description
200 The membership, as GET /me returns it.
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.

Example request

curl -X PATCH https://api.signclad.com/api/v1/me \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /ping

Liveness check Extension

Unauthenticated liveness check for the API surface itself. It touches no tenancy and no database, so a 200 here with a 401 elsewhere means the credential is the problem.

Base URL
https://api.signclad.com/api/v1
Authentication
None — this operation is public

Responses

Status Description
200 The API is up.

Example request

curl -X GET https://api.signclad.com/api/v1/ping \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /email_suppressions

List suppressed addresses Extension

Addresses this workspace can no longer mail, and why. A suppression list nobody can read is a black hole: a sender whose recipient bounced once should be able to see why the later invitations are not arriving. Owner and admin only — the list is a list of the workspace's recipients' email addresses. An API key is treated as an admin credential, matching GET /me. Released rows stay readable but are out of the default listing, which is about what is blocked now.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Query parameters

Name Type Required Description
email string (email) Optional Exact address, normalized before matching.
reason string Optional
include_released boolean Optional Include suppressions that have already been lifted.
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 suppressions, newest first.
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.…
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/email_suppressions \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

DELETE /email_suppressions/{id}

Lift a suppression Extension

Lets Signclad mail the address again. The row is kept and marked released rather than deleted: releasing an address that hard bounced twice is a different decision from releasing one that bounced once, and a delete would hide the difference. A suppression in another workspace, or one already released, is a 404 — never a 403, which would confirm the id exists somewhere.

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 suppression's id.

Responses

Status Description
204 Released.
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/email_suppressions/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /me/email_change

Get the pending email change Extension

Always 200, with all three fields null when nothing is pending — a settings page should not have to treat "no pending change" as an error. People only.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Responses

Status Description
200 The pending change, or nulls.
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.…

Example request

curl -X GET https://api.signclad.com/api/v1/me/email_change \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /me/email

Request an email change Extension

Starts a change of the address this account signs in with. The current password is required — an open session is not enough to move where the reset links go. 202 because the address has not changed yet: a link goes to the new address, and both addresses are notified. Requesting again supersedes the previous pending change. A Google-only account must set a password first.

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
current_password string Required
email string (email) Required

Responses

Status Description
202 A confirmation link is on its way.
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 errors.current_password reads That password is not correct. or Set a password before changing the address this account signs in with.; errors.email reads `That is already the address on this a…

Example request

curl -X POST https://api.signclad.com/api/v1/me/email \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

DELETE /me/email

Cancel a pending email change Extension

Idempotent, and 200 with the all-null body rather than 204 — the caller gets the same shape whether or not there was anything to cancel.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Responses

Status Description
200 Nothing is pending any more.
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.…

Example request

curl -X DELETE https://api.signclad.com/api/v1/me/email \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /me/email/confirm/{token}

Confirm an email change Extension

Completes the change. Unauthenticated by design — the person clicking the link may be in a different browser from the one that asked. A bad signature, a missing row, and an expired token are one answer, so the link cannot be probed.

Base URL
https://api.signclad.com/api/v1
Authentication
None — this operation is public

Path parameters

Name Type Description
token string The signed token from the confirmation email. It is the whole credential.

Responses

Status Description
200 Confirmed. This body carries two fields the other three operations do not: confirmed and the new email.
422 errors.token reads `This confirmation link is no longer valid.…

Example request

curl -X POST https://api.signclad.com/api/v1/me/email/confirm/{token} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /me/notifications

Get notification preferences Extension

Per person and per workspace — the same person can want different mail from two workspaces. Which workspace is decided by the credential, never by the body. Always complete: defaults are filled in rather than omitted.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Responses

Status Description
200 The preferences.
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.…

Example request

curl -X GET https://api.signclad.com/api/v1/me/notifications \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

PUT /me/notifications

Update notification preferences Extension

A merge, despite the verb: keys left out keep their value, so a client that knows about fewer switches than the server does cannot silently reset the rest. Unknown keys are ignored.

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
digest string Optional
document_bounced boolean Optional
document_completed boolean Optional
document_declined boolean Optional
document_expiring boolean Optional
document_sent boolean Optional
document_signed boolean Optional
document_viewed boolean Optional
product_updates boolean Optional The only switch that is off to begin with.
reminders_digest boolean Optional
team_activity boolean Optional
webhook_health boolean Optional

Responses

Status Description
200 The preferences, resolved.
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.

Example request

curl -X PUT https://api.signclad.com/api/v1/me/notifications \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /me/signatures

List saved signatures Extension

A sender's own signatures and initials, default first. Not paginated — nobody has enough of these for it to matter.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Responses

Status Description
200 The saved signatures.
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.…

Example request

curl -X GET https://api.signclad.com/api/v1/me/signatures \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /me/signatures

Save a signature Extension

Three ways in, and the body decides which: a PNG upload in file, a base64 PNG data URL in data, or text plus an optional font to render one. PNG only, 5 MB. method and source are the same field under two names, and each accepts both tenses (draw and drawn). Send either. The first signature of a kind becomes the default whatever the flag says.

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
kind string Required
data string or null Optional A data:image/png;base64,… URL.
default boolean Optional
file string (binary) Optional Multipart only. PNG, at most 5 MB.
font string or null Optional
is_default boolean Optional Alias of default; either sets it.
method string Optional
source string Optional Alias of method.
text string or null Optional The name to render, for a typed signature.

Responses

Status Description
201 The saved signature.
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 Under errors.data for an image that is missing, not a PNG, too large, or unreadable; errors.text for a typed signature with nothing to type; errors.method and errors.kind for values outside th…

Example request

curl -X POST https://api.signclad.com/api/v1/me/signatures \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

DELETE /me/signatures/{id}

Delete a saved signature Extension

Deleting the default promotes the next signature of that kind. Somebody else's id and an id that does not exist answer alike.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Path parameters

Name Type Description
id string

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.

Example request

curl -X DELETE https://api.signclad.com/api/v1/me/signatures/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /contacts

List contacts Extension

The workspace's address book, by name. q matches across name, address, company, job title, and phone. Readable by any role; writing needs send_documents. limit is clamped rather than refused, so an out-of-range value is quietly corrected.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Query parameters

Name Type Required Description
q string Optional
cursor string Optional Opaque cursor from a previous response's next_cursor.
limit integer Optional

Responses

Status Description
200 A page of contacts.
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.…

Example request

curl -X GET https://api.signclad.com/api/v1/contacts \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /contacts

Create or update a contact Extension

Create-or-update on the address, matched case-insensitively — so importing the same person twice does not make two rows. It answers 201 either way.

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
company string or null Optional
email string (email) Optional
job_title string or null Optional
name string or null Optional
phone_number string or null Optional

Responses

Status Description
201 The contact, whether it was created or updated.
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 errors.email reads Another contact in this workspace already uses that address.

Example request

curl -X POST https://api.signclad.com/api/v1/contacts \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /contacts/suggest

Suggest contacts Extension

Type-ahead for a recipient field. At most eight results, and a slimmer object than the list: no counts, no timestamps, no pagination.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Query parameters

Name Type Required Description
q string Optional

Responses

Status Description
200 Up to eight matches.
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.…

Example request

curl -X GET https://api.signclad.com/api/v1/contacts/suggest \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

PATCH /contacts/{id}

Update a contact Extension

Only the keys present change.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Path parameters

Name Type Description
id string

Request body

application/json

Property Type Required Description
company string or null Optional
email string (email) Optional
job_title string or null Optional
name string or null Optional
phone_number string or null Optional

Responses

Status Description
200 The updated contact.
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 errors.email reads Another contact in this workspace already uses that address.

Example request

curl -X PATCH https://api.signclad.com/api/v1/contacts/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

DELETE /contacts/{id}

Delete a contact Extension

A soft delete: documents they are on keep naming them, because an audit trail that forgets who somebody was is not an audit trail.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Path parameters

Name Type Description
id string

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.

Example request

curl -X DELETE https://api.signclad.com/api/v1/contacts/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /contacts/import

Import contacts from a CSV Extension

A CSV with an email column; name, company, title, and phone are optional, and each is matched against a list of spellings, so a file exported from another tool usually just works. Unrecognized columns are reported, not refused. 200 with a per-row report even when some rows failed — a partial import is the normal outcome. It only becomes a 422 when nothing could be imported, and then the failures arrive keyed by row and column under errors.contacts_csv.rows. update_existing defaults to true: an address already in the book is updated rather than skipped.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Request body

multipart/form-data

Property Type Required Description
file string (binary) Required CSV, at most 5 MB and 5000 rows.
update_existing boolean Optional

Responses

Status Description
200 What was imported, and what was not.
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 errors.contacts_csv when the file cannot be parsed, has no email column, or has too many rows; errors.contacts_csv.rows.<row>.<column> when every row failed; and errors.base.upload_unreadable

Example request

curl -X POST https://api.signclad.com/api/v1/contacts/import \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /data_exports

List data exports Extension

Every export this workspace has asked for, newest first. Owner and admin only — an export is the whole workspace in a zip.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Query parameters

Name Type Required Description
cursor string Optional Opaque cursor from a previous response's next_cursor.
limit integer Optional

Responses

Status Description
200 A page of exports.
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.…

Example request

curl -X GET https://api.signclad.com/api/v1/data_exports \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /data_exports

Request a data export Extension

Queues a zip of the workspace's documents, templates, contacts, and audit log — omit scope and it means all four. 202, because the file does not exist yet: poll the export until status is ready, then use download_url. Exports are kept seven days.

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
scope array of string Optional

Responses

Status Description
202 Queued.
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.

Example request

curl -X POST https://api.signclad.com/api/v1/data_exports \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /data_exports/{id}

Get a data export Extension

Poll this until status is ready, then follow download_url.

Base URL
https://api.signclad.com/api/v1
Authentication
API key or OAuth 2.1 access token

Path parameters

Name Type Description
id string

Responses

Status Description
200 The export.
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.

Example request

curl -X GET https://api.signclad.com/api/v1/data_exports/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"