# Are Sendforsign documents legally compliant?
Source: https://about.sendforsign.com/about/compliance
Yes, they are.
We provide the `Simple electronic signature (SES)`: ideal for everyday transactions.
This represents the most basic form of electronic signature available. It does not require
signer's authentication or identity verification. For transactions that can use this type of signature,
it is enough to know the signer’s email address, or that they received a unique access code or link before signing.
Sendforsign provides both methods: sending signing requests via emails and generating unique signing links.
These types of signature does not require the generation of additional data to confirm the signer's identity.
Examples of cases where Sendforsign can be useful:
* SAFE agreements
* Non-Disclosure Agreements (NDAs)
* Employment contracts
* Freelance contracts
* Routine sales agreements
* Procurement agreements
* Various simple forms requiring signatures
* And other low and medium-value agreements
For high-value transactions, it is advisable to explore alternative solutions, as
Sendforsign currently doesn't support complex user authentication methods.
# Privacy Policy
Source: https://about.sendforsign.com/about/privacypolicy
Last updated: September 15, 2023
This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.
We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy.
## Interpretation and Definitions
### Interpretation
The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.
### Definitions
* For the purposes of this Privacy Policy:
* Service (referred to as either "the Service", "We", "Us" or "Our" in this Agreement) refers to Sendforsign. The Service is located at [https://sendforsign.com](https://sendforsign.com) and [https://app.sendforsign.com](https://app.sendforsign.com)
* Account means a unique account created for You to access our Service or parts of our Service.
* Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.
* Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.
* Personal Data is any information that relates to an identified or identifiable individual.
* Service Provider means any natural or legal person who processes the data on behalf of the Service. It refers to third-party companies or individuals employed by the Service to facilitate the Service, to provide the Service on behalf of the Service, to perform services related to the Service or to assist the Service in analyzing how the Service is used.
* Usage Data refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).
* You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
## Collecting and Using Your Personal Data
### Types of Data Collected
### Personal Data
While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:
* Email address
* Usage Data
### Usage Data
Usage Data is collected automatically when using the Service.
Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.
When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.
We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.
### Tracking Technologies and Cookies
We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:
* Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.
* Web Beacons. Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Service, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).
Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. You can learn more about cookies on TermsFeed website article.
We use both Session and Persistent Cookies for the purposes set out below:
* Necessary / Essential Cookies
Type: Session Cookies
Administered by: Us
Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.
* Functionality Cookies
Type: Persistent Cookies
Administered by: Us
Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.
\###Use of Your Personal Data
The Company may use Personal Data for the following purposes:
* To provide and maintain our Service, including to monitor the usage of our Service.
* To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.
* To contact You: To contact You by email regarding updates or informative communications related to the Service functionalities, including the security updates, when necessary or reasonable for their implementation.
* To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired.x
* To manage Your requests: To attend and manage Your requests to Us.
* For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, marketing and your experience.
We may share Your personal information in the following situations:
* With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.
* With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.
* With Your consent: We may disclose Your personal information for any other purpose with Your consent.
## Retention of Your Personal Data
The Service will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy.
The Service will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.
## Transfer of Your Personal Data
Your information, including Personal Data, is processed at the Service's servers and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.
Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.
The Service will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.
## Delete Your Personal Data
You have the right to delete or request that We assist in deleting the Personal Data that We have collected about You.
We may give You the ability to delete certain information about You from within the Service through our support (You can send a mail to `ilia@sendforsign.com`).
You may update, amend, or delete Your information at any time by signing in to Your Account, if you have one, and visiting the account settings section that allows you to manage Your personal information. You may also contact Us to request access to, correct, or delete any personal information that You have provided to Us.
## Disclosure of Your Personal Data
### Law enforcement
Under certain circumstances, the Service may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).
### Security of Your Personal Data
The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.
### Children's Privacy
Our Service does not address anyone under the age of 18. We do not knowingly collect personally identifiable information from anyone under the age of 18. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 18 without verification of parental consent, We take steps to remove that information from Our servers.
If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.
## Links to Other Websites
Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.
We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.
## Changes to this Privacy Policy
We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.
We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.
You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
## Contact Us
If you have any questions about this Privacy Policy, You can contact us:
By email: `ilia@sendforsign.com`
# Terms and Conditions
Source: https://about.sendforsign.com/about/termsandconditions
Last updated: September 15, 2023
Please read these terms and conditions carefully before using Our Service.
## Interpretation and Definitions
### Interpretation
The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.
### Definitions
For the purposes of these Terms and Conditions:
* Service (referred to as either "the Service", "We", "Us" or "Our" in this Agreement) refers to Sendforsign. The Service is located at [https://sendforsign.com](https://sendforsign.com) and [https://app.sendforsign.com](https://app.sendforsign.com)
* Account means a unique account created for You to access our Service or parts of our Service.
* Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.
* Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.
* Personal Data is any information that relates to an identified or identifiable individual.
## Acknowledgment
These are the Terms and Conditions governing the use of this Service and the agreement that operates between You and Us. These Terms and Conditions set out the rights and obligations of all users regarding the use of the Service.
Your access to and use of the Service is conditioned on Your acceptance of and compliance with these Terms and Conditions. These Terms and Conditions apply to all visitors, users and others who access or use the Service.
By accessing or using the Service You agree to be bound by these Terms and Conditions. If You disagree with any part of these Terms and Conditions then You may not access the Service.
You represent that you are over the age of 18. We does not permit those under 18 to use the Service.
Your access to and use of the Service is also conditioned on Your acceptance of and compliance with the Privacy Policy of the Service. Our Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your personal information when You use the Service. Please read Our Privacy Policy carefully before using Our Service.
## Links to Other Websites
Our Service may contain links to third-party web sites or services that are not owned or controlled by Us.
The Service has no control over, and assumes no responsibility for, the content, privacy policies, or practices of any third party web sites or services. You further acknowledge and agree that the Service shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any such content, goods or services available on or through any such web sites or services.
We strongly advise You to read the terms and conditions and privacy policies of any third-party web sites or services that You visit.
## Termination
We may terminate or suspend Your access immediately, without prior notice or liability, for any reason whatsoever, including without limitation if You breach these Terms and Conditions.
Upon termination, Your right to use the Service will cease immediately.
## Limitation of Liability
Notwithstanding any damages that You might incur, the entire liability of the Service and any of its suppliers under any provision of this Terms and Your exclusive remedy for all of the foregoing shall be limited to the amount actually paid by You through the Service.
No event shall the Service or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever (including, but not limited to, damages for loss of profits, loss of data or other information, for business interruption, for personal injury, loss of privacy arising out of or in any way related to the use of or inability to use the Service, third-party software and/or third-party hardware used with the Service, or otherwise in connection with any provision of this Terms).
## "AS IS" and "AS AVAILABLE" Disclaimer
The Service is provided to You "AS IS" and "AS AVAILABLE" and with all faults and defects without warranty of any kind. The Service provides no warranty or undertaking, and makes no representation of any kind that the Service will meet Your requirements, achieve any intended results, be compatible or work with any other software, applications, systems or services, operate without interruption, meet any performance or reliability standards or be error free or that any errors or defects can or will be corrected.
Without limiting the foregoing, neither the Company nor any of the company's provider makes any representation or warranty of any kind, express or implied: (i) as to the operation or availability of the Service, or the information, content, and materials or products included thereon; (ii) that the Service will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or currency of any information or content provided through the Service; or (iv) that the Service, its servers, the content, or e-mails sent from or on behalf of the Company are free of viruses, scripts, trojan horses, worms, malware, timebombs or other harmful components.
## Governing Law
The laws of the Country, excluding its conflicts of law rules, shall govern this Terms and Your use of the Service. Your use of the Service may also be subject to other local, state, national, or international laws.
## Disputes Resolution
### Disputes Resolution
If You have any concern or dispute about the Service, You agree to first try to resolve the dispute informally by contacting Us.
## Severability and Waiver
### Severability
If any provision of these Terms is held to be unenforceable or invalid, such provision will be changed and interpreted to accomplish the objectives of such provision to the greatest extent possible under applicable law and the remaining provisions will continue in full force and effect.
### Waiver
Except as provided herein, the failure to exercise a right or to require performance of an obligation under these Terms shall not effect a party's ability to exercise such right or require such performance at any time thereafter nor shall the waiver of a breach constitute a waiver of any subsequent breach.
## Translation Interpretation
These Terms and Conditions may have been translated if We have made them available to You on our Service. You agree that the original English text shall prevail in the case of a dispute.
## Changes to These Terms and Conditions
We reserve the right, at Our sole discretion, to modify or replace these Terms at any time. If a revision is material We will make reasonable efforts to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at Our sole discretion.
By continuing to access or use Our Service after those revisions become effective, You agree to be bound by the revised terms. If You do not agree to the new terms, in whole or in part, please stop using the website and the Service.
## Contact Us
If you have any questions about these Terms and Conditions, You can contact us:
By email: `ilia@sendforsigning.com`
# Vision
Source: https://about.sendforsign.com/about/vision
Why are we building Sendforsign?
Here's the story of the founders and our vision below. To see more practical things on how Sendforsign
can help you, jump to this [page](/introduction).
Hi, this is [Ilia](https://www.linkedin.com/in/ibillidi/), [Kate](https://www.linkedin.com/in/ekabovk/) and
[Pasha](https://www.linkedin.com/in/pavelzhukov87/), the founders of Sendforsign. We initially embarked on this
project as a side venture in Autumn 2023 while developing another tool. However, this side project
became increasingly popular, with people using it to send and sign their documents. So, here we are,
working on another API-first AI-powered contract tool.
The concept behind Sendforsign is straightforward. We believe that digital contracts are kinda broken.
Perhaps you require the integration of a contract workflow into your business processes. This often involves
navigating demo requests, dealing with customer service managers, exploring personal pricing plans, and dedicating
weeks and months to implementation.
How do we know this? We've previously worked on building Contract Lifecycle Management (CLM) systems and integrating
contract workflows into businesses.
But there's a bigger picture here. We're living in an era of rapid AI advancement and the emergence of MCP (Model Context Protocol) servers
that are fundamentally changing how software interacts. Contracts, as the foundation of business relationships, should
be at the forefront of this technological evolution. They need to adapt to new capabilities, integrate seamlessly with
AI assistants, and leverage the power of protocol-based architectures.
Instead of contracts being rigid, isolated systems, they should become intelligent, programmable components that can be
generated, analyzed, and managed through AI-driven workflows. They should integrate naturally with MCP servers, allowing
developers and businesses to automate contract processes with unprecedented ease and sophistication.
So, we decided that our solution will be simple: we offer "zero-setup" interfaces for straightforward cases and an
easy-to-use Contract API for more complex scenarios, built from the ground up with AI and modern protocols in mind.
We hope you'll find it valuable.
# Authentication
Source: https://about.sendforsign.com/api-reference/authentication
Learn how to authenticate your API requests to the SFS API platform.
The SFS API offers industry-standard security controls for connecting to its platform, submitting, storing,
and retrieving data from SFS data servers, and conducting various business operations with this data.
## API security key concepts
The SFS API platform adheres to several principles to uphold the integrity and security of data:
* `Secure Data Transmission:` All API requests to the SFS API platform must be made via HTTPS. Attempts to make
calls over plain HTTP will be unsuccessful.
* `Bearer Token Authentication:` Each API request must authenticate using a Bearer token. This token is generated by
SFS using the provided API Key and Secret. This authentication method aligns with [OAuth 2.0 standards](https://oauth.net/2/),
the recognized protocol for API authorization. When an API request is received,
SFS checks whether the bearer of the token is valid and has not expired.
## API Key and Secret
SFS's token mechanism complies with the OAuth 2.0 standard, which allows for the generation of short-lived tokens.
These tokens, with customizable lifespans, are more secure than longer-lasting API keys and help reduce the risk of
damage from potential leaks.
To generate tokens for the SFS API, platform developers must first log into their account on the SFS Portal, where
they can access existing API Keys and Secret.
## Creating platform tokens
To create a new token for accessing the SFS API, first you need to call `POST /api/token` with the request body
containing the `apiKey` and `Secret` values you obtained in the previous step.
The `/api/token` endpoint does not require any authentication headers, which is in line with the OAuth 2.0 standard.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/token' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"apiKey": "YOUR_API_KEY",
"secret": "YOUR_SECRET"
}
}'
```
The successful `201 Created` response contains the `access_token` and its validity time (in seconds):
```bash JSON theme={null}
{
"access_token": "123456789...",
"token_type": "Bearer",
"expires_in": 1800
}
```
## Revoking platform tokens
Tokens generated within the SFS API platform have an auto-expiry based on the specified `expires_in` value
(in seconds). Nevertheless, in certain cases you may want to explicitly revoke an active token, such as when
a client logs out from your application.
To revoke a token, call `POST /api/token` with a request body containing the `revoke` action, and specify the
`platform Bearer token` in the header:
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/token' \
-H 'Authorization: Bearer 123456789' \
-H 'Content-Type: application/json' \
-d '{
"action": "revoke"
}'
```
A `201 OK` response indicates that the specified token has been revoked successfully.
```bash JSON theme={null}
{
"code": 201,
"message": "Token revoked"
}
```
## Creating client tokens
A Client token is a specific token issued for an individual platform client.
These tokens allowing actions to be directly linked to specific client within your platform.
To generate a client token, call `POST /api/token`, and specify the Key of this client in `clientKey` request field,
and specify the `platform Bearer token` in the header:
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/token' \
-H 'Authorization: Bearer 123456789' \
-H 'Content-Type: application/json' \
-d '{
"action": "create",
"clientKey": "YOUR_CLIENT_KEY"
}'
```
The successful `201 Created` response contains the `access_token` and its validity time (in seconds):
```bash JSON theme={null}
{
"access_token": "123456789...",
"token_type": "Bearer",
"expires_in": 1800
}
```
## Revoking client tokens
Tokens generated within the SFS API platform have an auto-expiry based on the specified `expires_in` value
(in seconds). Nevertheless, in certain cases you may want to explicitly revoke an active token, such as when
a client logs out from your application.
To revoke a token, call `POST /api/token` with a request body containing the `revoke` action and the `client access token`,
and specify the `platform Bearer token` in the header:
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/token' \
-H 'Authorization: Bearer 123456789' \
-H 'Content-Type: application/json' \
-d '{
"action": "revoke",
"access_token": "eyJ0eXAiOiJKV1QiLCJhb..."
}'
```
A `201 OK` response indicates that the specified token has been revoked successfully.
```bash JSON theme={null}
{
"code": 201,
"message": "Token revoked"
}
```
## Authentication for testing purposes
Although we always recommend using Sendforsign's token mechanism to access our infrastructure, there is an
alternative way to send API calls and render Sendforsign's components without the need to generate tokens.
You can use a combination of an API Key (in the request header) and a Client Key (in the request body) to achieve the same result
as using the access token.
Compare the two requests below; both will result in creating a new contract in Sendforsign's infrastructure.
In the first case, you will need to use only your Bearer Access Token, and in the second case, you can use
your `X-Sendforsign-Key` API key in the header and your Client Key in the request body.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'Authorization: Bearer 123456789' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"contract": {
"name": "New contract",
"value": "
Contract text
"
}
}
}'
```
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"name": "New contract",
"value": "Contract text
"
}
}
}'
```
# Create client
Source: https://about.sendforsign.com/api-reference/client/create
POST https://api.sendforsign.com/api/client
Create a new client.
### Body parameters
Action type.
Structure, at least one of the fields must be filled.
First and second names of the client.
Email of the client.
Organization name.
Your custom key, if you don't need to use any of the above fields.
Array of users, optional.
First and second names of the user.
Email of the user.
A custom user key, if you don't need to use any of the above fields.
### Response
Client structure.
Create time.
ID of the client.
Array of users.
Create time.
The default user flag.
ID of the user.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"client": {
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION",
"users": [{
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"customKey": "YOUR_COMBINATION"
}]
}
}
}'
```
```json Response theme={null}
{
"client": {
"createTime": "2023-12-01 12:18:55",
"clientKey": "CLIENT_KEY",
"users": [{
"createTime": "2023-12-01 12:18:55",
"default": true,
"userKey": "USER_KEY"
}]
},
"code": "201",
"message": "Client created"
}
```
# List of clients
Source: https://about.sendforsign.com/api-reference/client/list
POST https://api.sendforsign.com/api/client
Get a list of all clients created via a specific API Key.
### Body parameters
Action type.
### Response
Array of clients.
Create time.
Change time.
ID of the client.
First and second names of the client.
Email of the client.
Organization name.
Client custom key, if you used it when creating the client.
This parameter indicates that this client has users.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list"
}
}'
```
```json Response theme={null}
{
"clients": [{
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"clientKey": "CLIENT_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION",
"multiple": true
}],
"code": "200",
"message": "Clients found"
}
```
# Read client
Source: https://about.sendforsign.com/api-reference/client/read
POST https://api.sendforsign.com/api/client
Get information about a specific client.
### Body parameters
Action type.
Structure, at least one of the fields must be filled.
ID of the client.
First and second names of the client.
Email of the client.
Organization name.
Client custom key, if you used it when creating the client.
### Response
Client structure.
Create time.
Change time.
ID of the client.
First and second names of the client.
Email of the client.
Organization name.
Client custom key, if you used it when creating the client.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "read",
"client": {
"clientKey": "CLIENT_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
```json Response theme={null}
{
"client": {
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"clientKey": "CLIENT_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION"
},
"code": "200",
"message": "Client found"
}
```
# Update client
Source: https://about.sendforsign.com/api-reference/client/update
POST https://api.sendforsign.com/api/client
Update an existing client.
### Body parameters
Action type.
Structure, use the fields that should be updated.
ID of the client.
First and second names of the client.
Email of the client.
Organization name.
Client custom key, if you used it when creating the client.
### Response
Client structure.
Change time.
ID of the client.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"client": {
"clientKey": "CLIENT_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
```json Response theme={null}
{
"client": {
"changeTime": "2023-12-01 12:18:55",
"clientKey": "CLIENT_KEY",
},
"code": "201",
"message": "Client updated"
}
```
# Archive contract
Source: https://about.sendforsign.com/api-reference/contract/archive
POST https://api.sendforsign.com/api/contract
Archive a specific contract.
### Body parameters
Action type.
Key of the client.
Structure.
Key of the contract.
### Response
Contract structure.
ID of the contract.
Name of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "archive",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"contractKey": "CONTRACT_KEY"
}
}
}'
```
```json Response theme={null}
{
"contract": {
"contractKey": "CONTRACT_KEY",
"name": "New contract"
},
"code": "200",
"message": "Contract archived"
}
```
# Create contract
Source: https://about.sendforsign.com/api-reference/contract/create
POST https://api.sendforsign.com/api/contract
Create a new contract using contract value.
### Body parameters
Action type.
Key of the client.
ID of the user who create the contract. If not specified, the default user credentials will be used.
Contract structure.
Name of the contract.
Content of the contract, use HTML.
### Response
Contract structure.
Create time.
ID of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"contract": {
"name": "New contract",
"value": "Contract text
"
}
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"contractKey": "CONTRACT_KEY"
},
"code": "201",
"message": "Contract created"
}
```
# Create and fill in contract
Source: https://about.sendforsign.com/api-reference/contract/create-fill
POST https://api.sendforsign.com/api/contract
Create a new contract and populate it with the necessary data.
The best way to fill in contracts is to prepare a template that already contains all the necessary
placeholders in the text. This way, you can populate the necessary data in the right placeholders within
the contracts with a single API call.
### Body parameters
Action type.
Key of the client.
ID of the user who create the contract. If not specified, the default user credentials will be used.
Contract structure.
Name of the contract.
Template from which you are creating a contract.
Array of placeholders, optional.
A placeholder key corresponds to a specific placeholder in the template from which you create a contract.
Use this parameter if you need to populate any value into this specific placeholder.
Name of the placeholder.
Value of the placeholder.
### Response
Contract structure.
Create time.
ID of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"contract": {
"name": "New contract",
"templateKey": "TEMPLATE_KEY"
},
"placeholders": [
{
"placeholderKey": "PLACEHOLDER_KEY",
"value": "Placeholder value"
},
{
"name": "Placeholder name",
"value": "Placeholder value"
}
]
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"contractKey": "CONTRACT_KEY"
},
"code": "201",
"message": "Contract created"
}
```
# Create from template
Source: https://about.sendforsign.com/api-reference/contract/create-from-template
POST https://api.sendforsign.com/api/contract
Create a new contract using an existing template.
### Body parameters
Action type.
Key of the client.
ID of the user who create the contract. If not specified, the default user credentials will be used.
Contract structure.
Name of the contract.
Template from which you are creating a contract.
### Response
Contract structure.
Create time.
ID of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"contract": {
"name": "New contract",
"templateKey": "TEMPLATE_KEY"
}
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"contractKey": "CONTRACT_KEY"
},
"code": "201",
"message": "Contract created"
}
```
# Create and send contract
Source: https://about.sendforsign.com/api-reference/contract/create-send
POST https://api.sendforsign.com/api/contract
Create a new contract and immediately send it to the recipients.
### Body parameters
Action type.
Key of the client.
ID of the user who create the contract. If not specified, the default user credentials will be used.
Contract structure.
Name of the contract.
Content of the contract, use HTML.
Array of recipients, optional.
What the recipient needs to do with the contract. Available options: `view`, `sign`, `approve`, and `lock`.
Custom note to the recipient. If not specified, the default message will be sent.
Full name of the recipient.
Email of the recipient.
Signing order. If not specified, all requests will be sent simultaneously.
### Response
Contract structure.
Create time.
ID of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"contract": {
"name": "New contract",
"value": "Contract text
"
},
"recipients":[{
"action": "view",
"clientKey": "YOUR_CLIENT_KEY",
"customMessage": "Custom message text",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"position": 1
}]
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"contractKey": "CONTRACT_KEY"
},
"code": "201",
"message": "Contract created"
}
```
# Duplicate contract
Source: https://about.sendforsign.com/api-reference/contract/duplicate
POST https://api.sendforsign.com/api/contract
Duplicate an existing contract.
When duplicating a contract, the placeholder structure is copied, but all placeholder values are cleared.
### Body parameters
Action type.
Key of the client.
Structure.
Key of the contract that needs to be duplicated.
### Response
Contract structure.
Create time.
ID of the duplicated contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "duplicate",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"contractKey": "YOUR_CONTRACT_KEY"
}
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"contractKey": "NEW_CONTRACT_KEY"
},
"code": "201",
"message": "Contract duplicated"
}
```
# Get Timeline
Source: https://about.sendforsign.com/api-reference/contract/get_timeline
GET https://api.sendforsign.com/api/contract_event
Get timeline of an existing contract.
Retrieve a contract timeline.
### Query parameters
Key of the client.
Key of the contract.
```bash cURL theme={null}
curl -X GET 'https://api.sendforsign.com/api/contract_event?clientKey=658599d9-bbbe&contractKey=5cb-49c6-4f62-9b77-5c304' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
```
# List of contracts
Source: https://about.sendforsign.com/api-reference/contract/list
POST https://api.sendforsign.com/api/contract
Get a list of all contracts created by a specific client.
### Body parameters
Action type.
Key of the client.
### Response
Array of contracts.
Create time.
Change time.
ID of the contract.
Name of the contract.
Status of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list",
"clientKey": "YOUR_CLIENT_KEY"
}
}'
```
```json Response theme={null}
{
"contracts": [
{
"createTime": "2024-11-25T08:07:23.000Z",
"changeTime": "2024-11-25T08:07:25.000Z",
"contractKey": "93447fb5-91ee-41ad-9f73-b4ae2d467292",
"name": "IPPDF",
"status": "Created"
},
{
"createTime": "2024-11-18T13:27:21.000Z",
"changeTime": "2024-11-21T11:29:47.000Z",
"contractKey": "ac2a37e8-d5d6-4468-b1bb-29152a31d85d",
"name": "A test contract",
"status": "Created"
}
],
"code": "200",
"message": "Contracts found"
}
```
# Read contract
Source: https://about.sendforsign.com/api-reference/contract/read
POST https://api.sendforsign.com/api/contract
Get information about a specific contract.
### Body parameters
Action type.
Key of the client.
Structure, at least one of the fields must be filled.
Key of the contract.
Name of the contract.
### Response
Contract structure.
Create time.
Change time.
ID of the contract.
Name of the contract.
Content of the contract, HTML.
Status of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "read",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"contractKey": "CONTRACT_KEY",
"name": "New contract"
}
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"contractKey": "CONTRACT_KEY",
"name": "New contract",
"status": "Created",
"value": "Contract text
"
},
"code": "200",
"message": "Contract found"
}
```
# Update contract
Source: https://about.sendforsign.com/api-reference/contract/update
POST https://api.sendforsign.com/api/contract
Update an existing contract.
### Body parameters
Action type.
Key of the client.
Structure, use the fields that should be updated.
Key of the contract.
Name of the contract.
Content of the contract, use HTML.
### Response
Contract structure.
Create time.
Change time.
ID of the contract.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"contractKey": "CONTRACT_KEY",
"name": "New contract",
"value": "Contract text
"
}
}
}'
```
```json Response theme={null}
{
"contract": {
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"contractKey": "CONTRACT_KEY",
},
"code": "201",
"message": "Contract updated"
}
```
# Implement client side
Source: https://about.sendforsign.com/api-reference/implementation_client
Get started with Sendforsign API.
SFS offers two methods for platforms to smoothly integrate their applications with SFS services:
* React Components:
* The SFS React UI SDK is a collection of pre-made React components linked to the API, suitable for
React-based client and server-side applications. This option lets you maintain control over the design and
branding while SFS manages the more complex tasks.
* API Only:
* With API-only integration, platforms interact with SFS services by sending direct requests to SFS servers
using the provided API endpoints. This method offers full control over your integration process, enabling you to
implement necessary API calls within your application. It allows you the freedom to manage your backend logic while
utilizing the services offered by SFS.
# Implement server side
Source: https://about.sendforsign.com/api-reference/implementation_server
Get started with Sendforsign API.
No matter what integration type you will choose for your Client-side implementation, there are some
certain steps that can be only implemented on your backend. Please note that this tutorial shows code snippets
for each step in JSON, while the exact implementation depends on the programming language and framework you use
for your server side.
## Server Side
From the server side perspective, you need to create several fundamental objects:
* Get a platform API key and Secret (representing your platform).
* Generate a platform token.
* Create a client for each business that use your platform.
* Generate client tokens.
* Create client users for each end-user of the businesses on your platform.
## Get a platform API key and Secret
To begin using Sendforsign and gain the capability to generate documents through our infrastructure,
you need to create your SFS account. Creating a new account will automatically generate a unique API key and Secret for you.
## Generate a platform token
To create a new token for accessing the SFS API, first you need to call `POST /api/token` with the request body
containing the `apiKey` and `Secret` values you obtained in the previous step.
The `/api/token` endpoint does not require any authentication headers, which is in line with the OAuth 2.0 standard.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/token' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"apiKey": "YOUR_API_KEY",
"secret": "YOUR_SECRET"
}
}'
```
Never store your client secret in plain text. Always treat it in a way you treat
any other passwords and API keys in your system, and use a special encrypted storage for this type of sensitive data.
The successful `201 Created` response contains the `access_token` and its validity time (in seconds):
```bash JSON theme={null}
{
"access_token": "123456789...",
"token_type": "Bearer",
"expires_in": 1800
}
```
## Handle platform token expiry
A partner token is valid only for 1800 seconds (which is 30 minutes). If you will make a request with an expired token,
SFS responds back with a **401 Unauthorized** error:
```bash JSON theme={null}
{
"message": "Token expired",
"code": 401
}
```
In your server-side code, implement a mechanism to handle this error and generate a new token,
in the same way as you did in the previous step.
[Learn more about platfrom tokens here](/api-reference/authentication#creating-platform-tokens)
## Create a client for each business that use your platform
For each client you have in your platform, you need to create a corresponding client within the
SFS platform. Here, you don't need to duplicate all the information you already have about your
customers – submit only what's required by SFS. For more information about entities, refer to
SFS [account structure](/api-reference/structure).
To create a client, make a POST request to the `/api/client` endpoint.
The request's payload represents details of the client to be created. In the header, specify the `platform Bearer token`:
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'Authorization: Bearer 123456789' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"client": {
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
The successful `201 OK` response contains the `clientKey`:
```bash JSON theme={null}
{
"client": {
"createTime": "2023-12-01 12:18:55",
"clientKey": "CLIENT_KEY",
},
"code": "201",
"message": "Client created"
}
```
[Learn more about client API endpoint here](/api-reference/client/create)
## Generate client tokens
A Client token is a specific token issued for an individual platform client.
These tokens allowing actions to be directly linked to specific client within your platform.
To generate a client token, call `POST /api/token`, and specify the Key of this client in `clientKey` (from the previous step)
request field, and specify the `platform Bearer token` in the header:
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/token' \
-H 'Authorization: Bearer 123456789' \
-H 'Content-Type: application/json' \
-d '{
"action": "create",
"clientKey": "YOUR_CLIENT_KEY"
}'
```
The successful `201 Created` response contains the `access_token` and its validity time (in seconds):
```bash JSON theme={null}
{
"access_token": "123456789...",
"token_type": "Bearer",
"expires_in": 1800
}
```
[Learn more about client tokens here](/api-reference/authentication#creating-client-tokens)
## Handle client token expiry
A partner token is valid only for 1800 seconds (which is 30 minutes). If you will make a request with an expired token,
SFS responds back with a **401 Unauthorized** error:
```bash JSON theme={null}
{
"message": "Token expired",
"code": 401
}
```
In your server-side code, implement a mechanism to handle this error and generate a new token,
in the same way as you did in the previous step.
Once these steps are completed, you can proceed to the client side setup.
# Introduction
Source: https://about.sendforsign.com/api-reference/introapi
Understand our general API concepts.
## Base URL
Our API is organized around **REST**. It has predictable resource-oriented URLs. We enforce HTTPS in every request
to improve data security, integrity, and privacy. The API does not support HTTP.
All requests contain the following base URL:
```bash theme={null}
https://api.sendforsign.com/api
```
## Authentication
To authenticate you need to add an `X-Sendforsign-Key` header with the contents of the header
being `YOUR_API` where `YOUR_API` is your API key.
```bash theme={null}
X-Sendforsign-Key: YOUR_API_KEY
```
## Response
Sendforsign uses standard HTTP codes to indicate the success or failure of your requests.
In general, `2xx` HTTP codes correspond to success, `4xx` codes are for user-related failures,
and `5xx` codes are for infrastructure issues.
| Property | Description |
| -------- | -------------------------------------------- |
| `200` | Successful request. |
| `400` | Check that the parameters were correct. |
| `401` | The API key used was missing. |
| `403` | The API key used was invalid. |
| `404` | The resource was not found. |
| `429` | The rate limit was exceeded. |
| `5xx` | Indicates an error with Sendforsign servers. |
# AI+API
Source: https://about.sendforsign.com/api-reference/mcp/aiapi
POST https://aiapi.sendforsign.com/webhook/aiapi
Generate agreements with human language.
This feature is currently in open beta.
### Concept
We provide our users with the ability to simplify the API request structure, sending unified requests
to Sendforsign's infrastructure and receiving unified responses.
Supported use cases:
* `Create a contract in free format`: Ask the system to generate a contract using your context and best practices. Optionally, specify the recipients' names and email addresses.
* `Create a contract from a template`: Ask the system to generate a contract using a template. Specify the name of the template.
* `Create and fill in a contract from a template`: Provide the template name, the recipients' names and email addresses, and the data to populate the placeholders.
* `See the list of templates`: Retrieve a list of templates created in your account.
* `See the list of template placeholders`: Retrieve a list of placeholders of a template. Specify the name of the template.
### Headers
Your clientKey.
Your secretKey.
### Body parameters
Your message.
### Response
The response message.
If the system creates a contract, the contractKey will be returned.
If the system creates a contract, a previewURL will be returned. This URL is valid for 30 minutes and is intended for preview purposes only.
```bash cURL theme={null}
curl -X POST 'https://aiapi.sendforsign.com/webhook/aiapi' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'clientKey: YOUR_CLIENT_KEY' \
-H 'secretKey: YOUR_SECRET_KEY' \
-H 'Content-Type: application/json' \
-d '{
"message": "hello world"
}'
```
```json Response theme={null}
{
"output": "Hey how are you?",
"contract": {
"contractKey": "CONTRACT_KEY",
"previewURL": "URL",
}
"code": "201",
"message": "Contract created"
}
```
# Download PDF
Source: https://about.sendforsign.com/api-reference/pdf/download
GET https://api.sendforsign.com/api/download_pdf
Download PDF of an existing contract.
Retrieve a contract PDF. As a response, you will receive ArrayBuffer.
### Query parameters
Key of the client.
Key of the contract.
```bash cURL theme={null}
curl -X GET 'https://api.sendforsign.com/api/download_pdf?clientKey=658599d9-bbbe&contractKey=5cb-49c6-4f62-9b77-5c304' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
```
# Download Word
Source: https://about.sendforsign.com/api-reference/pdf/downloadword
GET https://api.sendforsign.com/api/download_docx
Download Word of an existing text contract.
Retrieve a contract Word. As a response, you will receive ArrayBuffer.
### Query parameters
Key of the client.
Key of the contract.
```bash cURL theme={null}
curl -X GET 'https://api.sendforsign.com/api/download_docx?clientKey=658599d9-bbbe&contractKey=5cb-49c6-4f62-9b77-5c304' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
```
# Upload PDF
Source: https://about.sendforsign.com/api-reference/pdf/upload
POST https://api.sendforsign.com/api/upload_pdf
Upload PDF as a contract.
Before uploading a PDF, you need to create an empty contract and obtain its Contract Key.
To do this, use the [Create Contract](/api-reference/contract/create)
request with the parameter `"contractType": "pdf"`.
Here's an example:
```bash cURL theme={null}
{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"name": "Your PDF name",
"contractType": "pdf"
}
}
}
```
As a response, you'll receive a ContractKey for the contract you created.
Use this key to upload your PDF to Sendforsign's infrastructure.
Additionally, you will need to include FormData in the body of the request.
For example:
```bash cURL theme={null}
-F 'pdf=@/path/to/yourfile.pdf;type=application/pdf'
```
Or in typescript:
```bash ts theme={null}
formData.append('pdf', new Blob([pdfFile as BlobPart], {type: 'application/pdf'}))
```
Where `pdfFile` is the ArrayBuffer of your document.
### Query parameters
Key of the client.
Key of the contract.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/upload_pdf?clientKey=658599d9-bbbe&contractKey=5cb-49c6-4f62-9b77-5c304' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: multipart/form-data' \
-F 'pdf=@/path/to/yourfile.pdf;type=application/pdf'
```
# Create placeholder
Source: https://about.sendforsign.com/api-reference/placeholder/create
POST https://api.sendforsign.com/api/placeholder
Add a placeholder to a contract.
One way to add placeholders to a contract is when you create a new contract.
[See this page](/api-reference/contract/create-fill) to learn more.
If a contract already exists, use the request below.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Structure, add the fields that need to be updated and ignore the rest.
Name of the placeholder
Value of the placeholder.
### Response
Placeholder structure.
Create time.
Change time.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholder": {
"name": "Placeholder name",
"value": "Placeholder value"
}
}
}'
```
```json Response theme={null}
{
"placeholder": {
"id": "3",
"createTime": "2024-11-22T11:11:24.000Z",
"changeTime": "2024-11-22T11:11:24.000Z",
"name": "1",
"value": "hello",
"type": "1",
"placeholderKey": "PLACEHOLDER_KEY",
"position": "3"
},
"code": 201,
"message": "Placeholder created"
}
```
# Delete placeholder
Source: https://about.sendforsign.com/api-reference/placeholder/delete
POST https://api.sendforsign.com/api/placeholder
Delete an existing placeholder.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Structure.
Key of the placeholder that needs to be deleted.
### Response
The status.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "delete",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholder": {
"placeholderKey": "PLACEHOLDER_KEY"
}
}
}'
```
```json Response theme={null}
{
"code": "200",
"message": "Placeholder deleted"
}
```
# List of placeholders
Source: https://about.sendforsign.com/api-reference/placeholder/list
POST https://api.sendforsign.com/api/placeholder
Get a list of all placeholders created in a specific contract or template.
### Body parameters
Action type.
Key of the client.
ID of the template. Use this parameter if you need to retrieve a template's placeholders.
Key of the contract. Use this parameter if you need to retrieve a contract's placeholders.
### Response
Array of placeholders.
ID of the placeholder.
Create time.
Change time.
Name of the placeholder.
Value of the placeholder.
Key of the placeholder.
Position of the placeholder.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"templateKey": "TEMPLATE_KEY"
}
}'
```
```json Response theme={null}
{
"placeholders": [
{
"id": "1",
"createTime": "2024-02-26T11:07:55.000Z",
"changeTime": "2024-02-26T11:07:59.000Z",
"name": "Placeholder Name",
"value": "Placeholder Value",
"placeholderKey": "PLACEHOLDER_KEY",
"position": 1
}
],
"code": "200",
"message": "Placeholders found"
}
```
# Place basic placeholder
Source: https://about.sendforsign.com/api-reference/placeholder/pdfbasic
POST https://api.sendforsign.com/api/placeholder
Place a basic placeholder in a PDF contract.
Basic placeholders are text placeholders that can be used to fill in HTML and PDF contracts.
Additionally, they can be linked to any recipient afterward.
Before placing placeholders in a PDF, you need to [create them](/api-reference/placeholder/create) in advance.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Array of placeholders.
Key of the placeholder that needs to be updated.
Array of places.
ID of the insertion. Provide a new ID for each insertion. If you provide the ID of an existing
placeholder, the placeholder will be updated.
Page number where you insert the placeholder, starting from 0.
Width of the placeholder.
Height of the placeholder.
Position X of the placeholder, starting from the top-left corner of the page.
Position Y of the placeholder, starting from the top-left corner of the page.
### Response
Placeholder structure.
Create time.
Change time.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholders": [
{
"placeholderKey": "PLACEHOLDER_KEY",
"insertion": [
{
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"id": 0,
"pageId": 0,
"width": 100,
"height": 100,
"positionX": 1,
"positionY": 1
}
]
}
]
}
}'
```
```json Response theme={null}
{
"code": 201,
"message": "Placeholder updated"
}
```
# Place special placeholder
Source: https://about.sendforsign.com/api-reference/placeholder/pdfspecial
POST https://api.sendforsign.com/api/placeholder
Place a special placeholder in a PDF contract.
Special placeholders are four types of placeholders that are created automatically for every recipient.
So, before placing special fields in your PDF contract, create a recipient using [this request](/api-reference/recipient/create).
After this, all the special placeholders will be created automatically with corresponding keys:
`Recipient_Key_1`, `Recipient_Key_2`, `Recipient_Key_3`, `Recipient_Key_4`.
Here's an example of a placeholder key: `"placeholderKey": "93447fb5-91ee-41ad-9f73-b4ae2d467292_4"`.
Available placeholder codes:
* 1: Recipient's date signed.
* 2: Recipient's full name.
* 3: Recipient's email.
* 4: Recipient's signature.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Array of placeholders.
Key of the placeholder that needs to be updated. Generated automatically from 2 paramaters: Recipient's Key and Special Type.
True for special fields.
Use the following placeholder codes to create the corresponding fields:
1: Recipient's date signed,
2: Recipient's full name
3: Recipient's email
4: Recipient's signature
Array of places.
ID of the insertion. Provide a new ID for each insertion. If you provide the ID of an existing
placeholder, the placeholder will be updated.
Page number where you insert the placeholder, starting from 0.
Width of the placeholder.
Height of the placeholder.
Position X of the placeholder, starting from the top-left corner of the page.
Position Y of the placeholder, starting from the top-left corner of the page.
### Response
Placeholder structure.
Create time.
Change time.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholders": [
{
"placeholderKey": "RECIPIENT_KEY_4",
"isSpecial": true,
"specialType": 4,
"insertion": [
{
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"id": 2,
"pageId": 0,
"width": 150,
"height": 150,
"positionX": 1,
"positionY": 1
}
]
}
]
}
}'
```
```json Response theme={null}
{
"code": 201,
"message": "Placeholder updated"
}
```
# Update placeholder
Source: https://about.sendforsign.com/api-reference/placeholder/update
POST https://api.sendforsign.com/api/placeholder
Update an existing placeholder.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Structure, add the fields that need to be updated and ignore the rest.
Key of the placeholder that needs to be updated.
Name of the placeholder
Value of the placeholder.
### Response
Placeholder structure.
Change time.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholder": {
"placeholderKey": "PLACEHOLDER_KEY",
"name": "Name",
"value": "Value"
}
}
}'
```
```json Response theme={null}
{
"placeholder": {
"id": "1",
"createTime": "2024-03-14T20:34:08.000Z",
"changeTime": "2024-03-14T20:38:39.000Z",
"name": "Name",
"value": "Value",
"type": "1",
"placeholderKey": "PLACEHOLDER_KEY",
"position": null
},
"code": "201",
"message": "Placeholder updated"
}
```
# Table placeholder
Source: https://about.sendforsign.com/api-reference/placeholder/update-table
POST https://api.sendforsign.com/api/placeholder
Convert any existing placeholder into a dynamic table in a HTML contract.
First, add a placeholder to the HTML document to obtain a placeholder key.
[See this page](/api-reference/placeholder/create) to learn more.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Structure, add the fields that need to be updated and ignore the rest.
Key of the placeholder that needs to be updated.
Table structure for the placeholder.
Array of column headers (strings).
Array of rows, where each row is an array of values (strings or numbers).
### Response
Placeholder structure.
Placeholder ID.
Creation time.
Change time.
Placeholder name.
JSON string containing table data with columns and rows.
Indicates if the placeholder is a table (true for table placeholders).
Placeholder type.
Placeholder key.
Position of the placeholder.
Filling type.
External recipient key (null if not set).
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholder": {
"placeholderKey": "PLACEHOLDER_KEY",
"table": {
"columns": ["Product", "Quantity", "Unit Price", "Total"],
"rows": [
["Product 1", 2, 100, 200],
["Product 2", 1, 250, 250],
["Product 3", 4, 75, 333]
]
}
}
}
}'
```
```json Response theme={null}
{
"placeholder": {
"id": "1",
"createTime": "2025-10-31T09:27:46.000Z",
"changeTime": "2025-10-31T09:28:23.000Z",
"name": "PLACEHOLDER_NAME",
"value": "{\"columns\":[\"Product\",\"Quantity\",\"Unit Price\",\"Total\"],\"rows\":[[\"Product 1\",2,100,200],[\"Product 2\",1,250,250],[\"Product 3\",4,75,333]]}",
"isTable": true,
"type": "1",
"placeholderKey": "PLACEHOLDER_KEY",
"position": "1",
"fillingType": "1",
"externalRecipientKey": null
},
"code": 201,
"message": "Placeholder updated"
}
```
# Create recipient
Source: https://about.sendforsign.com/api-reference/recipient/create
POST https://api.sendforsign.com/api/recipient
Add a recipient to a contract.
One way to add recipients to a contract is when you send a contract.
[See this page](/api-reference/recipient/send) to learn more.
If you need to add a recipient to a contract without sending it, use the request below.
### Body parameters
Action type.
Key of the client.
ID of the user who is sending the contract. If not specified, the default user credentials will be used.
Key of the contract.
Array of recipients, optional.
What the recipient needs to do with the contract. Available options: `view`, `sign`, `approve`, and `lock`.
Custom note to the recipient. If not specified, the default message will be sent.
Full name of the recipient.
Email of the recipient.
Signing order. If not specified, all requests will be sent simultaneously.
### Response
Status.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/recipient' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"recipients":[{
"action": "view",
"clientKey": "YOUR_CLIENT_KEY",
"customMessage": "Custom message text",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"position": 1
}],
}
}'
```
```json Response theme={null}
{
"result": true,
"code": "200",
"message": "Recipient created"
}
```
# Delete recipient
Source: https://about.sendforsign.com/api-reference/recipient/delete
POST https://api.sendforsign.com/api/recipient
Delete an existing recipient.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Structure.
Key of the recipient that needs to be deleted.
### Response
The status.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/recipient' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "delete",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"recipient": {
"recipientKey": "RECIPIENT_KEY"
}
}
}'
```
```json Response theme={null}
{
"result": true,
"code": "200",
"message": "Recipient deleted"
}
```
# List of recipients
Source: https://about.sendforsign.com/api-reference/recipient/list
POST https://api.sendforsign.com/api/recipient
Get a list of all recipients created in a specific contract.
### Body parameters
Action type.
Key of the client.
Key of the contract. Use this parameter if you need to retrieve a contract's recipients.
### Response
Array of recipients.
ID of the recipient.
Create time.
Change time.
Name of the recipient.
Email of the recipient.
Custom message of the recipient.
Position of the recipient.
Action of the recipient.
Key of the recipient.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/recipient' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY" }
}'
```
```json Response theme={null}
{
"recipients": [
{
"id": "1",
"createTime": "2024-02-26T11:07:55.000Z",
"changeTime": "2024-02-26T11:07:59.000Z",
"name": "Recipient Name",
"email": "Recipient Email",
"customMessage": "Custom message text",
"position": "1",
"action": "view",
"clientKey": "YOUR_CLIENT_KEY",
"recipientKey": "RECIPIENT_KEY",
}
],
"code": "200",
"message": "Recipients found"
}
```
# Send to recipients
Source: https://about.sendforsign.com/api-reference/recipient/send
POST https://api.sendforsign.com/api/recipient
Send an existing contract to recipients for signing, approval and more.
One way to send a contract to recipients is when you create a contract.
[See this page](/api-reference/contract/create-send) to learn more.
If you need to send an existing contract to recipients, use the request below.
### Body parameters
Action type.
Key of the client.
ID of the user who is sending the contract. If not specified, the default user credentials will be used.
Key of the contract.
Array of recipients, optional. If no array of recipients is provided,
the system will send the contract to those recipients who were added previously.
A recipient key corresponds to an existing recipient in the contract you are sending.
Use this parameter if you need to update any parameter of this specific recipient.
What the recipient needs to do with the contract. Available options: `view`, `sign`, `approve`, and `lock`.
Custom note to the recipient. If not specified, the default message will be sent.
Full name of the recipient.
Email of the recipient.
Signing order. If not specified, all requests will be sent simultaneously.
### Response
Status.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/recipient' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "send",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"contractKey": "CONTRACT_KEY",
"recipients":[
{
"recipientKey": "RECIPIENT_KEY",
"action": "sign",
"clientKey": "YOUR_CLIENT_KEY",
"customMessage": "Custom message text",
"fullname": "John Johnson",
"email": "john_johnson1@mail.com",
"position": 1
},
{
"action": "view",
"clientKey": "YOUR_CLIENT_KEY",
"customMessage": "Custom message text",
"fullname": "John Johnson",
"email": "john_johnson2@mail.com",
"position": 2
}
],
}
}'
```
```json Response theme={null}
{
"result": true,
"code": "200",
"message": "Contract sent"
}
```
# Update recipient
Source: https://about.sendforsign.com/api-reference/recipient/update
POST https://api.sendforsign.com/api/recipient
Update an existing recipient.
### Body parameters
Action type.
Key of the client.
Key of the contract.
Structure, add the fields that need to be updated and ignore the rest.
Key of the recipient that needs to be updated.
What the recipient needs to do with the contract. Available options: `view`, `sign`, `approve`, and `lock`.
Custom note to the recipient. If not specified, the default message will be sent.
Full name of the recipient.
Email of the recipient.
Signing order. If not specified, all requests will be sent simultaneously.
### Response
Recipient structure.
Change time.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/recipient' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"recipient": {
"recipientKey": "RECIPIENT_KEY",
"action": "view",
"clientKey": "YOUR_CLIENT_KEY",
"customMessage": "Custom message text",
"fullname": "Full Name",
"email": "email@email.com",
"position": 1
}
}
}'
```
```json Response theme={null}
{
"recipient": {
"changeTime": "2023-12-01 12:18:55"
},
"code": "201",
"message": "Recipient updated"
}
```
# Custom branding
Source: https://about.sendforsign.com/api-reference/settings/branding
POST https://api.sendforsign.com/api/settings
Implement your brand presence.
You can customize the appearance of the emails you send via Sendforsign's infrastructure, use your own email domain,
change the domain of recipient links you generate, and more.
### Body parameters
Settings type.
Key of the client.
Structure.
The sender's name that will be shown in the emails you send to recipients.
Available for Business accounts only. You'll need input from the Sendforsign team—contact your account manager.
Available for Business accounts only. You'll need input from the Sendforsign team—contact your account manager.
A short text shown at the bottom of the emails you send to recipients.
The logo that will be shown in the emails you send to recipients. Provide a public URL to a PNG, JPG, JPEG, or SVG image (W154 x H30).
The button color that will be shown in the emails you send to recipients. Provide a hex code; the default is #1677ff.
Available for Business accounts only. You'll need input from the Sendforsign team—contact your account manager.
### Response
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/settings' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"type": "brandings",
"clientKey": "YOUR_CLIENT_KEY",
"branding": {
"emailFrom": "",
"emailDomain": "",
"recipientLinkDomain": "",
"emailExplainer": "",
"emailLogo": "",
"emailButtonColor": "",
"recipientPageBranding": true
}
}
}'
```
```json Response theme={null}
{
"code": "201",
"message": "Settings updated"
}
```
# Email notifications
Source: https://about.sendforsign.com/api-reference/settings/email_notifications
POST https://api.sendforsign.com/api/settings
Enable or disable email notifications.
Email notifications are updated for the specific client key you use when updating the settings.
By default, Sendforsign sends email notifications for various types of events: signing and approval
requests, contract signed, and contract approved. You can disable these notifications if you prefer to use
your own email vendor. To disable notifications for `contract.approved` and `contract.signed`,
use the request provided below.
### Body parameters
Settings type.
Key of the client.
Structure.
Settings to change: send email notifications on `contract.approved`.
Settings to change: send email notifications on `contract.signed`.
### Response
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/settings' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"type": "email_notifications",
"clientKey": "YOUR_CLIENT_KEY",
"notification":
{
"approved": false,
"signed": false
}
}
}'
```
```json Response theme={null}
{
"code": "201",
"message": "Settings updated"
}
```
# Account structure
Source: https://about.sendforsign.com/api-reference/structure
Sendforsign account structure.
## Structure
The Sendforsign (SFS) API uses different layers to secure access to any stored data within the platform:
## Platform (You)
A platform is a business that integrates the SFS API into its application. This integration is an essential component.
Platform development teams connect to the SFS API using admin-level access API tokens.
These tokens allow platforms to create, configure clients, and access all resources across various
platforms for which they develop software.
## Client
A client, who is a customer of a platform, can be either an organization or an individual. Each platform
serves one or more clients. Using a client's token, it is possible to gain root access to all resources exclusively
associated with that particular client.
## Client User
This refers to the employees working for a client. The optional client user access layer is designed for
platforms that prefer using SFS's security features for quick development, instead of creating their own
custom access control systems.
Through the SFS API, partners can establish customizable roles and permissions at the entity level.
SFS then automatically oversees and enforces access policies for each API interaction.
# Convert into template
Source: https://about.sendforsign.com/api-reference/template/convert
POST https://api.sendforsign.com/api/template
Convert a contract into a template.
When converting a contract into a template, all content will be transferred to the template,
and all placeholders will be transferred with their values removed. The original contract will remain unchanged.
### Body parameters
Action type.
Key of the client.
ID of the user who converts a contract into a template. If not specified, the default user credentials will be used.
Template structure.
Name of the new template.
Key of the contract that will be converted into a template.
### Response
Template structure.
Create time.
ID of the template.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "convert",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"template": {
"name": "New template",
"contractKey": "CONTRACT_KEY"
}
}
}'
```
```json Response theme={null}
{
"template": {
"createTime": "2023-12-01 12:18:55",
"templateKey": "TEMPLATE_KEY"
},
"code": "201",
"message": "Template created"
}
```
# Create template
Source: https://about.sendforsign.com/api-reference/template/create
POST https://api.sendforsign.com/api/template
Create a new template using template value.
### Body parameters
Action type.
Key of the client.
ID of the user who create the template. If not specified, the default user credentials will be used.
Template structure.
Name of the template.
Content of the template, use HTML.
### Response
Template structure.
Create time.
ID of the template.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"template": {
"name": "New template",
"value": "Template text
"
}
}
}'
```
```json Response theme={null}
{
"template": {
"createTime": "2023-12-01 12:18:55",
"templateKey": "TEMPLATE_KEY"
},
"code": "201",
"message": "Template created"
}
```
# Create and fill in template
Source: https://about.sendforsign.com/api-reference/template/create-fill
POST https://api.sendforsign.com/api/template
Create a new template and populate it with the necessary placeholders.
Using this way, you can create a template and define all placeholders
with their names and values in a single API call.
### Body parameters
Action type.
Key of the client.
ID of the user who create the template. If not specified, the default user credentials will be used.
Template structure.
Name of the template.
Content of the template, use HTML.
Array of placeholders, optional.
Name of the placeholder.
Value of the placeholder.
### Response
Template structure.
Create time.
ID of the template.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"userKey": "USER_KEY",
"template": {
"name": "New template",
"value": "Template text
"
},
"placeholders": [
{
"name": "Company Name",
"value": "Acme Inc."
},
{
"name": "Contract Date",
"value": "2024-01-15"
}
]
}
}'
```
```json Response theme={null}
{
"template": {
"createTime": "2023-12-01 12:18:55",
"templateKey": "TEMPLATE_KEY"
},
"code": "201",
"message": "Template created"
}
```
# Delete template
Source: https://about.sendforsign.com/api-reference/template/delete
POST https://api.sendforsign.com/api/template
Delete an existing template.
### Body parameters
Action type.
Key of the client.
Structure.
Key of the template that needs to be deleted.
### Response
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "delete",
"clientKey": "YOUR_CLIENT_KEY",
"template": {
"templateKey": "TEMPLATE_KEY"
}
}
}'
```
```json Response theme={null}
{
"template": {
"templateKey": "TEMPLATE_KEY"
},
"code": "200",
"message": "Template deleted"
}
```
# Duplicate template
Source: https://about.sendforsign.com/api-reference/template/duplicate
POST https://api.sendforsign.com/api/template
Duplicate an existing template.
When duplicating a template, the placeholder structure is copied, but all placeholder values are cleared.
### Body parameters
Action type.
Key of the client.
Structure.
Key of the template that needs to be duplicated.
### Response
Template structure.
Create time.
ID of the duplicated template.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "duplicate",
"clientKey": "YOUR_CLIENT_KEY",
"template": {
"templateKey": "YOUR_TEMPLATE_KEY"
}
}
}'
```
```json Response theme={null}
{
"template": {
"createTime": "2023-12-01 12:18:55",
"templateKey": "NEW_TEMPLATE_KEY"
},
"code": "201",
"message": "Template duplicated"
}
```
# List of templates
Source: https://about.sendforsign.com/api-reference/template/list
POST https://api.sendforsign.com/api/template
Get a list of all templates created by a specific client.
### Body parameters
Action type.
Key of the client.
### Response
Array of templates.
Create time.
Change time.
ID of the template.
Name of the template.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list",
"clientKey": "YOUR_CLIENT_KEY"
}
}'
```
```json Response theme={null}
{
"templates": [{
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"templateKey": "TEMPLATE_KEY",
"name": "New template"
}],
"code": "200",
"message": "Templates found"
}
```
# Read template
Source: https://about.sendforsign.com/api-reference/template/read
POST https://api.sendforsign.com/api/template
Get information about a specific template.
### Body parameters
Action type.
Key of the client.
Structure, at least one of the fields must be filled.
ID of the template.
Name of the template.
### Response
Template structure.
Create time.
Change time.
ID of the template.
Name of the template.
Content of the template, HTML.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "read",
"clientKey": "YOUR_CLIENT_KEY",
"template": {
"templateKey": "TEMPLATE_KEY",
"name": "New template"
}
}
}'
```
```json Response theme={null}
{
"template": {
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"templateKey": "TEMPLATE_KEY",
"name": "New template",
"value": "Template text
"
},
"code": "200",
"message": "Template found"
}
```
# Update template
Source: https://about.sendforsign.com/api-reference/template/update
POST https://api.sendforsign.com/api/template
Update an existing template.
### Body parameters
Action type.
Key of the client.
Structure, use the fields that should be updated.
ID of the template.
Name of the template.
Content of the template, use HTML.
### Response
Template structure.
Create time.
Change time.
ID of the template.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/template' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"template": {
"templateKey": "TEMPLATE_KEY",
"name": "New template",
"value": "Template text
"
}
}
}'
```
```json Response theme={null}
{
"template": {
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"templateKey": "TEMPLATE_KEY",
},
"code": "201",
"message": "Template updated"
}
```
# Create user
Source: https://about.sendforsign.com/api-reference/user/create
POST https://api.sendforsign.com/api/user
Create a new user.
### Body parameters
Action type.
Key of the client.
Structure, at least one of the fields must be filled.
First and second names of the user.
Email of the user.
Your custom key, if you don't need to use any of the above fields.
### Response
User structure.
Create time.
ID of the user.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/user' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"user": {
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
```json Response theme={null}
{
"user": {
"createTime": "2023-12-01 12:18:55",
"userKey": "USER_KEY"
},
"code": "201",
"message": "User created"
}
```
# List of users
Source: https://about.sendforsign.com/api-reference/user/list
POST https://api.sendforsign.com/api/user
Get a list of all users created via a specific Client Key.
### Body parameters
Action type.
Key of the client.
### Response
Array of users.
Create time.
Change time.
ID of the user.
First and second names of the user.
Email of the user.
User custom key, if you used it when creating the user.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/user' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list",
"clientKey": "YOUR_CLIENT_KEY"
}
}'
```
```json Response theme={null}
{
"users": [{
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"userKey": "USER_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"customKey": "YOUR_COMBINATION"
}],
"code": "200",
"message": "Users found"
}
```
# Read user
Source: https://about.sendforsign.com/api-reference/user/read
POST https://api.sendforsign.com/api/user
Get information about a specific user.
### Body parameters
Action type.
Key of the client.
Structure, at least one of the fields must be filled.
ID of the user.
First and second names of the user.
Email of the user.
User custom key, if you used it when creating the client.
### Response
User structure.
Create time.
Change time.
ID of the user.
First and second names of the user.
Email of the user.
User custom key, if you used it when creating the user.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/user' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "read",
"clientKey": "YOUR_CLIENT_KEY",
"user": {
"userKey": "USER_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
```json Response theme={null}
{
"user": {
"createTime": "2023-12-01 12:18:55",
"changeTime": "2023-12-01 12:18:55",
"userKey": "USER_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"customKey": "YOUR_COMBINATION"
},
"code": "200",
"message": "User found"
}
```
# Update user
Source: https://about.sendforsign.com/api-reference/user/update
POST https://api.sendforsign.com/api/user
Update an existing user.
### Body parameters
Action type.
Key of the client.
Structure, use the fields that should be updated.
ID of the user.
First and second names of the user.
Email of the user.
User custom key, if you used it when creating the user.
### Response
User structure.
Change time.
ID of the user.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/user' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"user": {
"userKey": "USER_KEY",
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
```json Response theme={null}
{
"user": {
"changeTime": "2023-12-01 12:18:55",
"userKey": "USER_KEY",
},
"code": "201",
"message": "User updated"
}
```
# Webhooks concept
Source: https://about.sendforsign.com/api-reference/webhook/concept
Learn how to use webhooks.
Webhooks can be created via API calls by using the API references from this section.
Please bear in mind that webhooks are separated by Client Keys, so if you create multiple Client Keys for your platform,
be sure to follow this rule.
When you listen for the webhooks, you will receive them with the `Content-Type: application/vnd.api+json` header.
Webhooks have 6 events to listen for your purposes:
* `Contract.created`: fires when a contract is created.
* `Contract.sent`: fires for every recipient to whom a contract was sent.
* `Contract.seen`: fires every time a recipient opens a contract.
* `Contract.approved`: fires every time a recipient approves a contract.
* `Contract.signed`: fires every time a recipient signs a contract.
* `Contract.fully_signed`: fires once when all the recipients have signed a contract.
Below you will find the examples of webhooks.
### "contract.created"
```bash json theme={null}
{
"clientKey": "658599d9-bbbe-44ea-984e-0e5a766c2272",
"contractKey": "433e835c-0630-418c-8cd6-af223bb079d5",
"createTime": "2024-12-13T15:47:53.000Z",
"status": "contract.created"
}
```
### "contract.sent"
```bash json theme={null}
{
"clientKey": "658599d9-bbbe-44ea-984e-0e5a766c2272",
"contractKey": "433e835c-0630-418c-8cd6-af223bb079d5",
"createTime": "2024-12-13T16:02:27.000Z",
"status": "contract.sent",
"email": "ilia@sfs.com",
"fullname": "Ilia Bovk",
"contractName": "Sales Contract",
"recipientKey": "b113a5ea-115b-465c-a10f-baa361378e10"
}
```
### "contract.seen"
```bash json theme={null}
{
"clientKey": "658599d9-bbbe-44ea-984e-0e5a766c2272",
"contractKey": "433e835c-0630-418c-8cd6-af223bb079d5",
"createTime": "2024-12-13T16:03:39.000Z",
"status": "contract.seen",
"email": "ilia@sfs.com",
"fullname": "Ilia Bovk",
"contractName": "Sales Contract",
"recipientKey": "b113a5ea-115b-465c-a10f-baa361378e10"
}
```
### "contract.approved"
```bash json theme={null}
{
"clientKey": "658599d9-bbbe-44ea-984e-0e5a766c2272",
"contractKey": "433e835c-0630-418c-8cd6-af223bb079d5",
"createTime": "2024-12-13T16:05:06.000Z",
"status": "contract.approved",
"email": "ilia@sfs.com",
"fullname": "Ilia Bovk",
"contractName": "Sales Contract",
"recipientKey": "b113a5ea-115b-465c-a10f-baa361378e10"
}
```
### "contract.signed"
```bash json theme={null}
{
"clientKey": "658599d9-bbbe-44ea-984e-0e5a766c2272",
"contractKey": "433e835c-0630-418c-8cd6-af223bb079d5",
"createTime": "2024-12-13T16:06:56.000Z",
"status": "contract.signed",
"email": "ilia@sendforsign.com",
"fullname": "Ilia Bovk",
"contractName": "Sales Contract",
"recipientKey": "b113a5ea-115b-465c-a10f-baa361378e10"
}
```
### "contract.fully\_signed"
```bash json theme={null}
{
"clientKey": "658599d9-bbbe-44ea-984e-0e5a766c2272",
"contractKey": "433e835c-0630-418c-8cd6-af223bb079d5",
"createTime": "2024-12-13T16:06:56.000Z",
"status": "contract.fully_signed",
"contractName": "Sales Contract"
}
```
# Create webhook
Source: https://about.sendforsign.com/api-reference/webhook/create
POST https://api.sendforsign.com/api/webhook
Create a webhook.
Webhooks are created for the specific client key you use when creating a webhook.
### Body parameters
Action type.
Key of the client.
Array of webhooks.
Webhook's endpoint.
Event to listen: `contract.created`.
Event to listen: `contract.seen`.
Event to listen: `contract.sent`.
Event to listen: `contract.approved`.
Event to listen: `contract.signed`.
Event to listen: `contract.fully_signed`.
### Response
Array of webhooks.
Create time.
Webhook's endpoint.
Webhook's secret.
Webhook's key.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/webhook' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"webhooks": [
{
"url": "URL",
"created": true,
"seen": true,
"sent": false,
"approved": false,
"signed": false,
"fullySigned": true
}
]
}
}'
```
```json Response theme={null}
{
"webhooks": [
{
"createTime": "2024-04-08T08:58:54.000Z",
"url": "testurl1",
"secret": "whsec_123",
"webhookKey": "WEBHOOK_KEY"
}
],
"code": "201",
"message": "Webhooks created"
}
```
# Delete webhook
Source: https://about.sendforsign.com/api-reference/webhook/delete
POST https://api.sendforsign.com/api/webhook
Delete an existing webhook.
### Body parameters
Action type.
Key of the client.
Array of webhooks. Add the fields that need to be updated and ignore the rest.
Webhook's key.
### Response
Array of webhooks.
Webhook's key.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/webhook' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "delete",
"clientKey": "YOUR_CLIENT_KEY",
"webhooks": [
{
"webhookKey": "WEBHOOK_KEY"
}
]
}
}'
```
```json Response theme={null}
{
"webhooks": [
{
"webhookKey": "WEBHOOK_KEY",
}
],
"code": "201",
"message": "Webhooks deleted"
}
```
# List of webhooks
Source: https://about.sendforsign.com/api-reference/webhook/list
POST https://api.sendforsign.com/api/webhook
Get a list of all webhooks created for a specific client.
### Body parameters
Action type.
Key of the client.
### Response
Array of webhooks.
Create time.
Change time.
Webhook's endpoint.
Webhook's secret.
Event to listen: `contract.created`.
Event to listen: `contract.seen`.
Event to listen: `contract.sent`.
Event to listen: `contract.approved`.
Event to listen: `contract.signed`.
Event to listen: `contract.fully_signed`.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/webhook' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "list",
"clientKey": "YOUR_CLIENT_KEY"
}
}'
```
```json Response theme={null}
{
"webhooks": [
{
"createTime": "2024-03-29T20:02:28.000Z",
"changeTime": "2024-03-29T20:02:28.000Z",
"url": "URL",
"secret": "whsec_123",
"webhookKey": "WEBHOOK_KEY",
"created": true,
"seen": true,
"sent": true,
"approved": true,
"signed": true,
"fullySigned": true
}
],
"code": "201",
"message": "Webhooks found"
}
```
# Read webhook
Source: https://about.sendforsign.com/api-reference/webhook/read
POST https://api.sendforsign.com/api/webhook
Get information about a specific webhook.
### Body parameters
Action type.
Key of the client.
Array of webhooks.
Webhook's key.
### Response
Array of webhooks.
Create time.
Webhook's endpoint.
Webhook's secret.
Webhook's key.
Event to listen: `contract.created`.
Event to listen: `contract.seen`.
Event to listen: `contract.sent`.
Event to listen: `contract.approved`.
Event to listen: `contract.signed`.
Event to listen: `contract.fully_signed`.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/webhook' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "read",
"clientKey": "YOUR_CLIENT_KEY",
"webhooks": [
{
"webhookKey": "WEBHOOK_KEY"
}
]
}
}'
```
```json Response theme={null}
{
"webhooks": [
{
"createTime": "2024-04-08T08:58:54.000Z",
"changeTime": "2024-04-08T09:01:12.000Z",
"url": "URL",
"secret": "whsec_123",
"webhookKey": "WEBHOOK_KEY",
"created": true,
"seen": true,
"sent": false,
"approved": false,
"signed": false,
"fullySigned": false
}
],
"code": "201",
"message": "Webhooks read"
}
```
# Update webhook
Source: https://about.sendforsign.com/api-reference/webhook/update
POST https://api.sendforsign.com/api/webhook
Update an existing webhook.
### Body parameters
Action type.
Key of the client.
Array of webhooks. Add the fields that need to be updated and ignore the rest.
Webhook's key.
Webhook's endpoint.
Event to listen: `contract.created`.
Event to listen: `contract.seen`.
Event to listen: `contract.sent`.
Event to listen: `contract.approved`.
Event to listen: `contract.signed`.
Event to listen: `contract.fully_signed`.
### Response
Array of webhooks.
Change time.
Webhook's key.
The code of the answer.
The message of the answer.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/webhook' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "YOUR_CLIENT_KEY",
"webhooks": [
{
"webhookKey": "WEBHOOK_KEY",
"url": "URL",
"created": true,
"seen": true
}
]
}
}'
```
```json Response theme={null}
{
"webhooks": [
{
"webhookKey": "WEBHOOK_KEY",
"changeTime": "2024-04-08T09:01:12.000Z"
}
],
"code": "201",
"message": "Webhooks updated"
}
```
# 2025
Source: https://about.sendforsign.com/blog/2025
Blog posts by Sendforsign
## 22 April
### Contract workflows are a solved problem?
People talk about how contract workflows are a solved problem. That everyone just integrates DocuSign and moves on. I don't think so.
[Read more →](/blog/contract-workflows-are-a-solved-problem)
## 18 April
### AI-powered contract assistant
We built an AI-powered contract assistant that assesses risks, rewrites clauses, and makes targeted changes to agreements — in seconds.
[Read more →](/blog/ai-powered-contract-assistant)
## 10 February
### How do I see the future of digital agreements?
I believe it will follow a similar path to other apps (especially banking apps) — they tend to evolve into "super apps." I think this is also the future for CLM and legal tools, as they too will develop into super apps.
[Read more →](/blog/how-do-i-see-the-future-of-digital-agreements)
## 4 February
### 5 ways to make better decisions as a founder
I consider myself a poor decision-maker and have been constantly looking for ways to improve this aspect of my life. Years ago, I read the book 'How to fail at almost everything and still win big', and I realized that I still use the decision-making method from it.
[Read more →](/blog/5-ways-to-make-better-decisions-as-a-founder)
## 28 January
### AI + API = Love
Talk to anyone on our team, and you'll quickly discover that the most exciting part of the AI era for us isn't just that it can assist you in a more human-like way.
[Read more →](/blog/ai-api-love)
## 27 January
### The core of Sendforsign's business: embedded solutions for other companies
While we've been concentrating on artificial intelligence recently, we view it strictly as a practical tool: how can it enhance the capabilities of our embedded components and infrastructure?
[Read more →](/blog/the-core-of-sendforsign-s-business-embedded-solutions-for-other-companies)
## 26 January
### AI and its practical application
We have quickly moved past the hype phase and, in just a few years, transitioned to a stage of concrete AI usage. Now, we have a clear understanding of how AI is transforming the lives of individuals and humanity as a whole.
[Read more →](/blog/ai-and-its-practical-application)
# 2023
Source: https://about.sendforsign.com/changelog/2023
What's new in Sendforsign
## 1 December
PDF view and sign is here.
## 19 October
Approval flow is here.
## 2 October
Word file upload was released.
## 19 September
First additional contract options were released. (v 1.2.6)
## 10 September
First version of Sendforsign API was released. (v 0.1)
# 2024
Source: https://about.sendforsign.com/changelog/2024
What's new in Sendforsign
## 5 December
Get Document Events via API
New features:
* Now you can easily retrieve all events related to your document with a single API call.
## 30 October
Signer fields.
New Components Version:
* `"sendforsign": "1.1.7"`
New features:
* Prepare any document for signature by adding fields for signature blocks, text fields, dates, and more.
## 7 October
Customizable fields.
New Components Version:
* `"sendforsign": "1.1.3"`
New features:
* New customizable fields and recipient grouping.
## 10 September
Bundle size was decreased.
New Components Version:
* `"sendforsign": "1.0.108"`
Bug fixes:
* The Sendforsign's React Components bundle size was significantly decreased.
## 27 August
Actions Menu.
New Components Version:
* `"sendforsign": "1.0.85"`
New features:
* New Actions Menu for Contract List and Template List.
Bug fixes:
* Fixed a bug where some placeholders became non-editable on PDFs.
## 12 August
Minor impovements.
New Components Version:
* `"sendforsign": "1.0.84"`
Bug fixes:
* Minor improvements.
## 6 August
Fillable PDFs.
New Components Version:
* `"sendforsign": "1.0.78"`
New features:
* PDFs are now fillable—add placeholders and signature blocks directly on the PDFs.
Bug fixes:
* Minor improvements.
## 8 July
Signature certificates for PDFs.
New features:
* Signature certificates are now generated for PDF files upon signing.
Bug fixes:
* Fixed an issue where PDF generation through API calls sometimes failed.
* Minor improvements.
## 20 June
Assign specific placeholders to specific recipients.
New Components Version:
* `"sendforsign": "1.0.77"`
New features:
* Now you can assign specific placeholders to specific recipients, so they will need to fill in the placeholders upon signing documents.
Bug fixes:
* In some cases, the removal of placeholders caused errors in text documents.
## 5 May
New Q\&A flow.
New features:
* Q\&A flow for filling in contracts upon creation.
Bug fixes:
* In some cases, images uploaded to the editor were causing an error.
* In some cases, the PDF download API request returned an empty response.
## 18 April
Signature certificates were released.
## 7 April
New API endpoints for webhook management were released.
## 1 March
React components pack was updated.
## 1 February
New API endpoints were released.
## 15 January
Updated landing page was released.
# 2025
Source: https://about.sendforsign.com/changelog/2025
What's new in Sendforsign
## 1 October
### Dynamic Tables
We've introduced dynamic tables that can be easily created and updated through a single API call. Transform any placeholder in your HTML documents into a fully functional table with just one request.
New features:
* Convert any existing placeholder into a dynamic table
* Define table structure (columns and rows) via API
* Update table content programmatically using `/placeholder/update-table`
* Tables are automatically rendered in the document editor with full editing capabilities
[Learn more about dynamic tables](/api-reference/placeholder/update-table)
## 15 July
### New Editor with Enhanced Capabilities
We've released a brand new editor with a comprehensive set of formatting and editing tools. The new editor brings powerful features to help you create and edit documents with greater ease and flexibility.
New features:
* Rich text formatting options: bold, italic, underline, strikethrough
* Font selection and size control
* Text colors and highlighting
* Text alignment (left, center, right, justify)
* Multiple list types: numbered, bulleted, and checkbox lists
* Superscript and subscript
* Indentation controls
* Insert images, tables, links, and code blocks
* Quote blocks and horizontal dividers
* Undo/redo and clear formatting
## 10 April
### Cursor-like editor
New Components Version:
* `"sendforsign": "1.1.29"`
New features:
* Now you can ask questions about agreements, modify their content, chat with any document, and apply changes in one click using Sendforsign's AI.
## 15 January
### Introducing Legal AI Agent
🔹 E-signatures made contracts digital, but they didn't make them easy.
There's still way too much friction:
* Creating document templates is a pain.
* Filling out the same info over and over? Annoying.
* Fixing errors? Messy.
* Understanding complex legal terms? Feels like you need a law degree.
* Integrating with other software? Ugh.
💡 So we asked: what if AI+API could fix all of this?
That's why we ended up with an API-first approach empowered by AI capabilities.
Today we're introducing the ability to speed up the contract creation process with AI that understands your templates and company data.
# Introduction
Source: https://about.sendforsign.com/introduction
Sendforsign is a Contract infrastructure for modern SaaS and Platforms.
## Quickstart
Learn how to get Sendforsign set up in your project.
Understand our general API concepts.
Get started with Sendforsign React Components.
## Use cases
Learn how to start using Sendforsign.
Learn how to enhance your platform with embedded contracts.
Learn how to prepare template and create a document from it.
Learn how to update a document you previously created.
Learn how to add dynamic table placeholders to your contracts.
Learn how to set up a custom domain for the sharing links.
# AI Assistant
Source: https://about.sendforsign.com/sdk/components/aiassistant
The `AI Assistant` component is a React component that renders the entire Assistant.
This component enables communication with Sendforsign AI to create document templates, correct document errors,
explain complex terms, avoid duplicate data entry, and more.
### Preview
## Usage
First, install [Sendforsign components.](/sdk/introsdk#installation)
After that:
```typescript App.tsx theme={null}
import { AiAssistant } from 'sendforsign';
```
## Props
| Prop | Type | Default | Description |
| ----------- | -------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey` | `string` | | Use only for testing purposes. API key for your platform. |
| `clientKey` | `string` | | Use only for testing purposes. Client key for the account that is using the infrastructure. |
| `token` | `string` | | Client token refers to the client that is using the infrastructure. Learn more about client tokens [here](/api-reference/implementation_server#generate-client-tokens). |
| `userKey` | `string` | | User key for the user who is using this assistant. |
# Contract Editor
Source: https://about.sendforsign.com/sdk/components/contracteditor
The `Contract Editor` component is a React component that renders the entire Editor.
The component integrates the functionalities of the `E-signing`, `Approvals` and `Audit Trial` components,
providing a complete experience throughout the Contract workflow. This component provides the ability to
create new contracts, open existing contracts, send them for signing, sign, approve, and see the Audit Trial.
## Preview
## Usage
First, install [Sendforsign components.](/sdk/introsdk#installation)
After that:
```typescript App.tsx theme={null}
import { ContractEditor } from 'sendforsign';
```
## Props
| Prop | Type | Default | Description |
| ----------------- | ----------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey` | `string` | | Use only for testing purposes. API key for your platform. |
| `clientKey` | `string` | | Use only for testing purposes. Client key for the account that is using the infrastructure. |
| `token` | `string` | | Client token refers to the client that is using the infrastructure. Learn more about client tokens [here](/api-reference/implementation_server#generate-client-tokens). |
| `userKey` | `string` | | User key for the user who is creating a contract. |
| `contractKey` | `string` | | Unique contract key of the contract that needs to rendered. If not specified, the component will allow you to create a new contract from its interface. |
| `pdf` | `boolean` | `true` | If `true`, users can upload PDFs via this component. |
| `сanReDraft` | `boolean` | `false` | If `true`, users can recreate existing contracts from scratch. [Read this topic](/usecase/updatedoc#allow-users-to-recreate-documents) to learn more. |
| `showTimeline` | `boolean` | `true` | If `false`, the Timeline block will be hidden. |
| `showActionsBar` | `boolean` | `true` | If `false`, tha Actions block will be hidden. |
| `documentPreview` | `boolean` | `false` | If `true`, opens the contract in read-only preview mode and hides the actions bar and sidebar. |
| `onStepChange` | `function(data: {currentStep:string})` | | Called when component changes states and returns `currentStep: 'TypeChooseStep'` when the component is in the Type Choose state, `currentStep: 'QnAStep'` when the component is in the QnA step, and `currentStep: 'ContractEditorStep'` when the component is in the Editor state. |
| `onDocumentSave` | `function(data: {documentSaved:boolean})` | | Called when the contract body is being edited, this function returns `documentSaved: false` if the body is not saved and `documentSaved: true` if the body is saved. |
## Additional functionality of the `Contract Editor` component
These components are integrated into the Contract Editor component.
They can be switched on and off in your Sendforsign account.
### Audit trail
Keep track of what's happening with your documents.
### E-signing
E-sign any document right in your browser, including Word documents and PDFs.
### Approval
Approve any document right in your browser, including Word documents and PDFs.
# Contract List
Source: https://about.sendforsign.com/sdk/components/contractlist
The `Contract List` component is a React component that renders the list of contracts created by a specific
client (clientKey). This component is integrated with the `Contract Editor` component, allowing users to
open existing contracts and create new ones via the `Contract List` component.
### Preview
## Usage
First, install [Sendforsign components.](/sdk/introsdk#installation)
After that:
```typescript App.tsx theme={null}
import { ContractList } from 'sendforsign';
```
## Props
| Prop | Type | Default | Description |
| ----------- | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey` | `string` | | Use only for testing purposes. API key for your platform. |
| `clientKey` | `string` | | Use only for testing purposes. Client key for the account that is using the infrastructure. |
| `token` | `string` | | Client token refers to the client that is using the infrastructure. Learn more about client tokens [here](/api-reference/implementation_server#generate-client-tokens). |
| `userKey` | `string` | | User key for the user who is creating a contract. |
| `isModal` | `boolean` | `true` | If `false`, every click on the table row will save the contractKey to local storage. If `true`, a click on the table row will open a modal window with the contract rendered. |
# Template Editor
Source: https://about.sendforsign.com/sdk/components/templateeditor
The `Template Editor` component is a React component that renders the entire Editor.
This component provides the ability to create new templates and open existing templates.
### Preview
## Usage
First, install [Sendforsign components.](/sdk/introsdk#installation)
After that:
```typescript App.tsx theme={null}
import { TemplateEditor } from 'sendforsign';
```
## Props
| Prop | Type | Default | Description |
| ----------------- | ----------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey` | `string` | | Use only for testing purposes. API key for your platform. |
| `clientKey` | `string` | | Use only for testing purposes. Client key for the account that is using the infrastructure. |
| `token` | `string` | | Client token refers to the client that is using the infrastructure. Learn more about client tokens [here](/api-reference/implementation_server#generate-client-tokens). |
| `userKey` | `string` | | User key for the user who is creating a template. |
| `templateKey` | `string` | | Unique template key of the template that needs to be rendered. If not specified, the component will allow you to create a new template from its interface. |
| `сanReDraft` | `boolean` | `false` | If `true`, users can recreate existing templates from scratch. |
| `documentPreview` | `boolean` | `false` | If `true`, opens the template in read-only preview mode and hides the actions bar and sidebar. |
| `onStepChange` | `function(data: {currentStep:string})` | | Called when component changes states and returns `currentStep: 'TypeChooseStep'` when the component is in the Type Choose state, `currentStep: 'ContractEditorStep'` when the component is in the Editor state. |
| `onDocumentSave` | `function(data: {documentSaved:boolean})` | | Called when the contract body is being edited, this function returns `documentSaved: false` if the body is not saved and `documentSaved: true` if the body is saved. |
# Template List
Source: https://about.sendforsign.com/sdk/components/templatelist
The `Template List` component is a React component that renders the list of templates created by a specific
client (clientKey). This component is integrated with the `Template Editor` component, allowing users to
open existing contracts and create new ones via the `Template List` component.
### Preview
## Usage
First, install [Sendforsign components.](/sdk/introsdk#installation)
After that:
```typescript App.tsx theme={null}
import { TemplateList } from 'sendforsign';
```
## Props
| Prop | Type | Default | Description |
| ----------- | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKey` | `string` | | Use only for testing purposes. API key for your platform. |
| `clientKey` | `string` | | Use only for testing purposes. Client key for the account that is using the infrastructure. |
| `token` | `string` | | Client token refers to the client that is using the infrastructure. Learn more about client tokens [here](/api-reference/implementation_server#generate-client-tokens). |
| `userKey` | `string` | | User key for the user who is creating a template. |
| `isModal` | `boolean` | `true` | If `false`, every click on the table row will save the templateKey to local storage. If `true`, a click on the table row will open a modal window with the template rendered. |
# Introduction
Source: https://about.sendforsign.com/sdk/introsdk
Get started with Sendforsign React Components.
## React SDK Overview
The SFS React SDK is a collection of pre-built React components that are integrated with the SFS API.
These components are capable of displaying and interacting with data provided by the API. Platforms can use
these UI Components to develop React-based web applications for their clients, leveraging the power of the SFS API.
## Supported browsers
SFS UI Components support the five latest versions of major browsers: Chrome, Firefox, Safari, Edge, Opera.
As of this release, the SFS React SDK is optimized for desktop, tablets and mobile use.
## Installation
Before using Sendforsign React components, you must first install the React SDK and API SDK packages
available on the NPM and Yarn directories. To install:
```npm npm theme={null}
npm i sendforsign
```
```yarn yarn theme={null}
yarn global add sendforsign
```
## Usage
Before using components from the React SDK, see the [First document use case](/usecase/firstdoc) to set up your
platform account and get the API key.
We also assume you have already mapped out your customers and their users as Clients and Client users in SFS,
and that you have the ability to:
* look up the SFS Client user key for the user who is logged in to your application;
* look up the SFS Client key to which the user belongs.
When a Client user logs in to your application, look up the Client key and User key for that user.
Once you have a User key and a Client key, you can initialize the SFS client and components.
```typescript App.tsx theme={null}
import { ContractEditor } from 'sendforsign';
```
## Run the application
```npm npm theme={null}
npm run start
```
# Add Table Placeholders to a Contract
Source: https://about.sendforsign.com/usecase/add-table-placeholder
Learn how to add dynamic table placeholders to your contracts.
## Set up your account
Before using dynamic placeholders, see the [First document use case](/usecase/firstdoc) to set up your
platform account and get the API key.
## Create your document
SFS provides you with two ways of creating documents: by using an API request (API way) or via our React UI (visual way).
Let's create a simple document using our API.
To do this, you can use this request. [Learn more here.](/api-reference/contract/create-fill)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "CLIENT_KEY",
"contract": {
"name": "New contract",
"value": "Contract text
"
}
}
}'
```
As a response, you will receive a Contract Key:
```bash json theme={null}
{
"contract": {
"createTime": "2024-03-07T15:18:41.000Z",
"contractKey": "d29b3893-826c-47d0-abdd-c6ed2b691a5c"
},
"code": "201",
"message": "Contract created"
}
```
## Add a placeholder to your document
First, you need to add a regular placeholder to your document. This placeholder will later be converted into a dynamic table.
[Learn more about creating placeholders here.](/api-reference/placeholder/create)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholder": {
"name": "Product Table",
"value": "Products will be displayed here"
}
}
}'
```
As a response, you will receive a Placeholder Key:
```bash json theme={null}
{
"placeholder": {
"id": "3",
"createTime": "2024-11-22T11:11:24.000Z",
"changeTime": "2024-11-22T11:11:24.000Z",
"name": "Product Table",
"value": "Products will be displayed here",
"type": "1",
"placeholderKey": "abc123-def456-ghi789",
"position": "3"
},
"code": 201,
"message": "Placeholder created"
}
```
## Convert the placeholder into a dynamic table
Now that you have a placeholder with a placeholder key, you can convert it into a dynamic table. The table will replace the placeholder in your document and display structured data with columns and rows.
[Learn more about table placeholders here.](/api-reference/placeholder/update-table)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/placeholder' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "update",
"clientKey": "CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"placeholder": {
"placeholderKey": "PLACEHOLDER_KEY",
"table": {
"columns": ["Product", "Quantity", "Unit Price", "Total"],
"rows": [
["Product 1", 2, 100, 200],
["Product 2", 1, 250, 250],
["Product 3", 4, 75, 300]
]
}
}
}
}'
```
As a response, you will receive confirmation that the placeholder has been updated to a table:
```bash json theme={null}
{
"placeholder": {
"id": "3",
"createTime": "2024-11-22T11:11:24.000Z",
"changeTime": "2024-11-22T11:28:23.000Z",
"name": "Product Table",
"value": "{\"columns\":[\"Product\",\"Quantity\",\"Unit Price\",\"Total\"],\"rows\":[[\"Product 1\",2,100,200],[\"Product 2\",1,250,250],[\"Product 3\",4,75,300]]}",
"isTable": true,
"type": "1",
"placeholderKey": "abc123-def456-ghi789",
"position": "3",
"fillingType": "1",
"externalRecipientKey": null
},
"code": 201,
"message": "Placeholder updated"
}
```
Notice that the `isTable` property is now set to `true`, and the `value` contains a JSON string with the table structure including columns and rows.
## View your document with the dynamic table
Awesome! You've successfully added a dynamic table placeholder to your document. To view the document with the table,
use the [Contract Editor](/sdk/components/contracteditor) component and enter the Contract Key you've used
as a `contractKey` property for the component.
The table will be displayed in your document at the position where the placeholder was originally placed. The table
will show all your columns and rows with proper formatting, making it easy for recipients to view structured data
like product lists, pricing information, or any other tabular content.
## Understanding table structure
When creating a dynamic table, you need to provide:
* **Columns**: An array of strings that define the column headers (e.g., `["Product", "Quantity", "Unit Price", "Total"]`)
* **Rows**: An array of arrays, where each inner array represents a row with values corresponding to the columns. Values can be strings or numbers (e.g., `[["Product 1", 2, 100, 200], ["Product 2", 1, 250, 250]]`)
The number of values in each row should match the number of columns you've defined. This ensures the table displays correctly.
## Updating table data
You can update the table data at any time by making the same update request with new `columns` and `rows` values. The table
will be updated in the document, and if the document has already been sent to recipients, they will see the updated table
when they access the document.
# Embed Documents to Your App
Source: https://about.sendforsign.com/usecase/embeddocforplatform
Learn how to enhance your platform with embedded contracts.
## Get your API key
To begin using Sendforsign and gain the capability to generate documents through our infrastructure,
you need to create your SFS account. Creating a new account will automatically generate a unique API and Secret keys for you.
Go to your Sendforsign dashboard, navigate to the `API Keys` tab, and retrieve your keys.
## Create a client for each business that use your platform
For each client you have in your platform, you need to create a corresponding client within the
SFS platform. Here, you don't need to duplicate all the information you already have about your
customers – submit only what's required by SFS. For more information about entities, refer to
SFS [account structure](/api-reference/structure).
To create a client, make a POST request to the `/api/client` endpoint.
The request's payload represents details of the client to be created. In the header, specify the `platform Bearer token`:
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"client": {
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
The successful `201 OK` response contains the `clientKey`:
```bash JSON theme={null}
{
"client": {
"createTime": "2023-12-01 12:18:55",
"clientKey": "CLIENT_KEY",
},
"code": "201",
"message": "Client created"
}
```
[Learn more about client API endpoint here](/api-reference/client/create)
## Map your platform clients to the created clients
Use the Client keys you generated to map them to the clients that use your platform,
so every time a client logs into your system, you can retrieve the corresponding client key
to access Sendforsign's infrastructure.
## Allow your users to create contracts within your platform
Now that you have a Client key for each of your clients, you can allow them to create new documents,
send them for signing, and much more. There are multiple ways to enable your users to create documents.
The easiest way to do this is to add a [Contract List](/sdk/components/contractlist) component to your interface. Learn how to use
Sendforsign Components [here.](/sdk/introsdk)
Once the component is added and the Client key is populated, your clients will see all the documents they have
created and will have the ability to create new ones directly from this component.
## Create contracts via API and let users work with them
Although the previous method is the easiest way to enable your users to start working with contracts,
it often happens that you need to generate contracts from your backend, enrich them with your own data, and
then let your users work with them.
Let's create a contract first via an API call and add some placeholders so users can
insert them into the contract afterwards.
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "CLIENT_KEY",
"contract": {
"name": "A test contract",
"value": "Hello World!
"
},
"placeholders": [
{
"name": "Occupation",
"value": "Designer"
},
{
"name": "Duties",
"value": "Website updates"
}
]
}
}'
```
The contract has been created, and the placeholders have been placed in the contract sidebar.
You can now render this contract using the [Contract Editor](/sdk/components/contracteditor) component.
## Allow users to recreate documents
In some cases, you may need to allow users to recreate the content of documents that already exist —
either by uploading their own Word/PDF file or selecting a template.
In such cases, you should use the `canReDraft`=`true` property of the [Contract Editor](/sdk/components/contracteditor).
This enables users to start the creation process from scratch for a document that already exists.
If the existing document already has placeholders included, the system will also route these flows accordingly:
* If a user uploads a Word/PDF file or creates a document from scratch, the placeholders will remain untouched.
* If a user selects a template that does not contain placeholders, then the placeholders will remain untouched,
and the content will be populated from the selected template.
* If a user selects a template that already contains placeholders, then the system will do the following:
1. Populate the content from the template into the document.
2. Read all the placeholders from the template and all the placeholders from the document and merge them. For
placeholders with the same names (on the template side and on the document side), the system will transfer the
values from the document's placeholders to the template's placeholders.
3. Document-side placeholders that don't match any placeholder on the template side will remain untouched.
So, for example, if you have a document with a placeholder `Name1` and value `DocValue1`, and a template with placeholders
`Name1` and value `TempValue1` and `Name2` and value `TempValue2`, the resulting document will contain the content from the template and
two placeholders: `Name1-DocValue1` and `Name2-TempValue2`.
# Set up Your Account and Send Your First Document
Source: https://about.sendforsign.com/usecase/firstdoc
Learn how to start using Sendforsign.
## Get your API key
To begin using Sendforsign and gain the capability to generate documents through our infrastructure,
you need to create your SFS account. Creating a new account will automatically generate a unique API key for you.
## Create your Client key
When the API is created, you need to generate a Сlient key for every account on your platform that
will be using the SFS infrastructure. Use your unique API key for this purpose.
[Learn more here.](/api-reference/client/create)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/client' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"client": {
"fullname": "John Johnson",
"email": "john_johnson@mail.com",
"organization": "Company Inc.",
"customKey": "YOUR_COMBINATION"
}
}
}'
```
## Create your first document
SFS provides you with two ways of creating documents: by using an API request (API way) or via our React UI (visual way).
Let's create a simple document using our Create API request. [Learn more here.](/api-reference/contract/create)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "YOUR_CLIENT_KEY",
"contract": {
"name": "New contract",
"value": "Hello world
"
}
}
}'
```
As a response, you will receive a unique contract key.
```bash json theme={null}
{
"contract": {
"createTime": "2024-03-07T15:18:41.000Z",
"contractKey": "d29b3893-826c-47d0-abdd-c6ed2b691a5c"
},
"code": "201",
"message": "Contract created"
}
```
## Send your document
Now you're ready to send your contract to recipients. You will need just one API call to do this.
[Learn more here.](/api-reference/recipient/send)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/recipient' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "send",
"clientKey": "CLIENT_KEY",
"contractKey": "CONTRACT_KEY",
"recipients":[
{
"action": "sign",
"customMessage": "Custom message text",
"fullname": "John Johnson",
"email": "john_johnson1@mail.com",
"position": 1
},
{
"action": "view",
"customMessage": "Custom message text",
"fullname": "John Johnson",
"email": "john_johnson2@mail.com",
"position": 2
}
],
}
}'
```
# Draft a Template
Source: https://about.sendforsign.com/usecase/firsttemplate
Learn how to prepare template and create a document from it.
## Set up your account
Before using components from the React SDK, see the [First document use case](/usecase/firstdoc) to set up your
platform account and get the API key.
## Create your template
SFS provides you with two ways of creating templates: by using an API request (API way) or via our React UI (visual way).
Let's create a simple template using our React Components.
Navigate to your SFS account and proceed to the Components tab, find the Template editor component
and press the 'Live Demo' button.
Now you're ready to draft your first template. To do this, use your API and Client keys to make the component functional.
## Draft your template
Upload a Word file, a PDF file, or create a template from scratch.
## Add content
Now, add content. Highlight text to see options.
## Add placeholders
If you need reusable parts of text that you will be using throughout the template content,
add placeholders and paste them into the text. Your template is ready to be used!
## Create a document from this template
Now you have the ability to create as many documents from this template as you need. When creating a
contract from a template, the content, placeholders, and recipients from the template will be
copied to the brand new contract. [Learn more here.](/api-reference/contract/create-fill)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "CLIENT_KEY",
"contract": {
"name": "New contract",
"templateKey": "TEMPLATE_KEY"
},
"placeholders": [
{
"placeholderKey": "PLACEHOLDER_KEY",
"value": "Placeholder value"
},
{
"name": "Placeholder name",
"value": "Placeholder value"
}
]
}
}'
```
Take a look at the placeholders array. By using this, you can immediately fill in the placeholders,
so the contract will have all the necessary data in the locations specified by you. To do this, you simply
need to provide the call with the placeholder key from the template. This way, the system will identify this
placeholder and fill it with the value you need.
# Recipient Custom Domain
Source: https://about.sendforsign.com/usecase/recipientdomain
Set up a custom domain for the sharing links.
## The Concept
When you add recipients to the documents created in Sendforsign, each recipient receives their personalized public sharing
links, through which they can access the documents. Typically, the
links look like this:
`https://app.sendforsign.com/sharing/8269-4d32-4716-86d3-159a9cad`.
However, in some cases, you might want to change the branding of this link and replace the `sendforsign.com` domain
with your own domain, so the links for your customers will look like this:
`https://yourdomain.com/sharing/8269-4d32-4716-86d3-159a9cad`.
## Go to your domain provider dashboard
To enable your own domain, you will need access to your domain name provider (GoDaddy, Namecheap, or any other provider you use). Please contact your web administrator to get an overview of how to access your domain name dashboard.
Below, we will provide an overview of this process based on the Namecheap account; contact your web administrator to go through the process on any other provider.
1. Once you get into your dashboard, you need to find your domain list.
2. Go to the domain page, and navigate to the DNS settings of this specific domain.
## Create a new CNAME record
Now it's time to add a new CNAME record to your DNS settings. We always recommend using a subdomain for these purposes, such as `document.yourdomain.com` or `contract.yourdomain.com`.
Let's create a new CNAME record for a `document.` subdomain.
1. Press `ADD NEW RECORD`.
2. Select:
* Type: CNAME
* Host: document
* Value or Target: paste the value you receive from the Sendforsign team
* TTL: Automatic
That's it; all changes will populate within the next 48 hours.
Now, any recipient link for your account will be transformed into the following structure: `document.yourdomain.com` + `sharing` + `recipientKey`.
Example: `https://document.yourdomain.com/sharing/8269-4d32-4716-86d3-159a9cad`.
# Update an Exisiting Document
Source: https://about.sendforsign.com/usecase/updatedoc
Learn how to update a document you previously created.
## Set up your account
Before using components from the React SDK, see the [First document use case](/usecase/firstdoc) to set up your
platform account and get the API key.
## Create your document
SFS provides you with two ways of creating documents: by using an API request (API way) or via our React UI (visual way).
Let's create a simple document using our API.
To do this, you can use this request. [Learn more here.](/api-reference/contract/create-fill)
```bash cURL theme={null}
curl -X POST 'https://api.sendforsign.com/api/contract' \
-H 'X-Sendforsign-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"data": {
"action": "create",
"clientKey": "CLIENT_KEY",
"contract": {
"name": "New contract",
"value": "Contract text
"
},
"placeholders": [
{
"name": "Placeholder name 1",
"value": "Placeholder value 1"
},
{
"name": "Placeholder name 2",
"value": "Placeholder value 2"
}
]
}
}'
```
As a response, you will receive a Contract Key:
```bash json theme={null}
{
"contract": {
"createTime": "2024-03-07T15:18:41.000Z",
"contractKey": "d29b3893-826c-47d0-abdd-c6ed2b691a5c"
},
"code": "201",
"message": "Contract created"
}
```
## Render your document
Awesome, you've just created your document and even added two placeholders to it. To view the document,
use the [Contract Editor](/sdk/components/contracteditor) component and enter the Contract Key you've just
received as a `contractKey` property for the component.
By using this component and a Contract Key, you can continue editing the document, adding and removing
placeholders and recipients, and do everything you need to with documents. All changes will be saved
to this specific document.
## Allow users to recreate documents
In some cases, you may need to allow users to recreate the content of documents that already exist —
either by uploading their own Word/PDF file or selecting a template.
In such cases, you should use the `canReDraft`=`true` property of the [Contract Editor](/sdk/components/contracteditor).
This enables users to start the creation process from scratch for a document that already exists.
If the existing document already has placeholders included, the system will also route these flows accordingly:
* If a user uploads a Word/PDF file or creates a document from scratch, the placeholders will remain untouched.
* If a user selects a template that does not contain placeholders, then the placeholders will remain untouched,
and the content will be populated from the selected template.
* If a user selects a template that already contains placeholders, then the system will do the following:
1. Populate the content from the template into the document.
2. Read all the placeholders from the template and all the placeholders from the document and merge them. For
placeholders with the same names (on the template side and on the document side), the system will transfer the
values from the document's placeholders to the template's placeholders.
3. Document-side placeholders that don't match any placeholder on the template side will remain untouched.
So, for example, if you have a document with a placeholder `Name1` and value `DocValue1`, and a template with placeholders
`Name1` and value `TempValue1` and `Name2` and value `TempValue2`, the resulting document will contain the content from the template and
two placeholders: `Name1-DocValue1` and `Name2-TempValue2`.