# 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.