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
- GET /workspaces
- POST /workspaces
- GET /workspaces/{id}
- PATCH /workspaces/{id}
- DELETE /workspaces/{id}
- POST /workspaces/{id}/switch
- POST /workspaces/{id}/transfer_ownership
- GET /members
- PATCH /members/{id}
- POST /members/{id}/archive
- POST /members/{id}/restore
- GET /members/invitations
- POST /members/invitations
- DELETE /members/invitations/{id}
- POST /invitations/{token}/accept
- GET /api_keys
- POST /api_keys
- DELETE /api_keys/{id}
- POST /api_keys/{id}/rotate
- GET /billing
- PATCH /billing/plan
- POST /billing/checkout_session
- POST /billing/portal_session
- POST /billing/cancel
- GET /audit_log
- GET /sso/config
- PUT /sso/config
- GET /sso/metadata
- POST /sso/scim/token
- GET /workspace/compatibility
- GET /workspace/compliance
- PATCH /workspace/compliance
- POST /workspaces/{id}/storage_region
- GET /api_keys/{id}/requests
- GET /scim/v2/Users
- POST /scim/v2/Users
- GET /scim/v2/Users/{id}
- PATCH /scim/v2/Users/{id}
- DELETE /scim/v2/Users/{id}
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
/workspacesList workspaces - POST
/workspacesCreate a workspace - GET
/workspaces/{id}Get a workspace - PATCH
/workspaces/{id}Update a workspace - DELETE
/workspaces/{id}Schedule a workspace for deletion - POST
/workspaces/{id}/switchSwitch the active workspace - POST
/workspaces/{id}/transfer_ownershipTransfer ownership - GET
/membersList members - PATCH
/members/{id}Change a member's role - POST
/members/{id}/archiveArchive a member - POST
/members/{id}/restoreRestore an archived member - GET
/members/invitationsList pending invitations - POST
/members/invitationsInvite someone - DELETE
/members/invitations/{id}Revoke an invitation - POST
/invitations/{token}/acceptAccept an invitation - GET
/api_keysList API keys - POST
/api_keysCreate an API key - DELETE
/api_keys/{id}Revoke an API key - POST
/api_keys/{id}/rotateRotate an API key - GET
/billingGet the billing summary - PATCH
/billing/planChange the plan - POST
/billing/checkout_sessionStart a checkout session - POST
/billing/portal_sessionOpen the billing portal - POST
/billing/cancelCancel the subscription - GET
/audit_logList the workspace audit log - GET
/sso/configGet the SSO configuration - PUT
/sso/configUpdate the SSO configuration - GET
/sso/metadataDownload SAML SP metadata - POST
/sso/scim/tokenIssue a SCIM token - GET
/workspace/compatibilityGet compatibility shim status - GET
/workspace/complianceGet compliance settings - PATCH
/workspace/complianceUpdate compliance settings - POST
/workspaces/{id}/storage_regionMove a workspace's files to another region - GET
/api_keys/{id}/requestsRead a key's request log - GET
/scim/v2/UsersSCIM — list users - POST
/scim/v2/UsersSCIM — create a user - GET
/scim/v2/Users/{id}SCIM — get a user - PATCH
/scim/v2/Users/{id}SCIM — deactivate or reactivate a user - DELETE
/scim/v2/Users/{id}SCIM — deprovision a user
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"