{"id":24090,"date":"2026-08-20T11:53:10","date_gmt":"2026-08-20T06:23:10","guid":{"rendered":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/?post_type=article&#038;p=24090"},"modified":"2026-09-02T09:35:34","modified_gmt":"2026-09-02T04:05:34","slug":"rest-api-client","status":"publish","type":"article","link":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/","title":{"rendered":"REST API Client"},"content":{"rendered":"<h2>Overview<\/h2>\n<p>The <strong>REST API Client<\/strong> lets you connect an external application \u2014 such as an automation script, CI\/CD pipeline, or integration service \u2014 to Nimble&#8217;s project-level resources using the Nimble REST API. It uses OAuth 2.0 client credentials, so the application authenticates on its own with no user login required at run time.<\/p>\n<p>When you register a REST API Client, Nimble generates a <strong>Client ID<\/strong> and a <strong>Client Secret<\/strong>. You use these credentials to get a short-lived access token, then include it on every API request.<\/p>\n<p><strong>Base URL:<\/strong> <code>https:\/\/api.digite.com\/rest\/v2<\/code><\/p>\n<table style=\"width: 100%; border-collapse: collapse; background-color: #f7f7f7;\">\n<tbody>\n<tr>\n<td style=\"width: 100%; padding: 12px 16px;\">\n<p style=\"text-align: left;\"><strong>Skip Ahead to:<\/strong><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#RegisterClient\">Register a REST API Client<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#GetToken\">Get an Access Token<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Testing\">Testing Your API Calls<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Scripts\">Scripts &amp; Client Libraries<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Workspaces\">Workspaces<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Forms\">Forms<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Instances\">Instances (Workitems)<\/a><\/p>\n<p style=\"text-align: left; padding-left: 20px;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#ActorObject\">Actor Object (User vs Client)<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Flags\">Flags<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Blocks\">Blocks<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Votes\">Votes<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Links\">Links<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Comments\">Comments<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Attachments\">Attachments<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#Todos\">Todos<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#TimeEntries\">Time Entries<\/a><\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/#ImportantPoints\">Important Points<\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><a id=\"RegisterClient\"><\/a>Register a REST API Client<\/h2>\n<p>Go to <strong>Account Space &gt; Administration &gt; REST API Client<\/strong>.<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty.png\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24109\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty.png\" alt=\"REST API Client screen under Account Space Administration\" width=\"1920\" height=\"799\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty.png 1920w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty-300x125.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty-1024x426.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty-768x320.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-empty-1536x639.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<ol>\n<li>Click <strong>REGISTER<\/strong>.<\/li>\n<li>Enter a <strong>Client Name<\/strong> and an optional <strong>Description<\/strong>. The <strong>Client ID<\/strong> is auto-generated (editable before saving).<\/li>\n<\/ol>\n<p><a target=\"_blank\" href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form.png\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24110\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form.png\" alt=\"Register REST API Client form\" width=\"1920\" height=\"799\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form.png 1920w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form-300x125.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form-1024x426.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form-768x320.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-register-form-1536x639.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<ol start=\"3\">\n<li>Expand <strong>Workspace Access Permissions<\/strong> and tick the operations \u2014 Read Card, Create Card, Update Card, Close Card, Delete Card \u2014 for each workspace this client needs access to.<\/li>\n<\/ol>\n<p><a target=\"_blank\" href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions.png\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24111\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions.png\" alt=\"Workspace Access Permissions matrix\" width=\"1920\" height=\"799\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions.png 1920w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions-300x125.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions-1024x426.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions-768x320.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-workspace-permissions-1536x639.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<ol start=\"4\">\n<li>Click <strong>REGISTER CLIENT<\/strong>. Copy the <strong>Client Secret<\/strong> immediately \u2014 it is shown only once and cannot be retrieved again.<\/li>\n<\/ol>\n<p><a target=\"_blank\" href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials.png\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24112\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials.png\" alt=\"Client ID and one-time Client Secret\" width=\"1920\" height=\"799\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials.png 1920w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials-300x125.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials-1024x426.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials-768x320.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-credentials-1536x639.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>Click <strong>DONE<\/strong>. The client appears in the list with edit and delete options.<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing.png\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24113\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing.png\" alt=\"REST API Client list with registered client\" width=\"1920\" height=\"799\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing.png 1920w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing-300x125.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing-1024x426.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing-768x320.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/08\/nimble-rest-api-client-listing-1536x639.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<h2><a id=\"GetToken\"><\/a>Get an Access Token<\/h2>\n<h3>Why exchange credentials for a token?<\/h3>\n<p>Every API call requires <code>Authorization: Bearer &lt;token&gt;<\/code>. Using a short-lived token instead of sending your secret on every request provides these security benefits:<\/p>\n<ul>\n<li><strong>Short-lived exposure<\/strong> \u2014 your secret is sent once; only the token (~1 hr) travels with each request. If intercepted, it becomes useless after expiry.<\/li>\n<li><strong>Scoped access<\/strong> \u2014 the token carries only the permissions needed for the session.<\/li>\n<li><strong>Revocability<\/strong> \u2014 a compromised token can be invalidated without rotating your client secret.<\/li>\n<li><strong>Auditability<\/strong> \u2014 token issuance is a logged event.<\/li>\n<li><strong>Stateless validation<\/strong> \u2014 downstream services verify the self-contained JWT without storing your secret.<\/li>\n<\/ul>\n<h3>Step \u2014 Get a Token<\/h3>\n<p>Do this once, then reuse the token until it expires (approximately 1 hour).<\/p>\n<pre>POST https:\/\/auth.digite.com\/rest\/v1\/oauth\/token<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"grant_type\":    \"client_credentials\",\r\n  \"client_id\":     \"nmb_cli_xxxxxxxxxxxxxxxxxxxxxxxx\",\r\n  \"client_secret\": \"your_client_secret_here\"\r\n}<\/pre>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\r\n  \"token_type\":   \"Bearer\",\r\n  \"expires_in\":   3600\r\n}<\/pre>\n<p>Use the <code>access_token<\/code> value as <code>Authorization: Bearer &lt;access_token&gt;<\/code> in all subsequent requests.<\/p>\n<h2><a id=\"Testing\"><\/a>Testing Your API Calls<\/h2>\n<p><strong>Note:<\/strong> You can use any API client, HTTP tool, or IDE plugin to test and explore the Nimble REST API. The steps below use <strong>Postman<\/strong> as an example, but the same variables and headers apply equally to tools such as Insomnia, cURL, or any HTTP library.<\/p>\n<p>If you use Postman, create an Environment with these three variables:<\/p>\n<ul>\n<li><code>token<\/code> \u2014 paste the access_token from the step above<\/li>\n<li><code>baseUrl<\/code> \u2014 <code>https:\/\/api.digite.com\/rest\/v2<\/code><\/li>\n<li><code>workspaceId<\/code> \u2014 your workspace ID (get it from <code>GET \/workspaces<\/code>)<\/li>\n<\/ul>\n<p>Set these as default headers on your Postman collection (right-click collection &gt; Edit &gt; Headers):<\/p>\n<ul>\n<li><code>Authorization<\/code>: <code>Bearer {{token}}<\/code><\/li>\n<li><code>X-WorkspaceId<\/code>: <code>{{workspaceId}}<\/code><\/li>\n<\/ul>\n<h2><a id=\"Scripts\"><\/a>Scripts &amp; Client Libraries<\/h2>\n<p>The examples below use Python, Node.js, and Java. You can use any language or HTTP library that supports JSON requests and custom headers.<\/p>\n<h3>Python (requests)<\/h3>\n<pre>import requests\r\n\r\nbase_url     = \"https:\/\/api.digite.com\/rest\/v2\"\r\ntoken        = \"eyJhbGciOiJSUzI1NiIs...\"   # Bearer token from Step above\r\nworkspace_id = \"2110769\"\r\n\r\nheaders = {\r\n    \"Authorization\": f\"Bearer {token}\",\r\n    \"X-WorkspaceId\": workspace_id,\r\n    \"Content-Type\":  \"application\/json\",\r\n}\r\n\r\n# List workitems\r\nresp = requests.get(f\"{base_url}\/instances\", headers=headers, params={\"formId\": \"523440\", \"limit\": 20})\r\nfor item in resp.json()[\"items\"]:\r\n    print(item[\"instanceId\"], item.get(\"Name\"))\r\n\r\n# Create a workitem\r\nresp = requests.post(f\"{base_url}\/instances\", headers=headers, json={\r\n    \"formId\": \"523440\", \"Name\": \"Login page broken\", \"Priority\": \"High\"\r\n})\r\nprint(\"Created:\", resp.json()[\"instanceId\"])<\/pre>\n<h3>Node.js (fetch)<\/h3>\n<pre>const baseUrl     = \"https:\/\/api.digite.com\/rest\/v2\";\r\nconst token       = \"eyJhbGciOiJSUzI1NiIs...\";\r\nconst workspaceId = \"2110769\";\r\nconst headers = {\r\n  \"Authorization\": `Bearer ${token}`,\r\n  \"X-WorkspaceId\": workspaceId,\r\n  \"Content-Type\":  \"application\/json\",\r\n};\r\n\r\n\/\/ List workitems\r\nconst res = await fetch(`${baseUrl}\/instances?formId=523440&amp;limit=20`, { headers });\r\nconst data = await res.json();\r\ndata.items.forEach(item =&gt; console.log(item.instanceId, item.Name));\r\n\r\n\/\/ Create a workitem\r\nconst res2 = await fetch(`${baseUrl}\/instances`, {\r\n  method: \"POST\", headers,\r\n  body: JSON.stringify({ formId: \"523440\", Name: \"Login page broken\", Priority: \"High\" }),\r\n});\r\nconsole.log(\"Created:\", (await res2.json()).instanceId);<\/pre>\n<h3>Java (HttpClient)<\/h3>\n<pre>import java.net.URI;\r\nimport java.net.http.*;\r\n\r\nString baseUrl = \"https:\/\/api.digite.com\/rest\/v2\";\r\nString token   = \"eyJhbGciOiJSUzI1NiIs...\";\r\nString wsId    = \"2110769\";\r\nHttpClient client = HttpClient.newHttpClient();\r\n\r\nHttpRequest req = HttpRequest.newBuilder()\r\n    .uri(URI.create(baseUrl + \"\/instances?formId=523440&amp;limit=20\"))\r\n    .header(\"Authorization\", \"Bearer \" + token)\r\n    .header(\"X-WorkspaceId\", wsId)\r\n    .GET().build();\r\nHttpResponse resp = client.send(req, HttpResponse.BodyHandlers.ofString());\r\nSystem.out.println(resp.body());<\/pre>\n<p>A client SDK (nimblework-finch) is planned but not yet published. Until then, use the HTTP libraries above.<\/p>\n<h2><a id=\"Workspaces\"><\/a>Workspaces<\/h2>\n<p>Workspace endpoints do not require the <code>X-WorkspaceId<\/code> header.<\/p>\n<h3>GET \u2014 List Workspaces<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/workspaces<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>limit<\/code> \u2014 optional \u2014 Number of results per page (default 50)<\/li>\n<li><code>pageToken<\/code> \u2014 optional \u2014 Cursor from previous response for next page<\/li>\n<li><code>sort<\/code> \u2014 optional \u2014 Field to sort by<\/li>\n<li><code>order<\/code> \u2014 optional \u2014 <code>asc<\/code> or <code>desc<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [{\r\n    \"workspaceId\": \"2110769\",\r\n    \"name\": \"My First Project\",\r\n    \"description\": \"FromProjectCreate\",\r\n    \"createdBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"modifiedBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"createdAt\": \"2026-08-14T17:12:17Z\"\r\n  }],\r\n  \"total\": 1,\r\n  \"pageToken\": null\r\n}<\/pre>\n<h3>GET \u2014 Single Workspace<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/workspaces\/:workspaceId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>workspaceId<\/code> \u2014 required \u2014 e.g. 2110769<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"workspaceId\": \"2110769\",\r\n  \"name\": \"My First Project\",\r\n  \"description\": \"FromProjectCreate\",\r\n  \"createdBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"createdAt\": \"2026-08-14T17:12:17Z\",\r\n  \"updatedAt\": \"2026-08-14T17:12:17Z\"\r\n}<\/pre>\n<h2><a id=\"Forms\"><\/a>Forms<\/h2>\n<p>Forms are the templates that define the fields for workitems. Every workitem belongs to a form. The <code>X-WorkspaceId<\/code> header is required for both form endpoints.<\/p>\n<h3>GET \u2014 List Forms<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/forms<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [{\r\n    \"formId\": \"523440\",\r\n    \"name\": \"Issue\",\r\n    \"prefix\": \"ISS\",\r\n    \"workspaceId\": \"2110769\",\r\n    \"hexColorCode\": \"#FF5733\",\r\n    \"custom\": true,\r\n    \"createdAt\": \"2026-01-10T09:00:00Z\",\r\n    \"fields\": [\r\n      { \"fieldUniqueName\": \"Name\",     \"custom\": false, \"readOnly\": false },\r\n      { \"fieldUniqueName\": \"Priority\", \"custom\": true,  \"readOnly\": false },\r\n      { \"fieldUniqueName\": \"Status\",   \"custom\": false, \"readOnly\": true  }\r\n    ]\r\n  }]\r\n}<\/pre>\n<h3>GET \u2014 Single Form (with full field schema)<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/forms\/:formId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>formId<\/code> \u2014 required \u2014 Numeric form ID, e.g. 523440<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"formId\": \"523440\",\r\n  \"name\": \"Issue\",\r\n  \"prefix\": \"ISS\",\r\n  \"workspaceId\": \"2110769\",\r\n  \"fields\": [\r\n    { \"fieldUniqueName\": \"Name\",     \"custom\": false, \"readOnly\": false, \"type\": \"TEXT\",   \"required\": true  },\r\n    { \"fieldUniqueName\": \"Priority\", \"custom\": true,  \"readOnly\": false, \"type\": \"LOOKUP\", \"required\": false }\r\n  ]\r\n}<\/pre>\n<p>Use this to discover valid field names and types before writing instances.<\/p>\n<h2><a id=\"Instances\"><\/a>Instances (Workitems)<\/h2>\n<p>An instance is a single workitem (card). Custom field values are sent and received at the root level alongside system fields. Always include <code>formId<\/code> in the request body for writes.<\/p>\n<h3>GET \u2014 List Instances<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>formId<\/code> \u2014 optional \u2014 Filter by form, e.g. 523440<\/li>\n<li><code>expand<\/code> \u2014 optional \u2014 <code>true<\/code> \u2014 inlines lookup field values<\/li>\n<li><code>limit<\/code> \u2014 optional \u2014 Max results per page<\/li>\n<li><code>pageToken<\/code> \u2014 optional \u2014 Cursor for next page<\/li>\n<li><code>sort<\/code> \u2014 optional \u2014 Field name to sort by<\/li>\n<li><code>order<\/code> \u2014 optional \u2014 <code>asc<\/code> or <code>desc<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [{\r\n    \"instanceId\": \"523440-42\",\r\n    \"id\": \"ISS-42\",\r\n    \"formId\": \"523440\",\r\n    \"workspaceId\": \"2110769\",\r\n    \"Name\": \"Login page broken\",\r\n    \"Priority\": \"High\",\r\n    \"Status\": \"Open\",\r\n    \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"createdAt\": \"2026-08-01T10:00:00Z\"\r\n  }],\r\n  \"total\": 1\r\n}<\/pre>\n<h3>GET \u2014 Single Instance<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Use the <code>instanceId<\/code> returned by POST (e.g. 523440-42), not the business key (ISS-42)<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>expand<\/code> \u2014 optional \u2014 <code>true<\/code> \u2014 inlines lookup field values<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"523440-42\",\r\n  \"id\": \"ISS-42\",\r\n  \"formId\": \"523440\",\r\n  \"workspaceId\": \"2110769\",\r\n  \"Name\": \"Login page broken\",\r\n  \"Priority\": \"High\",\r\n  \"Status\": \"Open\",\r\n  \"flags\": [],\r\n  \"blocks\": [],\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"createdAt\": \"2026-08-01T10:00:00Z\"\r\n}<\/pre>\n<h3><a id=\"ActorObject\"><\/a>Actor Object \u2014 <code>createdBy<\/code> \/ <code>modifiedBy<\/code> (User vs Client)<\/h3>\n<p>Every response that includes <code>createdBy<\/code> and <code>modifiedBy<\/code> returns an <strong>actor object<\/strong>. Its shape tells you whether a human user or a registered API client performed the action.<\/p>\n<p>The fields present depend on the actor <code>type<\/code>:<\/p>\n<ul>\n<li><strong><code>\"USER\"<\/code><\/strong> \u2014 <code>actorId<\/code>, <code>name<\/code>, <code>type<\/code><\/li>\n<li><strong><code>\"CLIENT\"<\/code><\/strong> \u2014 <code>userId<\/code> (in <code>nmb_cli_\u2026<\/code> format), <code>name<\/code>, <code>type<\/code>, and <code>onBehalfOf<\/code><\/li>\n<\/ul>\n<p>When a <strong>human user<\/strong> performs the action, the actor object looks like this:<\/p>\n<pre>\"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }<\/pre>\n<p>When a <strong>registered API client<\/strong> performs the action, the actor is the client itself. The <code>onBehalfOf<\/code> object identifies the user account whose access the client is using:<\/p>\n<pre>\"createdBy\": {\r\n  \"name\": \"Claude AI\",\r\n  \"type\": \"CLIENT\",\r\n  \"userId\": \"nmb_cli_b1c0def41481a874498be77d\",\r\n  \"onBehalfOf\": {\r\n    \"name\": \"Simple Workflow\",\r\n    \"type\": \"USER\",\r\n    \"userId\": \"353135992\"\r\n  }\r\n}<\/pre>\n<p><strong>How to read it:<\/strong> <code>userId<\/code> (in <code>nmb_cli_\u2026<\/code> format) is the API client that made the request, and <code>onBehalfOf<\/code> is the user account it acted for. This lets you audit both the client and the underlying user for every action taken through the REST API.<\/p>\n<h4>Response Example \u2014 Created by an API Client<\/h4>\n<p>A workitem created by an API client returns both <code>createdBy<\/code> and <code>modifiedBy<\/code> as CLIENT actor objects:<\/p>\n<pre>{\r\n  \"instanceId\": \"823666\",\r\n  \"id\": \"ACTY1\",\r\n  \"formId\": \"412162\",\r\n  \"workspaceId\": \"412160\",\r\n  \"Name\": \"Testing Activity card\",\r\n  \"Status\": \"Open\",\r\n  \"version\": 1,\r\n  \"flags\": [],\r\n  \"blocks\": [],\r\n  \"createdBy\": {\r\n    \"name\": \"Claude AI\",\r\n    \"type\": \"CLIENT\",\r\n    \"userId\": \"nmb_cli_b1c0def41481a874498be77d\",\r\n    \"onBehalfOf\": { \"name\": \"Simple Workflow\", \"type\": \"USER\", \"userId\": \"353135992\" }\r\n  },\r\n  \"modifiedBy\": {\r\n    \"name\": \"Claude AI\",\r\n    \"type\": \"CLIENT\",\r\n    \"userId\": \"nmb_cli_b1c0def41481a874498be77d\",\r\n    \"onBehalfOf\": { \"name\": \"Simple Workflow\", \"type\": \"USER\", \"userId\": \"353135992\" }\r\n  },\r\n  \"createdAt\": \"2026-08-26T09:12:02Z\",\r\n  \"updatedAt\": \"2026-08-26T09:12:02Z\"\r\n}<\/pre>\n<h3>GET \u2014 Subblocks (child workitems)<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/subblocks<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent workitem instance ID<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>depth<\/code> \u2014 required \u2014 <code>0<\/code> = direct children only \u00b7 <code>-1<\/code> = full tree \u00b7 <code>n<\/code> = n levels deep<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"subblocks\": [{\r\n    \"instanceId\": \"523440-43\",\r\n    \"formId\": \"523441\",\r\n    \"workspaceId\": \"2110769\",\r\n    \"data\": { \"Name\": \"Sub-task A\", \"Status\": \"Open\" },\r\n    \"subblocks\": []\r\n  }]\r\n}<\/pre>\n<h3>POST \u2014 Create Instance<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"formId\":          \"412162\",\r\n  \"Name\":            \"Login page broken\",\r\n  \"Description\":     \"Reproduce: open Chrome, go to \/login, click Submit without credentials.\",\r\n  \"Priority\":        \"High\",\r\n  \"EstimateHours\":   4,\r\n  \"PercentComplete\": 0,\r\n  \"DueDate\":         \"2026-09-15T00:00:00.000Z\",\r\n  \"Tags\":            [\"bug\", \"login\"]\r\n}<\/pre>\n<p><code>formId<\/code> is the only required body field. Custom field names must match exactly what <code>GET \/forms\/{formId}<\/code> returns. <code>workspaceId<\/code> is NOT sent in the body \u2014 it comes from the <code>X-WorkspaceId<\/code> header.<\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{ \"instanceId\": \"523440-42\", \"id\": \"ISS-42\" }<\/pre>\n<p>The <code>Location<\/code> response header also contains the URL of the new instance.<\/p>\n<h3>PUT \u2014 Full Replace<\/h3>\n<pre>PUT https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 e.g. 523440-42<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"formId\":          \"412162\",\r\n  \"Name\":            \"Login page broken \u2014 updated\",\r\n  \"Description\":     \"Full replacement via PUT.\",\r\n  \"Priority\":        \"Critical\",\r\n  \"EstimateHours\":   8,\r\n  \"PercentComplete\": 0,\r\n  \"DueDate\":         \"2026-09-15T00:00:00.000Z\"\r\n}<\/pre>\n<p><strong>Important:<\/strong> This is a full replacement \u2014 any custom field not included in the body is cleared. System fields (Status, flags, blocks) are never cleared by PUT. Cleared fields do not appear in the response.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"formId\": \"412162\",\r\n  \"instanceId\": \"836334\",\r\n  \"version\": 0,\r\n  \"workspaceId\": \"412417\",\r\n  \"Name\": \"Login page broken \u2014 updated\",\r\n  \"Description\": \"Full replacement via PUT.\",\r\n  \"Priority\": \"Critical\",\r\n  \"EstimateHours\": 8,\r\n  \"PercentComplete\": 0,\r\n  \"DueDate\": \"2026-09-15T00:00:00.000+00:00\"\r\n}<\/pre>\n<h3>PATCH \u2014 Partial Update<\/h3>\n<pre>PATCH https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 e.g. 523440-42<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"formId\":          \"412162\",\r\n  \"Name\":            \"Login page broken\",\r\n  \"PercentComplete\": 40,\r\n  \"Priority\":        \"High\",\r\n  \"DueDate\":         \"2026-09-15T00:00:00.000Z\"\r\n}<\/pre>\n<p>Only the fields you send are updated \u2014 all other fields remain untouched. <code>formId<\/code> is required. Do not send flag or block keys here \u2014 use the dedicated sub-resource endpoints.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"formId\": \"412162\",\r\n  \"instanceId\": \"836334\",\r\n  \"version\": 0,\r\n  \"workspaceId\": \"412417\",\r\n  \"Name\": \"Login page broken\",\r\n  \"PercentComplete\": 40,\r\n  \"Priority\": \"High\",\r\n  \"DueDate\": \"2026-09-15T00:00:00.000+00:00\"\r\n}<\/pre>\n<h3>DELETE \u2014 Delete Instance<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 e.g. 523440-42<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"success\": true }<\/pre>\n<p>Returns 404 if the instance has already been deleted.<\/p>\n<h2><a id=\"Flags\"><\/a>Flags<\/h2>\n<p>Available on standalone form types only. Returns 400 for sub-block instances.<\/p>\n<h3>POST \u2014 Flag an Instance<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/flags<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to flag<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"comment\": \"Needs immediate attention\" }<\/pre>\n<p><code>comment<\/code> is required (max 5,000 characters). To get the <code>actionId<\/code> for unflagging, call <code>GET \/instances\/{instanceId}<\/code> and look at the <code>flags<\/code> field.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"version\": 2,\r\n  \"deleted\": false,\r\n  \"createdBy\": \"353136425\",\r\n  \"modifiedBy\": \"353136425\",\r\n  \"createdAt\": \"2026-02-25T04:14:51Z\",\r\n  \"updatedAt\": \"2026-08-19T10:00:00Z\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"Status\": \"Open\",\r\n  \"Priority\": \"1044\"\r\n}<\/pre>\n<p>Returns the full updated instance.<\/p>\n<h3>DELETE \u2014 Unflag an Instance<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/flags\/:actionId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to unflag<\/li>\n<li><code>actionId<\/code> \u2014 required \u2014 The actionId from the flag entry, e.g. flag_001<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"comment\": \"Resolved\" }<\/pre>\n<p><code>comment<\/code> is required. Returns 400 (not 409) for: no flag history, actionId mismatch, or already unflagged.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"version\": 3,\r\n  \"deleted\": false,\r\n  \"createdBy\": \"353136425\",\r\n  \"modifiedBy\": \"353136425\",\r\n  \"createdAt\": \"2026-02-25T04:14:51Z\",\r\n  \"updatedAt\": \"2026-08-19T10:05:00Z\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"Status\": \"Open\",\r\n  \"Priority\": \"1044\"\r\n}<\/pre>\n<h2><a id=\"Blocks\"><\/a>Blocks<\/h2>\n<h3>POST \u2014 Block an Instance<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/blocks<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to block<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"reason\":  \"Waiting for design approval\",\r\n  \"comment\": \"Blocked until design sign-off is received\"\r\n}<\/pre>\n<p>Both <code>reason<\/code> and <code>comment<\/code> are required. Returns 400 if either is absent. Use <code>GET \/forms\/{formId}<\/code> to discover valid blocking reasons. To get the <code>actionId<\/code> for unblocking, call <code>GET \/instances\/{instanceId}<\/code> and look at the <code>blocks<\/code> field.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"version\": 2,\r\n  \"deleted\": false,\r\n  \"createdBy\": \"353136425\",\r\n  \"modifiedBy\": \"353136425\",\r\n  \"createdAt\": \"2026-02-25T04:14:51Z\",\r\n  \"updatedAt\": \"2026-08-19T10:00:00Z\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"Status\": \"Open\",\r\n  \"Priority\": \"1044\"\r\n}<\/pre>\n<p>Returns the full updated instance.<\/p>\n<h3>DELETE \u2014 Unblock an Instance<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/blocks\/:actionId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to unblock<\/li>\n<li><code>actionId<\/code> \u2014 required \u2014 The actionId from the block entry<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"comment\": \"Design approved, unblocking\" }<\/pre>\n<p><code>comment<\/code> is required \u2014 returns 400 if absent or blank.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"version\": 3,\r\n  \"deleted\": false,\r\n  \"createdBy\": \"353136425\",\r\n  \"modifiedBy\": \"353136425\",\r\n  \"createdAt\": \"2026-02-25T04:14:51Z\",\r\n  \"updatedAt\": \"2026-08-19T10:05:00Z\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"Status\": \"Open\",\r\n  \"Priority\": \"1044\"\r\n}<\/pre>\n<h2><a id=\"Votes\"><\/a>Votes<\/h2>\n<h3>POST \u2014 Vote on an Instance<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/votes<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to vote on<\/li>\n<\/ul>\n<p>No body required. Returns 409 if you have already voted on this instance.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"version\": 2,\r\n  \"deleted\": false,\r\n  \"createdBy\": \"353136425\",\r\n  \"modifiedBy\": \"353136425\",\r\n  \"createdAt\": \"2026-02-25T04:14:51Z\",\r\n  \"updatedAt\": \"2026-08-19T10:00:00Z\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"Status\": \"Open\",\r\n  \"Priority\": \"1044\"\r\n}<\/pre>\n<p>Returns the full updated instance.<\/p>\n<h3>DELETE \u2014 Remove Vote<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/votes<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to remove vote from<\/li>\n<\/ul>\n<p>Returns 409 if you have not voted on this instance.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"version\": 3,\r\n  \"deleted\": false,\r\n  \"createdBy\": \"353136425\",\r\n  \"modifiedBy\": \"353136425\",\r\n  \"createdAt\": \"2026-02-25T04:14:51Z\",\r\n  \"updatedAt\": \"2026-08-19T10:05:00Z\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"Status\": \"Open\",\r\n  \"Priority\": \"1044\"\r\n}<\/pre>\n<p>Returns the full updated instance.<\/p>\n<h2><a id=\"Links\"><\/a>Links<\/h2>\n<p>Creates or removes a typed directional link between two instances. HIERARCHY links also set <code>parentCard<\/code> on the source instance.<\/p>\n<h3>PUT \u2014 Create a Link<\/h3>\n<pre>PUT https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/link<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Source instance<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"to\": {\r\n    \"workItemId\":  \"ISS-50\",\r\n    \"formId\":      \"523440\",\r\n    \"workSpaceId\": \"2110769\"\r\n  },\r\n  \"relationInverse\": \"fulfills\",\r\n  \"metaType\": \"DEPENDENCY\"\r\n}<\/pre>\n<p><strong>metaType values:<\/strong> <code>HIERARCHY<\/code> (default), <code>DEPENDENCY<\/code>, <code>TRACEBAILITY<\/code>, <code>CONTAINMENT<\/code>, <code>ASSOCIATION<\/code>.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"id\": \"lnk_001\",\r\n  \"from\": { \"workItemId\": \"523440-42\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"to\":   { \"workItemId\": \"523440-50\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"metaType\": \"DEPENDENCY\",\r\n  \"relation\": \"depends on\",\r\n  \"relationInverse\": \"fulfills\",\r\n  \"workSpaceId\": \"2110769\"\r\n}<\/pre>\n<h3>DELETE \u2014 Remove a Link<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/link\/:targetId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Source instance<\/li>\n<li><code>targetId<\/code> \u2014 required \u2014 Target instance ID<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>metaType<\/code> \u2014 optional \u2014 Must match the value used when the link was created. Defaults to HIERARCHY.<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"id\": \"lnk_001\",\r\n  \"from\": { \"workItemId\": \"523440-42\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"to\":   { \"workItemId\": \"523440-50\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"metaType\": \"DEPENDENCY\",\r\n  \"relation\": \"depends on\",\r\n  \"relationInverse\": \"fulfills\",\r\n  \"workSpaceId\": \"2110769\"\r\n}<\/pre>\n<h2><a id=\"Comments\"><\/a>Comments<\/h2>\n<p><strong>Limitations:<\/strong> User mentions (@user), emoji, and inline attachments are not supported in comment text. Use <code>POST \/attachments<\/code> to attach files.<\/p>\n<h3>POST \u2014 Add a Comment<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/comments<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to comment on<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"content\": \"Reproduced on Chrome 126. Stack trace attached.\", \"type\": \"COMMENT\" }<\/pre>\n<p><code>content<\/code> is required (min 1 char). <code>type<\/code> is optional, defaults to COMMENT.<\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{ \"commentId\": \"cmt_abc123\" }<\/pre>\n<h3>GET \u2014 List Comments<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/comments<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to list comments for<\/li>\n<\/ul>\n<p>The response key is <code>content<\/code>, not <code>comments<\/code>.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"content\": [{\r\n    \"commentId\": \"cmt_abc123\",\r\n    \"content\": \"Reproduced on Chrome 126.\",\r\n    \"type\": \"COMMENT\",\r\n    \"authorId\": \"353136425\",\r\n    \"actor\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"workitemId\": \"523440-42\",\r\n    \"workspaceId\": \"2110769\",\r\n    \"createdAt\": \"2026-08-19T10:05:00Z\"\r\n  }]\r\n}<\/pre>\n<h3>GET \u2014 Single Comment<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/comments\/:commentId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>commentId<\/code> \u2014 required \u2014 e.g. cmt_abc123<\/li>\n<\/ul>\n<p>The <code>replies<\/code> array is always empty here \u2014 replies are stored as independent comments at the same level. Use GET list to retrieve all comments including replies.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"commentId\": \"cmt_abc123\",\r\n  \"content\": \"Reproduced on Chrome 126.\",\r\n  \"authorId\": \"353136425\",\r\n  \"actor\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"workitemId\": \"523440-42\",\r\n  \"type\": \"COMMENT\",\r\n  \"replies\": []\r\n}<\/pre>\n<h3>PUT \u2014 Add a Reply<\/h3>\n<pre>PUT https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/comments\/:commentId\/replies<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>commentId<\/code> \u2014 required \u2014 Comment to reply to<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"content\": \"Also reproduced on Safari 17.\" }<\/pre>\n<p>No response body. The reply is stored as a separate independent comment at the same level.<\/p>\n<h3>PUT \u2014 Edit Comment Text<\/h3>\n<pre>PUT https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/comments\/:commentId\/content<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>commentId<\/code> \u2014 required \u2014 Comment to edit<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"content\": \"Reproduced on Chrome 126 and Edge 124. Stack trace attached.\" }<\/pre>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"commentId\": \"cmt_abc123\", \"updated\": true }<\/pre>\n<h3>DELETE \u2014 Delete Comment<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/comments\/:commentId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>commentId<\/code> \u2014 required \u2014 Comment to delete<\/li>\n<\/ul>\n<p>Empty body on success.<\/p>\n<h2><a id=\"Attachments\"><\/a>Attachments<\/h2>\n<h3>POST \u2014 Upload a File<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/attachments<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: Do NOT set manually \u2014 set automatically for multipart\/form-data<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to attach to<\/li>\n<\/ul>\n<p><strong>Body \u00b7 form-data<\/strong>: key <code>file<\/code>, type File, value: file to upload (max 32 MB). In Postman: Body \u2192 form-data \u2192 key <code>file<\/code> \u2192 change type from Text to File \u2192 Select Files.<\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{ \"attachmentId\": \"att_789012\" }<\/pre>\n<h3>POST \u2014 Link an External Resource<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/attachments\/link<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to attach to<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"attachmentName\": \"Design Mockup\",\r\n  \"content\":        \"https:\/\/figma.com\/file\/abc123\",\r\n  \"linkedUsing\":    \"Figma\"\r\n}<\/pre>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{ \"attachmentId\": \"att_link_001\" }<\/pre>\n<h3>GET \u2014 List Attachments<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/attachments<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Instance to list attachments for<\/li>\n<\/ul>\n<p>The response key is <code>content<\/code>, not <code>attachments<\/code>.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"content\": [{\r\n    \"attachmentId\": \"att_789012\",\r\n    \"name\": \"screenshot.png\",\r\n    \"mimeType\": \"image\/png\",\r\n    \"fileSize\": 204800,\r\n    \"workitemId\": \"523440-42\",\r\n    \"workspaceId\": \"2110769\",\r\n    \"isLink\": false,\r\n    \"uploaderId\": \"353136425\",\r\n    \"actor\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"createdAt\": \"2026-08-19T11:00:00Z\"\r\n  }]\r\n}<\/pre>\n<h3>DELETE \u2014 Delete Attachment<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/attachments\/:attachmentId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>attachmentId<\/code> \u2014 required \u2014 Attachment to delete<\/li>\n<\/ul>\n<p>Empty body on success.<\/p>\n<h2><a id=\"Todos\"><\/a>Todos<\/h2>\n<h3>GET \u2014 List Todos<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>assigneeId<\/code> \u2014 optional \u2014 Filter by assignee user ID<\/li>\n<li><code>limit<\/code> \u2014 optional \u2014 Max results per page<\/li>\n<li><code>pageToken<\/code> \u2014 optional \u2014 Cursor for next page<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [{\r\n    \"todoId\": \"TODO1\",\r\n    \"workspaceId\": \"2110769\",\r\n    \"formId\": \"523440\",\r\n    \"workitemId\": \"523440-42\",\r\n    \"name\": \"Write unit tests\",\r\n    \"status\": \"Open\",\r\n    \"isTimeLogged\": false,\r\n    \"assigneeId\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"createdBy\":  { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"updatedBy\":  { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n    \"estimate\": 4,\r\n    \"remaining\": 4,\r\n    \"position\": 1\r\n  }]\r\n}<\/pre>\n<h3>GET \u2014 Single Todo<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 e.g. TODO1<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"todoId\": \"TODO1\",\r\n  \"workspaceId\": \"2110769\",\r\n  \"formId\": \"523440\",\r\n  \"workitemId\": \"523440-42\",\r\n  \"name\": \"Write unit tests\",\r\n  \"status\": \"Open\",\r\n  \"isTimeLogged\": false,\r\n  \"assigneeId\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"estimate\": 4,\r\n  \"remaining\": 4,\r\n  \"position\": 1\r\n}<\/pre>\n<h3>POST \u2014 Create a Todo<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"name\":       \"Write unit tests\",\r\n  \"assigneeId\": \"353136425\",\r\n  \"estimate\":   4,\r\n  \"position\":   1\r\n}<\/pre>\n<p><code>name<\/code> is required. <code>assigneeId<\/code>, <code>estimate<\/code> (\u2265 0), and <code>position<\/code> (\u2265 1) are optional. Returns 404 if the parent instance does not exist.<\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{ \"todoId\": \"TODO1\" }<\/pre>\n<h3>PATCH \u2014 Update a Todo<\/h3>\n<pre>PATCH https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 Todo to update<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"estimate\": 6 }<\/pre>\n<p>All fields optional: <code>name<\/code>, <code>assigneeId<\/code>, <code>estimate<\/code>. Only sent fields are updated.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"todoId\": \"TODO1\" }<\/pre>\n<h3>POST \u2014 Close a Todo<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId\/close<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 Todo to close<\/li>\n<\/ul>\n<p>No body required.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"todoId\": \"TODO1\", \"status\": \"closed\", \"actualFinish\": \"2026-08-19T12:00:00Z\" }<\/pre>\n<h3>POST \u2014 Reopen a Todo<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId\/reopen<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 Todo to reopen<\/li>\n<\/ul>\n<p>No body required.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"todoId\": \"TODO1\", \"status\": \"open\" }<\/pre>\n<h3>DELETE \u2014 Delete a Todo<\/h3>\n<pre>DELETE https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 Todo to delete<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"message\": \"deleted\" }<\/pre>\n<h2><a id=\"TimeEntries\"><\/a>Time Entries<\/h2>\n<p>Time entries are keyed by <code>todoId<\/code> + <code>date<\/code>. Submitting the same pair again overwrites the existing entry.<\/p>\n<h3>POST \u2014 Log Time<\/h3>\n<pre>POST https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId\/timeentries\/:date<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>Content-Type<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 Todo to log time against<\/li>\n<li><code>date<\/code> \u2014 required \u2014 Format YYYY-MM-DD \u2014 cannot be a future date<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"actual\": 3.5, \"remaining\": 0.5 }<\/pre>\n<p><code>actual<\/code> is required (hours logged). <code>remaining<\/code> and <code>estimate<\/code> are optional.<\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{\r\n  \"actual\": 3.5,\r\n  \"remaining\": 0.5,\r\n  \"latestRemaining\": 0.5,\r\n  \"totalActual\": 7.0,\r\n  \"timesheetDate\": \"2026-08-19T00:00:00.000Z\"\r\n}<\/pre>\n<h3>GET \u2014 Get Time Entry for a Date<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/:instanceId\/todos\/:todoId\/timeentries\/:date<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 Parent instance<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 Todo ID<\/li>\n<li><code>date<\/code> \u2014 required \u2014 Date in YYYY-MM-DD format<\/li>\n<\/ul>\n<p>Returns 404 if no entry exists for that todo + date combination. <code>timesheetDate<\/code> in the response is a plain date string (YYYY-MM-DD).<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"workspaceId\": \"2110769\",\r\n  \"workItemId\": \"UST-42\",\r\n  \"todoId\": \"TODO1\",\r\n  \"timesheetUserId\": \"353136425\",\r\n  \"actual\": 3.5,\r\n  \"remaining\": 0.5,\r\n  \"isRemainingUpdated\": true,\r\n  \"timesheetDate\": \"2026-08-19\",\r\n  \"createdAt\": \"2026-08-19T10:30:00.000Z\",\r\n  \"updatedAt\": \"2026-08-19T10:30:00.000Z\"\r\n}<\/pre>\n<h3>GET \u2014 List Time Entries by Date Range<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/timeentries<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization<\/code>: Bearer &lt;access_token&gt;<\/li>\n<li><code>X-WorkspaceId<\/code>: &lt;workspace_id&gt;<\/li>\n<li><code>accept<\/code>: application\/json<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>timesheetStartDate<\/code> \u2014 required \u2014 YYYY-MM-DD<\/li>\n<li><code>timesheetEndDate<\/code> \u2014 required \u2014 YYYY-MM-DD<\/li>\n<li><code>workspaceIds[]<\/code> \u2014 optional \u2014 Repeatable \u2014 filter by workspace<\/li>\n<li><code>limit<\/code> \u2014 optional \u2014 1\u2013100, default 50<\/li>\n<li><code>pageToken<\/code> \u2014 optional \u2014 Cursor for next page<\/li>\n<\/ul>\n<p><code>nextPageToken<\/code> is omitted when there are no further pages. Pass it as the <code>pageToken<\/code> query param to fetch the next page.<\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [{\r\n    \"workspaceId\": \"2110769\",\r\n    \"workItemId\": \"UST-42\",\r\n    \"todoId\": \"TODO1\",\r\n    \"timesheetUserId\": \"353136425\",\r\n    \"actual\": 3.5,\r\n    \"remaining\": 0.5,\r\n    \"isRemainingUpdated\": true,\r\n    \"timesheetDate\": \"2026-08-19\",\r\n    \"createdAt\": \"2026-08-19T10:30:00.000Z\",\r\n    \"updatedAt\": \"2026-08-19T10:30:00.000Z\"\r\n  }],\r\n  \"nextPageToken\": \"eyJsYXN0SWQiOiI2NjlmYWRkYzQ3NWYwNzVjYWEwM2Y4ZTYifQ==\"\r\n}<\/pre>\n<h2><a id=\"ImportantPoints\"><\/a>Important Points<\/h2>\n<ul>\n<li>A REST API Client operates as its own independent identity \u2014 actions are attributed to the client, not to the user who registered it.<\/li>\n<li>The <strong>Client Secret<\/strong> is displayed only once at registration. If you lose it, regenerate it from the listing.<\/li>\n<li>Grant each client only the workspace permissions it needs.<\/li>\n<li>Tokens expire after approximately <strong>1 hour<\/strong>. Cache and reuse; request a new one only when expired.<\/li>\n<li><code>workspaceId<\/code> is passed via the <code>X-WorkspaceId<\/code> header \u2014 never in the request body.<\/li>\n<li><code>formId<\/code> is required in every instance write request (POST, PUT, PATCH).<\/li>\n<li>Custom field names must match exactly what <code>GET \/forms\/{formId}<\/code> returns.<\/li>\n<li><strong>PUT<\/strong> is a full replacement \u2014 any custom field not included is cleared. Use <strong>PATCH<\/strong> for partial updates.<\/li>\n<li>Flag and block <code>actionId<\/code> values are obtained by calling <code>GET \/instances\/{instanceId}<\/code> and reading the <code>flags<\/code> or <code>blocks<\/code> field.<\/li>\n<li>Always use HTTPS.<\/li>\n<\/ul>\n<div class=\"helpful-block-content wth-theme-thumbs\" data-title=\"\" >\n<ul>\n<li><span class=\"wth-title\">Was this helpful?<\/span><\/li>\n<li><a data-post=\"24090\" data-post-url=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/\" data-post-title=\"REST API Client\" data-response=\"1\" href=\"#\" class=\"wth-green-btn icon-thumbsup\">Yes<\/a>&nbsp; &nbsp;<a data-response=\"0\" data-post=\"24090\" data-post-url=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/rest-api-client\/\" data-post-title=\"REST API Client\" href=\"#\" class=\"wth-red-btn icon-thumbsdown\">No<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"author":2,"featured_media":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","multi-rating":{"mr_rating_results":[]},"_links":{"self":[{"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/article\/24090"}],"collection":[{"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/comments?post=24090"}],"version-history":[{"count":13,"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/article\/24090\/revisions"}],"predecessor-version":[{"id":24130,"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/article\/24090\/revisions\/24130"}],"wp:attachment":[{"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/media?parent=24090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}