{"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-10-09T12:49:49","modified_gmt":"2026-10-09T07:19:49","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><strong>Organization-level vs. project-level:<\/strong> This article covers the <strong>project-level<\/strong> resources of the Nimble REST API \u2014 instances, comments, attachments, to-dos, time entries, and related data \u2014 accessed using OAuth 2.0 client credentials. For <strong>organization-level<\/strong> resources (Users, Projects, and Team Members), which are accessed using an API key, see the <a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/article\/nimble-rest-api\/\">Nimble REST API<\/a> article.<\/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\/#GettingStarted\">Getting Started<\/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<\/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\/#Boards\">Boards<\/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 this client is allowed to perform \u2014 <strong>Read Card<\/strong>, <strong>Create Card<\/strong>, <strong>Update Card<\/strong>, <strong>Close Card<\/strong>, <strong>Delete Card<\/strong> \u2014 for each workspace it needs access to. These permissions are granted <em>per workspace<\/em>, so the same client can have different rights in different projects, and it can never do more through the API than the boxes you tick here.<strong>Example:<\/strong> a read-only reporting client that only pulls data from the <em>Mobile Team<\/em> workspace would tick only <strong>Read Card<\/strong> for that workspace; a client that files and updates bugs would also tick <strong>Create Card<\/strong> and <strong>Update Card<\/strong>, while leaving <strong>Delete Card<\/strong> unticked so it can never remove work items.<\/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>Limited exposure<\/strong> \u2014 your secret is sent once; only the token (~180 days) 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>Get a Token \u2014 step by step<\/h3>\n<p>You only need to do this once. The token stays valid for about 180 days; after that, repeat these steps to get a new one.<\/p>\n<p>You can use any API client or HTTP tool. The steps below use <strong>Postman<\/strong> (a free, widely used API client) as an example \u2014 the same idea applies to Insomnia, cURL, or any similar tool.<\/p>\n<ol>\n<li><strong>Open a new request.<\/strong> In Postman, click <strong>New &gt; HTTP Request<\/strong> (or the <strong>+<\/strong> tab).<\/li>\n<li><strong>Set the method to <code>POST<\/code>.<\/strong> To the left of the address bar is a dropdown that shows <code>GET<\/code> by default \u2014 change it to <strong><code>POST<\/code><\/strong>.<\/li>\n<li><strong>Paste the address<\/strong> into the long field next to the method dropdown:\n<pre>https:\/\/api.digite.com\/rest\/v1\/oauth\/token<\/pre>\n<\/li>\n<li><strong>Add the header.<\/strong> Click the <strong>Headers<\/strong> tab (just below the address bar). You will see a table with two columns, <strong>KEY<\/strong> and <strong>VALUE<\/strong>:\n<ul>\n<li>In the <strong>KEY<\/strong> column, type: <code>Content-Type<\/code><\/li>\n<li>In the <strong>VALUE<\/strong> column (same row), type: <code>application\/json<\/code><\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24182\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post.png\" alt=\"Postman showing the POST token request with the method, URL, Headers tab and Content-Type header highlighted\" width=\"1922\" height=\"871\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post.png 1922w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post-300x136.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post-1024x464.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post-768x348.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-01-method-post-1536x696.png 1536w\" sizes=\"(max-width: 1922px) 100vw, 1922px\" \/><\/a><\/p>\n<p><em>In this screen: <strong>1<\/strong> set the method to POST \u00b7 <strong>2<\/strong> paste the token URL \u00b7 <strong>3<\/strong> open the Headers tab \u00b7 <strong>4<\/strong> add <code>Content-Type<\/code> = <code>application\/json<\/code>.<\/em><\/li>\n<li><strong>Add the body.<\/strong> Click the <strong>Body<\/strong> tab (next to Headers). Choose the <strong>raw<\/strong> option, then in the format dropdown on the right change <strong>Text<\/strong> to <strong>JSON<\/strong>. Paste the following into the large box, and replace the two placeholder values with your own <strong>Client ID<\/strong> and <strong>Client Secret<\/strong> (from the <a href=\"#RegisterClient\">Register a REST API Client<\/a> step):\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><a href=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-24183\" src=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post.png\" alt=\"Postman showing the request body with the Body tab, raw option, JSON format and the JSON payload highlighted\" width=\"1922\" height=\"871\" srcset=\"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post.png 1922w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post-300x136.png 300w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post-1024x464.png 1024w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post-768x348.png 768w, https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-content\/uploads\/2026\/09\/rest-api-token-02-body-post-1536x696.png 1536w\" sizes=\"(max-width: 1922px) 100vw, 1922px\" \/><\/a><\/p>\n<p><em>In this screen: <strong>1<\/strong> open the Body tab \u00b7 <strong>2<\/strong> select <strong>raw<\/strong> \u00b7 <strong>3<\/strong> choose <strong>JSON<\/strong> \u00b7 <strong>4<\/strong> paste the request body (with your Client ID and Secret).<\/em><\/li>\n<li><strong>Click <em>Send<\/em><\/strong> (the button on the right of the address bar). The response appears in the panel at the bottom.<\/li>\n<li><strong>Copy your token.<\/strong> In the response, find the <code>access_token<\/code> value \u2014 a long string of letters and numbers \u2014 and copy it. That is your token.<\/li>\n<\/ol>\n<p>A successful response looks like this:<\/p>\n<pre>{\r\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\r\n  \"token_type\":   \"Bearer\",\r\n  \"expires_in\":   15552000\r\n}<\/pre>\n<p><code>expires_in<\/code> is how many seconds the token stays valid (15552000 = 180 days). When it expires, repeat these steps to get a fresh token.<\/p>\n<p>From now on, every other API call must include this token as a header named <code>Authorization<\/code> with the value <code>Bearer &lt;access_token&gt;<\/code> \u2014 the word <code>Bearer<\/code>, a space, then the token you copied. The next section shows how to set this up once so you do not have to paste it every time.<\/p>\n<h4>Quick reference<\/h4>\n<pre>POST https:\/\/api.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\":   15552000\r\n}<\/pre>\n<h2><a id=\"Testing\"><\/a>Testing Your API Calls<\/h2>\n<p>Use <strong>Postman<\/strong> for manual testing. Create a <strong>Postman Environment<\/strong> with these variables so you set them once:<\/p>\n<ul>\n<li><code>token<\/code> \u2014 the access token from the &#8220;Get an Access Token&#8221; step<\/li>\n<li><code>baseUrl<\/code> \u2014 <code>https:\/\/api.digite.com\/rest\/v2<\/code><\/li>\n<li><code>workspaceId<\/code> \u2014 e.g. <code>2110769<\/code><\/li>\n<\/ul>\n<p>Then add one <strong>default header<\/strong> on your Postman collection (right-click the collection \u2192 Edit \u2192 Headers tab):<\/p>\n<ul>\n<li><code>Authorization: Bearer {{token}}<\/code><\/li>\n<\/ul>\n<p><strong>Note:<\/strong> <code>workspaceId<\/code> is <strong>no longer sent as a header<\/strong>. Pass it as a query parameter on GET requests (e.g. <code>?workspaceId={{workspaceId}}<\/code>) or in the JSON body on POST requests (e.g. <code>\"workspaceId\": \"{{workspaceId}}\"<\/code>).<\/p>\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    \"Content-Type\":  \"application\/json\",\r\n}\r\n\r\n# List instances\r\nresp = requests.get(f\"{base_url}\/instances\", headers=headers, params={\"workspaceId\": workspace_id, \"formId\": \"523440\", \"limit\": 20})\r\nfor item in resp.json()[\"items\"]:\r\n    print(item[\"instanceId\"], item.get(\"Name\"))\r\n\r\n# Create an instance\r\nresp = requests.post(f\"{base_url}\/instances\", headers=headers, json={\r\n    \"workspaceId\": workspace_id, \"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  \"Content-Type\":  \"application\/json\",\r\n};\r\n\r\n\/\/ List instances\r\nconst res = await fetch(`${baseUrl}\/instances?workspaceId=${workspaceId}&amp;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 an instance\r\nconst res2 = await fetch(`${baseUrl}\/instances`, {\r\n  method: \"POST\", headers,\r\n  body: JSON.stringify({ workspaceId, 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?workspaceId=\" + wsId + \"&amp;formId=523440&amp;limit=20\"))\r\n    .header(\"Authorization\", \"Bearer \" + token)\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=\"GettingStarted\"><\/a>Getting Started<\/h2>\n<p>New to this API? Make these three calls in order \u2014 each gives you the ID the next one needs.<\/p>\n<ol>\n<li><strong>GET<\/strong> <code>\/workspaces<\/code> \u2014 Lists every workspace you can access. Pick one and copy its <code>workspaceId<\/code>.<\/li>\n<li><strong>GET<\/strong> <code>\/forms?workspaceId=&lt;id&gt;<\/code> \u2014 Lists the forms in that workspace (Issue, User Story, Activity, Bug\u2026). Copy the <code>formId<\/code> of the one you need.<\/li>\n<li><strong>GET<\/strong> <code>\/instances?workspaceId=&lt;id&gt;&amp;formId=&lt;id&gt;<\/code> \u2014 Lists the cards in that form using both IDs. To create a card, use <strong>POST<\/strong> <code>\/instances<\/code> with the same two IDs in the request body.<\/li>\n<\/ol>\n<h2><a id=\"Workspaces\"><\/a>Workspaces<\/h2>\n<h3>GET \u2014 List Workspaces<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/workspaces?limit=100<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/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 100, max 1000)<\/li>\n<li><code>pageToken<\/code> \u2014 optional \u2014 cursor from a previous response for the next page<\/li>\n<li><code>sort<\/code> \u2014 optional \u2014 field to sort by: <code>name<\/code>, <code>created_at<\/code>, <code>updated_at<\/code>, <code>workspace_id<\/code>, <code>template_id<\/code><\/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    {\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      \"templateId\": \"123456\",\r\n      \"enabled\": true\r\n    },\r\n    {\r\n      \"workspaceId\": \"1903997\",\r\n      \"name\": \"Mobile Team\",\r\n      \"description\": \"Sprint planning and bug tracking for mobile\",\r\n      \"createdBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n      \"modifiedBy\": { \"actorId\": \"353147454\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n      \"enabled\": true\r\n    }\r\n  ],\r\n  \"nextPageToken\": \"\"\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Path Variable<\/strong><\/p>\n<ul>\n<li><code>workspaceId<\/code> \u2014 required \u2014 e.g. <code>2110769<\/code><\/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  \"templateId\": \"123456\",\r\n  \"enabled\": true\r\n}<\/pre>\n<h2><a id=\"Forms\"><\/a>Forms<\/h2>\n<p>Forms are the templates that define the fields for instances. Every instance belongs to a form. Pass <code>workspaceId<\/code> as a query parameter on both form endpoints.<\/p>\n<h3>GET \u2014 List Forms<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/forms?workspaceId=2110769<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>workspaceId<\/code> \u2014 required \u2014 workspace to list forms from, e.g. <code>2110769<\/code><\/li>\n<li><code>limit<\/code> \u2014 optional \u2014 number of results per page (default 100, max 1000)<\/li>\n<li><code>pageToken<\/code> \u2014 optional \u2014 cursor from a previous response for the next page<\/li>\n<li><code>sort<\/code> \u2014 optional \u2014 field to sort by: <code>name<\/code>, <code>form_id<\/code>, <code>workspace_id<\/code><\/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    {\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      \"createdBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n      \"modifiedBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n      \"fields\": [\r\n        { \"fieldUniqueName\": \"Name\",       \"custom\": false, \"readOnly\": false, \"type\": \"String\", \"required\": true  },\r\n        { \"fieldUniqueName\": \"Priority\",   \"custom\": false, \"readOnly\": false, \"type\": \"Link\",   \"required\": false },\r\n        { \"fieldUniqueName\": \"Assignedto\", \"custom\": false, \"readOnly\": false, \"type\": \"Text\",   \"required\": false },\r\n        { \"fieldUniqueName\": \"Status\",     \"custom\": false, \"readOnly\": true,  \"type\": \"String\", \"required\": false }\r\n      ]\r\n    },\r\n    {\r\n      \"formId\": \"523441\",\r\n      \"name\": \"User Story\",\r\n      \"prefix\": \"UST\",\r\n      \"workspaceId\": \"2110769\",\r\n      \"hexColorCode\": \"#3498DB\",\r\n      \"custom\": true,\r\n      \"createdBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n      \"modifiedBy\": { \"actorId\": \"353147453\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n      \"fields\": [\r\n        { \"fieldUniqueName\": \"Name\",        \"custom\": false, \"readOnly\": false, \"type\": \"String\", \"required\": true  },\r\n        { \"fieldUniqueName\": \"Assigned To\", \"custom\": true,  \"readOnly\": false, \"type\": \"User\",   \"required\": false },\r\n        { \"fieldUniqueName\": \"Sprint\",      \"custom\": true,  \"readOnly\": false, \"type\": \"Link\",   \"required\": false },\r\n        { \"fieldUniqueName\": \"Status\",      \"custom\": false, \"readOnly\": true,  \"type\": \"String\", \"required\": false }\r\n      ]\r\n    }\r\n  ],\r\n  \"nextPageToken\": \"eyJsYXN0SWQiOiI1MjM0NDEifQ==\"\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}?workspaceId=2110769<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Path Variable<\/strong><\/p>\n<ul>\n<li><code>formId<\/code> \u2014 required \u2014 numeric form ID, e.g. <code>523440<\/code><\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>workspaceId<\/code> \u2014 required \u2014 workspace that owns the form, e.g. <code>2110769<\/code><\/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  \"hexColorCode\": \"#FF5733\",\r\n  \"custom\": true,\r\n  \"fields\": [\r\n    { \"fieldUniqueName\": \"Name\",       \"custom\": false, \"readOnly\": false, \"type\": \"String\", \"required\": true  },\r\n    { \"fieldUniqueName\": \"Priority\",   \"custom\": false, \"readOnly\": false, \"type\": \"Link\",   \"required\": false },\r\n    { \"fieldUniqueName\": \"Assignedto\", \"custom\": false, \"readOnly\": false, \"type\": \"Text\",   \"required\": false },\r\n    { \"fieldUniqueName\": \"Status\",     \"custom\": false, \"readOnly\": true,  \"type\": \"String\", \"required\": false }\r\n  ]\r\n}<\/pre>\n<h2><a id=\"Instances\"><\/a>Instances<\/h2>\n<p>An <em>instance<\/em> is a single card. Custom field values are sent and received at the root level alongside system fields.<\/p>\n<h3>GET \u2014 List Instances<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances?workspaceId=2110769&amp;formId=523440&amp;limit=20<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>workspaceId<\/code> \u2014 required \u2014 workspace to list instances from, e.g. <code>2110769<\/code><\/li>\n<li><code>formId<\/code> \u2014 optional \u2014 filter by form, e.g. <code>523440<\/code><\/li>\n<li><code>expand<\/code> \u2014 optional \u2014 <code>true<\/code> 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 the next page<\/li>\n<li><code>sort<\/code> \u2014 optional \u2014 field to sort by (applicable only for <code>formId<\/code>, <code>instanceId<\/code>)<\/li>\n<li><code>order<\/code> \u2014 optional \u2014 <code>asc<\/code> or <code>desc<\/code><\/li>\n<li><code>boardLane<\/code> \u2014 optional \u2014 filter by board lane name<\/li>\n<li><code>boardColumn<\/code> \u2014 optional \u2014 filter by board column name<\/li>\n<li><code>parentCard<\/code> \u2014 optional \u2014 filter by parent card; must be the full <code>ID: Name<\/code> string (e.g. <code>ACTY1: mhhhat<\/code>), not the ID alone<\/li>\n<li><code>id<\/code> \u2014 optional \u2014 filter by card ID (e.g. <code>SWB9<\/code>, <code>ISS42<\/code>)<\/li>\n<li><code>status<\/code> \u2014 optional \u2014 filter by status value<\/li>\n<li><code>createdBy<\/code> \u2014 optional \u2014 filter by creator user ID<\/li>\n<li><code>modifiedBy<\/code> \u2014 optional \u2014 filter by last modifier user ID<\/li>\n<li><code>blockingReason<\/code> \u2014 optional \u2014 filter by blocking reason ID<\/li>\n<li><code>dateCreated_after<\/code> \/ <code>dateCreated_before<\/code> \u2014 optional \u2014 ISO 8601 timestamp, e.g. <code>2026-01-01T00:00:00.000Z<\/code><\/li>\n<li><code>modifiedDate_after<\/code> \/ <code>modifiedDate_before<\/code> \u2014 optional \u2014 ISO 8601 timestamp<\/li>\n<li><code>dateClosed_after<\/code> \/ <code>dateClosed_before<\/code> \u2014 optional \u2014 ISO 8601 timestamp<\/li>\n<li><code>estimatedHours_gt<\/code> \/ <code>estimatedHours_lt<\/code> \u2014 optional \u2014 estimated hours greater\/less than (must be &gt; 0)<\/li>\n<li><code>actualHours_gt<\/code> \/ <code>actualHours_lt<\/code> \u2014 optional \u2014 actual hours greater\/less than (must be &gt; 0)<\/li>\n<li><code>remainingHours_gt<\/code> \/ <code>remainingHours_lt<\/code> \u2014 optional \u2014 remaining hours greater\/less than (must be &gt; 0)<\/li>\n<li><code>childPercentComplete_gt<\/code> \/ <code>childPercentComplete_lt<\/code> \u2014 optional \u2014 child percent complete greater\/less than (must be &gt; 0)<\/li>\n<li><code>votes_gt<\/code> \/ <code>votes_lt<\/code> \u2014 optional \u2014 vote count greater\/less than (must be &gt; 0)<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [\r\n    {\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\": \"107010\",\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    }\r\n  ],\r\n  \"nextPageToken\": \"\"\r\n}<\/pre>\n<h3>GET \u2014 Single Instance<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/{instanceId}?expand=true<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Path Variable<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 use the <code>instanceId<\/code> returned by POST \/instances (e.g. <code>523440-42<\/code>), not the business key (<code>ISS-42<\/code>)<\/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\": \"107010\",\r\n  \"Status\": \"Blocked\",\r\n  \"flags\": { \"actionIds\": [\"820890\"] },\r\n  \"blocks\": { \"actionIds\": [\"821210\"] },\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\r\n}<\/pre>\n<p><em><strong>flags \/ blocks:<\/strong> present only when active flags or blocks exist. Each contains an <code>actionIds<\/code> array \u2014 one entry per active flag or block. Pass each <code>actionId<\/code> to <code>DELETE \/instances\/{instanceId}\/flags\/{actionId}<\/code> or <code>DELETE \/instances\/{instanceId}\/blocks\/{actionId}<\/code> to clear it. If none are active, the key is absent from the response.<\/em><\/p>\n<h3><a id=\"ActorObject\"><\/a>Actor Object \u2014 createdBy \/ modifiedBy<\/h3>\n<p>The shape of <code>createdBy<\/code> and <code>modifiedBy<\/code> depends on <code>type<\/code>:<\/p>\n<ul>\n<li><code>\"USER\"<\/code> \u2014 <code>actorId<\/code>, <code>name<\/code>, <code>type<\/code><\/li>\n<li><code>\"CLIENT\"<\/code> \u2014 <code>actorId<\/code> (in <code>nmb_cli_\u2026<\/code> format), <code>type<\/code><\/li>\n<\/ul>\n<pre>\/\/ When type = \"CLIENT\"\r\n\"createdBy\": {\r\n  \"actorId\": \"nmb_cli_eb871278c317e54d83c41a73\",\r\n  \"type\": \"CLIENT\"\r\n}<\/pre>\n<p><strong>Response Example \u2014 Created by an API Client (200 OK)<\/strong><\/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  \"createdBy\": {\r\n    \"actorId\": \"nmb_cli_eb871278c317e54d83c41a73\",\r\n    \"type\": \"CLIENT\"\r\n  },\r\n  \"modifiedBy\": {\r\n    \"actorId\": \"nmb_cli_eb871278c317e54d83c41a73\",\r\n    \"type\": \"CLIENT\"\r\n  }\r\n}<\/pre>\n<p><strong>Response Example \u2014 Created via MCP, e.g. Claude AI (200 OK)<\/strong><\/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  \"createdBy\": {\r\n    \"actorId\": \"nmb_cli_b1c0def41481a874498be77d\",\r\n    \"name\": \"Claude AI\",\r\n    \"type\": \"CLIENT\",\r\n    \"onBehalfOf\": {\r\n      \"name\": \"Simple Workflow\",\r\n      \"type\": \"USER\",\r\n      \"userId\": \"353135992\"\r\n    }\r\n  },\r\n  \"modifiedBy\": {\r\n    \"actorId\": \"nmb_cli_b1c0def41481a874498be77d\",\r\n    \"name\": \"Claude AI\",\r\n    \"type\": \"CLIENT\",\r\n    \"onBehalfOf\": {\r\n      \"name\": \"Simple Workflow\",\r\n      \"type\": \"USER\",\r\n      \"userId\": \"353135992\"\r\n    }\r\n  }\r\n}<\/pre>\n<h3>GET \u2014 Subblocks (child instances)<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/instances\/{instanceId}\/subblocks?depth=-1<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/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<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"subblocks\": [\r\n    {\r\n      \"instanceId\": \"1900018\",\r\n      \"formId\": \"1899997\",\r\n      \"workspaceId\": \"1865093\",\r\n      \"data\": { \"customizingl\": \"1900017\", \"s1mID\": \"s1m1\" },\r\n      \"subblocks\": [\r\n        {\r\n          \"instanceId\": \"1900020\",\r\n          \"formId\": \"1900004\",\r\n          \"workspaceId\": \"1865093\",\r\n          \"data\": { \"s1\": \"1900018\", \"s2lID\": \"s2l1\" },\r\n          \"subblocks\": [\r\n            { \"instanceId\": \"1900022\", \"formId\": \"1900011\", \"workspaceId\": \"1865093\", \"data\": { \"s23\": \"1900020\", \"s3moID\": \"s3mo1\" }, \"subblocks\": [] },\r\n            { \"instanceId\": \"1900023\", \"formId\": \"1900011\", \"workspaceId\": \"1865093\", \"data\": { \"s23\": \"1900020\", \"s3moID\": \"s3mo2\" }, \"subblocks\": [] }\r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"instanceId\": \"1900019\",\r\n      \"formId\": \"1899997\",\r\n      \"workspaceId\": \"1865093\",\r\n      \"data\": { \"customizingl\": \"1900017\", \"s1mID\": \"s1m2\" },\r\n      \"subblocks\": [\r\n        { \"instanceId\": \"1900021\", \"formId\": \"1900004\", \"workspaceId\": \"1865093\", \"data\": { \"s1\": \"1900019\", \"s2lID\": \"s2l2\" }, \"subblocks\": [] }\r\n      ]\r\n    }\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"workspaceId\": \"1855197\",\r\n  \"formId\": \"1856514\",\r\n  \"FieldName25\": \"Option1\",\r\n  \"FieldName26\": 432,\r\n  \"Name\": \"pri\",\r\n  \"Priority\": \"107010\",\r\n  \"Tags\": [\"sample\", \"tested\"]\r\n}<\/pre>\n<p><em><strong>Note:<\/strong> <code>workspaceId<\/code> and <code>formId<\/code> are <strong>compulsory<\/strong> \u2014 the request fails without either. Custom field names must match exactly what <code>GET \/forms\/{formId}<\/code> returns.<\/em><\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{\r\n  \"FieldName25\": \"Option1\",\r\n  \"FieldName26\": 432,\r\n  \"Name\": \"pri\",\r\n  \"Priority\": \"107010\",\r\n  \"SWBID\": \"SWB9\",\r\n  \"Tags\": [\"sample\", \"tested\"],\r\n  \"formId\": \"1856514\",\r\n  \"id\": \"SWB9\",\r\n  \"instanceId\": \"1858628\",\r\n  \"workspaceId\": \"1855197\"\r\n}<\/pre>\n<h3>PUT \u2014 Full Replace (all custom fields replaced)<\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"Name\": \"Login page broken \u2014 updated\",\r\n  \"Description\": \"Full replacement via PUT.\",\r\n  \"EstimateHours\": 8,\r\n  \"PercentComplete\": 0,\r\n  \"DueDate\": \"2026-09-15T00:00:00.000Z\"\r\n}<\/pre>\n<p><em><strong>Important:<\/strong> this is a full replacement \u2014 any custom field not included in the body is cleared on the record. System fields (<code>Status<\/code>, <code>flags<\/code>, <code>blocks<\/code>) are never cleared by PUT. Cleared fields do not appear in the response.<\/em><\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>Empty body on success.<\/pre>\n<h3>PATCH \u2014 Partial Update (only sent fields change)<\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"Name\": \"test 1\",\r\n  \"Assignedto\": [\"353168951\"]\r\n}<\/pre>\n<p><em><strong>Note:<\/strong> only the fields you send are updated \u2014 all other fields remain untouched. Do not send <code>flag<\/code> or <code>block<\/code> keys here \u2014 use the dedicated sub-resource endpoints.<\/em><\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>Empty body on success.<\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{ \"success\": true }<\/pre>\n<p><em>Returns <code>404<\/code> if the instance has already been deleted.<\/em><\/p>\n<h2><a id=\"Flags\"><\/a>Flags<\/h2>\n<p>Only available on instances of <strong>STANDALONE<\/strong> form types. Returns <code>400<\/code> 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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<li><code>accept: *\/*<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"comment\": \"Needs immediate attention\"\r\n}<\/pre>\n<p><em><code>comment<\/code> is <strong>required<\/strong>. Max 5,000 characters.<\/em><\/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  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\r\n}<\/pre>\n<p><em>Returns the full updated instance object. To get the <code>actionId<\/code> for a subsequent unflag call, do <code>GET \/instances\/{instanceId}<\/code> and look at the <code>flags<\/code> system field.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Path Variable<\/strong><\/p>\n<ul>\n<li><code>actionId<\/code> \u2014 required \u2014 the <code>actionId<\/code> from the flag entry, e.g. <code>flag_001<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"comment\": \"Resolved\"\r\n}<\/pre>\n<p><em><code>comment<\/code> is <strong>required<\/strong>. Returns <code>400<\/code> (not <code>409<\/code>) for error cases: no flag history, actionId mismatch, already unflagged.<\/em><\/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  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<li><code>accept: *\/*<\/code><\/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><em><strong>Both <code>reason<\/code> and <code>comment<\/code> are required.<\/strong> Returns <code>400<\/code> if either is absent or blank. Use <code>GET \/forms\/{formId}<\/code> to discover valid blocking reasons for the form.<\/em><\/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  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\r\n}<\/pre>\n<p><em>Returns the full updated instance object. To get the <code>actionId<\/code> for a subsequent unblock call, do <code>GET \/instances\/{instanceId}<\/code> and look at the <code>blocks<\/code> system field.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"comment\": \"Design approved, unblocking\"\r\n}<\/pre>\n<p><em><code>comment<\/code> is <strong>required<\/strong> \u2014 returns <code>400<\/code> if absent or blank.<\/em><\/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  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body<\/strong><\/p>\n<p>No body required.<\/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  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\r\n}<\/pre>\n<p><em>Returns the full updated instance object. Returns <code>409<\/code> if you have already voted on this instance.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"instanceId\": \"308785\",\r\n  \"formId\": \"524430\",\r\n  \"workspaceId\": \"524321\",\r\n  \"Name\": \"MSSQL Jar Upgrade\",\r\n  \"createdBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" },\r\n  \"modifiedBy\": { \"actorId\": \"353136425\", \"name\": \"Utkarsh Singh\", \"type\": \"USER\" }\r\n}<\/pre>\n<p><em>Returns the full updated instance object. Returns <code>409<\/code> if you have not voted on this instance.<\/em><\/p>\n<h2><a id=\"Links\"><\/a>Links<\/h2>\n<p>Creates or removes a typed directional link between two instances. <code>HIERARCHY<\/code> 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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"to\": {\r\n    \"instanceId\": \"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><em><code>metaType<\/code> is required. Values: <code>HIERARCHY<\/code>, <code>DEPENDENCY<\/code>, <code>TRACEBAILITY<\/code>, <code>CONTAINMENT<\/code>, <code>ASSOCIATION<\/code>.<\/em><\/p>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"id\": \"6a99a8b5ace11b1c9084af4a\",\r\n  \"from\": { \"instanceId\": \"523440-42\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"to\":   { \"instanceId\": \"523440-50\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"metaType\": \"DEPENDENCY\",\r\n  \"type\": \"MANYTOMANY\",\r\n  \"relation\": \"fulfills\",\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}?metaType=DEPENDENCY<\/pre>\n<p><strong>Path Parameters<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 the source (parent) instance \u2014 the one <strong>from<\/strong> which the link originates<\/li>\n<li><code>targetId<\/code> \u2014 the destination (child) instance \u2014 the one <strong>to<\/strong> which the link points<\/li>\n<\/ul>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Query Parameter<\/strong><\/p>\n<ul>\n<li><code>metaType<\/code> \u2014 required \u2014 must match the value used when the link was created<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"id\": \"6a99a8b5ace11b1c9084af4a\",\r\n  \"from\": { \"instanceId\": \"523440-42\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"to\":   { \"instanceId\": \"523440-50\", \"formId\": \"523440\", \"workSpaceId\": \"2110769\" },\r\n  \"metaType\": \"DEPENDENCY\",\r\n  \"type\": \"MANYTOMANY\",\r\n  \"relation\": \"fulfills\",\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 (<code>@user<\/code>), emoji, and inline attachments are not supported in comment text. Use <code>POST \/attachments<\/code> to attach files to an instance.<\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"content\": \"Reproduced on Chrome 126. Stack trace attached.\",\r\n  \"type\": \"COMMENT\"\r\n}<\/pre>\n<p><em><code>content<\/code> is required (min 1 char). <code>type<\/code> is optional, defaults to <code>COMMENT<\/code>.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"content\": [\r\n    {\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      \"instanceId\": \"523440-42\",\r\n      \"workspaceId\": \"2110769\"\r\n    }\r\n  ]\r\n}<\/pre>\n<p><em>The response key is <code>content<\/code>, not <code>comments<\/code>.<\/em><\/p>\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\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  \"instanceId\": \"523440-42\",\r\n  \"type\": \"COMMENT\",\r\n  \"replies\": []\r\n}<\/pre>\n<p><em>The <code>replies<\/code> array is always empty here \u2014 replies are stored as independent comments, not nested under the parent. Use <code>GET \/comments<\/code> (list) to retrieve all comments including replies.<\/em><\/p>\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{ \"content\": \"Also reproduced on Safari 17.\" }<\/pre>\n<p><strong>Response 201 Created<\/strong><\/p>\n<p><em>No response body. The reply is stored as a separate independent comment (same level as the parent in the list).<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<p><em>Empty body on success.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type<\/code> \u2014 <em>do NOT set manually<\/em> \u2014 Postman sets this automatically for form-data<\/li>\n<\/ul>\n<p><strong>Body \u00b7 form-data<\/strong><\/p>\n<ul>\n<li><code>file<\/code> \u2014 type <strong>File<\/strong> \u2014 select a file from your computer (max 32 MB)<\/li>\n<\/ul>\n<p><em>In Postman: Body tab \u2192 select <strong>form-data<\/strong> \u2192 set the key to <code>file<\/code> \u2192 hover the key and change its type from Text to <strong>File<\/strong> \u2192 click <strong>Select Files<\/strong>.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"attachmentName\": \"Design Mockup\",\r\n  \"content\": \"https:\/\/images.unsplash.com\/photo-1789758385644-4faa0dda0cfa\",\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"content\": [\r\n    {\r\n      \"attachmentId\": \"att_789012\",\r\n      \"name\": \"screenshot.png\",\r\n      \"mimeType\": \"image\/png\",\r\n      \"fileSize\": 204800,\r\n      \"instanceId\": \"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    }\r\n  ]\r\n}<\/pre>\n<p><em>The response key is <code>content<\/code>, not <code>attachments<\/code>.<\/em><\/p>\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<p><em>Empty body on success.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/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 the next page<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [\r\n    {\r\n      \"todoId\": \"TODO1\",\r\n      \"workspaceId\": \"2110769\",\r\n      \"formId\": \"523440\",\r\n      \"instanceId\": \"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  ]\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Path Variables<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 parent instance ID<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 e.g. <code>TODO1<\/code><\/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  \"instanceId\": \"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}<\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/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><em><code>name<\/code> is required. <code>assigneeId<\/code>, <code>estimate<\/code> (\u2265 0), and <code>position<\/code> (\u2265 1) are optional.<\/em><\/p>\n<p><strong>Response 201 Created<\/strong><\/p>\n<pre>{ \"todoId\": \"TODO1\" }<\/pre>\n<p><em>Returns <code>404<\/code> if the parent instance (<code>instanceId<\/code>) does not exist.<\/em><\/p>\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"estimate\": 6\r\n}<\/pre>\n<p><em>All fields optional: <code>name<\/code>, <code>assigneeId<\/code>, <code>estimate<\/code>. Only sent fields are updated.<\/em><\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Body<\/strong><\/p>\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: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\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: Bearer &lt;access_token&gt;<\/code><\/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 + date<\/code>. Submitting the same pair again overwrites the existing entry. Date format: <code>YYYY-MM-DD<\/code>.<\/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: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>Content-Type: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Path Parameters<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 instance ID<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 todo ID<\/li>\n<li><code>date<\/code> \u2014 required \u2014 format <code>YYYY-MM-DD<\/code>, e.g. <code>2026-08-19<\/code>. Cannot be a future date.<\/li>\n<\/ul>\n<p><strong>Body \u00b7 Raw \u00b7 JSON<\/strong><\/p>\n<pre>{\r\n  \"actual\": 3.5,\r\n  \"remaining\": 0.5,\r\n  \"estimate\": 8,\r\n  \"userId\": \"353136425\"\r\n}<\/pre>\n<p><em><code>actual<\/code> and <code>userId<\/code> are required. <code>remaining<\/code> and <code>estimate<\/code> are optional.<\/em><\/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>Path Parameters<\/strong><\/p>\n<ul>\n<li><code>instanceId<\/code> \u2014 required \u2014 instance ID<\/li>\n<li><code>todoId<\/code> \u2014 required \u2014 todo ID (e.g. <code>TODO01<\/code>)<\/li>\n<li><code>date<\/code> \u2014 required \u2014 date in <code>YYYY-MM-DD<\/code> format<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>userId<\/code> \u2014 required \u2014 ID of the user whose time entry to retrieve<\/li>\n<\/ul>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"workspaceId\": \"417982\",\r\n  \"instanceId\": \"103244\",\r\n  \"todoId\": \"2\",\r\n  \"timesheetUserId\": \"353136425\",\r\n  \"actual\": 3.5,\r\n  \"remaining\": 0.5,\r\n  \"isRemainingUpdated\": false,\r\n  \"timesheetDate\": \"2026-08-19T00:00:00.000Z\",\r\n  \"updatedAt\": \"2026-08-19T10:30:00.000Z\"\r\n}<\/pre>\n<p><em>Returns <code>404<\/code> if no entry exists for that todo + date combination.<\/em><\/p>\n<h3>GET \u2014 List Time Entries by Date Range<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/timeentries?timesheetStartDate=2026-08-01&amp;timesheetEndDate=2026-08-19&amp;userId=353136425&amp;limit=50<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<li><code>accept: application\/json<\/code><\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>timesheetStartDate<\/code> \u2014 required \u2014 <code>YYYY-MM-DD<\/code><\/li>\n<li><code>timesheetEndDate<\/code> \u2014 required \u2014 <code>YYYY-MM-DD<\/code><\/li>\n<li><code>userId<\/code> \u2014 required \u2014 ID of the user whose time entries to list<\/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 the next page<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [\r\n    {\r\n      \"workspaceId\": \"417982\",\r\n      \"instanceId\": \"103244\",\r\n      \"todoId\": \"2\",\r\n      \"timesheetUserId\": \"353136425\",\r\n      \"actual\": 3.5,\r\n      \"remaining\": 0.5,\r\n      \"isRemainingUpdated\": false,\r\n      \"timesheetDate\": \"2026-08-19T00:00:00.000Z\",\r\n      \"updatedAt\": \"2026-08-19T10:30:00.000Z\"\r\n    }\r\n  ],\r\n  \"nextPageToken\": \"eyJsYXN0SWQiOiI2NjlmYWRkYzQ3NWYwNzVjYWEwM2Y4ZTYifQ==\"\r\n}<\/pre>\n<p><em><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.<\/em><\/p>\n<h2><a id=\"Boards\"><\/a>Boards<\/h2>\n<p>Returns the board structure for a workspace \u2014 swim lanes and their queues. Queues include the cards currently positioned in them. Use <code>swimlanes=true<\/code> to include swim lanes; add <code>queues=true<\/code> to also include queues.<\/p>\n<h3>GET \u2014 List Boards (with swim lanes and queues)<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/workspaces\/{workspaceId}\/boards?swimlanes=true&amp;queues=true<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Path Parameters<\/strong><\/p>\n<ul>\n<li><code>workspaceId<\/code> \u2014 required \u2014 workspace ID (e.g. <code>798619<\/code>). Returns <code>404<\/code> if the workspace does not exist or is deleted.<\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>swimlanes<\/code> \u2014 optional \u2014 <code>true<\/code> includes swim lanes. Omit for board metadata only.<\/li>\n<li><code>queues<\/code> \u2014 optional \u2014 <code>true<\/code> includes queues inside each swim lane. Requires <code>swimlanes=true<\/code>; returns <code>400<\/code> if used alone.<\/li>\n<li><code>swimId<\/code> \u2014 optional \u2014 filter to a single swim lane by ID. Implies <code>swimlanes=true<\/code> and always includes that lane&#8217;s queues.<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [\r\n    {\r\n      \"boardId\": \"2008\",\r\n      \"workspaceId\": \"798619\",\r\n      \"createdBy\": { \"actorId\": \"353135521\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n      \"modifiedBy\": { \"actorId\": \"353137842\", \"name\": \"System Administrator\", \"type\": \"USER\" },\r\n      \"swimLanes\": [\r\n        {\r\n          \"swimId\": \"3022\",\r\n          \"boardId\": \"2008\",\r\n          \"name\": \"Execution\",\r\n          \"description\": \"Execution\",\r\n          \"position\": 1,\r\n          \"agingRules\": [],\r\n          \"updatedAt\": \"2026-09-11T01:16:17.198+00:00\",\r\n          \"createdBy\": { \"actorId\": \"353135521\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n          \"modifiedBy\": null,\r\n          \"queues\": [\r\n            {\r\n              \"queueId\": \"5106\",\r\n              \"swimId\": \"3022\",\r\n              \"name\": \"Backlog\",\r\n              \"displayName\": \"Backlog\",\r\n              \"queueType\": \"Ready\",\r\n              \"position\": 1,\r\n              \"wipLimit\": 0,\r\n              \"splitType\": \"Vertical\",\r\n              \"percentColumn\": false,\r\n              \"percentDone\": false,\r\n              \"percentGenerated\": false,\r\n              \"scaleInterval\": 0,\r\n              \"agingRules\": [],\r\n              \"cards\": [],\r\n              \"updatedAt\": \"2026-09-11T01:16:17.234+00:00\",\r\n              \"createdBy\": { \"actorId\": \"353135521\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n              \"modifiedBy\": null\r\n            },\r\n            {\r\n              \"queueId\": \"5108\",\r\n              \"swimId\": \"3022\",\r\n              \"name\": \"Queued\",\r\n              \"displayName\": \"Backlog#Queued\",\r\n              \"parentQueueId\": \"5106\",\r\n              \"queueType\": \"Ready\",\r\n              \"position\": 1,\r\n              \"wipLimit\": 0,\r\n              \"splitType\": \"Vertical\",\r\n              \"percentColumn\": false,\r\n              \"percentDone\": false,\r\n              \"percentGenerated\": false,\r\n              \"scaleInterval\": 0,\r\n              \"agingRules\": [],\r\n              \"cards\": [\r\n                { \"position\": \"0\", \"instanceId\": \"798630\" },\r\n                { \"position\": \"0\", \"instanceId\": \"798629\" }\r\n              ],\r\n              \"updatedAt\": \"2026-09-11T01:16:17.255+00:00\",\r\n              \"createdBy\": { \"actorId\": \"353135521\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n              \"modifiedBy\": null\r\n            }\r\n          ]\r\n        }\r\n      ]\r\n    }\r\n  ],\r\n  \"nextPageToken\": \"\"\r\n}<\/pre>\n<ul>\n<li><strong>items<\/strong> \u2014 array of board objects; one per board in the workspace.<\/li>\n<li><strong>swimLanes<\/strong> \u2014 present only when <code>swimlanes=true<\/code>; ordered by <code>position<\/code>.<\/li>\n<li><strong>queues<\/strong> \u2014 present only when <code>queues=true<\/code> or <code>swimId<\/code> is set; ordered by <code>position<\/code>.<\/li>\n<li><strong>parentQueueId<\/strong> \u2014 present on sub-queues (split queues); absent on top-level queues.<\/li>\n<li><strong>displayName<\/strong> \u2014 for sub-queues this is <code>ParentName#ChildName<\/code> (e.g. <code>Backlog#Queued<\/code>).<\/li>\n<li><strong>cards<\/strong> \u2014 instance IDs currently in that queue, with their board position.<\/li>\n<li><strong>nextPageToken<\/strong> \u2014 always <code>\"\"<\/code> (pagination not yet supported).<\/li>\n<\/ul>\n<h3>GET \u2014 List Boards (boards only, no swim lanes)<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/workspaces\/{workspaceId}\/boards<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [\r\n    {\r\n      \"boardId\": \"2008\",\r\n      \"workspaceId\": \"798619\",\r\n      \"createdBy\": { \"actorId\": \"353135521\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n      \"modifiedBy\": { \"actorId\": \"353137842\", \"name\": \"System Administrator\", \"type\": \"USER\" }\r\n    }\r\n  ],\r\n  \"nextPageToken\": \"\"\r\n}<\/pre>\n<p><em>Omitting <code>swimlanes<\/code> returns board metadata only \u2014 no <code>swimLanes<\/code> key in the response.<\/em><\/p>\n<h3>GET \u2014 Single Swim Lane with Queues (swimId filter)<\/h3>\n<pre>GET https:\/\/api.digite.com\/rest\/v2\/workspaces\/{workspaceId}\/boards?swimId=3022<\/pre>\n<p><strong>Headers<\/strong><\/p>\n<ul>\n<li><code>Authorization: Bearer &lt;access_token&gt;<\/code><\/li>\n<\/ul>\n<p><strong>Query Parameters<\/strong><\/p>\n<ul>\n<li><code>swimId<\/code> \u2014 required \u2014 swim lane ID to filter on. Implies <code>swimlanes=true<\/code> and always includes the lane&#8217;s queues.<\/li>\n<\/ul>\n<p><strong>Response 200 OK<\/strong><\/p>\n<pre>{\r\n  \"items\": [\r\n    {\r\n      \"boardId\": \"2008\",\r\n      \"workspaceId\": \"798619\",\r\n      \"createdBy\": { \"actorId\": \"353135521\", \"name\": \"Rahul Mahant\", \"type\": \"USER\" },\r\n      \"modifiedBy\": { \"actorId\": \"353137842\", \"name\": \"System Administrator\", \"type\": \"USER\" },\r\n      \"swimLanes\": [\r\n        {\r\n          \"swimId\": \"3022\",\r\n          \"boardId\": \"2008\",\r\n          \"name\": \"Execution\",\r\n          \"description\": \"Execution\",\r\n          \"position\": 1,\r\n          \"queues\": [ \"...\" ]\r\n        }\r\n      ]\r\n    }\r\n  ],\r\n  \"nextPageToken\": \"\"\r\n}<\/pre>\n<p><em>Only the matching swim lane is returned inside <code>swimLanes<\/code>. Its queues are always included.<\/em><\/p>\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>180 days<\/strong>. Cache and reuse; request a new one only when expired.<\/li>\n<li><code>workspaceId<\/code> is passed as a query parameter on GET requests (e.g. <code>?workspaceId=\u2026<\/code>) and in the JSON request body on POST requests \u2014 it is <strong>no longer sent as a header<\/strong>.<\/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":25,"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/article\/24090\/revisions"}],"predecessor-version":[{"id":24439,"href":"https:\/\/www.nimblework.com\/knowledge-base\/nimble\/wp-json\/wp\/v2\/article\/24090\/revisions\/24439"}],"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}]}}