> You are reading the Docusign Developer Documentation. For clean Markdown of any page, append .md to the page URL. > > Documentation indexes by section: > - APIs and SDKs: https://docusign.docs.buildwithfern.com/docs/llms.txt > - Platform 101: https://docusign.docs.buildwithfern.com/platform/llms.txt > - Extension Apps: https://docusign.docs.buildwithfern.com/extension-apps/llms.txt > - Docusign CLI: https://docusign.docs.buildwithfern.com/docusign-cli/llms.txt > > Authentication (OAuth, JWT Grant, M2M): https://docusign.docs.buildwithfern.com/platform/auth > Webhooks and Connect: https://docusign.docs.buildwithfern.com/platform/webhooks > > OpenAPI specifications: https://docusign.docs.buildwithfern.com/openapi.json > MCP server: https://docusign.docs.buildwithfern.com/_mcp/server # Data IO extension overview > Lean how the data IO extension works, where it is used, and how it executes. Data IO is an [extension](/extension-apps/extension-apps-101/supported-extensions) that enables you to read data from and write data to your system of record. After creating an extension app that implements data IO, you can integrate that functionality into your automation and Docusign scenarios, such as creating automation that responds to a job offer agreement by creating an account for the new employee in your system of record. You can also publish your completed extension app to the [Docusign App Center](/extension-apps/extension-apps-101/app-center) for other Docusign users to find, install, and use. Data IO includes two capabilities that can be configured as steps in [Workflow Builder](/docs/workflow-builder-api) workflows: * The [data input](/extension-apps/extension-apps-101/supported-extensions/data-io#input-data) capability retrieves data from your system of record, such as Salesforce, ServiceNow, or Stripe. * The [data output](/extension-apps/extension-apps-101/supported-extensions/data-io#output-data) capability transmits your data from Docusign to update your system of record. See [Data IO extension workflow test](/extension-apps/build-an-extension-app/test/functional-tests/data-io-workflow) for details on how the data IO extension is displayed to users in the UI and learn how it maps to the extension action contracts. These screenshots show an example of how these capabilities are displayed in the Workflow Builder UI, in both **Add a step** and **Step configuration**. **Workflow Builder add steps UI:** ![An image of the Maestro workflow designer UI showing the option to add either data input or data output steps.](/_fern-files/_img/5cf2e645a88733cdc2a36b492698777b9d531d81b587284bde11d069adb79ec3.webp) **Workflow Builder data input configuration UI:** ![An image of the UI options for configuring a data read step in the Maestro workflow designer.](/_fern-files/_img/cf1c41f166f37ee627b701334480f7d3eaded66acb2bbe7b811e8b3a70683d28.webp) **Workflow Builder data output configuration UI:** ![An image showing the options to configure a data ouptut step in the Maestro workflow designer.](/_fern-files/_img/68820bb4bf67874dff08bdc47b05fd4ef9e27f9f0f83492e24c5b97e47f520df.webp) You can implement data input as a standalone capability without also implementing data output. To do this, implement only the [Search Records](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts), [Get Type Names](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts), and [Get Type Definitions](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) actions. Note that you cannot implement data output as a standalone capability, because it uses the data input actions to find the records to update. If your extension must write data to your system of record, you must implement all five data IO actions. > **Note:** If your app only needs to create new records and does not need to update them, you can choose to only create a full implementation for [Create Record](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts). In this case you still need to define [Patch Record](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts), but it does not need to contain any code. | Action name | Executed when | Description | | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [Get Type Names](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) | The extension app establishes or refreshes a connection. | Gets the names of the types that are used by your system of record. In the manifest, this action is named `DataIO.Version6.GetTypeNames`. | | [Get Type Definitions](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) | The extension app establishes or refreshes a connection. Called directly after **Get Type Names**. | Gets a set of type definitions from your system of record and returns their equivalents in the [Concerto](https://concerto.accordproject.org/docs/intro/) data model format. DocuSign uses the [Concerto](https://concerto.accordproject.org/docs/intro/) data model to map the data read from your system of record. If your system of record does not already use the Concerto data model, you must implement transform logic that defines how your records map to Concerto data types before they can be read. This transform logic should be implemented within your **Get Type Definitions** action, and is called whenever the action is executed. See [Data model](/extension-apps/extension-apps-101/supported-extensions/data-model) for details on the data model structure. In the manifest, this action is named `DataIO.Version6.GetTypeDefinitions`. | | [Create Record](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) | When a [data output](/extension-apps/extension-apps-101/supported-extensions/data-io#output-data) step is executed and no query is provided, or the query does not find a record to update. | Creates a new entry in your system of record. In the manifest, this action is named `DataIO.Version6.CreateRecord`. | | [Patch Record](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) | When a [data output](/extension-apps/extension-apps-101/supported-extensions/data-io#output-data) step is executed and your provided query finds a record to update. | Updates an existing entry in your system of record. In the manifest, this action is named `DataIO.Version6.PatchRecord`. | | [Search Records](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) | When a [data input](/extension-apps/extension-apps-101/supported-extensions/data-io#input-data) or [data output](/extension-apps/extension-apps-101/supported-extensions/data-io#output-data) step is executed. | Gets specific entries from your system of record. In the manifest, this action is named `DataIO.Version6.SearchRecords`. | ## Get type names and definitions When your data IO extension app is run and your [Connection](/extension-apps/extension-apps-101/concepts/connections) is established prior to any steps being executed, your extension app will automatically get the types and type definitions of the objects that your system of record is configured to expose: 1. Your workflow calls [Get Type Names](/extension-apps/extension-app-reference/extension-contracts/data-io#action-contracts) to get the set of types that your system of record exposes for Docusign. The types are returned as an array of string names. 2. Next, it calls [Get Type Definitions](/extension-apps/extension-app-reference/extension-contracts/data-io#dataio-version6-get-type-definitions), inputting the types returned by **Get Types**. This returns the full definitions of each type that your system of record exposes for Docusign. **Important**: Docusign models data input and output definitions using a flexible schema in [Concerto](https://concerto.accordproject.org/docs/intro/). If your system of record does not already use the Concerto data model, you must implement logic to convert your type definitions into Concerto format as part of your response to the **Get Type Definitions** call. See [Data model](/extension-apps/extension-apps-101/supported-extensions/data-model) for recommendations on mapping types or [Concerto specification](https://concerto.accordproject.org/docs/category/specification) for details on specific types, syntax, and examples. ![A diagram showing each step in data IO that is executed to get type names and definitions for Docusign, your extension app, and your system of record.](/_fern-files/_img/18aa7c6daaf9b7452f67759890068c487bce571aabc6114c6fdb4278837df104.webp) ## Input data When you add a data input step in the [workflow designer](https://support.docusign.com/s/document-item?language=en_US\&bundleId=yff1696971835267\&topicId=pps1696973636517.html), you configure that step by: * Choosing the type of record to retrieve. * Applying filters to specify which set of records to look through. * Specifying the attributes of the specific records to retrieve. When your data input workflow step is reached during execution, the [Search Records](/extension-apps/extension-app-reference/extension-contracts/data-io#dataio-version6-search-records) action is called to run your query and retrieve the records. Once the records are retrieved, you can use these values in subsequent workflow steps. **Important**: Docusign uses a simple custom query language to filter and select records without dependencies on any specific external systems. To implement the **Search Records** action, you must create transform logic to convert the query expression into one supported by your system of record. See [Custom query language reference](/extension-apps/extension-app-reference/extension-contracts/custom-query-language) for details on the query language structure and syntax. ![A diagram showing each step in data IO that is executed to input data for Docusign, your extension app, and your system of record.](/_fern-files/_img/57f84874c0428cc02dd2ee1c730e85740e9822b0fdb9e711244a0200d76511a0.webp) ## Output data When you add a data output step in the [workflow designer](https://support.docusign.com/s/document-item?language=en_US\&bundleId=yff1696971835267\&topicId=pps1696973636517.html), you configure that step by choosing whether it creates or updates a record. **To create a record**: 1. Select the type of record to create. 2. Do not set any filter conditions for the step’s query. 3. Provide data attributes to populate the record. Any attributes that are required by the record type in your system of record must be provided. ![A diagram showing each step in data IO that is executed to create a record. Includes steps for Docusign, your extension app, and your system of record.](/_fern-files/_img/d631aff336c7b4d1955c916769cdc1bc2df54cd79c2161f5dddb2df679b79f35.webp) **To update a record**: 1. Select the type of record to create. 2. Set one or more filter conditions that result in exactly one matching record being found. If more than one record is returned, an error will be generated. If no records are found, a **Create Record** call will be made instead. 3. Provide data attributes to be added to the record. Any values of these attributes already present in the record will be overwritten. When your data output step is reached during execution, the following logic is run: 1. If you provide one or more search filter conditions, a **Search Records** action is performed to find any record matching your query. 2. If the results of this query are empty, the internal Docusign system will create a record by invoking the **Create Record** action on the app, which will return a `recordId`. 3. If the query returns a record, that record’s `recordId` is used to call **Patch Record** and update the record’s attribute values. An error will be generated if more than one record is returned. 4. You can then use the returned `recordId` to identify the record to use and work with in future steps of your workflow. **Important**: Docusign uses a simple custom query language to filter and select records without dependencies on any specific external systems. To implement the **Search Records** action, you must create transform logic to convert the query expression into one supported by your system of record. See [Custom query language reference](/extension-apps/extension-app-reference/extension-contracts/custom-query-language) for details on the query language structure and syntax. ![A diagram showing each step in data IO that is executed to update a record. Shows steps for Docusign, your extension app, and your system of record.](/_fern-files/_img/8f74bbd52cc682788de533b4a2f5c8d0269dbc739d241479d4484f5bb7e1c950.webp) ## Next steps * See [Data IO extension workflow test](/extension-apps/build-an-extension-app/test/functional-tests/data-io-workflow) for details on how the data IO extension is displayed to users in the UI and learn how it maps to the extension action contracts. * See details about the data IO contracts and objects in the [Data IO extension contract reference](/extension-apps/extension-app-reference/extension-contracts/data-io). * Learn how to implement [foreign-key relationships](/extension-apps/extension-apps-101/supported-extensions/data-io/related-objects) in a data IO extension app. * After creating an extension app that implements data IO, you can integrate that functionality into your automation and Docusign scenarios, such as creating automation that responds to a job offer agreement by creating an account for the new employee in your system of record. You can also publish your completed extension app to the [Docusign App Center](/extension-apps/extension-apps-101/app-center) for other Docusign users to find, install, and use. > Lean how the data IO extension works, where it is used, and how it executes. ## Docs - [Define related objects in a data model](https://developers.docusign.com/extension-apps/extension-apps-101/supported-extensions/data-io/related-objects.md): Learn how to define related objects in the data model for a data IO extension app.