Accounts API

Workspaces, members and invitations, API keys, billing, and the workspace audit log. Every operation here is an extension; no compatibility client calls any of it.

Updated

On this page

39 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 /workspaces

List workspaces Extension

Every workspace the caller can reach, sorted by name. Readable by any role. An API key belongs to exactly one workspace, so it sees a single entry with role: admin. The list item is a smaller object than every other workspace response here — no default_language, or created_at — and its test_mode is always false for a person, whatever the key would report.

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

Responses

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

POST /workspaces

Create a workspace Extension

Adds a workspace to the caller's account. Requires manage_settings. Documents, templates, API keys, and webhooks all live inside a workspace; billing does not.

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
name string Required
default_language string Optional

Responses

Status Description
201 The new workspace.
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.…
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.

Example request

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

GET /workspaces/{id}

Get a workspace Extension

One workspace, as a bare object. Readable by any member; somebody with no role in it gets a 404, not a 403, so the id is never confirmed. This is the only workspace shape that carries created_at — the list omits 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 workspace's id. One outside the caller's account is a 404, never a 403.

Responses

Status Description
200 The workspace.
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/workspaces/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

PATCH /workspaces/{id}

Update a workspace Extension

Renames a workspace and changes its default language, compatibility shim, and idle timeout. Requires manage_settings both on the current workspace and on the one being changed. The storage region is not changed here — it is a migration, not a setting, and it has its own route.

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 workspace's id. One outside the caller's account is a 404, never a 403.

Request body

application/json

Property Type Required Description
default_language string Optional
idle_timeout_minutes integer Optional How long a session may sit idle before it is signed out. One of a fixed set, which deployment configuration decides; the values below are the defaults.
name string Optional

Responses

Status Description
200 The updated workspace.
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/workspaces/{id} \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

DELETE /workspaces/{id}

Schedule a workspace for deletion Extension

Owner only — an API key never has manage_billing. Answers 202: the workspace is marked deleted now and purged at purge_at. An account must keep at least one workspace; deleting the last one is 422.

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 workspace's id. One outside the caller's account is a 404, never a 403.

Responses

Status Description
202 Scheduled.
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.workspace reads An account must keep at least one workspace. Cancel the subscription instead.

Example request

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

POST /workspaces/{id}/switch

Switch the active workspace Extension

Points this session at another of the caller's workspaces. People only: an API key is 403, because a key is bound to one workspace by construction. A workspace the caller has no role in is 404.

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)

Responses

Status Description
200 The workspace now in context.
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 POST https://api.signclad.com/api/v1/workspaces/{id}/switch \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /workspaces/{id}/transfer_ownership

Transfer ownership Extension

Hands the owner role to another member, named either by membership_id or by user_id. Owner only. This is the only way a workspace's owner changes: PATCH /members/{id} refuses to grant owner.

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)

Request body

application/json

Property Type Required Description
membership_id string Optional
user_id string Optional

Responses

Status Description
200 The workspace and its new owner.
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.member reads That person is not in this workspace. or That membership is archived.

Example request

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

GET /members

List members Extension

Everyone in the workspace, oldest first, archived members included. Readable by any role — unlike the invitation list, which needs manage_members. The list item carries seat and created_at; the item returned by the role, archive, and restore operations does not.

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

Responses

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

PATCH /members/{id}

Change a member's role Extension

People only — an API key is 403. Nobody can change their own role, an admin cannot touch an owner, and only an owner may grant owner; in practice granting owner goes through POST /workspaces/{id}/transfer_ownership, which is what keeps exactly one owner.

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

Path parameters

Name Type Description
id string The membership's id.

Request body

application/json

Property Type Required Description
role string Required

Responses

Status Description
200 The updated membership.
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.role reads That is not a role., That workspace no longer exists., or A workspace must keep an owner. Transfer ownership first.

Example request

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

POST /members/{id}/archive

Archive a member Extension

Takes away access and frees the seat while keeping the row, so their documents keep their author. Their templates transfer to the owner. Idempotent: archiving an archived member is 200 and changes nothing.

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 archived membership.
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.member reads That workspace no longer exists. or A workspace must keep an owner. Transfer ownership first.

Example request

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

POST /members/{id}/restore

Restore an archived member Extension

Gives access back and takes a seat again.

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 restored membership.
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 POST https://api.signclad.com/api/v1/members/{id}/restore \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /members/invitations

List pending invitations Extension

Invitations that have neither been accepted nor revoked, newest first. Requires manage_members.

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

Responses

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

POST /members/invitations

Invite someone Extension

Emails an invitation and returns the token and accept URL — the only response that carries them. People only. owner cannot be invited; transfer ownership instead. Inviting an address that already has a pending invitation resends it rather than failing. adds_seat says whether accepting will bill another seat.

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

Responses

Status Description
201 The invitation, with its token.
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 That person is already in this workspace.; errors.role reads That is not a role.

Example request

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

DELETE /members/invitations/{id}

Revoke an invitation Extension

Only a pending invitation can be revoked; anything else is 422.

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 Revoked.
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.invitation reads That invitation is not pending.

Example request

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

POST /invitations/{token}/accept

Accept an invitation Extension

Joins the workspace. The caller must be signed in but is, by definition, not yet a member, so this route carries neither the workspace requirement nor a role check — the token is the authorization. The invitation must have been sent to the signed-in address.

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

Path parameters

Name Type Description
token string The token from the invitation email.

Responses

Status Description
200 The new membership.
401 Missing or invalid credentials. Unauthenticated requests are rate limited at 50 per minute.…
422 errors.token reads This invitation is no longer valid., This invitation was sent to a different email address., or That workspace no longer exists.

Example request

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

GET /api_keys

List API keys Extension

Every key in the workspace, newest first, revoked and expired ones included. Requires manage_settings. The secret is never returned here — only display_prefix and last_four.

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

Responses

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

POST /api_keys

Create an API key Extension

Returns the key object with its plaintext key — the only time it exists. A sandbox key is requested either as sandbox: true or mode: sandbox (test is accepted as a synonym); sandbox wins when both are sent, and the response always reports mode as sandbox or live.

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
name string Required
mode string Optional
sandbox boolean Optional

Responses

Status Description
201 The key, with its secret.
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.sandbox reads Sandbox keys are not available on this plan.; errors.base reads The API is not available on this plan. or `This workspace already has the maximum number of API keys.…

Example request

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

DELETE /api_keys/{id}

Revoke an API key Extension

Immediate and idempotent. A key cannot revoke itself — that is a 409, so an automated rotation cannot lock itself out halfway through.

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 Revoked.
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.
409 The request is well formed; the resource is not in a state that allows it.…

Example request

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

POST /api_keys/{id}/rotate

Rotate an API key Extension

Mints a replacement and leaves the old key working until previous.stops_working_at, so a deploy can roll. Answers 200, not 201. The new plaintext is at key.key.

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 new key and the outgoing one.
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.base reads That key no longer belongs to a workspace.

Example request

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

GET /billing

Get the billing summary Extension

Plan, seats, usage for a period, card, invoices, and the plan's feature matrix. Owner only: an API key resolves to admin and is refused, so a leaked integration key cannot see or change billing. period is a YYYY-MM string; anything that does not look like one is ignored rather than rejected, and the current month is used.

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

Query parameters

Name Type Required Description
period string Optional Usage period. Silently ignored unless it matches YYYY-MM.

Responses

Status Description
200 The summary.
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.…
409 The request is well formed; the resource is not in a state that allows it.…

Example request

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

PATCH /billing/plan

Change the plan Extension

Switches plan or billing interval and returns the whole billing summary, with usage for the current month.

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
plan string Required
interval string Optional All paid plans are billed annually.

Responses

Status Description
200 The updated summary.
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.…
409 The request is well formed; the resource is not in a state that allows it.…
422 errors.plan reads That is not a plan., This account has no billing customer yet., or `That plan has no price configured.…

Example request

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

POST /billing/checkout_session

Start a checkout session Extension

Returns a hosted checkout URL for a paid plan. free passes validation but is refused by the business rule — there is nothing to buy.

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
plan string Required
interval string Optional All paid plans are billed annually.

Responses

Status Description
201 The session.
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.…
409 The request is well formed; the resource is not in a state that allows it.…
422 errors.plan reads That plan cannot be bought., Billing is not configured in this environment., or That plan has no price configured.

Example request

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

POST /billing/portal_session

Open the billing portal Extension

A hosted URL where the owner manages the card, invoices, and cancellation.

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

Responses

Status Description
201 The session.
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.…
409 The request is well formed; the resource is not in a state that allows it.…
422 errors.base reads Billing is not configured in this environment.

Example request

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

POST /billing/cancel

Cancel the subscription Extension

Ends the subscription at the period end, or straight away with immediately: true. Returns the whole billing summary.

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
immediately boolean Optional

Responses

Status Description
200 The updated summary.
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.…
409 The request is well formed; the resource is not in a state that allows it.…

Example request

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

GET /audit_log

List the workspace audit log Extension

Who did what in this workspace, newest first, plus account-level entries such as plan changes. Requires manage_members. Cursor-paginated; the filters are applied as given and never rejected.

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

Query parameters

Name Type Required Description
action string Optional Exact match on the action name.
limit integer Optional
cursor string Optional Opaque cursor from a previous response's next_cursor.

Responses

Status Description
200 A page of entries.
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/audit_log \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /sso/config

Get the SSO configuration Extension

SAML or OIDC single sign-on for this workspace, plus the service-provider values an IdP administrator needs to paste into their end. Owner only — an API key resolves to admin and is always refused — and Enterprise only. Two shapes, told apart by configured. Before anything is set up the body is just configured: false and service_provider, which is exactly what somebody starting the setup needs.

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

Responses

Status Description
200 The configuration.
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 The request was well formed; the account may not make it right now.…

Example request

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

PUT /sso/config

Update the SSO configuration Extension

A merge, not a replacement, despite the verb: a field left out is untouched, and a field sent empty is cleared. protocol is required the first time. The request is flat where the response nests: idp_entity_id and friends come back under saml, oidc_issuer and oidc_client_id under oidc, and jit_enabled, default_role, and group_role_map under provisioning. oidc_client_secret is write-only; the response only says whether one is set. Sending metadata_url makes the server fetch that document and overwrite the SAML fields from it, which is the fast path for an IdP that publishes metadata.

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
allowed_domains array of string Optional
attribute_map object Optional
default_role string Optional owner is refused: ownership is not something an IdP provisions.
enabled boolean Optional
enforce boolean Optional
group_role_map object Optional
idp_entity_id string or null Optional
idp_slo_url string or null Optional
idp_sso_url string or null Optional
idp_x509_cert string or null Optional PEM. Rejected under errors.sso when it is not a readable X.509 certificate.
jit_enabled boolean Optional
metadata_url string or null Optional Fetched server-side. Sending it forces protocol to saml and overwrites every idp_* field from the document.
oidc_client_id string or null Optional
oidc_client_secret string or null Optional Write-only. The response only reports whether one is set.
oidc_issuer string or null Optional
protocol string Optional Required on the first write.

Responses

Status Description
200 The configuration, as stored.
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.protocol when the first write names none. Everything the connection itself rejects arrives under errors.sso — an unreadable certificate, a default_role of owner, a group map grantin…

Example request

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

GET /sso/metadata

Download SAML SP metadata Extension

The service-provider metadata document to hand to an IdP administrator, as XML. Owner only, Enterprise only. A workspace with no usable connection answers 422 — JSON, on an endpoint that otherwise returns XML.

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

Responses

Status Description
200 The SP metadata, as a downloadable XML file.
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.sso reads This workspace has no usable SSO connection.

Example request

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

POST /sso/scim/token

Issue a SCIM token Extension

Mints the bearer token an IdP uses to provision users, and returns it once. Issuing a new one invalidates the old. The token is the tenant: SCIM calls carry no user and no role, so this value is the whole credential for the provisioning surface.

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

Responses

Status Description
201 The token, shown once.
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.sso reads This workspace has no usable SSO connection.

Example request

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

GET /workspace/compatibility

Get compatibility shim status Extension

Whether this workspace still emits the compatibility SW-* message aliases in embedded pages, and how often anything used them in the last 30 days. recorded: false means nothing has been measured yet, which is not the same as zero — the difference decides whether it is safe to turn the shim off.

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

Responses

Status Description
200 The shim's status and usage.
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/workspace/compatibility \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /workspace/compliance

Get compliance settings Extension

The workspace's 21 CFR Part 11, NOM-151, and identity-verification switches, what the plan makes available, and the values each setting accepts. Readable by any member.

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

Responses

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

PATCH /workspace/compliance

Update compliance settings Extension

Owner only. Turning a feature off is always allowed, even on a plan that no longer carries it — a workspace must be able to stop doing something it can no longer pay for. Turning one on without the plan is 422.

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
cfr_part11 boolean Optional
cfr_part11_signing_mode string or null Optional
id_verification_provider string or null Optional
id_verification_required boolean Optional
nom151_enabled boolean Optional

Responses

Status Description
200 The updated settings.
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 Either the ordinary validation envelope, or — when the plan does not carry the feature being switched on — a bare {"message": "That compliance feature is not available on this plan."}.…

Example request

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

POST /workspaces/{id}/storage_region

Move a workspace's files to another region Extension

Queues a migration of every stored object to the named region. Owner only, and any region other than the default needs the eu_residency feature. 202 when a move was queued, 200 when the workspace is already there — same body, distinguished by changed. storage_region keeps reporting the old region until the migration completes; effective_region is where a write would land right now, which can differ again if the plan lapsed. Only one migration at a time: a second is 409.

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)

Request body

application/json

Property Type Required Description
storage_region string Required Currently us or eu. The list is deployment configuration.

Responses

Status Description
200 Already in that region. Nothing was queued.
202 The migration was 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.…
404 No such record for this workspace. Signclad never answers 404 for a record that exists: a 404 is authoritative.
409 A migration is already running. errors.base.region_change_in_progress, with the migration in meta.migration.
422 errors.storage_region names the regions on offer for an unknown one; a region the plan does not carry is errors.base.not_available_on_plan with meta.feature: eu_residency.

Example request

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

GET /api_keys/{id}/requests

Read a key's request log Extension

The last seven days of calls made with this key: method, path, status, latency, request id, and a ready-made copy_as_curl. Bodies are never stored and query strings are redacted at write time, so a secret in a URL does not become a second copy of the secret. Requires manage_settings. status accepts a class (4) or an exact code (404); a value that is neither, and an unparseable since, are ignored rather than refused.

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

Path parameters

Name Type Description
id string

Query parameters

Name Type Required Description
status integer Optional 4 for every 4xx, 404 for exactly that. Anything else is ignored.
since string (date-time) Optional
cursor string Optional Opaque cursor from a previous response's next_cursor.
limit integer Optional

Responses

Status Description
200 A page of requests.
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/api_keys/{id}/requests \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /scim/v2/Users

SCIM — list users Extension

RFC 7644 provisioning. The SCIM bearer token from POST /sso/scim/token is the whole credential and identifies the workspace; there is no user and no role on this surface, and every response — errors included — is application/scim+json with the SCIM error envelope rather than Signclad's. Only userName eq "value" is supported as a filter. sortBy and sortOrder are ignored rather than refused.

Base URL
https://api.signclad.com
Authentication
SCIM token

Query parameters

Name Type Required Description
filter string Optional Only userName eq "value". Anything else is 400 invalidFilter.
startIndex integer Optional 1-based.
count integer Optional Page size. 0 returns no rows and only totalResults, which is how a provider sizes a sync before running one.

Responses

Status Description
200 A page of users.
400 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
401 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
403 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…

Example request

curl -X GET https://api.signclad.com/scim/v2/Users \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

POST /scim/v2/Users

SCIM — create a user Extension

Provisions a membership. The body is read leniently, as IdPs vary: the address comes from userName or the first valid emails[].value, the display name from displayName, name.formatted, the given and family names, or the address; everything else in the payload is ignored without complaint. roles[].value is honoured when it is a real role, except owner, which is quietly downgraded to admin — ownership is not something an IdP gets to grant. An address outside the connection's allowed domains is refused. externalId is the directory's own immutable handle for the person. It is stored verbatim against the membership and echoed back on every read. It used to be discarded, and the response answered Signclad's user id instead — which meant a provider that stored and reconciled on it was matching against an identifier it never issued.

Base URL
https://api.signclad.com
Authentication
SCIM token

Request body

application/scim+json

Property Type Required Description
active boolean Optional
displayName string Optional
emails array of object Optional
externalId string Optional The IdP's own handle, as it was supplied on create. Omitted entirely when there is none.
id string Optional
meta object Optional
name object Optional
roles array of object Optional One entry. owner is downgraded to admin on the way in.
schemas array of string Optional
userName string (email) Optional

Responses

Status Description
201 The provisioned user.
400 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
401 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
403 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
409 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…

Example request

curl -X POST https://api.signclad.com/scim/v2/Users \
  -H "X-Api-Key: $SIGNCLAD_API_KEY"

GET /scim/v2/Users/{id}

SCIM — get a user Extension

A membership outside the token's workspace is 404, like one that does not exist.

Base URL
https://api.signclad.com
Authentication
SCIM token

Path parameters

Name Type Description
id string The membership id, which is what SCIM id means here.

Responses

Status Description
200 The user.
401 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
403 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
404 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…

Example request

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

PATCH /scim/v2/Users/{id}

SCIM — deactivate or reactivate a user Extension

Only active can change. Role, name, and address are not patchable, and asking to patch one is a 400 rather than a silent no-op — a provisioning system that thinks it renamed somebody should find out. Operations and operations are both accepted, replace and add both work, and a string "False" counts as false, because that is what Entra ID sends.

Base URL
https://api.signclad.com
Authentication
SCIM token

Path parameters

Name Type Description
id string The membership id, which is what SCIM id means here.

Request body

application/scim+json

Property Type Required Description
Operations array of object Optional
schemas array of string Optional

Responses

Status Description
200 The patched user, in full.
400 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
401 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
403 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
404 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…

Example request

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

DELETE /scim/v2/Users/{id}

SCIM — deprovision a user Extension

Archives the membership. The person's user record is untouched — they may be in other workspaces, and their signatures are evidence. Idempotent.

Base URL
https://api.signclad.com
Authentication
SCIM token

Path parameters

Name Type Description
id string The membership id, which is what SCIM id means here.

Responses

Status Description
204 Deprovisioned.
401 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
403 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…
404 The SCIM error envelope. scimType narrows the reason: uniqueness for an address already provisioned, invalidFilter for a filter other than userName eq, invalidValue for a body or patch this…

Example request

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