tmsign Documentation

Version v1

Get Started

Overview

Use the tmsign API to create signing requests, deliver signature journeys, track status changes, and retrieve final signed documents inside your own application.

Base URL

https://dev.api.tmsign.co.uk

Version

v1

Support

Contact LawTech Team

Build e-signature flows into your product with a docs experience that feels like a real developer portal.

This portal is built for third-party teams integrating tmsign signing journeys. The focus is on clear workflow guidance, consistent request patterns, and production-ready event tracking.

Who this is for

Partners, platform teams, and internal product teams embedding signing.

Typical use cases

Onboarding, contracts, identity verification, and regulated approvals.

Docs structure

One click nav, clear flows, and concrete payload examples.

Get Started

Getting Started

If you integrate using the company scope (`client_credentials`), you will receive a company ID plus a client ID and client secret from the tmsign team. Use those to request an access token and start creating signing requests.

1

Get credentials

Request a `client_id` and `client_secret` if you will use the `client_credentials` grant. You will also need `x-company-id` for most company-scoped endpoints.

2

Create access token

Call `POST /v1/auth/token` with `grant_type=client_credentials` when using client credentials. Other supported grants are `otp`, `password`, and `refresh_token`.

3

Send documents

Use `POST /v1/documents` with files and signer data to start a signing flow.

4

Track & download

Poll document status with `GET /v1/documents/{id}` or receive webhook events, then download the document file from `GET /v1/documents/{id}/download`.

Get Started

Core Workflow

A clear end-to-end path from authentication to signed PDFs.

1

Authenticate

Exchange client credentials for an access token.

2

Create Document

Upload PDFs or use templates with signer details.

3

Send to Signers

Signers receive email/SMS based on delivery settings.

4

Track Status

Poll `/v1/documents/{id}` or receive webhooks.

5

Download

Get the signed document when status is `Completed`.

Development

Authentication

The API follows OAuth-style token exchange. The recommended integration grant is `client_credentials`.

Token Request

curl -X POST https://dev.api.tmsign.co.uk/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "client_credentials",
    "client_id": "YOUR_CLIENT_ID",
    "client_secret": "YOUR_CLIENT_SECRET"
  }'

Token Response

{
  "access_token": "eyJhbGciOi...",
  "token_type": "Bearer",
  "expires_in": 86400
}
Other supported grant types: `otp`, `password`, `refresh_token`.

OTP Grant

curl -X POST https://dev.api.tmsign.co.uk/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "otp",
    "username": "user@example.com",
    "scope": "company-admin"
  }'

Password Grant

curl -X POST https://dev.api.tmsign.co.uk/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "password",
    "username": "user@example.com",
    "password": "Password123!",
    "scope": "company-admin"
  }'

Refresh Token Grant

curl -X POST https://dev.api.tmsign.co.uk/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "refresh_token",
    "refresh_token": "YOUR_REFRESH_TOKEN",
    "scope": "company-admin"
  }'
OTP and password grants return an OTP verification response. Then call `POST /v1/auth/verify-otp` with `email` and `otpCode` to receive access tokens.
`scope` is optional and currently ignored by the token endpoint. Access scopes are derived from the user/company associations in the system.

Using the API

API Overview

Quick lookup for the primary endpoints used in integrations.

Endpoint Method Description
/v1/auth/token POST Issue access tokens for OAuth-style auth.
/v1/documents POST Create a document with signers and attachments.
/v1/documents/{id} GET Fetch document status and signer progress.
/v1/documents/{id}/download GET Download the signed document when completed.
/v1/esign-templates GET List available templates for reuse.
/v1/esign-templates/{id} GET Retrieve template details and roles.
/v1/company GET Get company profile and settings.
/v1/users/me GET Return details of the authenticated user.

Response envelope

Most endpoints return `{ data, metadata }`. List endpoints return `{ data, metadata }` with pagination.

Using the API

API Reference

All endpoints grouped by controller/tag. Each entry lists parameters, request bodies, and responses.

Authentication

6 endpoints

POST /v1/auth/logout Logout user Authentication

Revoke user's refresh token and logout

Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
SchemaLogoutRequest
RequiredYes
Fields
FieldTypeRequiredDescription
refreshTokenstringYesRefresh token to revoke

Responses

200Logout successful | application/json | ApiResponse_null_
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid refresh token | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": null,
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/auth/request-password-reset RequestPasswordReset Authentication
Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
RequiredYes
Fields
FieldTypeRequiredDescription
captchaTokenstringYes
emailstringYes

Responses

200Ok | application/json | ApiResponse__message-string__
400Invalid request | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "message": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/auth/reset-password ResetPassword Authentication
Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
RequiredYes
Fields
FieldTypeRequiredDescription
captchaTokenstringYes
passwordstringYes
tokenstringYes

Responses

200Ok | application/json | ApiResponse__message-string__
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid or expired token | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "message": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/auth/signup Register new user Authentication

Register a new user with email verification

Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
SchemaSignupRequest
RequiredYes
Fields
FieldTypeRequiredDescription
emailstringYesUser's email address Pattern: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
passwordstringYesUser's password Pattern: ^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$
namestringYesUser's full name
telephoneNumberstringNoUser's telephone number in E.164 format Pattern: ^\+[1-9]\d{1,14}$
nationalitystringNoUser's nationality (ISO 3166-1 alpha-2)
companyNamestringYesCompany name
captchaTokenstringYesCAPTCHA token for verification

Responses

201User created successfully | application/json | ApiResponse__message-string--email-string--status-string_-or-ErrorResponse_
400Invalid request | application/json | ApiResponse_ErrorResponse_
409User already exists | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 201 response
{
  "data": {
    "status": "string",
    "email": "string",
    "message": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/auth/token Get OAuth token Authentication

OAuth 2.0 token endpoint supporting multiple grant types

Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
SchemaTokenRequest
RequiredYes
Fields
FieldTypeRequiredDescription
grant_typestringYesOAuth grant type ('otp', 'password', 'refresh_token', or 'client_credentials') Allowed: otp, password, refresh_token, client_credentials
usernamestringNoUsername (email) for authentication - required for password grant
passwordstringNoUser password - required for password grant if user has a password set Pattern: ^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z\d])[^\s]{8,}$
refresh_tokenstringNoRefresh token - required for refresh_token grant
client_idstringNoClient ID - required for client_credentials grant
client_secretstringNoClient Secret - required for client_credentials grant
scopestringNoSpace-separated list of requested scopes

Responses

200Token generated successfully | application/json | ApiResponse_TokenResponse-or-ErrorResponse-or-OTPVerificationResponse_
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid credentials | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "access_token": "string",
    "refresh_token": "string",
    "token_type": "string",
    "expires_in": 0,
    "forcePasswordChange": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/auth/verify-otp Verify OTP Authentication

Verify OTP code for user authentication

Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
SchemaVerifyOTPRequest
RequiredYes
Fields
FieldTypeRequiredDescription
emailstringYesUser's email address
otpCodestringYesOTP code sent to the user
isRememberbooleanNoKeep cookie longer. Default 2 hours. is remember true keep 7 days

Responses

200OTP verified successfully | application/json | ApiResponse_TokenResponse_
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid OTP code | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "access_token": "string",
    "refresh_token": "string",
    "token_type": "string",
    "expires_in": 0,
    "forcePasswordChange": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

Users

13 endpoints

GET /v1/users Get all users Users

Retrieve all users within a specific company

Auth: jwt (scopes: lawtech-admin, company-admin, company)Params: 5

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
page querynumber (double) — The page number for pagination (default: 1)
limit querynumber (double) — The number of items per page (default: 10)
isActive query boolean
type query array<string>

Responses

200Success | application/json | PaginatedResponse_UserResponse-Array_
400Company ID is required | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
Example 200 response
{
  "data": [
    {
      "id": "string",
      "email": "string",
      "name": "string",
      "telephoneNumber": "string",
      "isActive": true,
      "createdAt": "2026-04-07T15:56:49.999Z",
      "updatedAt": "2026-04-07T15:56:49.999Z",
      "verified": true,
      "nationality": "string",
      "transactionID": "string",
      "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
      "securityContext": "string",
      "isGrantAccess": true
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}
POST /v1/users Create user Users

Create a new user

Auth: jwt (scopes: lawtech-admin, company-admin, company-user)Body: application/jsonParams: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Request Body

Content-Type application/json
SchemaCreateUserRequest
RequiredYes
Fields
FieldTypeRequiredDescription
emailstringYesThe user's email address
namestringYesThe user's full name
passwordstringNoThe user's password
telephoneNumberstringNoThe user's telephone number
scopesarray<string>NoUser's permission scopes
forcePasswordChangebooleanNo
nationalitystringNoISO 3166-1 alpha-2 nationality code (e.g. "VN", "US")

Responses

201User created successfully | application/json | ApiResponse_UserResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
409User already exists | application/json | ApiResponse_null_
Example 201 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/me Get current user Users

Get the current user's details

Auth: jwt

Responses

200Success | application/json | ApiResponse_UserResponse_
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
PATCH /v1/users/me/change-password ChangePassword Users
Auth: jwt (scopes: lawtech-admin, company-admin, company, company-user)Body: application/jsonParams: 1

Parameters

x-company-id header string, required

Request Body

Content-Typeapplication/json
SchemaChangePasswordRequest
RequiredYes
Fields
FieldTypeRequiredDescription
passwordstringYesThe user's password
emailstringYes
newPasswordstringYes
captchaTokenstringYes

Responses

200User updated successfully | application/json | ApiResponse_UserResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/me/companies Get current user details and companies Users

Get the current user's details and associated companies

Auth: jwt

Responses

200Success | application/json | ApiResponse__user-UserResponse--companies-UserCompanyResponse-Array__
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "companies": [
      {
        "id": "string",
        "name": "string",
        "scopes": [
          "string"
        ]
      }
    ],
    "user": {
      "id": "string",
      "email": "string",
      "name": "string",
      "telephoneNumber": "string",
      "isActive": true,
      "createdAt": "2026-04-07T15:56:49.999Z",
      "updatedAt": "2026-04-07T15:56:49.999Z",
      "verified": true,
      "nationality": "string",
      "transactionID": "string",
      "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
      "securityContext": "string",
      "isGrantAccess": true
    }
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/me/documents Get current user documents Users

Get the current user's documents

Auth: jwt

Responses

200Success | application/json | ApiResponse_UserWithDocumentsResponse_
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true,
    "documents": [
      {
        "createdAt": "2026-04-07T15:56:49.999Z",
        "status": "string",
        "name": "string",
        "id": "string"
      }
    ]
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/me/documents/signer Get current user signer documents Users

Get the current user's documents where they are a signer

Auth: jwtParams: 4

Parameters

type queryStatusSignerEnum — Optional status type filter. If not provided, returns all documents.
search query stringOptional search term to filter documents by name
page querynumber (double) — The page number for pagination (default: 1)
limit querynumber (double) — The number of items per page (default: 10)

Responses

200Success | application/json | PaginatedResponse_AdditionSigner-Array_
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": [
    {
      "document": {
        "user": {
          "nationality": "string",
          "updatedAt": "string",
          "telephoneNumber": "string",
          "name": "string",
          "isActive": true,
          "id": "string",
          "email": "string",
          "createdAt": "string"
        },
        "signingUrl": "string",
        "typeRecipient": "ID_DOCUMENT",
        "type": "string",
        "updatedAt": "string",
        "templateId": "string",
        "status": "string",
        "name": "string",
        "id": "string",
        "description": "string",
        "createdAt": "string",
        "companyId": "string"
      }
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}
DELETE /v1/users/{id} Delete user Users

Delete a user

Auth: jwt (scopes: lawtech-admin, company-admin)Params: 3

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id pathstring, required — The unique identifier of the user to delete
deleteType query stringThe type of delete operation (soft or hard)

Responses

200User deleted successfully | application/json | ApiResponse__message-string--success-boolean__
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "success": true,
    "message": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/{id} Get user details Users

Get a user by ID

Auth: jwt (scopes: lawtech-admin, company-admin)Params: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id path string, requiredThe unique identifier of the user

Responses

200User retrieved successfully | application/json | ApiResponse_UserResponse_
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
404Not Found | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
PATCH /v1/users/{id} UpdateCompanyUser Users
Auth: jwt (scopes: lawtech-admin, company-admin, company)Body: application/jsonParams: 2

Parameters

x-company-id header string, required
id path string, required

Request Body

Content-Typeapplication/json
SchemaUpdateUserRequest
RequiredYes
Fields
FieldTypeRequiredDescription
namestringNoThe user's full name
passwordstringNoThe user's password
telephoneNumberstringNoThe user's telephone number
forcePasswordChangebooleanNo
emailstringNo
nationalitystringNoISO 3166-1 alpha-2 nationality code (e.g. "VN", "US")
securityContextstringNoClient-provided security context

Responses

200User updated successfully | application/json | ApiResponse_UserResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
404User not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/{id}/company Get user company Users

Get the company associated with a user for the specified company ID

Auth: jwt (scopes: lawtech-admin, company-admin, company, company-user)Params: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id path string, requiredThe unique identifier of the user

Responses

200Success | application/json | ApiResponse_UserCompanyResponse_
401Unauthorized | application/json | ApiResponse_null_
404User or company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "name": "string",
    "scopes": [
      "string"
    ]
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/users/{id}/documents Get user documents Users

Get a user's documents

Auth: jwt (scopes: lawtech-admin, company-admin, company)Params: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id path string, requiredThe unique identifier of the user

Responses

200User documents retrieved successfully | application/json | ApiResponse_UserWithDocumentsResponse_
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
404Not Found | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "id": "string",
    "email": "string",
    "name": "string",
    "telephoneNumber": "string",
    "isActive": true,
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "verified": true,
    "nationality": "string",
    "transactionID": "string",
    "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
    "securityContext": "string",
    "isGrantAccess": true,
    "documents": [
      {
        "createdAt": "2026-04-07T15:56:49.999Z",
        "status": "string",
        "name": "string",
        "id": "string"
      }
    ]
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

Company

8 endpoints

GET /v1/company Get current company Company

Get the current user's company information

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Params: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Responses

200Success | application/json | ApiResponse_CompanyResponse_
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "name": "string",
    "webhookUrl": "string",
    "webhookSecret": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "isActive": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
PATCH /v1/company Update current company Company

Update the current company

Auth: jwt (scopes: lawtech-admin, company-admin, company)Body: application/jsonParams: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Request Body

Content-Type application/json
SchemaUpdateCompanyRequest
RequiredYes
Fields
FieldTypeRequiredDescription
namestringNoThe name of the company
webhookUrlstringNoThe webhook URL for receiving notifications

Responses

200Company updated successfully | application/json | ApiResponse_CompanyResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "name": "string",
    "webhookUrl": "string",
    "webhookSecret": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "isActive": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
DELETE /v1/company/client-secrets Delete client credentials Company

Delete the company's client credentials

Auth: jwt (scopes: lawtech-admin, company-admin, company)Params: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Responses

201Client ID delete successfully | application/json
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
Example 201 response
{
  "new": {
    "id": "string",
    "name": "string",
    "clientId": "string",
    "clientSecret": "string",
    "webhookUrl": "string",
    "webhookSecret": "string",
    "isActive": true,
    "companyUsers": [
      {
        "id": "string",
        "company": {},
        "companyId": "string",
        "user": {
          "id": "string",
          "email": "string",
          "password": "string",
          "name": "string",
          "telephoneNumber": "string",
          "isActive": true,
          "verified": true,
          "forcePasswordChange": true,
          "failedLoginAttempts": 0,
          "isLocked": true,
          "nationality": "string",
          "pinHash": "string",
          "pinFailedAttempts": 0,
          "va_data": "string",
          "securityContext": "string",
          "transactionID": "string",
          "transactionExpiresAt": "2026-04-07T15:56:49.999Z",
          "isGrantAccess": true,
          "companyUsers": [
            {}
          ],
          "documents": [
            {
              "id": "string",
              "createdAt": "2026-04-07T15:56:49.999Z",
              "updatedAt": "2026-04-07T15:56:49.999Z",
              "name": "string",
              "signedFileUrl": "string",
              "description": "string",
              "filePath": "string",
              "fileType": "string",
              "fileSize": 0,
              "fileKey": [
                "string"
              ],
              "fileUrl": [
                "string"
              ],
              "cc": [
                "string"
              ],
              "companyId": "string",
              "company": {},
              "createdByUser": {},
              "metadata": {
                "key": "string"
              },
              "eventType": "Sent",
              "status": "InProgress",
              "documentSource": "Upload",
              "type": "Standard",
              "user": {},
              "userId": "string",
              "boldSignId": "string",
              "sendUrl": "string",
              "template": {
                "id": "string",
                "name": "string",
                "content": "string",
                "metadata": {
                  "key": "string"
                },
                "signersCount": 0,
                "isActive": true,
                "tags": [
                  "string"
                ],
                "documents": [
                  {}
                ],
                "createdAt": "2026-04-07T15:56:49.999Z",
                "updatedAt": "2026-04-07T15:56:49.999Z"
              },
              "templateId": "string",
              "signers": [
                {
                  "id": "string",
                  "createdAt": "2026-04-07T15:56:49.999Z",
                  "updatedAt": "2026-04-07T15:56:49.999Z",
                  "signerName": "string",
                  "signerRole": "string",
                  "signerEmail": "string",
                  "enableAccessCode": true,
                  "isAuthenticationFailed": true,
                  "enableEmailOTP": true,
                  "signingUrl": "string",
                  "signedAt": "2026-04-07T15:56:49.999Z",
                  "isDeliveryFailed": true,
                  "isViewed": true,
                  "order": 0,
                  "authenticationRetryCount": 0,
                  "enableQes": true,
                  "authenticationType": "None",
                  "status": "InProgress",
                  "signerType": "Signer",
                  "hostEmail": "string",
                  "hostName": "string",
                  "isReassigned": true,
                  "privateMessage": "string",
                  "allowFieldConfiguration": true,
                  "language": 0,
                  "locale": "EN",
                  "deliveryMode": "Email",
                  "boldSignId": "string",
                  "fileKey": "string",
                  "xPosition": 0,
                  "yPosition": 0,
                  "width": 0,
                  "height": 0,
                  "pageNumber": 0,
                  "document": {},
                  "documentId": "string",
                  "user": {},
                  "userId": "string"
                }
              ],
              "logs": [
                {
                  "id": "string",
                  "createdAt": "2026-04-07T15:56:49.999Z",
                  "updatedAt": "2026-04-07T15:56:49.999Z",
                  "event": "created",
                  "description": "string",
                  "document": {},
                  "user": {}
                }
              ],
              "typeRecipient": "ID_DOCUMENT"
            }
          ],
          "refreshTokens": [
            {
              "id": "string",
              "token": "string",
              "expiresAt": "2026-04-07T15:56:49.999Z",
              "isRevoked": true,
              "clientIp": "string",
              "userAgent": "string",
              "revokedReason": "string",
              "revokedAt": "2026-04-07T15:56:49.999Z",
              "user": null,
              "userId": null,
              "company": null,
              "companyId": null,
              "createdAt": "2026-04-07T15:56:49.999Z",
              "updatedAt": "2026-04-07T15:56:49.999Z"
            }
          ],
          "signatures": [
            {
              "id": "string",
              "createdAt": "2026-04-07T15:56:49.999Z",
              "updatedAt": "2026-04-07T15:56:49.999Z",
              "signerName": "string",
              "signerRole": "string",
              "signerEmail": "string",
              "enableAccessCode": true,
              "isAuthenticationFailed": true,
              "enableEmailOTP": true,
              "signingUrl": "string",
              "signedAt": "2026-04-07T15:56:49.999Z",
              "isDeliveryFailed": true,
              "isViewed": true,
              "order": 0,
              "authenticationRetryCount": 0,
              "enableQes": true,
              "authenticationType": "None",
              "status": "InProgress",
              "signerType": "Signer",
              "hostEmail": "string",
              "hostName": "string",
              "isReassigned": true,
              "privateMessage": "string",
              "allowFieldConfiguration": true,
              "language": 0,
              "locale": "EN",
              "deliveryMode": "Email",
              "boldSignId": "string",
              "fileKey": "string",
              "xPosition": 0,
              "yPosition": 0,
              "width": 0,
              "height": 0,
              "pageNumber": 0,
              "document": {
                "id": "string",
                "createdAt": "2026-04-07T15:56:49.999Z",
                "updatedAt": "2026-04-07T15:56:49.999Z",
                "name": "string",
                "signedFileUrl": "string",
                "description": "string",
                "filePath": "string",
                "fileType": "string",
                "fileSize": 0,
                "fileKey": [
                  "string"
                ],
                "fileUrl": [
                  "string"
                ],
                "cc": [
                  "string"
                ],
                "companyId": "string",
                "company": {},
                "createdByUser": {},
                "metadata": {
                  "key": "string"
                },
                "eventType": "Sent",
                "status": "InProgress",
                "documentSource": "Upload",
                "type": "Standard",
                "user": {},
                "userId": "string",
                "boldSignId": "string",
                "sendUrl": "string",
                "template": {
                  "id": "string",
                  "name": "string",
                  "content": "string",
                  "metadata": {
                    "key": "string"
                  },
                  "signersCount": 0,
                  "isActive": true,
                  "tags": [
                    "string"
                  ],
                  "documents": [
                    {}
                  ],
                  "createdAt": "2026-04-07T15:56:49.999Z",
                  "updatedAt": "2026-04-07T15:56:49.999Z"
                },
                "templateId": "string",
                "signers": [
                  {}
                ],
                "logs": [
                  {
                    "id": "string",
                    "createdAt": "2026-04-07T15:56:49.999Z",
                    "updatedAt": "2026-04-07T15:56:49.999Z",
                    "event": "created",
                    "description": "string",
                    "document": {},
                    "user": {}
                  }
                ],
                "typeRecipient": "ID_DOCUMENT"
              },
              "documentId": "string",
              "user": {},
              "userId": "string"
            }
          ],
          "logs": [
            {
              "id": "string",
              "createdAt": "2026-04-07T15:56:49.999Z",
              "updatedAt": "2026-04-07T15:56:49.999Z",
              "event": "created",
              "description": "string",
              "document": {
                "id": "string",
                "createdAt": "2026-04-07T15:56:49.999Z",
                "updatedAt": "2026-04-07T15:56:49.999Z",
                "name": "string",
                "signedFileUrl": "string",
                "description": "string",
                "filePath": "string",
                "fileType": "string",
                "fileSize": 0,
                "fileKey": [
                  "string"
                ],
                "fileUrl": [
                  "string"
                ],
                "cc": [
                  "string"
                ],
                "companyId": "string",
                "company": {},
                "createdByUser": {},
                "metadata": {
                  "key": "string"
                },
                "eventType": "Sent",
                "status": "InProgress",
                "documentSource": "Upload",
                "type": "Standard",
                "user": {},
                "userId": "string",
                "boldSignId": "string",
                "sendUrl": "string",
                "template": {
                  "id": "string",
                  "name": "string",
                  "content": "string",
                  "metadata": {
                    "key": "string"
                  },
                  "signersCount": 0,
                  "isActive": true,
                  "tags": [
                    "string"
                  ],
                  "documents": [
                    {}
                  ],
                  "createdAt": "2026-04-07T15:56:49.999Z",
                  "updatedAt": "2026-04-07T15:56:49.999Z"
                },
                "templateId": "string",
                "signers": [
                  {
                    "id": "string",
                    "createdAt": "2026-04-07T15:56:49.999Z",
                    "updatedAt": "2026-04-07T15:56:49.999Z",
                    "signerName": "string",
                    "signerRole": "string",
                    "signerEmail": "string",
                    "enableAccessCode": true,
                    "isAuthenticationFailed": true,
                    "enableEmailOTP": true,
                    "signingUrl": "string",
                    "signedAt": "2026-04-07T15:56:49.999Z",
                    "isDeliveryFailed": true,
                    "isViewed": true,
                    "order": 0,
                    "authenticationRetryCount": 0,
                    "enableQes": true,
                    "authenticationType": "None",
                    "status": "InProgress",
                    "signerType": "Signer",
                    "hostEmail": "string",
                    "hostName": "string",
                    "isReassigned": true,
                    "privateMessage": "string",
                    "allowFieldConfiguration": true,
                    "language": 0,
                    "locale": "EN",
                    "deliveryMode": "Email",
                    "boldSignId": "string",
                    "fileKey": "string",
                    "xPosition": 0,
                    "yPosition": 0,
                    "width": 0,
                    "height": 0,
                    "pageNumber": 0,
                    "document": {},
                    "documentId": "string",
                    "user": {},
                    "userId": "string"
                  }
                ],
                "logs": [
                  {}
                ],
                "typeRecipient": "ID_DOCUMENT"
              },
              "user": {}
            }
          ],
          "createdAt": "2026-04-07T15:56:49.999Z",
          "updatedAt": "2026-04-07T15:56:49.999Z"
        },
        "userId": "string",
        "scopes": [
          "string"
        ],
        "isActive": true,
        "createdAt": "2026-04-07T15:56:49.999Z",
        "updatedAt": "2026-04-07T15:56:49.999Z"
      }
    ],
    "refreshTokens": [
      {
        "id": "string",
        "token": "string",
        "expiresAt": "2026-04-07T15:56:49.999Z",
        "isRevoked": true,
        "clientIp": "string",
        "userAgent": "string",
        "revokedReason": "string",
        "revokedAt": "2026-04-07T15:56:49.999Z",
        "user": null,
        "userId": null,
        "company": null,
        "companyId": null,
        "createdAt": "2026-04-07T15:56:49.999Z",
        "updatedAt": "2026-04-07T15:56:49.999Z"
      }
    ],
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  },
  "data": "string"
}
GET /v1/company/client-secrets Get client credentials Company

Get the company's client credentials

Auth: jwt (scopes: lawtech-admin, company-admin, company)Params: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Responses

200Success | application/json | ApiResponse_CompanyClientID_
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "clientId": "string",
    "clientSecret": "string",
    "webhookSecret": "string",
    "companyId": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/company/client-secrets create client credentials Company

Create the company's client credentials

Auth: jwt (scopes: lawtech-admin, company-admin, company)Params: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Request Body

Required No

No request body. Provide the company header only.

Responses

201Client ID created successfully | application/json | ApiResponse_CompanyClientID_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
Example 201 response
{
  "data": {
    "clientId": "string",
    "clientSecret": "string",
    "webhookSecret": "string",
    "companyId": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/company/stats Get company statistics Company

Get company statistics

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Params: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Responses

200Success | application/json | ApiResponse_CompanyStatsView_
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "totalUsers": 0,
    "roles": {
      "companySigner": 0,
      "companyUser": 0,
      "companyAdmin": 0,
      "lawtechAdmin": 0
    },
    "documents": {
      "total": 0,
      "scheduled": 0,
      "draft": 0,
      "revoked": 0,
      "expired": 0,
      "declined": 0,
      "needsAttention": 0,
      "terminated": 0,
      "completed": 0,
      "awaitingOthers": 0,
      "awaitingUs": 0
    }
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/company/users Get company users Company

Get all users associated with the current company

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Params: 3

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
page querynumber (double) — The page number for pagination (default: 1)
limit querynumber (double) — The number of items per page (default: 10)

Responses

200Success | application/json | PaginatedResponse_Array__id-string--email-string--name-string--scopes-string-Array___
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": [
    {
      "scopes": [
        "string"
      ],
      "name": "string",
      "email": "string",
      "id": "string"
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}

Companies

8 endpoints

GET /v1/companies Get all companies Companies

Get all companies

Auth: jwt (scopes: lawtech-admin)Params: 2

Parameters

page querynumber (double) — The page number for pagination (default: 1)
limit querynumber (double) — The number of items per page (default: 10)

Responses

200Success | application/json | PaginatedResponse_CompanyResponse-Array_
401Unauthorized | application/json | ApiResponse_null_
Example 200 response
{
  "data": [
    {
      "id": "string",
      "name": "string",
      "webhookUrl": "string",
      "webhookSecret": "string",
      "createdAt": "2026-04-07T15:56:49.999Z",
      "updatedAt": "2026-04-07T15:56:49.999Z",
      "isActive": true
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}
POST /v1/companies Create company Companies

Create a new company

Auth: jwt (scopes: lawtech-admin)Body: application/jsonParams: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Request Body

Content-Type application/json
SchemaCreateCompanyRequest
RequiredYes
Fields
FieldTypeRequiredDescription
namestringYesThe name of the company
webhookUrlstringNoThe webhook URL for receiving notifications

Responses

201Company created successfully | application/json | ApiResponse_CompanyResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
409Company already exists | application/json | ApiResponse_null_
Example 201 response
{
  "data": {
    "id": "string",
    "name": "string",
    "webhookUrl": "string",
    "webhookSecret": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "isActive": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
DELETE /v1/companies/{id} Delete company Companies

Delete a company

Auth: jwt (scopes: lawtech-admin)Params: 3

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id pathstring, required — The unique identifier of the company to delete
deleteType query stringThe type of delete operation (soft or hard)

Responses

200Company deleted successfully | application/json | ApiResponse__success-boolean__
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "success": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/companies/{id} Get company details Companies

Get detailed information about a specific company

Auth: jwt (scopes: lawtech-admin)Params: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id path string, requiredThe unique identifier of the company

Responses

200Success | application/json | ApiResponse_CompanyResponse_
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "name": "string",
    "webhookUrl": "string",
    "webhookSecret": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "isActive": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
PATCH /v1/companies/{id} Update company Companies

Update an existing company

Auth: jwt (scopes: lawtech-admin)Body: application/jsonParams: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id pathstring, required — The unique identifier of the company to update

Request Body

Content-Type application/json
SchemaUpdateCompanyRequest
RequiredYes
Fields
FieldTypeRequiredDescription
namestringNoThe name of the company
webhookUrlstringNoThe webhook URL for receiving notifications

Responses

200Company updated successfully | application/json | ApiResponse_CompanyResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "name": "string",
    "webhookUrl": "string",
    "webhookSecret": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "isActive": true
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/companies/{id}/client-secrets Get client credentials Companies

Get a company's client credentials

Auth: jwt (scopes: lawtech-admin)Params: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id path string, requiredThe unique identifier of the company

Responses

200Success | application/json | ApiResponse__clientId-string--clientSecret-string--webhookSecret-string--companyId-string__
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "companyId": "string",
    "webhookSecret": "string",
    "clientSecret": "string",
    "clientId": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/companies/{id}/users Get company users Companies

Get all users associated with a company

Auth: jwt (scopes: lawtech-admin)Params: 4

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id path string, requiredThe unique identifier of the company
page querynumber (double) — The page number for pagination (default: 1)
limit querynumber (double) — The number of items per page (default: 10)

Responses

200Success | application/json | PaginatedResponse_Array__id-string--email-string--name-string--scopes-string-Array___
401Unauthorized | application/json | ApiResponse_null_
404Company not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": [
    {
      "scopes": [
        "string"
      ],
      "name": "string",
      "email": "string",
      "id": "string"
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}

Documents

8 endpoints

GET /v1/documents Get all documents for a company Documents

Retrieve all documents

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Params: 6

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
page query number (double)The page number (default: 1)
limit querynumber (double) — The number of items per page (default: 10)
status querystring — Optional document status filter Waiting For Me, Waiting For Others, Needs Attention, Completed, Declined, Expired, Revoked, Draft, Scheduled, Terminated
equal queryboolean — Whether to return documents matching the status (true) or not matching the status (false). Defaults to true.
userId query stringOptional user ID to filter by

Responses

200Documents retrieved successfully | application/json | PaginatedResponse_DocumentWithSignersResponse-Array_
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
500Server error | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "type": "string",
      "companyId": "string",
      "status": "string",
      "documentSource": "Upload",
      "typeRecipient": "ID_DOCUMENT",
      "createdAt": "2026-04-07T15:56:49.999Z",
      "updatedAt": "2026-04-07T15:56:49.999Z",
      "signers": [
        {
          "transactionID": "string",
          "nationality": "string",
          "phoneNumber": "string",
          "fileKey": "string",
          "pageNumber": 0,
          "height": 0,
          "width": 0,
          "yPosition": 0,
          "xPosition": 0,
          "boldSignId": "string",
          "enableQes": true,
          "signerType": "string",
          "signingUrl": "string",
          "order": 0,
          "updatedAt": "2026-04-07T15:56:49.999Z",
          "signedAt": "2026-04-07T15:56:49.999Z",
          "status": "string",
          "email": "string",
          "name": "string",
          "id": "string"
        }
      ]
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}
POST /v1/documents Create document Documents

Create a new document

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Body: multipart/form-dataParams: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Request Body

Content-Typemultipart/form-data (file upload)
Schema CreateDocumentRequest
RequiredYes
Fields
FieldTypeRequiredDescription
titlestringYesDocument title.
messagestringNoOptional message for signers.
typeStandard | Advanced | QualifiedYesDocument type.
documentSourceUpload | TemplateNoUpload (default) or Template.
templateIduuidNoRequired when documentSource=Template.
typeRecipientID_DOCUMENT | PASSPORT_ONLY | NORMALNoRecipient type configuration.
enableSigningOrderbooleanNoEnable signing order.
cc[].emailAddressstringNoCC recipient email.
signers[].namestringYesSigner name.
signers[].emailAddressstringNoSigner email.
signers[].signerOrdernumberNoSigning order number.
signers[].signerTypeSigner | Reviewer | InPersonSignerNoSigner type.
signers[].signerRolestringNoSigner role label.
signers[].deliveryModeEmail | SMS | EmailAndSMS | WhatsAppNoDelivery channel.
signers[].authenticationTypeAuthenticationTypeEnumNoAuthentication type.
signers[].enableEmailOTPbooleanNoEnable email OTP.
signers[].phoneNumberstringNoSigner phone number.
signers[].nationalitystringNoISO 2-character nationality.
signers[].signatureCoordinates.xPositionnumberNoX position.
signers[].signatureCoordinates.yPositionnumberNoY position.
signers[].signatureCoordinates.widthnumberNoWidth.
signers[].signatureCoordinates.heightnumberNoHeight.
signers[].signatureCoordinates.pageNumbernumberNoPage number.
files[]fileNoRequired when documentSource=Upload.

Send as multipart/form-data (use form-data fields, not a JSON body). When documentSource=Upload, attach files[] (PDF). When documentSource=Template, pass templateId instead. For multipart arrays/objects, use bracket notation (for example, `signers[0][name]`, `signers[0][signatureCoordinates][xPosition]`, `cc[0][emailAddress]`).

Responses

201Document created successfully | application/json | ApiResponse_DocumentResponse_
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
500Server error | application/json | ApiResponse__code-string--message-string__
Example 201 response
{
  "data": {
    "id": "string",
    "name": "string",
    "description": "string",
    "documentId": "string",
    "sendUrl": "string",
    "companyId": "string",
    "company": {
      "isActive": true,
      "updatedAt": "2026-04-07T15:56:49.999Z",
      "createdAt": "2026-04-07T15:56:49.999Z",
      "name": "string",
      "id": "string"
    },
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "type": "Standard",
    "documentSource": "Upload",
    "status": "string",
    "typeRecipient": "ID_DOCUMENT",
    "signers": [
      {
        "nationality": "string",
        "phoneNumber": "string",
        "signerRole": "string",
        "signerType": "string",
        "order": 0,
        "status": "string",
        "email": "string",
        "name": "string",
        "id": "string"
      }
    ]
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/documents/stats Get document statistics Documents

Get document statistics for both company and individual user

Auth: jwt (scopes: lawtech-admin, company-admin, company-user)Params: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Responses

200Ok | application/json | ApiResponse_CompanyDocumentStatsResponse_
400Invalid request | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
500Internal server error | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "company": {
      "total": 0,
      "scheduled": 0,
      "draft": 0,
      "revoked": 0,
      "expired": 0,
      "declined": 0,
      "needsAttention": 0,
      "terminated": 0,
      "completed": 0,
      "awaitingOthers": 0,
      "awaitingUs": 0
    },
    "user": {
      "total": 0,
      "scheduled": 0,
      "draft": 0,
      "revoked": 0,
      "expired": 0,
      "declined": 0,
      "needsAttention": 0,
      "terminated": 0,
      "completed": 0,
      "awaitingOthers": 0,
      "awaitingMe": 0
    }
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/documents/stats-month-status GetDocumentStatsMonthStatus Documents
Auth: jwt (scopes: lawtech-admin, company-admin, company-user)Params: 1

Parameters

x-company-id header string, required

Responses

200Ok | application/json | ApiResponse_DataCompanyDocumentStatsStatus-Array_
400Invalid request | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
500Internal server error | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": [
    {
      "month": "string",
      "monthNumber": 0,
      "awaitingOthers": 0,
      "needsAttention": 0,
      "awaitingMe": 0,
      "revoked": 0,
      "signed": 0,
      "notSigned": 0,
      "total": 0
    }
  ],
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/documents/{id} Get document details Documents

Get a document by ID

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Params: 2

Parameters

id path string, requiredThe unique identifier of the document
x-company-id headerstring, required — The company ID from x-company-id header

Responses

200Document retrieved successfully | application/json
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
404Document not found | application/json | ApiResponse__code-string--message-string__
500Server error | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "metadata": {
    "timestamp": "2026-04-07T15:56:49.999Z"
  },
  "data": {
    "id": "string",
    "name": "string",
    "description": "string",
    "type": "string",
    "companyId": "string",
    "status": "string",
    "documentSource": "Upload",
    "typeRecipient": "ID_DOCUMENT",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "signers": [
      {
        "transactionID": "string",
        "nationality": "string",
        "phoneNumber": "string",
        "fileKey": "string",
        "pageNumber": 0,
        "height": 0,
        "width": 0,
        "yPosition": 0,
        "xPosition": 0,
        "boldSignId": "string",
        "enableQes": true,
        "signerType": "string",
        "signingUrl": "string",
        "order": 0,
        "updatedAt": "2026-04-07T15:56:49.999Z",
        "signedAt": "2026-04-07T15:56:49.999Z",
        "status": "string",
        "email": "string",
        "name": "string",
        "id": "string"
      }
    ]
  }
}
PATCH /v1/documents/{id} Update document Documents

Update an existing document

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Body: application/jsonParams: 2

Parameters

x-company-id headerstring, required — The company ID from x-company-id header
id pathstring, required — The unique identifier of the document to update

Request Body

Content-Type application/json
SchemaUpdateDocumentRequest
RequiredYes
Fields
FieldTypeRequiredDescription
namestringNo
descriptionstringNo
typeRecipientDocumentTypeRecipientsNoAllowed: ID_DOCUMENT, PASSPORT_ONLY, NORMAL

Responses

200Ok | application/json | ApiResponse_DocumentResponse_
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "id": "string",
    "name": "string",
    "description": "string",
    "documentId": "string",
    "sendUrl": "string",
    "companyId": "string",
    "company": {
      "isActive": true,
      "updatedAt": "2026-04-07T15:56:49.999Z",
      "createdAt": "2026-04-07T15:56:49.999Z",
      "name": "string",
      "id": "string"
    },
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z",
    "type": "Standard",
    "documentSource": "Upload",
    "status": "string",
    "typeRecipient": "ID_DOCUMENT",
    "signers": [
      {
        "nationality": "string",
        "phoneNumber": "string",
        "signerRole": "string",
        "signerType": "string",
        "order": 0,
        "status": "string",
        "email": "string",
        "name": "string",
        "id": "string"
      }
    ]
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/documents/{id}/download Download document file Documents

Download a document file

Auth: jwt (scopes: lawtech-admin, company-admin, company-user, company)Params: 2

Parameters

id path string, requiredThe unique identifier of the document
x-company-id headerstring, required — The company ID from x-company-id header

Responses

200 File stream | application/octet-streamBinary file content. Check response headers for filename and type.
400Company ID is required | application/json | ApiResponse__code-string--message-string__
401Unauthorized | application/json | ApiResponse__code-string--message-string__
404Document not found | application/json | ApiResponse__code-string--message-string__
500Server error | application/json | ApiResponse__code-string--message-string__

Esign Templates

6 endpoints

GET /v1/esign-templates List Esign templates Esign Templates

List Esign template records for current user

Auth: jwtParams: 2

Parameters

page query number (double)
limit query number (double)

Responses

200Templates retrieved successfully | application/json | PaginatedResponse_BoldsignTemplateResponse-Array_
401Unauthorized | application/json | ApiResponse__code-string--message-string__
500Server error | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": [
    {
      "id": "string",
      "boldSignTemplateId": "string",
      "name": "string",
      "description": "string",
      "signersCount": 0,
      "roles": [
        {
          "name": "string",
          "index": 0,
          "signerType": "string"
        }
      ],
      "userId": "string",
      "errorMessage": "string",
      "createUrl": "string",
      "status": "string",
      "files": [
        {
          "type": "string",
          "name": "string"
        }
      ],
      "deletedAt": "2026-04-07T15:56:49.999Z",
      "createdAt": "2026-04-07T15:56:49.999Z",
      "updatedAt": "2026-04-07T15:56:49.999Z"
    }
  ],
  "metadata": {
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z",
    "totalPages": 0,
    "limit": 0,
    "page": 0,
    "total": 0
  }
}
POST /v1/esign-templates Create Esign template record Esign Templates

Create a Esign template record

Auth: jwtBody: multipart/form-data

Request Body

Content-Typemultipart/form-data (file upload)
SchemaCreateBoldsignTemplateRequest
RequiredYes
Fields
FieldTypeRequiredDescription
namestringYesTemplate name.
descriptionstringNoOptional description.
rolesarrayNoJSON array of roles (name, index, signerType).
roles[].namestringYesRole name.
roles[].indexnumberYesRole order (>=1).
roles[].signerTypestringNoSigner type label.
files[]fileYesTemplate PDF files.

Send as multipart/form-data and attach files[] (PDF). The roles field can be JSON string or array.

Responses

201Template created successfully | application/json | ApiResponse_BoldsignTemplateResponse_
400Invalid request | application/json | ApiResponse__code-string--message-string__
Example 201 response
{
  "data": {
    "id": "string",
    "boldSignTemplateId": "string",
    "name": "string",
    "description": "string",
    "signersCount": 0,
    "roles": [
      {
        "name": "string",
        "index": 0,
        "signerType": "string"
      }
    ],
    "userId": "string",
    "errorMessage": "string",
    "createUrl": "string",
    "status": "string",
    "files": [
      {
        "type": "string",
        "name": "string"
      }
    ],
    "deletedAt": "2026-04-07T15:56:49.999Z",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
DELETE /v1/esign-templates/{id} Soft delete Esign template Esign Templates

Soft delete Esign template record

Auth: jwtParams: 1

Parameters

id path string, required

Responses

200Template deleted successfully | application/json | ApiResponse_string_
404Template not found | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": "string",
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/esign-templates/{id} Get Esign template Esign Templates

Get Esign template record by ID

Auth: jwtParams: 1

Parameters

id path string, required

Responses

200Template retrieved successfully | application/json | ApiResponse_BoldsignTemplateResponse_
404Template not found | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "id": "string",
    "boldSignTemplateId": "string",
    "name": "string",
    "description": "string",
    "signersCount": 0,
    "roles": [
      {
        "name": "string",
        "index": 0,
        "signerType": "string"
      }
    ],
    "userId": "string",
    "errorMessage": "string",
    "createUrl": "string",
    "status": "string",
    "files": [
      {
        "type": "string",
        "name": "string"
      }
    ],
    "deletedAt": "2026-04-07T15:56:49.999Z",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
PATCH /v1/esign-templates/{id} Update Esign template Esign Templates

Update Esign template record

Auth: jwtBody: multipart/form-dataParams: 1

Parameters

id path string, required

Request Body

Content-Typemultipart/form-data (file upload)
SchemaUpdateBoldsignTemplateRequest
Fields
FieldTypeRequiredDescription
namestringNoTemplate name.
descriptionstringNoOptional description.
rolesarrayNoJSON array of roles (name, index, signerType).
roles[].namestringNoRole name.
roles[].indexnumberNoRole order (>=1).
roles[].signerTypestringNoSigner type label.
files[]fileNoOptional updated PDF files.

Send as multipart/form-data. Upload files[] only if replacing PDFs. The roles field can be JSON string or array.

Responses

200Template updated successfully | application/json | ApiResponse_BoldsignTemplateResponse_
404Template not found | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "id": "string",
    "boldSignTemplateId": "string",
    "name": "string",
    "description": "string",
    "signersCount": 0,
    "roles": [
      {
        "name": "string",
        "index": 0,
        "signerType": "string"
      }
    ],
    "userId": "string",
    "errorMessage": "string",
    "createUrl": "string",
    "status": "string",
    "files": [
      {
        "type": "string",
        "name": "string"
      }
    ],
    "deletedAt": "2026-04-07T15:56:49.999Z",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/esign-templates/{id}/embedded-edit-url Get embedded template edit URL Esign Templates

Get embedded template edit URL

Auth: jwtParams: 1

Parameters

id path string, required

Responses

200Edit URL generated successfully | application/json | ApiResponse_EmbeddedTemplateEditUrlResponse_
404Template not found | application/json | ApiResponse__code-string--message-string__
Example 200 response
{
  "data": {
    "editUrl": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

File-Service

2 endpoints

GET /v1/file-service/{documentId}/documents GetFileDocument File-Service
Auth: jwtParams: 2

Parameters

documentId path string, required
fileName query string

Responses

200File retrieved successfully | application/json
401Unauthorized | application/json | ApiResponse_null_
404File not found | application/json | ApiResponse_null_
Example 200 response
"BASE64_DATA"
GET /v1/file-service/{key} Get file by key File-Service

Get a file by its key

Auth: jwtParams: 1

Parameters

key pathstring, required — The unique identifier of the file to retrieve

Responses

200File retrieved successfully | application/json
401Unauthorized | application/json | ApiResponse_null_
404File not found | application/json | ApiResponse_null_
Example 200 response
"BASE64_DATA"

ID-Card

4 endpoints

GET /v1/users/me/id-cards Get ID card info ID-Card

Get ID card information

Auth: jwt

Responses

200ID card information retrieved successfully | application/json
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid credentials | application/json | ApiResponse_ErrorResponse_
404Not found data | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "images": [
      "string"
    ],
    "userId": "string",
    "dateOfBirth": "string",
    "dateOfExpiry": "string",
    "dateOfIssue": "string",
    "verificationDate": "string",
    "documentNumber": "string",
    "country": "string",
    "givenNames": "string",
    "mrzCode": "string",
    "name": "string",
    "nationality": "string",
    "sex": "string",
    "surname": "string",
    "placeOfBirth": "string",
    "portrait": "string",
    "signature": "string",
    "faceImage": "string",
    "docFront": "string",
    "documentName": "string",
    "authority": "string",
    "score": 0,
    "isFaceMatch": true,
    "isDocumentValid": true,
    "docType": "string",
    "docBack": "string",
    "nfcImage": "string",
    "cardAccessNumber": "string",
    "faceLiveness": "string",
    "faceCompareScore": 0,
    "nfcCheck": true,
    "skipNfcReason": "string",
    "issuingStateCode": "string",
    "documentClassCode": "string",
    "id": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/users/me/id-cards Create ID card ID-Card

Create a new ID card

Auth: jwtBody: multipart/form-data

Request Body

Content-Typemultipart/form-data (file upload)
Schema CreateIdCardInput
RequiredYes
Fields
FieldTypeRequiredDescription
files[]fileYes1-3 images (JPG/PNG).
dateOfBirthstringNo
dateOfExpirystringNo
dateOfIssuestringNo
verificationDatestringNo
documentNumberstringNo
countrystringNo
givenNamesstringNo
mrzCodestringNo
namestringNo
nationalitystringNo
sexstringNo
surnamestringNo
placeOfBirthstringNo
portraitstringNo
signaturestringNo
faceImagestringNo
docFrontstringNo
documentNamestringNo
authoritystringNo
scorenumberNo
isFaceMatchbooleanNo
isDocumentValidbooleanNo
docTypestringNo
docBackstringNo
nfcImagestringNo
cardAccessNumberstringNo
faceLivenessstringNo
faceCompareScorenumberNo
nfcCheckbooleanNo
skipNfcReasonstringNo
issuingStateCodestringNo
documentClassCodestringNo

Send as multipart/form-data and attach files[] (JPG/PNG). Supports up to 3 images. File size max 40MB.

Responses

201ID card created successfully | application/json | ApiResponse_Partial_IDCardResponse__
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid credentials | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 201 response
{
  "data": {
    "images": [
      "string"
    ],
    "userId": "string",
    "dateOfBirth": "string",
    "dateOfExpiry": "string",
    "dateOfIssue": "string",
    "verificationDate": "string",
    "documentNumber": "string",
    "country": "string",
    "givenNames": "string",
    "mrzCode": "string",
    "name": "string",
    "nationality": "string",
    "sex": "string",
    "surname": "string",
    "placeOfBirth": "string",
    "portrait": "string",
    "signature": "string",
    "faceImage": "string",
    "docFront": "string",
    "documentName": "string",
    "authority": "string",
    "score": 0,
    "isFaceMatch": true,
    "isDocumentValid": true,
    "docType": "string",
    "docBack": "string",
    "nfcImage": "string",
    "cardAccessNumber": "string",
    "faceLiveness": "string",
    "faceCompareScore": 0,
    "nfcCheck": true,
    "skipNfcReason": "string",
    "issuingStateCode": "string",
    "documentClassCode": "string",
    "id": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
DELETE /v1/users/me/id-cards/{id} Delete ID card ID-Card

Delete an ID card

Auth: jwtParams: 1

Parameters

id path string, requiredThe ID of the ID card to delete

Responses

200ID card deleted successfully | application/json
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid credentials | application/json | ApiResponse_ErrorResponse_
404Not found data | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": "string"
}
PATCH /v1/users/me/id-cards/{id} Update ID card ID-Card

Update an existing ID card

Auth: jwtBody: multipart/form-dataParams: 1

Parameters

id path string, requiredThe ID of the ID card to update

Request Body

Content-Typemultipart/form-data (file upload)
SchemaUpdateIdCardBody
Fields
FieldTypeRequiredDescription
files[]fileNoOptional replacement images.
dateOfBirthstringNo
dateOfExpirystringNo
dateOfIssuestringNo
verificationDatestringNo
documentNumberstringNo
countrystringNo
givenNamesstringNo
mrzCodestringNo
namestringNo
nationalitystringNo
sexstringNo
surnamestringNo
placeOfBirthstringNo
portraitstringNo
signaturestringNo
faceImagestringNo
docFrontstringNo
documentNamestringNo
authoritystringNo
scorenumberNo
isFaceMatchbooleanNo
isDocumentValidbooleanNo
docTypestringNo
docBackstringNo
nfcImagestringNo
cardAccessNumberstringNo
faceLivenessstringNo
faceCompareScorenumberNo
nfcCheckbooleanNo
skipNfcReasonstringNo
issuingStateCodestringNo
documentClassCodestringNo

Send as multipart/form-data. Attach files[] only if you want to replace existing images.

Responses

200ID card updated successfully | application/json | ApiResponse_Partial_IDCardResponse__
400Invalid request | application/json | ApiResponse_ErrorResponse_
401Invalid credentials | application/json | ApiResponse_ErrorResponse_
404Not found data | application/json | ApiResponse_ErrorResponse_
500Server error | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "images": [
      "string"
    ],
    "userId": "string",
    "dateOfBirth": "string",
    "dateOfExpiry": "string",
    "dateOfIssue": "string",
    "verificationDate": "string",
    "documentNumber": "string",
    "country": "string",
    "givenNames": "string",
    "mrzCode": "string",
    "name": "string",
    "nationality": "string",
    "sex": "string",
    "surname": "string",
    "placeOfBirth": "string",
    "portrait": "string",
    "signature": "string",
    "faceImage": "string",
    "docFront": "string",
    "documentName": "string",
    "authority": "string",
    "score": 0,
    "isFaceMatch": true,
    "isDocumentValid": true,
    "docType": "string",
    "docBack": "string",
    "nfcImage": "string",
    "cardAccessNumber": "string",
    "faceLiveness": "string",
    "faceCompareScore": 0,
    "nfcCheck": true,
    "skipNfcReason": "string",
    "issuingStateCode": "string",
    "documentClassCode": "string",
    "id": "string",
    "createdAt": "2026-04-07T15:56:49.999Z",
    "updatedAt": "2026-04-07T15:56:49.999Z"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

ID Verification

3 endpoints

POST /v1/verification Verify user identity ID Verification

Verify user identity

Auth: jwt (scopes: lawtech-admin, company, company-admin)Body: application/jsonParams: 1

Parameters

x-company-id headerstring, required — The company ID from x-company-id header

Request Body

Content-Type application/json
SchemaVerificationRequest
RequiredYes
Fields
FieldTypeRequiredDescription
emailstringYes
firstNamestringYes
lastNamestringYes
phoneNumberstringNo

Responses

200Verification successful | application/json | ApiResponse_VerificationResponse_
400Invalid request | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
404ID card not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "decisionDate": "2026-04-07T15:56:49.999Z",
    "localName": "string",
    "document": {
      "status": "verified",
      "placeOfBirth": "string",
      "dateOfBirth": "2026-04-07T15:56:49.999Z",
      "citizenship": "string",
      "gender": "string",
      "lastName": "string",
      "firstName": "string",
      "validUntil": "2026-04-07T15:56:49.999Z",
      "validFrom": "2026-04-07T15:56:49.999Z",
      "number": "string",
      "type": "string"
    }
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/verification/{id} Get verification status ID Verification

Get verification status

Auth: jwt (scopes: lawtech-admin, company)Params: 2

Parameters

id path string, requiredThe verification ID
x-company-id headerstring, required — The company ID from x-company-id header

Responses

200Verification status retrieved successfully | application/json | ApiResponse_VerificationResponse_
401Unauthorized | application/json | ApiResponse_null_
404Verification not found | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "id": "string",
    "decisionDate": "2026-04-07T15:56:49.999Z",
    "localName": "string",
    "document": {
      "status": "verified",
      "placeOfBirth": "string",
      "dateOfBirth": "2026-04-07T15:56:49.999Z",
      "citizenship": "string",
      "gender": "string",
      "lastName": "string",
      "firstName": "string",
      "validUntil": "2026-04-07T15:56:49.999Z",
      "validFrom": "2026-04-07T15:56:49.999Z",
      "number": "string",
      "type": "string"
    }
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
GET /v1/verification/{id}/download Download verification PDF ID Verification

Download verification PDF

Auth: jwt (scopes: lawtech-admin, company)Params: 2

Parameters

id path string, requiredThe verification ID
x-company-id headerstring, required — The company ID from x-company-id header

Responses

200PDF file stream | application/pdf
401Unauthorized | application/json | ApiResponse_null_
404Verification not found | application/json | ApiResponse_null_

Evrotrust

5 endpoints

GET /v1/evrotrust/callback Web SDK Callback Evrotrust

Handle Evrotrust Web SDK callback (via Redirect)

Auth: PublicParams: 5

Parameters

external_reference_id query string, required
reference_id query string
status query number (double), required
unsuccess_reason query string
error query string

Responses

200Callback processed successfully | application/json | ApiResponse__message-string__
400Invalid request | application/json | ApiResponse_null_
500Internal server error | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "message": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/evrotrust/document/doc/identification Fetch identification data Evrotrust

Get Evrotrust document identification data

Auth: jwtBody: application/json

Request Body

Content-Typeapplication/json
SchemaRecord_string.unknown_
RequiredYes

Responses

200Identification data retrieved successfully | application/json | ApiResponse_EvrotrustIdentificationResponse_
401Unauthorized | application/json | ApiResponse_null_
500Internal server error | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "transactionID": "string",
    "threadID": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/evrotrust/document/download Download document content Evrotrust

Download Evrotrust document

Auth: jwtBody: application/json

Request Body

Content-Typeapplication/json
SchemaEvrotrustDocumentDownloadRequest
RequiredYes
Fields
FieldTypeRequiredDescription
transactionIDstringYes

Responses

200File stream | application/octet-stream
401Unauthorized | application/json | ApiResponse_null_
500Internal server error | application/json | ApiResponse_null_
POST /v1/evrotrust/document/status Fetch document status Evrotrust

Get Evrotrust document status

Auth: jwtBody: application/json

Request Body

Content-Typeapplication/json
SchemaEvrotrustDocumentStatusRequest
RequiredYes
Fields
FieldTypeRequiredDescription
transactionIDstringYes

Responses

200Document status retrieved successfully | application/json | ApiResponse_Record_string.unknown__
401Unauthorized | application/json | ApiResponse_null_
500Internal server error | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "key": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}
POST /v1/evrotrust/session Create SDK session Evrotrust

Create an Evrotrust Web SDK session

Auth: jwtBody: application/json

Request Body

Content-Typeapplication/json
RequiredYes
Fields
FieldTypeRequiredDescription
emailstringYes
user_pidstringNo
user_countrystringNo
user_document_typenumberNoAllowed: 101, 201
redirect_urlstringNo
external_referencestringNo
colorDataEvrotrustColorDataNo
colorData.backgroundColorstringNo
colorData.borderColorstringNo
colorData.titleColorstringNo
colorData.subTitleColorstringNo
colorData.screenTextColorstringNo
colorData.buttonColorstringNo
colorData.buttonTextColorstringNo
colorData.iconsColorstringNo

Responses

200Session created successfully | application/json | ApiResponse_EvrotrustSessionResponse_
401Unauthorized | application/json | ApiResponse_null_
500Internal server error | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "token": "string",
    "encData": "string",
    "vendorNumber": "string",
    "sdkUrl": "string",
    "colorData": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

Webhook

2 endpoints

POST /v1/webhook Process webhook events Webhook

Handle BoldSign webhook events

Auth: PublicBody: application/json

Request Body

Content-Typeapplication/json
SchemaWebhookData
RequiredYes
Fields
FieldTypeRequiredDescription
jsonRecord_string.unknown_NoConstruct a type with a set of properties K of type T
filesarray<object>No
files[].metadataRecord_string.unknown_NoConstruct a type with a set of properties K of type T
files[].sizenumber (double)No
files[].typestringYes
files[].contentstringYes
files[].namestringYes

Signed payload from BoldSign. Verify signature with x-webhook-signature header.

Responses

200Webhook processed successfully | application/json
400Bad Request - Invalid payload | application/json | ApiResponse_ErrorResponse_
401Unauthorized - Invalid signature | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": [
    {
      "status": "fulfilled",
      "value": {
        "status": "none",
        "signerEmail": "string",
        "reason": "string"
      }
    }
  ]
}
POST /v1/webhook/listener Listener webhook event Webhook

Listener webhook event

Auth: PublicBody: application/jsonParams: 2

Parameters

x-company-id header string, requiredThe company ID
x-webhook-signature headerstring, required — The webhook signature from x-webhook-signature header

Request Body

Content-Type application/json
SchemaWebhookData
RequiredYes
Fields
FieldTypeRequiredDescription
jsonRecord_string.unknown_NoConstruct a type with a set of properties K of type T
filesarray<object>No
files[].metadataRecord_string.unknown_NoConstruct a type with a set of properties K of type T
files[].sizenumber (double)No
files[].typestringYes
files[].contentstringYes
files[].namestringYes

Listener endpoint for webhook events.

Responses

200Webhook event received | application/json | ApiResponse__status-string--event_63_-string--data_63_-WebhookData__
400Invalid webhook signature | application/json | ApiResponse_null_
401Unauthorized | application/json | ApiResponse_null_
403Forbidden | application/json | ApiResponse_null_
Example 200 response
{
  "data": {
    "data": {
      "json": {
        "key": "string"
      },
      "files": [
        {
          "metadata": {
            "key": "string"
          },
          "size": 0,
          "type": "string",
          "content": "string",
          "name": "string"
        }
      ]
    },
    "event": "string",
    "status": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

Health

1 endpoints

GET /smoke Get application health status Health

Check application health and dependencies

Auth: Public

Responses

200Application is healthy | application/json | ApiResponse_SmokeResponse_
500Application is unhealthy | application/json | ApiResponse_ErrorResponse_
Example 200 response
{
  "data": {
    "buildId": "string"
  },
  "metadata": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "requestId": "string",
    "timestamp": "2026-04-07T15:56:49.999Z"
  }
}

Using the API

Error Handling

Standard HTTP errors with structured error payloads.

400 Bad Request

Missing required fields or invalid form-data.

401 Unauthorized

Invalid token or missing `Authorization` header.

403 Forbidden

Token lacks the required scopes for the endpoint.

500 Server Error

Unexpected exception. Provide `X-Request-ID` for support.

{
  "data": null,
  "error": {
    "code": "AUTH_401",
    "message": "Invalid access token",
    "details": {
      "field": "Authorization",
      "reason": "expired"
    }
  }
}