Reference
Source code
<?xml version="1.0" encoding="utf-8"?>
<ApiConfig Name="Azure DevOps"
Desc="Read and write Azure DevOps (Cloud or On-Premises) data effortlessly. Integrate, manage, and automate work items, projects, and teams — almost no coding required."
Slug="azure-devops-connector"
Id="db3fba88-bb48-47dd-9527-0c0050f4423d"
Logo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAYAAACLz2ctAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAArFSURBVHhe7Z0vbBxXF8VXlQpKSgpKQgpKSgqKPlISElpmZmYp0sdMdp1YCnGlSFVIVRRiEmQYYhIZRAoKsdS3G7ktMbFkUBJUqVJ675uxM16frOft/NnzZs5P+inOs72enXu8b+bum/FErGAank4en31T/k+Inpn+fmIh/HuyN/+pHBGiR2IAf/8QnYXfJr9cfl5+RogeqAawCOHbyd7i2/KzQnTMcgCj4b0Fcav8CiE6BAaw1Kfkn8+/KL9SiA5YFUB3Fk41JYvuuCuAUU3JoitqBfDK8FxTsmiXpACaPiU/evdd+d1CNCQ1gNE4JW+XjyBEA9YK4JXhUFOyaEajAJqzsNCULNanaQCjcUreKR9RiARaCWDpLLyYHPz5ZfnIQtSgzQC6PiXvv/u+fHQhVvD47CsLzCkMUiPDP5qSBebXD59N9ub343TpQYEBaslZONKULAr2z+5NZvNHFoq/YFi60n/ebPFDuRViVPjiUl/pPAsv7dXuXxiQXrRX2r3w/3KrxODx1SuzcGCFv8CB2JCakgeMvyPhK1am4RUsPouakgeGtzx84ahfWIQKTmk8S94tn4HIDp/GvM3h12/AAmeiH5t6K0hkwt7if/bqcWi+hwXN0Vk4j89LkFI0i3fNBSzgICynZO9RCgI+NouPYnFg0QaopuQN87FZfA4LNAY1JfcMTbOYSdsP/ouoKblDvFnsNwaahktcBGm/lMeT/T++LvdYHniHwl/Biy6Ft8del58hoGgWb8eNQjtcAsOFzRA/lnuQB3919ruKFbPXE/PIxO+zb5wsm8VMbnhKjq9q9kswnT+MdZyFN7ZN9VthG8E3utjgvJvFVIZXnU7JsfsQ30ffMg/Ml2bz1UO9En9TBtYspjJOyffLvb0+3u7xWvkqHb/gPr5QdFSzzvHfysE3i5n0KdmOu+pMyd5l8Kv2ioUaT+3fY7PfNlcn+JOfzR/YkxlXs5jLkxtTsn9cNPB3rSaH9u8pRW1aJTaL41nPeJvFDMZlXfHMc9s8tqDxtrMa87FZ7E9UzeJejdPtwnxh7sbjtuVFrfD7iGxEcXynV7tejIsSfNp8Hk8OvKFb59Yf8LGIXBt/5VPTuCPj3RTemt5X24mrpH1/rwN8fCLXZhaewQeUiXp7w36RfX/6MZs35ttsKsOfSeRa+DEfejB5h/5uj1+XElseW7Gx2/U7GHA7iEymWCigRvKdhgsLmffVDuIv7Kb+4hLcNiKTKBYMdHC7isz1E7HiraknMWzejmIBbS+TScS30cCDjMnrHpsvjp0/6PT91zZAz4HJ2vjZGHqAwXqrx3b/Vo8tB+BzI7IW3gYY9FtqMWzeYztM6rHlAHy+RN5JceVZvzft6dTY0PXVHb7Ko1mPLQfgPiByJXFRgV+PAb4xC2ND943pDd2ixzbksCHgfiFyJX6gjb6J0rii+sSC5g3drbjMqOseWw7AfUXkJ/GDbtrFBeHSQlb02Ppq6OYK3H9EQryPRbOEJzZ0OXtsOQD3KZG38GOkeGEJ+OKuza3HlgNoPzN5i74WGSz32HTbiW5A+57JG8RrA8AXNXK5xwYWTYrugDUh8ho/a2y8yKDSY/PLLofU0M0VWCciI8Uig/WvWvPvHWOPLQdQvZiMxL+LAT5ZVz9pEZygejFZXHwMPpGiAsgLqheT8bgNfSJFBZAXVC8m4WCqCiAvqF5MwsFUFUBeUL2YhIOpKoC8oHoxCQdTVQB5QfViEg6mqgDygurFJBxMVQHkBdWLSTiYqgLIC6oXk3AwVQWQF1QvJuFgqgogL6heTMLBVBVAXlC9mISDqSqAvKB6MQkHU1UAeUH1YhIOpqoA8oLqxSQcTFUB5AXVi0k4mKoCyAuqF5NwMFUFkBdULybhYKoKIC+oXkzCwVQVQF5QvZiEg6kqgLygejEJB1NVAHlB9WISDqaqAPKC6sUkHExVAeQF1YtJOJiqAsgLqheTcDBVBZAXVC8m4WCqCiAvqF5MwsFUFUBeUL2YhIOpKoC8oHoxCQdTVQB5QfViEg6mqgDygurFJBxMVQHkBdWLSTiYqgLIC6oXk3AwVQWQF1QvJuFgqgogL6heTMLBVBVAXlC9mISDqSqAvKB6MQkHU1UAeUH1YhIOpqoA8oLqxSQcTFUB5AXVi0k4mKoCyAuqF5NwMFUFkBdULybhYKoKIC+oXkzCwVQVQF5QvZiEg6kqgLygejEJB1NVAHlB9WLSwvNiMg2X8JN1VQB5QfViMvLrh8/iXzefhSfmW/iFq1QAeUH1YhKy/8fXFqpt88heHf+G31hVAeQF1YvJO4mvjvMfLWQH5il8EAWQF1QvJpPZP7tngdsx/dXxfXwQBZCX5YKz2YhfLj+3V8f78c/++7+Pz76JY4IHVHQmW2MWdosHDf/ax3/Zv6/M55PZ/JH9fyue5PixpeiX5YKz2SrTcAh/yA1t2p6FhfnSfGbu2qvnT5P9d99PDv78snwk0RawBkS2ik+/0/Aa/qDahksL5VvzyPQTn51iml98q+l9DeA+JrJ1Hp99ZaGxKRj8sMbG6f3cPj6xj29P737GLm4C9yORneCvVnX6h60b/rFAXk3vv5ma3uF+IrIzvHfogUA/dGPaL8XV9D4NT+3fHXsVfTDo6R3uByI7xd9NQT+U0hvT+6F97G9LbhfT+9m9bKd3+FyJ7Bw/kUA/ODuvp/djM5/pHT4XIjvHXznilAd++KBcmt6n84cU0zvcViJ74efzL2Jx0AaMxTi9e4uqOr3bcXLX0zvaFiZ7o1hh48dYeENG7Sem99nih9jWagL8eUT2ih8vXS1gkAnG6f3U9Ob8s/jeu0/vj959F2eXVcDHI7J3fMf5GSfaGLmm4cJ8beF8Yd6c3uHXE7kR/DcYbYwcnxvDj3XQBslxuTG8NeEH3Wij5HjcKN7A9bM/tGFyHG4cX0Xd9LJQmal2dk+Bv99Kt3BBdqrPfP4uEQ2+rg9tqByefuxP+f65LzBFGyyHozfSqVcWxVuFgA2XmRvfbtwuq0xMK9eVSC7DRTzOz4ZOryuRveqroPwtwezwN9o3cl2JbE0/nLprsQQ1fjmmFi7kqZ9QDgK/cAg9QUlqeB/XMg4KP3WHT1ZS6cftfug0OIrrSl7CJy1ZPGm8epua1q4r8feddVzZqr60bhS3TYkrfH31L9gJdfXpvGjz+D0OjxXGJvq+mz8sqzMS/EKdJteVeACrXIWxuJ2cwlhbm0l82f8o8bOsdcOyHMAqCmM9/QIpX0Y3aq5viJnoqgBWURixfjKo+ziW+C3a0E5aZd0AVlEYC/02K7neI6cTioULFgqwsz7lOgGsUlxgP7IwxrvabpV7QNwg9bqSpgGsMoYw+t0s/MRPrKC4IWa960raDGCVIYbR//yGPy9Rg7o3xOwqgFUGEcZwOI7mcpvUuSFmHwGs4mH0Zm02YbRt9A6DWJO7bojZdwCr0IfRb4I0f1BurViLu26IuckAVmEL42BXsmyCYuHCm0/saI4AVtl0GGkvk8yZ4kTg9g0xGQNYpe8w+v5Qc7kjiutKbi5cYA9gleswxjv3txzGXC6TzJ3lG2LmFMAqrYbRV7LkdJlk7lRviJlrAKs0CWO2l0nmjgevKED+AaySEkbvDmR9mWTOXF1XMrQAVvEwFq/2t8Po947WycaGKRYujOPA+zqMdjZNe5nkZPIfytu2IgOXgV8AAAAASUVORK5CYII="
Version="4"
EngineVersion="13">
<VersionHistory>
<Change Date="2026-10-31" Type="New">Added new authentication options: User Credentials (delegated OAuth flow) plus Azure App‑based authentication (service principal via client credentials or certificate); deprecated legacy OAuth and PAT methods.</Change>
<Change Date="2025-10-31" Type="New">Added support for On-Premises Azure DevOps Server</Change>
<Change Date="2025-10-31" Type="Fix">Changed hard coded URL in endpoints to relative URL (Useful for supporting On-Premises TFS Server which supports similar API calls as AzureDevOps Online)</Change>
<Change Date="2025-07-27" Type="New">Added support for ParentId column and Expand Parameter (To get ParentId, you must set Expand Parameters=Relations)</Change>
<Change Date="2025-07-27" Type="New">Added three additional parameters for WorkItem Update / Insert operations (e.g. SuppressNotifications, BypassRules, ValidateOnly)</Change>
<Change Date="2025-07-27" Type="New">Added new field ResolvedBy for WorkItem operations UPDATE and INSERT, added new column ResolvedById for Read Operation</Change>
<Change Date="2025-07-27" Type="New">Added new columns Severity, ProposedFix, Symptom, RootCause, HowFound, FoundInEnvironment, BusinessValue, ValueArea, TestedBy, TestPriority, Activity</Change>
<Change Date="2025-07-27" Type="Modified">Changed datatypes for Description, Steps, ReproSteps, SystemInfo and History columns to DT_NTEXT to handle more than 4000 chars (helps in some ETL tools like SSIS)</Change>
<Change Date="2024-12-04" Type="New">Added images in OAuth authentication instructions</Change>
<Change Date="2024-12-03" Type="New">Added images in Token authentication instructions</Change>
<Change Date="2024-06-24" Type="Fix">Updated InputColumns datatypes for some endpoint columns (previously they were all string types)</Change>
<Change Date="2024-03-04" Type="Fix">Query list doesn't refresh after changing Project parameter for get_workitems_by_query_id endpoint on Query Builder UI</Change>
<Change Date="2024-01-30" Type="New">Added new endpoint get_queries and get_workitems_by_query_id endpoint to fetch result from predefined query</Change>
<Change Date="2023-10-09" Type="New">Updated query_workitems endpoint to be treated as IsSqlEndPoint (support for #DirectSQL prefix)</Change>
<Change Date="2023-10-09" Type="Fix">Using slash throws JSON encoding error sometimes (e.g. IterationPath can have slash)</Change>
<Change Date="2023-10-09" Type="New">Updated examples to show how to query more than 20000 AzureDevOps / TFS workitems</Change>
<Change Date="2023-06-14" Type="New">Initial version</Change>
</VersionHistory>
<ServiceUrls>
<ServiceUrl Url="https://dev.azure.com" Name="(Cloud) Azure DevOps Server"/>
<ServiceUrl Url="https://YOUR-LOCAL-HOST/tfs" Name="(On-Premises) Azure DevOps Server" />
<ServiceUrl Url="https://auditservice.dev.azure.com" Hidden="True" Desc="Private URL needed for some operations"/>
<ServiceUrl Url="https://almsearch.dev.azure.com" Hidden="True" Desc="Private URL needed for some operations"/>
</ServiceUrls>
<Auths>
<!-- New delegated user credentials flow -->
<Auth Name="UserCreds" Label="User Credentials" Type="OAuth"
Desc="Delegated access using OAuth authorization code flow. Users sign in with their Azure AD account."
HelpLink="https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops"
ConnStr="Provider=Custom;OAuthVersion=OAuth2;ScopeSeparator={space};GrantType=Default;Scope=[$Scope$];ScopeSeparator={space};"
TestEndPoint="get_projects">
<Notes>
<![CDATA[
<p>Follow these simple steps below to create Microsoft Entra ID application with delegated access:<p/>
<div class="alert alert-warning">
<strong>WARNING</strong>:
To automate your company's processes, make sure you use a system/generic account (e.g. <code>automation@my-company.com</code>).
When you use a personal account which is tied to a specific employee profile and that employee leaves the company,
the token may become invalid and any automated processes using that token will start to fail.
</div>
<ol>
<li>
Navigate to the <a target="_blank" href="https://portal.azure.com/#home">Azure Portal</a> and log in using your credentials.
</li>
<li>
Access <a target="_blank" href="https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview">Microsoft Entra ID</a>.
</li>
<li>
Register a new application by going to
<a target="_blank" href="https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps">App registrations</a>
and clicking on <strong>New registration</strong> button:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/start-new-app-registration-in-microsoft-entra-id.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start new app registration in Microsoft Entra ID"
title="Starting new app registration in Microsoft Entra ID"
width="1000"
height="490" />
<div class="alert alert-info">
<strong>INFO:</strong>
Find more information on how to register an application in <a target="_blank" href="https://docs.microsoft.com/en-us/graph/auth-register-app-v2">Graph API reference</a>.
</div>
</li>
<li>
When configuration window opens, configure these fields:
<ul>
<li>
<strong>Supported account type</strong>
<ul>
<li>Use <code>Accounts in this organizational directory only</code>, if you need access to data in your organization only.</li>
</ul>
</li>
</li>
<li>
<strong>Redirect URI</strong>:
<ul>
<li>Set the type to <code>Public client/native (mobile & desktop)</code>.</li>
<li>Use <code>https://zappysys.com/oauth</code> as the URL.</li>
</ul>
</li>
</ul>
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/register-app-in-microsoft-entra-id.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Register app in Microsoft Entra ID"
title="Registering app in Microsoft Entra ID"
width="1000"
height="840" />
</li>
<li>
After registering the app, copy the <strong>Application (client) ID</strong> for later:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-client-id-of-microsoft-entra-id-app.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy client ID of Microsoft Entra ID app"
title="Copying client ID of Microsoft Entra ID app"
width="1000"
height="560" />
</li>
<li>
Then copy <strong>OAuth authorization endpoint (v2)</strong> & <strong>OAuth token endpoint (v2) URLs</strong> to use later in the configuration:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-auth-and-token-urls-in-microsoft-entra-id-app.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy Auth and Token URLs in Microsoft Entra ID app"
title="Copying Auth and Token URLs in Microsoft Entra ID app"
width="1000"
height="560" />
</li>
<li>
Now go to SSIS package or ODBC data source and use the copied values in <strong>User Credentials</strong> authentication configuration:
<ul>
<li>In the <strong>Authorization URL</strong> field paste the <strong>OAuth authorization endpoint (v2) URL</strong> value you copied in the previous step.</li>
<li>In the <strong>Token URL</strong> field paste the <strong>OAuth token endpoint (v2) URL</strong> value you copied in the previous step.</li>
<li>In the <strong>Client ID</strong> field paste the <strong>Application (client) ID</strong> value you copied in the previous step.</li>
<li>
In the <strong>Scope</strong> field use the default value or select individual scopes, e.g.:
<ul>
<li>
<code>vso.project</code>
</li>
<li>
<code>vso.work_full</code>
</li>
</ul>
</li>
</ul>
</li>
<li>
Press <strong>Generate Token</strong> button to generate Access and Refresh Tokens.
</li>
<li>
<em>Optional step</em>. Choose <strong>Default Drive Id</strong> from the drop down menu.
</li>
<li>
Click <strong>Test Connection</strong> to confirm the connection is working.
</li>
<li>
Done! Now you are ready to use the API Connector!
</li>
</ol>
]]>
</Notes>
<Params>
<Param Name="AuthUrl"
Label="Authorization URL"
Required="True"
Options="For Single Tenant=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/authorize;For Multi Tenant=https://login.microsoftonline.com/common/oauth2/v2.0/authorize"
HelpLink="https://docs.microsoft.com/en-us/graph/auth-register-app-v2" />
<Param Name="TokenUrl"
Label="Token URL"
Required="True"
Options="For Single Tenant=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/token;For Multi Tenant=https://login.microsoftonline.com/common/oauth2/v2.0/token"
HelpLink="https://docs.microsoft.com/en-us/graph/auth-register-app-v2" />
<Param Name="ClientId" Label="Client ID" Required="True"
HelpLink="https://docs.microsoft.com/en-us/graph/auth-register-app-v2" />
<Param Name="ClientSecret" Label="Client Secret" Secret="True"/>
<Param Name="RefreshTokenFilePath" Label="Refresh Token File Path" Hidden="True"
Desc="If you cant fit long refresh token in ConnectionString from your program then use this. Supply three properties in json format (i.e. save this in file { "access_token": "YOUR_ACCESS_TOKEN", "refresh_token": "YOUR_REFRESH_TOKEN", "expires_in": 3600 } )"/>
<Param Name="Organization" Label="Organization name or Id (e.g. mycompany)" Desc="The organization name or Id obtained from Azure DevOps." Functions="URLENC" Required="True" />
<Param Name="Project" Label="Default Project Name (Choose after Generating Token)" Desc="The default project name to make API calls for." Template="ProjectParam" Required="False" />
<Param Name="ReturnUrl" Label="Return URL" Desc="The URL to send the authentication token back to." Value="https://zappysys.com/oauth" Options="https://zappysys.com/oauth" Required="True" />
<Param Name="Scope" Label="Scopes (Must match with App Registration)" Required="True" MultiSelectSeparator=" " MultiSelect="True" Value="https://app.vssps.visualstudio.com/vso.project~https://app.vssps.visualstudio.com/vso.work_full~offline_access"
Options="Delegated Access (All Permissions for User Account)=https://app.vssps.visualstudio.com/user_impersonation;Project and team (read)=https://app.vssps.visualstudio.com/vso.project;Project and team (read and write)=https://app.vssps.visualstudio.com/vso.project_write;Project and team (read, write and manage)=https://app.vssps.visualstudio.com/vso.project_manage;Work items (read)=https://app.vssps.visualstudio.com/vso.work;Work items (read and write)=https://app.vssps.visualstudio.com/vso.work_write;Work items (full)=https://app.vssps.visualstudio.com/vso.work_full;Offline access=offline_access" Desc="The scopes of access needed for the Azure DevOps API connection. **Offline_access** is required to receive a refresh token; without it the connection cannot renew and will effectively stop working when the access token expires." />
<Param Name="ApiVersion" Key="api-version" Label="API Version" Desc="The version of the Azure DevOps API to use." Value="7.0" Options="6.0;7.0;7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
</Params>
</Auth>
<!-- Azure App-based auths placed immediately after user credentials -->
<Auth Name="AppCreds" Label="Azure App Credentials" Type="OAuth"
Desc="Use Azure AD service principal credentials (client id + secret) with the client credentials flow. Recommended for automated server-to-server access instead of PAT or delegated OAuth."
HelpLink="https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops#service-principal"
ConnStr="Provider=Custom;OAuthVersion=OAuth2;ScopeSeparator={space};GrantType=ClientCredentials;Scope=[$Scope$];ScopeSeparator={space};"
TestEndPoint="get_projects">
<Notes>
<![CDATA[
<h3>Step 1: Register the App in Microsoft Entra ID (AAD)</h3>
<ol>
<li>Go to <a target="_blank" href="https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade">the Azure Portal > Microsoft Entra ID > App registrations</a> and click <strong>New registration</strong>:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/start-new-app-registration-in-microsoft-entra-id.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start new app registration in Microsoft Entra ID"
title="Starting new app registration in Microsoft Entra ID"
width="1000"
height="490" />
</li>
<li>Name it (e.g., <em>ZS-AzureDevOps-AppCred</em>).</li>
<li>Set <strong>Supported account types</strong> to "<em>Accounts in this organizational directory only</em>" (Single Tenant):
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/register-app-in-microsoft-entra-id.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Register app in Microsoft Entra ID"
title="Registering app in Microsoft Entra ID"
width="1000"
height="840" />
</li>
<li>Leave <strong>Redirect URI</strong> blank (it's not used for Client Credentials).</li>
<li>Click <strong>Register</strong>.</li>
</ol>
<h3>Step 2: Create a Client Secret</h3>
<ol>
<li>In your new app, go to <strong>Certificates & secrets</strong>.</li>
<li>Click <strong>New client secret</strong>, give it a name, and set an expiration.</li>
<li><strong>Copy the Secret Value immediately</strong>. You will never see it again once you leave the page:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-client-id-of-microsoft-entra-id-app.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy client Secret of Microsoft Entra ID app"
title="Copying client Secret of Microsoft Entra ID app"
width="1000"
height="560" />
</li>
</ol>
<h3>Step 3: Set Permissions and Admin Consent</h3>
<ol>
<li>Go to <strong>API permissions</strong> > <strong>Add a permission</strong>.</li>
<li>Select <strong>Azure DevOps</strong> and click <strong>Delegated permissions</strong>.</li>
<li>Check the necessary scopes (e.g., <code>vso.project</code>, <code>vso.work_full</code>).</li>
<li><strong>Crucial:</strong> Click <strong>Grant admin consent for [Your Tenant]</strong>. Without this, the app cannot authenticate in the background.</li>
</ol>
<h3>Step 4: Map the App to Azure DevOps Organization</h3>
<ol>
<li>Copy your <strong>Application (client) ID</strong> from the App Overview page.</li>
<li>Go to your <strong>Azure DevOps Organization Settings</strong> > <strong>Users</strong>.</li>
<li>Click <strong>Add users</strong>, paste the <strong>Application (client) ID</strong> in the search box, and select the App.</li>
<li>Assign an <strong>Access level</strong> (usually <em>Basic</em>) and add it to the relevant <strong>Projects</strong>.</li>
</ol>
<h3>Step 5: Connection Settings</h3>
<p>In your SSIS package or ODBC data source, use the following in the <strong>App Credentials</strong> configuration:</p>
<ul>
<li>In the <strong>Token URL</strong> field, paste the <strong>OAuth token endpoint (v2) URL</strong> from the Azure Portal 'Endpoints' tab.</li>
<li>In the <strong>Client ID</strong> field, paste the <strong>Application (client) ID</strong>.</li>
<li>In the <strong>Client Secret</strong> field, paste the <strong>Secret Value</strong> copied in Step 2.</li>
<li>In the <strong>Scope</strong> field, use: <code>https://app.vssps.visualstudio.com/.default</code></li>
</ul>
<h3>Step 6: Finalize Connection</h3>
<ol>
<li>Press <strong>Generate Token</strong> button to fetch the token using the Client Secret.</li>
<li>Click <strong>Test Connection</strong> to confirm the setup.</li>
<li>Done! You are ready to use the API Connector!</li>
</ol>
]]>
</Notes>
<Params>
<Param Name="TokenUrl" Label="Token URL" Required="True" Options="For Single Tenant=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/token;For Multi Tenant=https://login.microsoftonline.com/common/oauth2/v2.0/token" />
<Param Name="ClientId" Label="Client ID" Required="True" />
<Param Name="ClientSecret" Label="Client Secret" Secret="True" Required="True"/>
<Param Name="Scope"
Label="Scopes (Use .default for App Credentials)"
Required="True"
MultiSelectSeparator=" "
MultiSelect="True"
Value="https://app.vssps.visualstudio.com/.default"
Options="App-Only Default (Recommended for AppCreds)=https://app.vssps.visualstudio.com/.default;Project and team (read)=https://app.vssps.visualstudio.com/vso.project;Project and team (read and write)=https://app.vssps.visualstudio.com/vso.project_write;Project and team (read, write and manage)=https://app.vssps.visualstudio.com/vso.project_manage;Work items (read)=https://app.vssps.visualstudio.com/vso.work;Work items (read and write)=https://app.vssps.visualstudio.com/vso.work_write;Work items (full)=https://app.vssps.visualstudio.com/vso.work_full"
Desc="For App Credentials or Certificates, use the **.default** scope to automatically include all permissions granted and consented to in the Azure App Registration. Note: offline_access is not used in App-Only flows as refresh tokens are not required." />
<Param Name="Organization" Label="Organization name or Id" Desc="The organization name or Id obtained from Azure DevOps." Functions="URLENC" Required="True" />
<Param Name="Project" Label="Default Project Name" Desc="The default project name to make API calls for." Template="ProjectParam" OptionsEndPointParameters="Organization=[$Organization$]" Required="False"/>
<Param Name="ApiVersion" Key="api-version" Label="API Version" Desc="The version of the Azure DevOps API to use." Value="7.0" Options="6.0;7.0;7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
</Params>
</Auth>
<Auth Name="AppCredsWithCert" Label="Azure App Credentials with Certificate (Sign JWT with Private Key)" Type="OAuth"
Desc="Same as Application Credentials but uses a client certificate instead of a secret."
HelpLink="https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops#service-principal"
ConnStr="Provider=GenericJwt;OAuthVersion=OAuth2;ScopeSeparator={space};GrantType=ClientCredentials;Scope=[$Scope$];ScopeSeparator={space};UseClientCertificate=True;"
TestEndPoint="get_projects">
<Notes>
<![CDATA[
<h3>Step 1: Register the App in Microsoft Entra ID (AAD)</h3>
<ol>
<li>Go to <a target="_blank" href="https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade">the Azure Portal > Microsoft Entra ID > App registrations</a> and click <strong>New registration</strong>:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/start-new-app-registration-in-microsoft-entra-id.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Start new app registration in Microsoft Entra ID"
title="Starting new app registration in Microsoft Entra ID"
width="1000"
height="490" />
</li>
<li>Name it (e.g., <em>ZS-AzureDevOps-CertAuth</em>).</li>
<li>Set <strong>Supported account types</strong> to "<em>Accounts in this organizational directory only</em>" (Single Tenant):
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/register-app-in-microsoft-entra-id.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Register app in Microsoft Entra ID"
title="Registering app in Microsoft Entra ID"
width="1000"
height="840" />
</li>
<li>Leave <strong>Redirect URI</strong> blank (it's not used for Client Credentials flows).</li>
<li>Click <strong>Register</strong>.</li>
</ol>
<h3>Step 2: Upload Client Certificate</h3>
<ol>
<li>In your new app, go to <strong>Certificates & secrets</strong>.</li>
<li>Click the <strong>Certificates</strong> tab, then click <strong>Upload certificate</strong>.</li>
<li>Upload your public key certificate (.cer, .pem, or .crt). Keep the private key secure on your system.</li>
<li>Copy the <strong>Thumbprint</strong> for your configuration:
<img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-client-id-of-microsoft-entra-id-app.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy certificate thumbprint"
title="Copying certificate thumbprint"
width="1000"
height="560" />
</li>
</ol>
<h3>Step 3: Set Permissions and Admin Consent</h3>
<ol>
<li>Go to <strong>API permissions</strong> > <strong>Add a permission</strong>.</li>
<li>Select <strong>Azure DevOps</strong> and click <strong>Delegated permissions</strong>.</li>
<li>Select the required scopes (e.g., <code>vso.project</code>, <code>vso.work_full</code>).</li>
<li><strong>Crucial:</strong> Click <strong>Grant admin consent for [Your Tenant]</strong>. Without this, the background service cannot acquire a token.</li>
</ol>
<h3>Step 4: Map the App to Azure DevOps Organization</h3>
<ol>
<li>Copy your <strong>Application (client) ID</strong> from the App Overview page.</li>
<li>Go to your <strong>Azure DevOps Organization Settings</strong> > <strong>Users</strong>.</li>
<li>Click <strong>Add users</strong> and paste the <strong>Application (client) ID</strong> in the search box to find the App.</li>
<li>Assign an <strong>Access level</strong> (usually <em>Basic</em>) and add it to the relevant <strong>Projects</strong>.</li>
</ol>
<h3>Step 5: Connection Settings</h3>
<p>In your SSIS package or ODBC data source, use the following in the <strong>Client Certificate</strong> configuration:</p>
<ul>
<li>In the <strong>Token URL</strong> field, paste the <strong>OAuth token endpoint (v2) URL</strong> from the Azure Portal 'Endpoints' tab.</li>
<li>In the <strong>Client ID</strong> field, paste the <strong>Application (client) ID</strong>.</li>
<li>Configure your <strong>Certificate Path</strong> or <strong>Thumbprint</strong> in the Client Certificate tab of the connector.</li>
<li>In the <strong>Scope</strong> field, use: <code>https://app.vssps.visualstudio.com/.default</code></li>
</ul>
<h3>Step 6: Finalize Connection</h3>
<ol>
<li>Press <strong>Generate Token</strong>. The connector will sign the request using your certificate to fetch a token.</li>
<li>Click <strong>Test Connection</strong> to confirm the setup.</li>
<li>Done! Your certificate-based connection is ready!</li>
</ol>
]]>
</Notes>
<Params>
<Param Name="TokenUrl" Label="Token URL" Required="True" Options="For Single Tenant=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/token;For Multi Tenant=https://login.microsoftonline.com/common/oauth2/v2.0/token" />
<Param Name="ClientId" Label="Client ID" Required="True" />
<Param Name="Certificate" Label="Certificate: *** Configure [Client Certificate] Tab ***" Required="True" />
<Param Name="Scope"
Label="Scopes (Must match with App Registration)"
Required="True"
MultiSelectSeparator=" "
MultiSelect="True"
Value="https://app.vssps.visualstudio.com/.default"
Options="App-Only Default (Recommended for AppCreds)=https://app.vssps.visualstudio.com/.default;Project and team (read)=https://app.vssps.visualstudio.com/vso.project;Project and team (read and write)=https://app.vssps.visualstudio.com/vso.project_write;Project and team (read, write and manage)=https://app.vssps.visualstudio.com/vso.project_manage;Work items (read)=https://app.vssps.visualstudio.com/vso.work;Work items (read and write)=https://app.vssps.visualstudio.com/vso.work_write;Work items (full)=https://app.vssps.visualstudio.com/vso.work_full"
Desc="For App Credentials or Certificates, use the **.default** scope to automatically include all permissions granted and consented to in the Azure App Registration. Note: offline_access is not used in App-Only flows as refresh tokens are not required." />
<Param Name="Organization" Label="Organization name or Id" Desc="The organization name or Id obtained from Azure DevOps." Functions="URLENC" Required="True" />
<Param Name="Project" Label="Default Project Name" Desc="The default project name to make API calls for." Template="ProjectParam" OptionsEndPointParameters="Organization=[$Organization$]" Required="False"/>
<Param Name="ApiVersion" Key="api-version" Label="API Version" Desc="The version of the Azure DevOps API to use." Value="7.0" Options="6.0;7.0;7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
</Params>
</Auth>
<Auth Name="OAuth" Type="OAuth" Label="(Cloud) OAuth App - User Credentials (DEPRECATED)"
ConnStr="Provider=Vsts;ScopeSeparator={space};ReturnUrl=[$ReturnUrl$];Scope=[$Scope$];"
TestEndPoint="get_projects">
<Notes>
<![CDATA[**DEPRECATED:** this OAuth-based user credential flow is legacy; for new integrations prefer the Azure App Credentials options below.
Connecting to your Azure DevOps data requires you to authenticate your REST API access. Follow the instructions below:
<ol>
<li>Go to
<a target="_blank" href="https://app.vsaex.visualstudio.com/app/register">https://app.vsaex.visualstudio.com/app/register</a>
to register your app.</li>
<li>
Fill in your application and company's information as required, and then select the scopes that your application needs.
This should typically be <strong>Project and team (read and write)</strong> and <strong>Work items (read and write)</strong>.
<div style="background-color: #f5f2c4; border-style: solid; border-color: #000000; border-width: 1px; margin-top: 3px; margin-bottom: 6px; padding: 6px;">
<div>
Your selected scopes when registering your app <u><i><strong>must</strong></i></u> match the scopes you enter here on the connector screen.
<span style="color: #bb0000;"><u><i><strong>If they don't match, the connector will not be able to work with your Azure DevOps account!</strong></i></u></span>
</div>
<div style="margin-top: 8px;">
If you need further information about the scopes used in Azure DevOps, or need to see what to enter into the connector screen to
match up with your selected scopes, visit
<a target="_blank" href="https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops">https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops</a>.
</div>
</div>
<img src="https://cdn.zappysys.com/api/Images/authentication/azure-devops/OAuth/create-oauth-application-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail img-thumbnail-background block"
alt="Create OAuth application in Azure DevOps"
title="Creating OAuth application in Azure DevOps"
width="900"
height="1300" />
<p style="margin-top: 1em">
<strong>NOTE:</strong>
For <strong>Authorization callback URL</strong> use your company's OAuth Redirect URL (if IT administrator provides you one) or you can use <code>https://zappysys.com/oauth</code> (it's safe).
</p>
</li>
<li>
Select <strong>Create Application</strong> and then the <strong>Application Settings</strong> page will be displayed.
</li>
<li>
Record the <strong>App ID</strong> for us to use later:
<img src="https://cdn.zappysys.com/api/Images/authentication/azure-devops/OAuth/copy-app-id-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy App ID in Azure DevOps"
title="Copying App ID in Azure DevOps"
width="900"
height="610" />
<li>
And do the same with <strong>Client Secret</strong>:
<img src="https://cdn.zappysys.com/api/Images/authentication/azure-devops/OAuth/use-client-secret-to-read-azure-devops-rest-api-data.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Use Client Secret to read Azure DevOps REST API data"
title="Using Client Secret to read Azure DevOps REST API data"
width="900"
height="610" />
</li>
<li>
Then go to <a target="_blank" href="https://aex.dev.azure.com">https://aex.dev.azure.com</a> and select relevant organization on the left.
</li>
<li>
Then copy <strong>Organization's host name part</strong> (e.g. <code>acmeinc</code>, if full host name is <code>acmeinc.visualstudio.com</code>), save it to a file, and click it:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/copy-organization-host-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy Organization Host in Azure DevOps"
title="Copying Organization Host in Azure DevOps"
width="1000"
height="600" />
</li>
<!--<li>Visit <a target="_blank" href="https://aex.dev.azure.com">https://aex.dev.azure.com</a>.
Once you are logged in, record your organization name in the URL that is displayed on the page.
For example, if your organization is called "acmeinc", the URL on the page would be acmeinc.visualstudio.com.</li>-->
<li>
Back at the connector screen, enter the App ID into the <strong>Client Id (App ID)</strong> field that was recorded in the previous step.
</li>
<li>
Enter the Client Secret that was recorded in the previous step into the <strong>Client Secret</strong> field.
In order to edit the text in this field, select the ellipses <strong>(...)</strong> button that appears when the textbox is clicked,
and edit the <strong>Client Secret</strong> with the dialog box that appears.
</li>
<li>
Enter the organization that was recorded in step 5 into the <strong>Organization name or Id for url</strong> field.
</li>
<li>
Click <strong>Generate Token</strong>. If proper authentication occurs, you will see a notice saying so.
You can click <strong>Yes</strong> to save a backup file of your generated tokens.
</li>
<li>
Select the project you want to connect to by default from the <strong>Default Project (Choose after Generating Token)</strong> field.
</li>
<li>
Select the <strong>Security</strong> tab.
</li>
<li>
Enter <code>https://auditservice.dev.azure.com,https://almsearch.dev.azure.com</code> into the <strong>Additional Trusted Domains</strong> field.
</li>
<li>
Select the <strong>Test Connection</strong> button at the bottom of the window to verify proper connectivity with your Azure DevOps account.
</li>
<li>
If the connection test succeeds, select <strong>OK</strong>.
</li>
<li>
To edit previously created app you can visit <code>https://app.vsaex.visualstudio.com/me</code> and see <b>Applications and services</b> section. Click on your desired app name.
</li>
</ol>]]>
</Notes>
<Params>
<Param Name="ClientId" Label="Client Id (App ID)" Required="True" Desc="The App ID obtained from the Azure Portal." />
<Param Name="ClientSecret" Label="Client Secret" Desc="The Client Secret obtained from the Azure Portal https://app.vsaex.visualstudio.com/ Click on your APP and View Client Secret. NOTE: Client Secret expires every five years. Regenerate your app secret to continue to create and use access tokens and refresh tokens. To do so, go to your app page, select [Regenerate secret], which then confirms that you want to complete this action." Secret="True" Required="True" />
<Param Name="Organization" Label="Organization name or Id (e.g. mycompany)" Desc="The organization name or Id obtained from the Azure Portal." Functions="URLENC" Required="True" />
<Param Name="Project" Label="Default Project Name (Choose after Generating Token)" Desc="The default project name to make API calls for." Template="ProjectParam" Required="False"/>
<Param Name="ReturnUrl" Label="Return URL" Desc="The URL to send the authentication token back to." Value="https://zappysys.com/oauth" Options=";https://zappysys.com/oauth" Required="True" />
<Param Name="Scope" Label="Scopes (Use .default for App Credentials)" Required="True" MultiSelectSeparator=" " MultiSelect="True" Value="vso.project~vso.work_full"
Options="Project and team (read)=vso.project;Project and team (read and write)=vso.project_write;Project and team (read, write and manage)=vso.project_manage;Work items (read)=vso.work;Work items (read and write)=vso.work_write;Work items (full)=vso.work_full" Desc="The scopes of access needed for the Azure DevOps API connection." />
<Param Name="ApiVersion" Key="api-version" Label="API Version" Desc="The version of the Azure DevOps API to use." Value="7.0" Options="6.0;7.0;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
</Params>
</Auth>
<Auth Name="Token" Label="(Cloud) Personal Access Token (PAT) (DEPRECATED)" Type="Http"
ConnStr="CredentialType=Basic;AuthScheme=[$AuthScheme$];TokenAuthHeader=[$AuthHeader$];"
TestEndPoint="get_projects">
<Notes>
<![CDATA[**DEPRECATED:** Personal Access Tokens are still supported but the new Azure App Credentials auth is recommended for security and automation.
To connect to Azure DevOps using a Personal Access Token (PAT), you must first create a valid PAT:
<ol>
<li>
Start by going to <a target="_blank" href="https://aex.dev.azure.com">https://aex.dev.azure.com</a> and selecting relevant organization on the left.
</li>
<li>
Then copy <strong>Organization's host name part</strong> (e.g. <code>acmeinc</code>, if full host name is <code>acmeinc.visualstudio.com</code>), save it to a file, and click it:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/copy-organization-host-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Copy Organization Host in Azure DevOps"
title="Copying Organization Host in Azure DevOps"
width="1000"
height="600" />
</li>
<li>
Next, click <strong>User settings</strong> icon and then click <strong>Personal access tokens</strong>:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/click-user-settings-icon-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Click User Settings icon in Azure DevOps"
title="Clicking User Settings icon in Azure DevOps"
width="1000"
height="430" />
</li>
<li>
Then click <strong>New Token</strong> button to create a new personal access token:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/create-new-token-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create new token in Azure DevOps"
title="Creating new token in Azure DevOps"
width="1000"
height="430" />
</li>
<li>
Continue by...
<ul>
<li>naming your token</li>
<li>selecting the right <strong>Organization</strong></li>
<li>setting token's <strong>Expiration</strong> date (it's recommended to use <code>Custom defined</code> option and make it expire after one year or later)</li>
<li>and setting the <strong>Scopes</strong>:</li>
</ul>
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/finish-creating-token-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Finish creating token in Azure DevOps"
title="Finishing creating token in Azure DevOps"
width="1000"
height="720" />
<p>
<strong>NOTE:</strong>
You may be restricted from creating full-scoped PATs.
If so, your Azure DevOps administrator in Azure AD has enabled a policy which limits you to a specific custom defined set of scopes.
</p>
</li>
<li>
Now click <strong>Copy</strong> button and save the newly created token into a file for quick access later:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/use-azure-devops-token-to-read-rest-api-data.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Use Azure DevOps token to read REST API data"
title="Using Azure DevOps token to read REST API data"
width="1000"
height="540" />
</li>
<li>Go back to the connector screen, input the token you saved in a previous step into the <strong>Personal Access Token (PAT)</strong> field.</li>
<li>Then enter the Organization host name part that you noted recorded in previous step into <strong>Organization name or Id for url</strong> field.</li>
<li>Enter the name or Id of the project you want to connect to by default in the <strong>Default Project (Choose after above fields)</strong> field.</li>
<li>Select the <strong>Security</strong> tab.</li>
<li>Enter <code>https://auditservice.dev.azure.com,https://almsearch.dev.azure.com,https://analytics.dev.azure.com</code> into the <strong>Additional Trusted Domains</strong> field.</li>
<li>Select the <strong>Test Connection</strong> button at the bottom of the window to verify proper connectivity with your Azure DevOps account.</li>
<li>Done!</li>
</ol>]]>
</Notes>
<Params>
<Param Name="AuthScheme" Value="Bearer" Hidden="True" />
<Param Name="AuthHeader" Value="Authorization" Hidden="True" />
<Param Name="Password" Label="Personal Access Token (PAT)" Secret="True" Required="True"/>
<Param Name="Organization" Label="Organization name or Id for url" Desc="The organization name or Id obtained from the Azure Portal." Functions="URLENC" Required="True" />
<Param Name="Project" Label="Default Project Name" Desc="The default project name to make API calls for."
Template="ProjectParam"
OptionsEndPointParameters="Organization=[$Organization$]"
Required="False"
/>
<Param Name="ApiVersion" Key="api-version" Label="API Version" Desc="The version of the Azure DevOps API to use." Value="7.0" Options="6.0;7.0;7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
</Params>
</Auth>
<Auth Name="TokenOnPremises" Label="(On-Premises) Personal Access Token (PAT) (DEPRECATED)" Type="Http"
ConnStr="CredentialType=Basic;AuthScheme=[$AuthScheme$];TokenAuthHeader=[$AuthHeader$];"
TestEndPoint="get_projects">
<Notes>
<![CDATA[**DEPRECATED:** On-premises PAT method is legacy; consider Azure App Credentials if your server supports Azure AD apps.
To connect to Azure DevOps On-Premises Server using a Personal Access Token (PAT), you must first create a valid PAT:
<ol>
<li>
Start by navigating to your on-premises Azure DevOps Server URL.
<br /><strong>NOTE:</strong> The screenshots shown below are from the cloud version, so your interface may look slightly different depending on which on-premises Azure DevOps Server version you’re using — however, the overall concepts and steps are very similar between the cloud and on-premises editions.
</li>
<li>
Now open any project and capture Collection Name from the URL. For example if your URL is <pre>https://tfs.mycompany.local/tfs/MyCollection/MyProject/</pre> then your collection name is <b>MyCollection</b> usually after <b>/tfs/</b>. Copy this collection name and later we will enter on Connection UI.
</li>
<li>
Next, click <strong>User settings</strong> icon and then click <strong>Personal access tokens</strong>:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/click-user-settings-icon-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Click User Settings icon in Azure DevOps"
title="Clicking User Settings icon in Azure DevOps"
width="1000"
height="430" />
</li>
<li>
Then click <strong>New Token</strong> button to create a new personal access token:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/create-new-token-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Create new token in Azure DevOps"
title="Creating new token in Azure DevOps"
width="1000"
height="430" />
</li>
<li>
Continue by...
<ul>
<li>naming your token</li>
<li>selecting the right <strong>Organization</strong></li>
<li>setting token's <strong>Expiration</strong> date (it's recommended to use <code>Custom defined</code> option and make it expire after one year or later)</li>
<li>and setting the <strong>Scopes</strong>:</li>
</ul>
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/finish-creating-token-in-azure-devops.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Finish creating token in Azure DevOps"
title="Finishing creating token in Azure DevOps"
width="1000"
height="720" />
<p>
<strong>NOTE:</strong>
You may be restricted from creating full-scoped PATs.
If so, your Azure DevOps administrator in Azure AD has enabled a policy which limits you to a specific custom defined set of scopes.
</p>
</li>
<li>
Now click <strong>Copy</strong> button and save the newly created token into a file for quick access later:
<img src="https://cdn.zappysys.com/api/images/authentication/azure-devops/PAT/use-azure-devops-token-to-read-rest-api-data.png"
loading="lazy"
decoding="async"
class="img-thumbnail block"
alt="Use Azure DevOps token to read REST API data"
title="Using Azure DevOps token to read REST API data"
width="1000"
height="540" />
</li>
<li>Go back to the connector screen, input the token you saved in a previous step into the <strong>Personal Access Token (PAT)</strong> field.</li>
<li>Then enter the Organization host name part that you noted recorded in previous step into <strong>Organization name or Id for url</strong> field.</li>
<li>Enter the name or Id of the project you want to connect to by default in the <strong>Default Project (Choose after above fields)</strong> field.</li>
<li>Select the <strong>Security</strong> tab.</li>
<li>Enter <code>https://auditservice.dev.azure.com,https://almsearch.dev.azure.com,https://analytics.dev.azure.com</code> into the <strong>Additional Trusted Domains</strong> field.</li>
<li>Select the <strong>Test Connection</strong> button at the bottom of the window to verify proper connectivity with your Azure DevOps account.</li>
<li>Done!</li>
</ol>]]>
</Notes>
<Params>
<Param Name="AuthScheme" Value="Bearer" Hidden="True" />
<Param Name="AuthHeader" Value="Authorization" Hidden="True" />
<Param Name="Password" Label="Personal Access Token (PAT)" Secret="True" Required="True"/>
<Param Name="Organization" Label="Collection name (e.g. MyCollection)" Desc="The collection name or Id" Functions="URLENC" Required="True" />
<Param Name="Project" Label="Default Project Name" Desc="The default project name to make API calls for."
Template="ProjectParam"
OptionsEndPointParameters="Organization=[$Organization$]"
Required="False"
/>
<Param Name="ApiVersion" Key="api-version" Label="API Version"
Desc="The version of the On-Premises TFS Server API to use." Value="7.0" Options="4.1;5.0;6.0;7.0;" Type="Query"
Required="True" Hidden="True" />
<Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
<Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
<Param Name="RetryCountMax" Value="5" Hidden="True" />
<Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />
</Params>
</Auth>
</Auths>
<Template>
<Param Name="QueryIdParam" Label="Query Id" Desc="The Id of the predefined Query."
OptionsEndPoint="get_queries" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" OptionsEndPointParameters="Project=[$Project$]" />
<Param Name="ProjectParam" Label="Project Name" Desc="The Name of the project." Functions=""
OptionsEndPoint="get_projects" OptionsEndPointValueColumn="name" OptionsEndPointLabelColumn="name" Required="True" />
<Param Name="TeamParam" Label="Team Id or Name" OptionsEndPoint="get_teams" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" OptionsEndPointParameters="Project=[$Project$];" />
<Param Name="IterationParam" Label="Itertation Id or Name" OptionsEndPoint="get_team_iterations" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" OptionsEndPointParameters="Project=[$Project$];Team=[$Team$];" />
<Param Name="QueryParam" Label="Wiql Query" Desc="The WIQL query (refer Azure DevOps Help to learn Wiql syntax." Required="True"
Value="SELECT * FROM WorkItems Order By [System.Id] DESC" ValueTemplate="<<{$value$}|~|{$Project$}|~|[$Project$],FUN_REPLACE>>"
HelpLink="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops" Editor="MultiLine"/>
<Param Name="DateSelectionParam" Type="Query"
Value="" Options="1900-12-31;today;yesterday;monthstart;monthend;yearstart;yearend;weekstart;weekend;yearstart-1y;yearend-1y;monthstart-1d;monthend+1d"
ValueTemplate="<<{$value$}||yyyy-MM-ddTHH:mm:ss,FUN_TO_DATETIME>>" />
<EndPoint Name="Paginated">
<Params>
<Param Name="NextUrlAttributeOrExpr" Type="Property" Value="$.nextPage" />
</Params>
</EndPoint>
<EndPoint Name="QueryOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_WSTR" Label="Id" Length="200" Key="True" />
<Column Name="name" DataType="DT_WSTR" Label="Name" Length="200" />
<Column Name="path" DataType="DT_WSTR" Label="Path" Length="200" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="2048" />
<Column Name="createdDate" Label="CreatedDate" DataType="DT_DBTIMESTAMP" />
<Column Name="lastModifiedDate" Label="LastModifiedDate" DataType="DT_DBTIMESTAMP" />
<Column Name="isFolder" Label="IsFolder" DataType="DT_BOOL" />
<Column Name="hasChildren" Label="HasChildren" DataType="DT_BOOL" />
<Column Name="createdBy.displayName" DataType="DT_WSTR" Label="CreatedByName" Length="255" />
<Column Name="createdBy.uniqueName" DataType="DT_WSTR" Label="CreatedByUniqueName" Length="255" />
<Column Name="createdBy.id" DataType="DT_WSTR" Label="CreatedById" Length="200" />
<Column Name="lastModifiedBy.displayName" DataType="DT_WSTR" Label="LastModifiedByName" Length="255" />
<Column Name="lastModifiedBy.uniqueName" DataType="DT_WSTR" Label="LastModifiedByUniqueName" Length="255" />
<Column Name="lastModifiedBy.id" DataType="DT_WSTR" Label="LastModifiedById" Length="200" />
</OutputColumns>
</EndPoint>
<EndPoint Name="IterationOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_WSTR" Label="Id" Length="200" Key="True" />
<Column Name="name" DataType="DT_WSTR" Label="Name" Length="200" />
<Column Name="path" DataType="DT_WSTR" Label="Path" Length="200" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="2048" />
<Column Name="attributes.startDate" Label="StartDate" DataType="DT_DBTIMESTAMP" />
<Column Name="attributes.finishDate" Label="EndDate" DataType="DT_DBTIMESTAMP" />
<Column Name="attributes.timeFrame" Label="Timeframe" />
</OutputColumns>
</EndPoint>
<EndPoint Name="OperationReferenceOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_WSTR" Label="Id" Length="200" Key="True" />
<Column Name="pluginId" DataType="DT_WSTR" Label="PluginId" Length="200" />
<Column Name="status" DataType="DT_WSTR" Label="Status" Length="100" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="2048" />
</OutputColumns>
</EndPoint>
<EndPoint Name="ProjectPostParamsAndInputColumns">
<Params>
<Param Name="Name" Label="Project Name" Desc="The name of the project." Type="Placeholder" Required="True" />
<Param Name="Abbreviation" Label="Project Abbreviation" Desc="The abbreviation of the project." Type="Placeholder" Required="True" />
<Param Name="Description" Label="Project Description" Desc="The description of the project." Type="Placeholder" Required="True" />
<Param Name="SourceControlType" Label="Source Control Type" Desc="The type of source control to be used with the project." Options="Git;Tfvc" Type="Placeholder" Required="True" />
<Param Name="TemplateTypeId" Label="Template Type Id" Desc="The template type id to use for the project." Type="Placeholder" Required="True" />
<Param Name="Visibility" Desc="The visibility of the project to organizational users. If set to private, the project is only visible to users with explicit access. If set to public, the project is visible to all." Value="private" Options="private;public" Type="Placeholder" Required="True" />
</Params>
</EndPoint>
<EndPoint Name="ProjectPutParamsAndInputColumns">
<Params>
<Param Name="Name" Label="Project Name" Desc="The name of the project." Type="Placeholder" />
<Param Name="Abbreviation" Label="Project Abbreviation" Desc="The abbreviation of the project." Type="Placeholder" />
<Param Name="Description" Label="Project Description" Desc="The description of the project." Type="Placeholder" />
<Param Name="SourceControlType" Label="Source Control Type" Desc="The type of source control to be used with the project." Options="Git;Tfvc" Type="Placeholder" />
<Param Name="TemplateTypeId" Label="Template Type Id" Desc="The template type id to use for the project." Type="Placeholder" />
<Param Name="Visibility" Desc="The visibility of the project to organizational users. If set to private, the project is only visible to users with explicit access. If set to public, the project is visible to all." Value="private" Options="private;public" Type="Placeholder" />
</Params>
</EndPoint>
<EndPoint Name="ProjectOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_WSTR" Label="Id" Length="500" Key="True" />
<Column Name="name" DataType="DT_WSTR" Label="Name" Length="500" />
<Column Name="description" DataType="DT_WSTR" Label="Description" Length="1160" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="1000" />
<Column Name="state" DataType="DT_WSTR" Label="State" Length="100" />
<Column Name="revision" DataType="DT_I4" Label="Revision" />
<Column Name="visibility" DataType="DT_WSTR" Label="Visibility" Length="100" />
<Column Name="lastUpdateTime" DataType="DT_DBTIMESTAMP" Label="LastUpdateTime" />
</OutputColumns>
</EndPoint>
<EndPoint Name="WorkItemOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_I4" Label="Id" Key="True" />
<Column Name="fields.System.Title" DataType="DT_WSTR" Label="Title" Length="1000" />
<Column Name="fields.System.Description" DataType="DT_NTEXT" Label="Description" />
<Column Name="fields.System.WorkItemType" DataType="DT_WSTR" Label="WorkItemType" Length="100" />
<Column Name="fields.System.State" DataType="DT_WSTR" Label="State" Length="100" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="2048" />
<Column Name="fields.System.Tags" DataType="DT_WSTR" Label="Tags" Length="4000" />
<Column Name="rev" DataType="DT_I4" Label="Revision" />
<Column Name="fields.System.AreaPath" DataType="DT_WSTR" Label="AreaPath" Length="500" />
<Column Name="fields.System.TeamProject" DataType="DT_WSTR" Label="TeamProject" Length="500" />
<Column Name="fields.System.IterationPath" DataType="DT_WSTR" Label="IterationPath" Length="500" />
<Column Name="fields.System.Reason" DataType="DT_WSTR" Label="Reason" Length="500" />
<Column Name="fields.System.CreatedDate" DataType="DT_DBTIMESTAMP" Label="CreatedDate" />
<Column Name="fields.System.ChangedDate" DataType="DT_DBTIMESTAMP" Label="ChangedDate" />
<Column Name="fields.System.CommentCount" DataType="DT_I4" Label="CommentCount" />
<Column Name="fields.System.Parent" DataType="DT_I4" Label="ParentId" Desc="Only returned if Expand Parameter is set to Relations or All"/>
<Column Name="fields.System.AssignedTo.displayName" DataType="DT_WSTR" Label="AssignedToDisplayName" Length="500" />
<Column Name="fields.System.AssignedTo.url" DataType="DT_WSTR" Label="AssignedToUrl" Length="2048" />
<Column Name="fields.System.AssignedTo._links.avatar.href" DataType="DT_WSTR" Label="AssignedToLinksAvatarHref" Length="4000" />
<Column Name="fields.System.AssignedTo.id" DataType="DT_WSTR" Label="AssignedToId" Length="500" />
<Column Name="fields.System.AssignedTo.uniqueName" DataType="DT_WSTR" Label="AssignedToUniqueName" Length="500" />
<Column Name="fields.System.AssignedTo.imageUrl" DataType="DT_WSTR" Label="AssignedToImageUrl" Length="2048" />
<Column Name="fields.System.AssignedTo.descriptor" DataType="DT_WSTR" Label="AssignedToDescriptor" Length="2000" />
<Column Name="fields.System.CreatedBy.displayName" DataType="DT_WSTR" Label="CreatedByDisplayName" Length="500" />
<Column Name="fields.System.CreatedBy.url" DataType="DT_WSTR" Label="CreatedByUrl" Length="2048" />
<Column Name="fields.System.CreatedBy._links.avatar.href" DataType="DT_WSTR" Label="CreatedByLinksAvatarHref" Length="2048" />
<Column Name="fields.System.CreatedBy.id" DataType="DT_WSTR" Label="CreatedById" Length="500" />
<Column Name="fields.System.CreatedBy.uniqueName" DataType="DT_WSTR" Label="CreatedByUniqueName" Length="500" />
<Column Name="fields.System.CreatedBy.imageUrl" DataType="DT_WSTR" Label="CreatedByImageUrl" Length="2048" />
<Column Name="fields.System.CreatedBy.descriptor" DataType="DT_WSTR" Label="CreatedByDescriptor" Length="2000" />
<Column Name="fields.System.ChangedBy.displayName" DataType="DT_WSTR" Label="ChangedByDisplayName" Length="500" />
<Column Name="fields.System.ChangedBy.url" DataType="DT_WSTR" Label="ChangedByUrl" Length="2048" />
<Column Name="fields.System.ChangedBy._links.avatar.href" DataType="DT_WSTR" Label="ChangedByLinksAvatarHref" Length="2048" />
<Column Name="fields.System.ChangedBy.id" DataType="DT_WSTR" Label="ChangedById" Length="500" />
<Column Name="fields.System.ChangedBy.uniqueName" DataType="DT_WSTR" Label="ChangedByUniqueName" Length="500" />
<Column Name="fields.System.ChangedBy.imageUrl" DataType="DT_WSTR" Label="ChangedByImageUrl" Length="2048" />
<Column Name="fields.System.ChangedBy.descriptor" DataType="DT_WSTR" Label="ChangedByDescriptor" Length="2000" />
<Column Name="fields.System.Watermark" DataType="DT_WSTR" Label="Watermark" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.StateChangeDate" DataType="DT_DBTIMESTAMP" Label="StateChangeDate" />
<Column Name="fields.Microsoft.VSTS.Common.Priority" DataType="DT_I4" Label="Priority" />
<Column Name="fields.Microsoft.VSTS.Common.Triage" DataType="DT_WSTR" Label="Triage" Length="1000" />
<Column Name="fields.Microsoft.VSTS.Common.StackRank" DataType="DT_I4" Label="StackRank" />
<Column Name="fields.Microsoft.VSTS.CMMI.Blocked" DataType="DT_WSTR" Label="Blocked" Length="500" />
<Column Name="fields.Microsoft.VSTS.CMMI.TaskType" DataType="DT_WSTR" Label="TaskType" Length="500" />
<Column Name="fields.Microsoft.VSTS.CMMI.RequiresReview" DataType="DT_WSTR" Label="RequiresReview" Length="100" />
<Column Name="fields.Microsoft.VSTS.CMMI.RequiresTest" DataType="DT_WSTR" Label="RequiresTest" Length="100" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedDate" DataType="DT_DBTIMESTAMP" Label="ActivatedDate" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy.displayName" DataType="DT_WSTR" Label="ActivatedByDisplayName" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy.url" DataType="DT_WSTR" Label="ActivatedByUrl" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy._links.avatar.href" DataType="DT_WSTR" Label="ActivatedByLinksAvatarHref" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy.id" DataType="DT_WSTR" Label="ActivatedById" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy.uniqueName" DataType="DT_WSTR" Label="ActivatedByUniqueName" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy.imageUrl" DataType="DT_WSTR" Label="ActivatedByImageUrl" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ActivatedBy.descriptor" DataType="DT_WSTR" Label="ActivatedByDescriptor" Length="2000" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedDate" DataType="DT_DBTIMESTAMP" Label="ClosedDate" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy.displayName" DataType="DT_WSTR" Label="ClosedByDisplayName" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy.url" DataType="DT_WSTR" Label="ClosedByUrl" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy._links.avatar.href" DataType="DT_WSTR" Label="ClosedByLinksAvatarHref" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy.id" DataType="DT_WSTR" Label="ClosedById" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy.uniqueName" DataType="DT_WSTR" Label="ClosedByUniqueName" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy.imageUrl" DataType="DT_WSTR" Label="ClosedByImageUrl" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ClosedBy.descriptor" DataType="DT_WSTR" Label="ClosedByDescriptor" Length="2000" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedDate" DataType="DT_DBTIMESTAMP" Label="ResolvedDate" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy.displayName" DataType="DT_WSTR" Label="ResolvedByDisplayName" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy.url" DataType="DT_WSTR" Label="ResolvedByUrl" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy._links.avatar.href" DataType="DT_WSTR" Label="ResolvedByLinksAvatarHref" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy.id" DataType="DT_WSTR" Label="ResolvedById" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy.uniqueName" DataType="DT_WSTR" Label="ResolvedByUniqueName" Length="500" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy.imageUrl" DataType="DT_WSTR" Label="ResolvedByImageUrl" Length="2048" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedBy.descriptor" DataType="DT_WSTR" Label="ResolvedByDescriptor" Length="2000" />
<Column Name="fields.Microsoft.VSTS.Common.ResolvedReason" DataType="DT_WSTR" Label="ResolvedReason" Length="4000" />
<Column Name="fields.System.AreaId" DataType="DT_WSTR" Label="AreaId" Length="500" />
<Column Name="fields.System.IterationId" DataType="DT_WSTR" Label="IterationId" Length="500" />
<Column Name="fields.System.RevisedDate" DataType="DT_DBTIMESTAMP" Label="RevisedDate" />
<Column Name="fields.System.RemoteLinkCount" DataType="DT_I4" Label="RemoteLinkCount" />
<Column Name="fields.System.RelatedLinkCount" DataType="DT_I4" Label="RelatedLinkCount" />
<Column Name="fields.System.HyperLinkCount" DataType="DT_I4" Label="HyperLinkCount" />
<Column Name="fields.System.ExternalLinkCount" DataType="DT_I4" Label="ExternalLinkCount" />
<Column Name="fields.System.History" DataType="DT_NTEXT" Label="History" />
<Column Name="fields.Microsoft.VSTS.Build.IntegrationBuild" DataType="DT_WSTR" Label="IntegrationBuild" Length="500" />
<Column Name="fields.Microsoft.VSTS.Build.FoundIn" DataType="DT_WSTR" Label="FoundIn" Length="500" />
<Column Name="fields.Microsoft.VSTS.Scheduling.OriginalEstimate" DataType="DT_R4" Label="OriginalEstimate" />
<Column Name="fields.Microsoft.VSTS.Scheduling.RemainingWork" DataType="DT_R4" Label="RemainingWork" />
<Column Name="fields.Microsoft.VSTS.Scheduling.CompletedWork" DataType="DT_R4" Label="CompletedWork" />
<Column Name="fields.Microsoft.VSTS.Scheduling.Size" DataType="DT_R4" Label="Size" />
<Column Name="fields.Microsoft.VSTS.Scheduling.Effort" DataType="DT_R4" Label="Effort" />
<Column Name="fields.Microsoft.VSTS.Scheduling.TargetDate" DataType="DT_DBTIMESTAMP" Label="TargetDate" />
<Column Name="fields.Microsoft.VSTS.Scheduling.StoryPoints" DataType="DT_R4" Label="StoryPoints" />
<Column Name="fields.Microsoft.VSTS.Scheduling.StartDate" DataType="DT_DBTIMESTAMP" Label="StartDate" />
<Column Name="fields.Microsoft.VSTS.Scheduling.FinishDate" DataType="DT_DBTIMESTAMP" Label="FinishDate" />
<Column Name="fields.Microsoft.VSTS.Scheduling.DueDate" DataType="DT_DBTIMESTAMP" Label="DueDate" />
<Column Name="fields.Microsoft.VSTS.Common.Discipline" DataType="DT_WSTR" Label="Discipline" Length="500" />
<Column Name="fields.Microsoft.VSTS.TCM.SystemInfo" DataType="DT_NTEXT" Label="SystemInfo" />
<Column Name="fields.Microsoft.VSTS.TCM.Steps" DataType="DT_NTEXT" Label="Steps" />
<Column Name="fields.Microsoft.VSTS.TCM.ReproSteps" DataType="DT_NTEXT" Label="ReproSteps" />
<Column Name="fields.Microsoft.VSTS.Common.Severity" Label="Severity" DataType="DT_WSTR" Length="100"/>
<Column Name="fields.Microsoft.VSTS.CMMI.ProposedFix" Label="ProposedFix" DataType="DT_NTEXT"/>
<Column Name="fields.Microsoft.VSTS.CMMI.Symptom" Label="Symptom" DataType="DT_NTEXT"/>
<Column Name="fields.Microsoft.VSTS.CMMI.RootCause" Label="RootCause" DataType="DT_WSTR" Length="100"/>
<Column Name="fields.Microsoft.VSTS.CMMI.HowFound" Label="HowFound" DataType="DT_WSTR" Length="100"/>
<Column Name="fields.Microsoft.VSTS.CMMI.FoundInEnvironment" Label="FoundInEnvironment" DataType="DT_WSTR" Length="100"/>
<Column Name="fields.Microsoft.VSTS.Common.BusinessValue" DataType="DT_I4" Label="BusinessValue" />
<Column Name="fields.Microsoft.VSTS.Common.ValueArea" DataType="DT_WSTR" Label="ValueArea" Length="100" />
<Column Name="fields.Microsoft.VSTS.Common.TestedBy" DataType="DT_WSTR" Label="TestedBy" Length="500" />
<Column Name="fields.Microsoft.VSTS.TCM.Priority" DataType="DT_I4" Label="TestPriority" />
<Column Name="fields.Microsoft.VSTS.Common.Activity" DataType="DT_WSTR" Label="Activity" Length="100" />
<Column Name="fields.[$parent.referenceName$]" Label="[$parent.referenceName$]" Expand="True"
DataEndPoint="get_query_fields" CachedTtl="60"
DataEndPointParameters="Filter=$.columns[?(@referenceName=~/^Custom./)];Project=[$Project$];Query=SELECT * FROM WorkItems Where [System.Id]=1"
ColumnInfoMap="Name=referenceName"
UseCamelCaseLabel="True"
/>
</OutputColumns>
</EndPoint>
<EndPoint Name="WorkItemWrite">
<Params>
<Param Name="BypassRules" Key="bypassRules" Label="Bypass Rules (useful to set Readonly - e.g. ResolvedBy)" Type="Query" Options="true;false;" Desc="Allows setting read-only/system fields during creation (like CreatedBy, ResolvedBy)." />
<Param Name="SuppressNotifications" Key="suppressNotifications" Label="Suppress email notifications" Type="Query" Options="true;false;" Desc="Suppresses email notifications triggered by the new work item creation" />
<Param Name="ValidateOnly" Key="validateOnly" Type="Query" Options="true;false;" Label="Validate Only (Do not perform actual update/insert)" Desc="Validates the JSON patch without actually creating / updating the work item. Useful for testing templates." />
</Params>
</EndPoint>
<EndPoint Name="WorkItemUpdateColumns" Template="WorkItemWrite">
<InputColumns>
<Column Name="Id" DataType="DT_WSTR" MapToParam="True" Key="True" ExcludeFromRowMap="True"/>
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.WorkItemType" }" Name="System.WorkItemType" DataType="DT_WSTR" Label="WorkItemType" Length="1000" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Title" }" Name="System.Title" DataType="DT_WSTR" Label="Title" Length="1000" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Description" }" Name="System.Description" DataType="DT_NTEXT" Label="Description" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.State" }" Name="System.State" DataType="DT_WSTR" Label="State" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.History" }" Name="System.History" DataType="DT_NTEXT" Label="History" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Tags" }" Name="fields.System.Tags" DataType="DT_WSTR" Label="Tags" Length="4000" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/rev" }" Name="rev" DataType="DT_I4" Label="Revision" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.AreaPath" }" Name="System.AreaPath" DataType="DT_WSTR" Label="AreaPath" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.TeamProject" }" Name="System.TeamProject" DataType="DT_WSTR" Label="TeamProject" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.IterationPath" }" Name="System.IterationPath" DataType="DT_WSTR" Label="IterationPath" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Reason" }" Name="System.Reason" DataType="DT_WSTR" Label="Reason" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.AssignedTo" }" Name="System.AssignedTo" DataType="DT_WSTR" Label="AssignedTo" Length="500"/>
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Priority" }" Name="Microsoft.VSTS.Common.Priority" DataType="DT_I4" Label="Priority" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Triage" }" Name="Microsoft.VSTS.Common.Triage" DataType="DT_WSTR" Label="Triage" Length="1000" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.StackRank" }" Name="Microsoft.VSTS.Common.StackRank" DataType="DT_I4" Label="StackRank" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.Blocked" }" Name="Microsoft.VSTS.CMMI.Blocked" DataType="DT_WSTR" Label="Blocked" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.TaskType" }" Name="Microsoft.VSTS.CMMI.TaskType" DataType="DT_WSTR" Label="TaskType" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.RequiresReview" }" Name="Microsoft.VSTS.CMMI.RequiresReview" DataType="DT_WSTR" Label="RequiresReview" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.RequiresTest" }" Name="Microsoft.VSTS.CMMI.RequiresTest" DataType="DT_WSTR" Label="RequiresTest" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ActivatedDate" }" Name="Microsoft.VSTS.Common.ActivatedDate" DataType="DT_DBTIMESTAMP" Label="ActivatedDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ActivatedBy" }" Name="Microsoft.VSTS.Common.ActivatedBy" DataType="DT_WSTR" Label="ActivatedBy" Length="500"/>
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ClosedDate" }" Name="Microsoft.VSTS.Common.ClosedDate" DataType="DT_DBTIMESTAMP" Label="ClosedDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ClosedBy" }" Name="Microsoft.VSTS.Common.ClosedBy" DataType="DT_WSTR" Label="ClosedBy" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ResolvedDate" }" Name="Microsoft.VSTS.Common.ResolvedDate" DataType="DT_DBTIMESTAMP" Label="ResolvedDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ResolvedReason" }" Name="Microsoft.VSTS.Common.ResolvedReason" DataType="DT_WSTR" Label="ResolvedReason" Length="4000" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ResolvedBy" }" Name="Microsoft.VSTS.Common.ResolvedBy" DataType="DT_WSTR" Label="ResolvedBy" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Build.IntegrationBuild" }" Name="Microsoft.VSTS.Build.IntegrationBuild" DataType="DT_WSTR" Label="IntegrationBuild" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Build.FoundIn" }" Name="Microsoft.VSTS.Build.FoundIn" DataType="DT_WSTR" Label="FoundIn" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.OriginalEstimate" }" Name="Microsoft.VSTS.Scheduling.OriginalEstimate" DataType="DT_R4" Label="OriginalEstimate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.RemainingWork" }" Name="Microsoft.VSTS.Scheduling.RemainingWork" DataType="DT_R4" Label="RemainingWork" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.CompletedWork" }" Name="Microsoft.VSTS.Scheduling.CompletedWork" DataType="DT_R4" Label="CompletedWork" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.Size" }" Name="Microsoft.VSTS.Scheduling.Size" DataType="DT_R4" Label="Size" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.Effort" }" Name="Microsoft.VSTS.Scheduling.Effort" DataType="DT_R4" Label="Effort" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.TargetDate" }" Name="Microsoft.VSTS.Scheduling.TargetDate" DataType="DT_DBTIMESTAMP" Label="TargetDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.StartDate" }" Name="Microsoft.VSTS.Scheduling.StartDate" DataType="DT_DBTIMESTAMP" Label="StartDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.FinishDate" }" Name="Microsoft.VSTS.Scheduling.FinishDate" DataType="DT_DBTIMESTAMP" Label="FinishDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.DueDate" }" Name="Microsoft.VSTS.Scheduling.DueDate" DataType="DT_DBTIMESTAMP" Label="DueDate" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.StoryPoints" }" Name="Microsoft.VSTS.Scheduling.StoryPoints" DataType="DT_R4" Label="StoryPoints" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.Discipline" }" Name="Microsoft.VSTS.Scheduling.Discipline" DataType="DT_WSTR" Label="Discipline" Length="100"/>
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.SystemInfo" }" Name="Microsoft.VSTS.TCM.SystemInfo" DataType="DT_NTEXT" Label="SystemInfo" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.Steps" }" Name="Microsoft.VSTS.TCM.Steps" DataType="DT_NTEXT" Label="Steps" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.ReproSteps" }" Name="Microsoft.VSTS.TCM.ReproSteps" DataType="DT_NTEXT" Label="ReproSteps" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Severity" }" Name="Microsoft.VSTS.Common.Severity" DataType="DT_WSTR" Label="Severity" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.ProposedFix" }" Name="Microsoft.VSTS.CMMI.ProposedFix" DataType="DT_NTEXT" Label="ProposedFix" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.Symptom" }" Name="Microsoft.VSTS.CMMI.Symptom" DataType="DT_NTEXT" Label="Symptom" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.RootCause" }" Name="Microsoft.VSTS.CMMI.RootCause" DataType="DT_WSTR" Label="RootCause" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.HowFound" }" Name="Microsoft.VSTS.CMMI.HowFound" DataType="DT_WSTR" Label="HowFound" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.FoundInEnvironment" }" Name="Microsoft.VSTS.CMMI.FoundInEnvironment" DataType="DT_WSTR" Label="FoundInEnvironment" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.BusinessValue" }" Name="Microsoft.VSTS.Common.BusinessValue" DataType="DT_I4" Label="BusinessValue" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ValueArea" }" Name="Microsoft.VSTS.Common.ValueArea" DataType="DT_WSTR" Label="ValueArea" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.TestedBy" }" Name="Microsoft.VSTS.Common.TestedBy" DataType="DT_WSTR" Label="TestedBy" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.Priority" }" Name="Microsoft.VSTS.TCM.Priority" DataType="DT_I4" Label="TestPriority" />
<Column Raw="True" ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Activity" }" Name="Microsoft.VSTS.Common.Activity" DataType="DT_WSTR" Label="Activity" Length="100" />
<Column Raw="True" Name="[$parent.referenceName$]" Expand="True" DataEndPoint="get_query_fields" CachedTtl="60"
DataEndPointParameters="Filter=$.columns[?(@referenceName=~/^Custom./)];Project=[$Project$];Query=SELECT * FROM WorkItems Where [System.Id]=1"
ColumnInfoMap="Name=referenceName"
ValueTemplate="{ "op": "[$Operation$]", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/[$parent.referenceName$]" }"
UseCamelCaseLabel="True"
/>
</InputColumns>
</EndPoint>
<EndPoint Name="WorkItemAddColumns" Template="WorkItemWrite">
<InputColumns>
<Column Name="WorkItemType" DataType="DT_WSTR" MapToParam="True" ExcludeFromRowMap="True"/>
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.WorkItemType" }" Name="System.WorkItemType" DataType="DT_WSTR" Label="WorkItemType" Length="1000" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Title" }" Name="System.Title" DataType="DT_WSTR" Label="Title" Length="1000" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Description" }" Name="System.Description" DataType="DT_NTEXT" Label="Description" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.State" }" Name="System.State" DataType="DT_WSTR" Label="State" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.History" }" Name="System.History" DataType="DT_NTEXT" Label="History" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Tags" }" Name="fields.System.Tags" DataType="DT_WSTR" Label="Tags" Length="4000" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/rev" }" Name="rev" DataType="DT_I4" Label="Revision" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.AreaPath" }" Name="System.AreaPath" DataType="DT_WSTR" Label="AreaPath" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.TeamProject" }" Name="System.TeamProject" DataType="DT_WSTR" Label="TeamProject" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.IterationPath" }" Name="System.IterationPath" DataType="DT_WSTR" Label="IterationPath" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.Reason" }" Name="System.Reason" DataType="DT_WSTR" Label="Reason" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/System.AssignedTo" }" Name="System.AssignedTo" DataType="DT_WSTR" Label="AssignedTo" Length="500"/>
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Priority" }" Name="Microsoft.VSTS.Common.Priority" DataType="DT_I4" Label="Priority" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Triage" }" Name="Microsoft.VSTS.Common.Triage" DataType="DT_WSTR" Label="Triage" Length="1000" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.StackRank" }" Name="Microsoft.VSTS.Common.StackRank" DataType="DT_I4" Label="StackRank" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.Blocked" }" Name="Microsoft.VSTS.CMMI.Blocked" DataType="DT_WSTR" Label="Blocked" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.TaskType" }" Name="Microsoft.VSTS.CMMI.TaskType" DataType="DT_WSTR" Label="TaskType" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.RequiresReview" }" Name="Microsoft.VSTS.CMMI.RequiresReview" DataType="DT_WSTR" Label="RequiresReview" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.RequiresTest" }" Name="Microsoft.VSTS.CMMI.RequiresTest" DataType="DT_WSTR" Label="RequiresTest" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ActivatedDate" }" Name="Microsoft.VSTS.Common.ActivatedDate" DataType="DT_DBTIMESTAMP" Label="ActivatedDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ActivatedBy" }" Name="Microsoft.VSTS.Common.ActivatedBy" DataType="DT_WSTR" Label="ActivatedBy" Length="500"/>
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ClosedDate" }" Name="Microsoft.VSTS.Common.ClosedDate" DataType="DT_DBTIMESTAMP" Label="ClosedDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ClosedBy" }" Name="Microsoft.VSTS.Common.ClosedBy" DataType="DT_WSTR" Label="ClosedBy" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ResolvedDate" }" Name="Microsoft.VSTS.Common.ResolvedDate" DataType="DT_DBTIMESTAMP" Label="ResolvedDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ResolvedReason" }" Name="Microsoft.VSTS.Common.ResolvedReason" DataType="DT_WSTR" Label="ResolvedReason" Length="4000" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ResolvedBy" }" Name="Microsoft.VSTS.Common.ResolvedBy" DataType="DT_WSTR" Label="ResolvedBy" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Build.IntegrationBuild" }" Name="Microsoft.VSTS.Build.IntegrationBuild" DataType="DT_WSTR" Label="IntegrationBuild" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Build.FoundIn" }" Name="Microsoft.VSTS.Build.FoundIn" DataType="DT_WSTR" Label="FoundIn" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.OriginalEstimate" }" Name="Microsoft.VSTS.Scheduling.OriginalEstimate" DataType="DT_R4" Label="OriginalEstimate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.RemainingWork" }" Name="Microsoft.VSTS.Scheduling.RemainingWork" DataType="DT_R4" Label="RemainingWork" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.CompletedWork" }" Name="Microsoft.VSTS.Scheduling.CompletedWork" DataType="DT_R4" Label="CompletedWork" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.Size" }" Name="Microsoft.VSTS.Scheduling.Size" DataType="DT_R4" Label="Size" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.Effort" }" Name="Microsoft.VSTS.Scheduling.Effort" DataType="DT_R4" Label="Effort" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.TargetDate" }" Name="Microsoft.VSTS.Scheduling.TargetDate" DataType="DT_DBTIMESTAMP" Label="TargetDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.StartDate" }" Name="Microsoft.VSTS.Scheduling.StartDate" DataType="DT_DBTIMESTAMP" Label="StartDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.FinishDate" }" Name="Microsoft.VSTS.Scheduling.FinishDate" DataType="DT_DBTIMESTAMP" Label="FinishDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.DueDate" }" Name="Microsoft.VSTS.Scheduling.DueDate" DataType="DT_DBTIMESTAMP" Label="DueDate" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.StoryPoints" }" Name="Microsoft.VSTS.Scheduling.StoryPoints" DataType="DT_R4" Label="StoryPoints" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Scheduling.Discipline" }" Name="Microsoft.VSTS.Scheduling.Discipline" DataType="DT_WSTR" Label="Discipline" Length="100"/>
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.SystemInfo" }" Name="Microsoft.VSTS.TCM.SystemInfo" DataType="DT_NTEXT" Label="SystemInfo" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.Steps" }" Name="Microsoft.VSTS.TCM.Steps" DataType="DT_NTEXT" Label="Steps" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.ReproSteps" }" Name="Microsoft.VSTS.TCM.ReproSteps" DataType="DT_NTEXT" Label="ReproSteps" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Severity" }" Name="Microsoft.VSTS.Common.Severity" DataType="DT_WSTR" Label="Severity" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.ProposedFix" }" Name="Microsoft.VSTS.CMMI.ProposedFix" DataType="DT_NTEXT" Label="ProposedFix" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.Symptom" }" Name="Microsoft.VSTS.CMMI.Symptom" DataType="DT_NTEXT" Label="Symptom" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.RootCause" }" Name="Microsoft.VSTS.CMMI.RootCause" DataType="DT_WSTR" Label="RootCause" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.HowFound" }" Name="Microsoft.VSTS.CMMI.HowFound" DataType="DT_WSTR" Label="HowFound" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.CMMI.FoundInEnvironment" }" Name="Microsoft.VSTS.CMMI.FoundInEnvironment" DataType="DT_WSTR" Label="FoundInEnvironment" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.BusinessValue" }" Name="Microsoft.VSTS.Common.BusinessValue" DataType="DT_I4" Label="BusinessValue" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.ValueArea" }" Name="Microsoft.VSTS.Common.ValueArea" DataType="DT_WSTR" Label="ValueArea" Length="100" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.TestedBy" }" Name="Microsoft.VSTS.Common.TestedBy" DataType="DT_WSTR" Label="TestedBy" Length="500" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.TCM.Priority" }" Name="Microsoft.VSTS.TCM.Priority" DataType="DT_I4" Label="TestPriority" />
<Column Raw="True" ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/Microsoft.VSTS.Common.Activity" }" Name="Microsoft.VSTS.Common.Activity" DataType="DT_WSTR" Label="Activity" Length="100" />
<Column Raw="True" Name="[$parent.referenceName$]" Expand="True" DataEndPoint="get_query_fields" CachedTtl="60"
DataEndPointParameters="Filter=$.columns[?(@referenceName=~/^Custom./)];Project=[$Project$];Query=SELECT * FROM WorkItems Where [System.Id]=1"
ColumnInfoMap="Name=referenceName"
ValueTemplate="{ "op": "add", "value": "<<{$value$},FUN_JSONENC>>", "path": "/fields/[$parent.referenceName$]" }"
UseCamelCaseLabel="True"
/>
</InputColumns>
</EndPoint>
<EndPoint Name="TextSearchWorkItemOutputColumns">
<OutputColumns>
<Column Name="fields.system.id" DataType="DT_WSTR" Label="Id" Length="50" />
<Column Name="fields.system.title" DataType="DT_WSTR" Label="Title" Length="4000" />
<Column Name="fields.system.workitemtype" DataType="DT_WSTR" Label="WorkItemType" Length="50" />
<Column Name="fields.system.assignedto" DataType="DT_WSTR" Label="AssignedTo" Length="500" />
<Column Name="fields.system.state" DataType="DT_WSTR" Label="State" Length="100" />
<Column Name="fields.system.tags" DataType="DT_WSTR" Label="Tags" Length="500" />
<Column Name="fields.system.rev" DataType="DT_WSTR" Label="Revision" Length="50" />
<Column Name="fields.system.createddate" DataType="DT_DBTIMESTAMP" Label="CreatedDate" />
<Column Name="fields.system.changeddate" DataType="DT_DBTIMESTAMP" Label="ChangedDate" />
<Column Name="project.id" DataType="DT_WSTR" Label="ProjectId" Length="500" />
<Column Name="project.name" DataType="DT_WSTR" Label="ProjectName" Length="500" />
<Column Name="hits" DataType="DT_WSTR" Label="Hits" Length="4000" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="1000" />
</OutputColumns>
</EndPoint>
<EndPoint Name="WorkItemCommentOutputColumns" >
<OutputColumns>
<Column Name="id" Label="Id" DataType="DT_I4" />
<Column Name="workItemId" Label="WorkItemId" DataType="DT_I4" />
<Column Name="text" Label="Text" DataType="DT_NTEXT" />
<Column Name="renderedText" Label="RenderedText" DataType="DT_NTEXT" />
<Column Name="format" Label="Format" DataType="DT_WSTR" />
<Column Name="createdDate" Label="CreatedDate" DataType="DT_DBTIMESTAMP" />
<Column Name="createdBy.uniqueName" Label="CreatedByUniqueName" DataType="DT_WSTR" />
<Column Name="createdBy.id" Label="CreatedById" DataType="DT_WSTR" />
<Column Name="createdBy.displayName" Label="CreatedByDisplayName" DataType="DT_WSTR" />
<Column Name="modifiedDate" Label="ModifiedDate" DataType="DT_DBTIMESTAMP" />
<Column Name="modifiedBy.uniqueName" Label="ModifiedByUniqueName" DataType="DT_WSTR" />
<Column Name="modifiedBy.id" Label="ModifiedById" DataType="DT_WSTR" />
<Column Name="modifiedBy.displayName" Label="ModifiedByDisplayName" DataType="DT_WSTR" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="1000" />
</OutputColumns>
</EndPoint>
<EndPoint Name="QueryWorkItemOutputColumns" Template="WorkItemOutputColumns">
<OutputColumns>
</OutputColumns>
</EndPoint>
<EndPoint Name="TeamPostParamsAndInputColumns">
<Params>
<Param Name="Name" Label="Team Name" Desc="The name of the team." Type="Placeholder" Required="True" />
<Param Name="Description" Label="Team Description" Desc="The description of the team." Type="Placeholder" Required="True" />
</Params>
<InputColumns>
<Column Name="name" Label="Name" Desc="The name of the team." MapToParam="True" DataType="DT_WSTR" Length="200" />
<Column Name="description" Label="Description" Desc="The description of the team." MapToParam="True" DataType="DT_WSTR" Length="500" />
</InputColumns>
</EndPoint>
<EndPoint Name="TeamPutParamsAndInputColumns">
<Params>
<Param Name="Name" Label="Team Name" Desc="The name of the team." Type="Placeholder" />
<Param Name="Description" Label="Team Description" Desc="The description of the team." Type="Placeholder" />
</Params>
<InputColumns>
<Column Name="name" Label="Name" Desc="The name of the team." MapToParam="True" DataType="DT_WSTR" Length="200" />
<Column Name="description" Label="Description" Desc="The description of the team." MapToParam="True" DataType="DT_WSTR" Length="500" />
</InputColumns>
</EndPoint>
<EndPoint Name="TeamOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_WSTR" Label="Id" Length="200" Key="True" />
<Column Name="name" DataType="DT_WSTR" Label="Name" Length="200" />
<Column Name="projectId" DataType="DT_WSTR" Label="ProjectId" Length="200" />
<Column Name="projectName" DataType="DT_WSTR" Label="ProjectName" Length="200" />
<Column Name="url" DataType="DT_WSTR" Label="Url" Length="2048" />
<Column Name="description" DataType="DT_WSTR" Label="Description" Length="4000" />
<Column Name="identityUrl" DataType="DT_WSTR" Label="IdentityUrl" Length="2048" />
</OutputColumns>
</EndPoint>
<EndPoint Name="TeamMemberOutputColumns">
<OutputColumns>
<Column Name="identity.id" Label="Id" Length="200"/>
<Column Name="identity.displayName" Label="DisplayName"/>
<Column Name="identity.uniqueName" Label="UniqueName"/>
<Column Name="identity.url" Label="Url"/>
<Column Name="identity.imageUrl" Label="ImageUrl"/>
<Column Name="identity.inactive" Label="Inactive" DataType="DT_BOOL"/>
<Column Name="isTeamAdmin" Label="IsTeamAdmin" DataType="DT_BOOL"/>
</OutputColumns>
</EndPoint>
<EndPoint Name="AuditRecordOutputColumns">
<OutputColumns>
<Column Name="id" DataType="DT_WSTR" Label="Id" Length="1000" Key="True" />
<Column Name="correlationId" DataType="DT_WSTR" Label="CorrelationId" Length="500" />
<Column Name="activityId" DataType="DT_WSTR" Label="ActivityId" Length="500" />
<Column Name="actorCUID" DataType="DT_WSTR" Label="ActorCUID" Length="500" />
<Column Name="actorUserId" DataType="DT_WSTR" Label="ActorUserId" Length="500" />
<Column Name="authenticationMechanism" DataType="DT_WSTR" Label="AuthenticationMechanism" Length="200" />
<Column Name="timestamp" DataType="DT_DBTIMESTAMP" Label="Timestamp" />
<Column Name="scopeType" DataType="DT_WSTR" Label="ScopeType" Length="200" />
<Column Name="scopeDisplayName" DataType="DT_WSTR" Label="ScopeDisplayName" Length="200" />
<Column Name="scopeId" DataType="DT_WSTR" Label="ScopeId" Length="200" />
<Column Name="ipAddress" DataType="DT_WSTR" Label="IpAddress" Length="200" />
<Column Name="userAgent" DataType="DT_WSTR" Label="UserAgent" Length="2048" />
<Column Name="actionId" DataType="DT_WSTR" Label="ActionId" Length="200" />
<Column Name="data.ProjectId" DataType="DT_WSTR" Label="ProjectId" Length="200" />
<Column Name="data.ProjectName" DataType="DT_WSTR" Label="ProjectName" Length="200" />
<Column Name="data.ProcessTemplate" DataType="DT_WSTR" Label="ProcessTemplate" Length="200" />
<Column Name="data.ProjectVisibility" DataType="DT_WSTR" Label="ProjectVisibility" Length="200" />
<Column Name="data.Filter.StartTime" DataType="DT_DBTIMESTAMP" Label="StartTime" />
<Column Name="data.Filter.EndTime" DataType="DT_DBTIMESTAMP" Label="EndTime" />
<Column Name="data.Filter.ContinuationToken" DataType="DT_WSTR" Label="ContinuationToken" Length="4000" />
<Column Name="data.Filter.BatchSize" DataType="DT_I4" Label="BatchSize" />
<Column Name="data.Filter.HasMore" DataType="DT_WSTR" Label="HasMore" />
<Column Name="data.EventSummary" DataType="DT_WSTR" Label="EventSummary" Length="4000" />
<Column Name="details" DataType="DT_WSTR" Label="Details" Length="4000" />
<Column Name="area" DataType="DT_WSTR" Label="Area" Length="500" />
<Column Name="category" DataType="DT_WSTR" Label="Category" Length="500" />
<Column Name="categoryDisplayName" DataType="DT_WSTR" Label="CategoryDisplayName" Length="500" />
<Column Name="actorDisplayName" DataType="DT_WSTR" Label="ActorDisplayName" Length="500" />
<Column Name="actorImageUrl" DataType="DT_WSTR" Label="ActorImageUrl" Length="2048" />
</OutputColumns>
</EndPoint>
</Template>
<EndPoints>
<!-- Get Query Fields -->
<EndPoint Name="get_query_fields"
Label="Get Query Fileds"
Desc="Gets query fields for work items."
Method="POST"
CachedTtl="60"
Url="/[$Organization$]/[$Project$][$Team$]/_apis/wit/wiql?$top=1"
ContentType="application/json"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/wiql/query-by-wiql?view=azure-devops-rest-7.0">
<Body>
<![CDATA[{ "query": "<<[$Query$],FUN_JSONENC>>" }]]>
</Body>
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Team" Label="Team Id or Name" Type="Placeholder" Desc="Id or name of the team associated with the query." ValueTemplate="/{$value$}"
OptionsEndPointParameters="Project=[$Project$]" />
<Param Name="TimePrecision" Key="timePrecision" Label="Use time precision" Type="Query" Desc="Whether or not to use time precision." Options=";false;true" />
<Param Name="Query" Template="QueryParam" />
<Param Name="Filter" Value="$.columns[*]" Type="Property" Options="All=$.columns[*];Custom Fields=$.columns[?(@referenceName=~ /^Custom./ )];System Fields=$.columns[?(@referenceName=~ /.System/ )]"/>
</Params>
<OutputColumns>
<Column Name="name" Label="Name" />
<Column Name="referenceName" Label="ReferenceName" />
</OutputColumns>
</EndPoint>
<!-- Query Work Items -->
<EndPoint Name="get_workitems_by_query_id"
Label="Get Work Items for Specified Query Id"
Desc="Get work items associated with the specified project, organization and query. (A team can optionally be specified as well.). Read more about this API here https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/wiql/query-by-id?view=azure-devops-rest-7.1"
Method="GET"
Url="/[$Organization$]/[$Project$][$Team$]/_apis/wit/wiql/[$Query$]"
ContentType="application/json"
Filter="$.workItems[*]"
Template="QueryWorkItemOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/wiql/query-by-id?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Query" Label="Query Id" Template="QueryIdParam" />
<Param Name="Team" Label="Team Id or Name" Type="Placeholder" Desc="Id or name of the team associated with the query."
ValueTemplate="/{$value$}" OptionsEndPoint="get_teams"
OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name"
OptionsEndPointParameters="Project=[$Project$]"
/>
<Param Name="TimePrecision" Key="timePrecision" Label="Use time precision" Type="Query" Desc="Whether or not to use time precision." Options=";false;true" />
<Param Name="Expand" Key="$expand" Label="Expand Parameters" Type="Query" Value="Relations"
Desc="The expand parameters for work item attributes. Possible options are 'None', 'Relations', 'Fields', 'Links', and 'All'." Options="None;Relations;Fields;Links;All" />
</Params>
<EndPoint Name="child_get_workitems_by_ids_for_projects"
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems?ids={$rows$}"
ContentType="application/json"
Filter="$.value[*]"
BatchSize="200"
RequestFormat="Csv">
<Params>
<Param Name="Expand" Key="$expand" Type="Query" />
</Params>
<LayoutMap>
<![CDATA[<?xml version="1.0" encoding="utf-8"?>
<settings>
<dataset id="root" readfrominput="True" />
<map name="id" src="id" />
</settings>]]>
</LayoutMap>
</EndPoint>
</EndPoint>
<!-- Query Work Items -->
<EndPoint Name="query_workitems"
Label="Query Work Items"
Desc="Get work items associated with the specified project and organization that are filtered by a Wiql query. (A team can optionally be specified as well.). Read more about this API here https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/wiql/query-by-wiql?view=azure-devops-rest-7.0 and here https://learn.microsoft.com/en-us/azure/devops/boards/queries/query-operators-variables?view=azure-devops"
Method="POST"
Url="/[$Organization$]/[$Project$][$Team$]/_apis/wit/wiql"
ContentType="application/json"
Filter="$.workItems[*]"
IsSqlEndPoint="True"
Template="QueryWorkItemOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">
<Body>
<![CDATA[{ "query": "<<[$Query$],FUN_JSONENC>>" }]]>
</Body>
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Team" Label="Team Id or Name" Type="Placeholder" Desc="Id or name of the team associated with the query."
ValueTemplate="/{$value$}" OptionsEndPoint="get_teams"
OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name"
OptionsEndPointParameters="Project=[$Project$]"
/>
<Param Name="TimePrecision" Key="timePrecision" Label="Use time precision" Type="Query" Desc="Whether or not to use time precision." Options=";false;true" />
<Param Name="Query" Template="QueryParam" IsSqlParameter="True"/>
<Param Name="Expand" Key="$expand" Label="Expand Parameters (Set Blank for fast response)" Type="Query" Value="Relations"
Desc="The expand parameters for work item attributes. Possible options are 'None', 'Relations', 'Fields', 'Links', and 'All'. Set 'Relations' if you need ParentId field." Options="None;Relations;Fields;Links;All" />
</Params>
<EndPoint Name="child_get_workitems_by_ids_for_projects"
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems?ids={$rows$}"
ContentType="application/json"
Filter="$.value[*]"
BatchSize="200"
RequestFormat="Csv">
<Params>
<Param Name="Expand" Key="$expand" Type="Query" />
</Params>
<LayoutMap>
<![CDATA[<?xml version="1.0" encoding="utf-8"?>
<settings>
<dataset id="root" readfrominput="True" />
<map name="id" src="id" />
</settings>]]>
</LayoutMap>
</EndPoint>
</EndPoint>
<!-- Query Work Items -->
<EndPoint Name="query_workitem_comments"
Label="Query Work Item Comments"
Desc="Get work item comments associated with the specified project and organization that are filtered by a Wiql query. (A team can optionally be specified as well.). Read more about this API here https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/wiql/query-by-wiql?view=azure-devops-rest-7.0 and here https://learn.microsoft.com/en-us/azure/devops/boards/queries/query-operators-variables?view=azure-devops"
Method="POST"
Url="/[$Organization$]/[$Project$][$Team$]/_apis/wit/wiql"
ContentType="application/json"
Filter="$.workItems[*]"
Template="WorkItemCommentOutputColumns,Paginated"
HelpLink="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">
<Body>
<![CDATA[{ "query": "<<[$Query$],FUN_JSONENC>>" }]]>
</Body>
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Team" Label="Team Id or Name" Type="Placeholder" Desc="Id or name of the team associated with the query."
ValueTemplate="/{$value$}" OptionsEndPoint="get_teams"
OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name"
OptionsEndPointParameters="Project=[$Project$]"
/>
<Param Name="TimePrecision" Key="timePrecision" Label="Use time precision" Type="Query" Desc="Whether or not to use time precision." Options=";false;true" />
<Param Name="Query" Template="QueryParam" />
</Params>
<EndPoint Name="child_get_workitem_comments"
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$parent.id$]/comments"
ContentType="application/json"
Filter="$.comments[*]"
BatchSize="1"
>
<Params>
<Param Name="api-version" Type="Query" Value="7.0-preview" Desc="For this API you must set 7.0-preview for now"/>
</Params>
</EndPoint>
</EndPoint>
<EndPoint Name="get_workitem_comments"
Label="Get Work Item Comments (by WorkItem Id)"
Desc="Get work item comments associated with WorkItem Id "
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$WorkItemId$]/comments"
ContentType="application/json"
Filter="$.comments[*]"
Template="WorkItemCommentOutputColumns,Paginated"
HelpLink="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">
<Params>
<Param Name="WorkItemId" Desc="WorkItem Id for which you like to get comments" Required="True" IsKey="True"/>
<Param Name="Project" Template="ProjectParam" />
<Param Name="api-version" Type="Query" Value="7.0-preview" Desc="For this API you must set 7.0-preview for now"/>
</Params>
</EndPoint>
<EndPoint Name="get_workitem_comment"
Label="Get Work Item Comment by Comment Id and Work Item Id"
Desc="Get work item comment by its Comment Id (for specific WorkItem Id)"
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$WorkItemId$]/comments/[$Id$]"
ContentType="application/json"
Template="WorkItemCommentOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/comments/get?tabs=HTTP">
<Params>
<Param Name="Id" Desc="Comment Id" Required="True" IsKey="True"/>
<Param Name="WorkItemId" Desc="WorkItem Id for which you like to get comments" Required="True" IsKey="True"/>
<Param Name="Project" Template="ProjectParam" />
<Param Name="api-version" Type="Query" Value="7.0-preview" Desc="For this API you must set 7.0-preview for now"/>
</Params>
</EndPoint>
<EndPoint Name="add_workitem_comment"
Label="Create Work Item Comment"
Desc="Creates work item comment for a specific WorkItem Id"
Method="POST"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$WorkItemId$]/comments/[$Id$]"
ContentType="application/json"
Template="WorkItemCommentOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/comments/add?tabs=HTTP"
>
<Body>
<![CDATA[
{
"text": "[$Text$]"
}
]]>
</Body>
<Params>
<Param Name="Id" Desc="Comment Id" Required="True" IsKey="True"/>
<Param Name="WorkItemId" Desc="WorkItem Id for which you like to get comments" Required="True" IsKey="True"/>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Text" Label="Comment Text" Functions="JSONENC" />
<Param Name="api-version" Type="Query" Value="7.0-preview" Desc="For this API you must set 7.0-preview for now"/>
</Params>
<InputColumns>
<Column Name="WorkItemId" MapToParam="True" DataType="DT_I4" />
<Column Name="Text" MapToParam="True" DataType="DT_NTEXT" />
</InputColumns>
</EndPoint>
<EndPoint Name="update_workitem_comment"
Label="Update Work Item Comment"
Desc="Update work item comment for a specific Work Item Id and Comment Id"
Method="PATCH"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$WorkItemId$]/comments/[$Id$]"
ContentType="application/json"
Template="WorkItemCommentOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/comments/update?tabs=HTTP"
>
<Body>
<![CDATA[
{
"text": "<<[$Text$],FUN_JSONENC>>"
}
]]>
</Body>
<Params>
<Param Name="Id" Desc="Comment Id" Required="True" IsKey="True"/>
<Param Name="WorkItemId" Desc="WorkItem Id for which you like to get comments" Required="True" IsKey="True"/>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Text" Label="Comment Text" Functions="JSONENC" />
<Param Name="api-version" Type="Query" Value="7.0-preview" Desc="For this API you must set 7.0-preview for now"/>
</Params>
<InputColumns>
<Column Name="WorkItemId" MapToParam="True" DataType="DT_I4" Key="True" />
<Column Name="Id" MapToParam="True" DataType="DT_I4" Key="True" />
<Column Name="Text" MapToParam="True" DataType="DT_NTEXT" />
</InputColumns>
</EndPoint>
<EndPoint Name="delete_workitem_comment"
Label="Delete Work Item Comment"
Desc="Delete work item comment for a specific Work Item Id and Comment Id"
Method="DELETE"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$WorkItemId$]/comments/[$Id$]"
ContentType="application/json"
OutputHeaders="StatusCode"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/comments/delete?tabs=HTTP"
>
<Params>
<Param Name="Id" Desc="Comment Id" Required="True" IsKey="True"/>
<Param Name="WorkItemId" Desc="WorkItem Id for which you like to get comments" Required="True" IsKey="True"/>
<Param Name="Project" Template="ProjectParam" />
<Param Name="api-version" Type="Query" Value="7.0-preview" Desc="For this API you must set 7.0-preview for now"/>
<Param Name="RawOutputDataRowTemplate" Value="{}" ValueTemplate="{Status:'Deleted', Id:'[$Id$]', WorkItemId: [$WorkItemId$]}" Type="Property" />
<Param Name="EnableRawOutputModeSingleRow" Value="True" Type="Property" />
<Param Name="ContineOnErrorForStatusCode" Value="True" Type="Property" />
<Param Name="ErrorStatusCodeToMatchRegex" Value="404|405" Type="Property" />
</Params>
<InputColumns>
<Column Name="WorkItemId" MapToParam="True" DataType="DT_I4" Key="True" />
<Column Name="Id" MapToParam="True" DataType="DT_I4" Key="True" />
</InputColumns>
<OutputColumns>
<Column Name="Id" DataType="DT_I4" />
<Column Name="WorkItemId" DataType="DT_I4" />
<Column Name="Status" />
<Column Name="ResponseHeaders_StatusCode" Label="StatusCode" DataType="DT_I4" />
</OutputColumns>
</EndPoint>
<!-- Get Work Item Column Fields -->
<EndPoint Name="get_workitem_fields"
Label="Get Work Item Column Fields"
Desc="Get work item column fields in the default project within the organization. Read more about description on each field here https://learn.microsoft.com/en-us/azure/devops/boards/work-items/guidance/work-item-field?view=azure-devops"
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/fields"
ContentType="application/json"
Filter="$.value[*]"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/fields/list?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Expand" Key="$expand" Label="Expand Parameters" Type="Query" Desc="The expand parameters for work item attributes. Possible options are 'None', 'Relations', 'Fields', 'Links', and 'All'." Options="None;Relations;Fields;Links;All" />
</Params>
</EndPoint>
<!-- Get Work Items by Ids -->
<EndPoint Name="get_workitems_by_ids"
Label="Get Work Items by Ids"
Desc="Get work items in the default project within the organization by their work item Ids."
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems"
ContentType="application/json"
Filter="$.value[*]"
BatchSize="200"
Template="WorkItemOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-items/list?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Ids" Key="ids" ReadAs="Id" IsKey="True" Label="Work Item Id List (comma separated)"
Type="Query" Desc="The comma-separated list of requested work item ids. (Maximum 200 ids allowed)." />
<Param Name="AsOf" Key="asOf" Label="As-Of Date" Type="Query" Desc="AsOf UTC date time string." />
<Param Name="Expand" Key="$expand" Label="Expand Parameters (Set Blank for fast response)" Type="Query" Value="Relations"
Desc="The expand parameters for work item attributes. Possible options are 'None', 'Relations', 'Fields', 'Links', and 'All'. Set 'Relations' if you need ParentId field." Options="None;Relations;Fields;Links;All" />
<Param Name="ErrorPolicy" Key="errorPolicy" Label="Error Policy" Type="Query" Desc="The flag to control error policy in a bulk get work items request. Possible options are 'Fail' and 'Omit'." Options="Fail;Omit" />
<Param Name="Fields" Key="fields" Label="Fields" Type="Query" Desc="Comma-separated list of requested fields." MultiSelect="True" MultiSelectSeparator="," OptionsEndPoint="get_workitem_fields" OptionsEndPointValueColumn="referenceName" OptionsEndPointLabelColumn="name" />
<Param Name="ContineOn404Error" Label="Continue processing on 404 error" Type="Property" Value="True" Hidden="False" />
</Params>
</EndPoint>
<!-- Get Work Item Types -->
<EndPoint Name="get_workitemtypes"
Label="Get Work Item Types"
Desc="Get work item types in the default project within the organization."
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitemtypes"
Filter="$.value[*]"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-item-types/list?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
</Params>
<OutputColumns>
<Column Name="name" Label="Name" />
<Column Name="referenceName" Label="ReferenceName" />
<Column Name="description" Label="Description" />
<Column Name="isDisabled" Label="IsDisabled" />
<Column Name="url" Label="Url" />
<Column Name="color" Label="Color" />
<Column Name="fields" Label="Fields" Length="4000" />
</OutputColumns>
</EndPoint>
<!-- Create Work Item -->
<EndPoint Name="add_workitem"
Label="Create Work Item"
Desc="Creates a new work item in the default project within the organization."
Method="POST"
Body="{$rows$}"
Headers="Content-Type: application/json-patch+json"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/$[$WorkItemType$]"
BatchSize="1"
JsonRowFormat="ArrayLines"
Template="WorkItemAddColumns,WorkItemOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-items/create?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="WorkItemType" Required="True" OptionsEndPoint="get_workitemtypes" OptionsEndPointValueColumn="Name" />
</Params>
</EndPoint>
<!-- Update Work Item -->
<EndPoint Name="update_workitem"
Label="Update Work Item"
Desc="Updates an existing work item in the default project within the organization."
Method="PATCH"
Body="{$rows$}"
Headers="Content-Type: application/json-patch+json"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$Id$]"
BatchSize="1"
JsonRowFormat="ArrayLines"
Template="WorkItemUpdateColumns,WorkItemOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-items/update?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Id" IsKey="True" Label="Work Item Id" />
<Param Name="ContineOn404Error" Label="Continue processing on 404 error" Type="Property" Value="True" Hidden="False" />
<Param Name="Operation" Value="replace" Options="replace;add;remove;copy;move;test;" Desc="Some operation requires you to supply 'add' rather than 'replace' (e.g. adding new tag)" />
</Params>
</EndPoint>
<!-- Delete Work Item -->
<EndPoint Name="delete_workitem"
Label="Delete Work Item"
Desc="Deletes an existing work item in the default project within the organization."
Method="DELETE"
Url="/[$Organization$]/[$Project$]/_apis/wit/workitems/[$Id$]"
BatchSize="1"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-items/delete?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Id" IsKey="True" Label="Work Item Id" />
<Param Name="ContineOn404Error" Label="Continue processing on 404 error" Type="Property" Value="True" Hidden="False" />
</Params>
<InputColumns>
<Column Name="Id" MapToParam="True" Key="True" />
</InputColumns>
<OutputColumns>
<Column Name="id" Label="Id" DataType="DT_I4" Key="True" />
<Column Name="project" Label="project" />
<Column Name="name" Label="Title"/>
<Column Name="type" Label="WorkItemType"/>
<Column Name="deletedBy" Label="DeletedBy"/>
<Column Name="deletedDate" Label="DeletedDate"/>
</OutputColumns>
</EndPoint>
<!-- Get List of Projects -->
<EndPoint Name="get_queries"
Label="Get List of Queries"
Desc="Gets a list of predefined queries within the organization."
Method="GET"
Url="/[$Organization$]/[$Project$]/_apis/wit/queries?api-version=7.1-preview.2"
ContentType="application/json"
Filter="$..children[*]"
Template="QueryOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/queries/list?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" Template="ProjectParam" />
<Param Name="Depth" Key="$depth" Label="Max Depth (items inside nested folders)" Type="Query" Value="2" Hidden="True" />
</Params>
</EndPoint>
<!-- Get List of Projects -->
<EndPoint Name="get_projects"
Label="Get List of Projects"
Desc="Gets a list of projects within the organization."
Method="GET"
Url="/[$Organization$]/_apis/projects"
ContentType="application/json"
Filter="$.value[*]"
Template="ProjectOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/list?view=azure-devops-rest-7.0">
</EndPoint>
<!-- Get Project Details -->
<EndPoint Name="get_project"
Label="Get Project Details"
Desc="Gets the details of the specified project within the organization by its project Id."
Method="GET"
Url="/[$Organization$]/_apis/projects/[$Id$]"
ContentType="application/json"
Template="ProjectOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/get?view=azure-devops-rest-7.0">
<Params>
<Param Name="Id" IsKey="True" Required="True" Type="Placeholder" Desc="" OptionsEndPoint="get_projects" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" />
</Params>
<InputColumns>
<Column Name="Id" Key="True" Label="Project Id" MapToParam="True" Desc="" DataType="DT_WSTR" Length="300" />
</InputColumns>
</EndPoint>
<!-- Create Project -->
<EndPoint Name="add_project"
Label="Create Project"
Desc="Create a new project within the organization."
Method="POST"
Url="/[$Organization$]/_apis/projects"
ContentType="application/json"
JsonRowFormat="Multicontent"
Body="{$rows$}"
Template="ProjectPostParamsAndInputColumns,OperationReferenceOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/create?view=azure-devops-rest-7.0">
<LayoutMap>
<![CDATA[<?xml version="1.0" encoding="utf-8"?>
<settings ver="3" singledataset="True">
<dataset id="root" main="True" readfrominput="True"></dataset>
<map src="Name" name="name" />
<map src="Abbreviation" name="abbreviation" />
<map src="Description" name="description" />
<map name="capabilities">
<map name="versioncontrol">
<map src="SourceControlType" name="sourceControlType" />
</map>
<map name="processTemplate">
<map src="TemplateTypeId" name="templateTypeId" />
</map>
</map>
<map src="Visibility" name="visibility" />
</settings>]]>
</LayoutMap>
</EndPoint>
<!-- Update Project -->
<EndPoint Name="update_project"
Label="Update Project"
Desc="Update an existing project within the organization."
Method="PATCH"
Url="/[$Organization$]/_apis/projects/[$Id$]"
ContentType="application/json"
JsonRowFormat="Multicontent"
Body="{$rows$}"
Template="ProjectPutParamsAndInputColumns,OperationReferenceOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/update?view=azure-devops-rest-7.0">
<Params>
<Param Name="Id" IsKey="True" Label="Project Id" Type="Placeholder" Desc="The ID of the project to update." OptionsEndPoint="get_projects" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" />
</Params>
<InputColumns>
<Column Name="Id" MapToParam="True" Key="True" DataType="DT_WSTR" Length="200" ExcludeFromRowMap="True" Desc="The ID of the project to update." Required="True" />
</InputColumns>
</EndPoint>
<!-- Delete Project -->
<EndPoint Name="delete_project"
Label="Delete Project"
Desc="Delete an existing project within the organization."
Method="DELETE"
Url="/[$Organization$]/_apis/projects/[$Id$]"
ContentType="application/json"
Template="OperationReferenceOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/delete?view=azure-devops-rest-7.0">
<Params>
<Param Name="Id" IsKey="True" Label="Project Id" Type="Placeholder" Desc="The ID of the project to delete." OptionsEndPoint="get_projects" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" />
</Params>
<InputColumns>
<Column Name="Id" MapToParam="True" Key="True" DataType="DT_WSTR" Length="200" ExcludeFromRowMap="True" Desc="The ID of the project to delete." Required="True" />
</InputColumns>
</EndPoint>
<!-- Get List of Teams -->
<EndPoint Name="get_teams"
Label="Get List of Teams"
Desc="Gets a list of teams in the default project within the organization."
Method="GET"
Filter="$.value[*]"
Url="/[$Organization$]/_apis/projects/[$Project$]/teams"
ContentType="application/json"
Template="TeamOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/get-teams?view=azure-devops-rest-7.1">
<Params>
<Param Name="Project" IsKey="True" Template="ProjectParam" />
</Params>
</EndPoint>
<!-- Get Team Details -->
<EndPoint Name="get_team"
Label="Get Team Details"
Desc="Gets the details of the specified team in the default project within the organization by its team Id or team name."
Method="GET"
Url="/[$Organization$]/_apis/projects/[$Project$]/teams/[$Id$]"
ContentType="application/json"
Template="TeamOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/get?view=azure-devops-rest-7.1">
<Params>
<!-- We had to override the API version for this endpoint since 7.0 (that is not preview) does not yet work with this endpoint -->
<Param Name="ApiVersion" Key="api-version" Label="API Version" Value="7.0-preview" Options="7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="Id" Label="Team Id or Name" IsKey="True" OptionsEndPoint="get_teams" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" />
<Param Name="Project" Template="ProjectParam" />
</Params>
<InputColumns>
<Column Name="Id" Key="True" MapToParam="True" DataType="DT_WSTR" Length="300" />
</InputColumns>
</EndPoint>
<!-- Create Team -->
<EndPoint Name="add_team"
Label="Create Team"
Desc="Creates a new team in the default project within the organization."
Method="POST"
Body="{$rows$}"
JsonRowFormat="Multicontent"
Url="/[$Organization$]/_apis/projects/[$Project$]/teams"
ContentType="application/json"
Template="TeamPostParamsAndInputColumns,OperationReferenceOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/create?view=azure-devops-rest-7.0">
</EndPoint>
<!-- Update Team -->
<EndPoint Name="update_team"
Label="Update Team"
Desc="Updates the details of the specified team in the default project within the organization by its team Id."
Method="PATCH"
Url="/[$Organization$]/_apis/projects/[$Project$]/teams/[$Id$]"
ContentType="application/json"
JsonRowFormat="Multicontent"
Body="{$rows$}"
Template="TeamPutParamsAndInputColumns,TeamOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/update?view=azure-devops-rest-7.0">
<LayoutMap>
<![CDATA[<?xml version="1.0" encoding="utf-8"?>
<settings ver="3" singledataset="True">
<dataset id="root" main="True" readfrominput="True"></dataset>
<map src="Name" name="name" />
<map src="Description" name="description" />
</settings>]]>
</LayoutMap>
<Params>
<!-- We had to override the API version for this endpoint since 7.0 (that is not preview) does not yet work with this endpoint -->
<Param Name="ApiVersion" Key="api-version" Label="API Version" Value="7.0-preview" Options="7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="Id" Label="Team Id" IsKey="True" OptionsEndPoint="get_teams" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" />
</Params>
<InputColumns>
<Column Name="Id" Key="True" MapToParam="True" DataType="DT_WSTR" Length="300" />
</InputColumns>
</EndPoint>
<!-- Delete Team -->
<EndPoint Name="delete_team"
Label="Delete Team"
Desc="Deletes the specified team in the default project within the organization by its team Id."
Method="GET"
Url="/[$Organization$]/_apis/projects"
ContentType="application/json"
Filter="$.value[*]"
Template="TeamOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/delete?view=azure-devops-rest-7.0">
<Params>
<!-- We had to override the API version for this endpoint since 7.0 (that is not preview) does not yet work with this endpoint -->
<Param Name="ApiVersion" Key="api-version" Label="API Version" Value="7.0-preview" Options="7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="Id" IsKey="True" Label="Team Id" Desc="The ID of the team to delete." OptionsEndPoint="get_teams" OptionsEndPointValueColumn="id" OptionsEndPointLabelColumn="name" Required="True" />
</Params>
<InputColumns>
<Column Name="Id" MapToParam="True" Key="True" DataType="DT_WSTR" Length="200" ExcludeFromRowMap="True" Desc="The ID of the team to delete." Required="True" />
</InputColumns>
<EndPoint Name="delete_team_for_projects"
Method="DELETE"
Url="/[$Organization$]/_apis/projects/[$parent.id$]/teams/[$Id$]"
ContentType="application/json"
Template="OperationReferenceOutputColumns">
</EndPoint>
</EndPoint>
<!-- Get List of Audit Records -->
<EndPoint_unused Name="get_audit_records"
Label="Get List of Audit Records"
Desc="Gets the audit records for the organization."
Method="GET"
Url="https://auditservice.dev.azure.com/[$Organization$]/_apis/audit/auditlog"
ContentType="application/json"
Filter="$.value.decoratedAuditLogEntries[*]"
Template="AuditRecordOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/audit/audit-log/query?view=azure-devops-rest-7.0">
<Params>
<Param Name="startTime" Label="Start Time" Desc="Start time of download window." Type="Query" Template="DateSelectionParam" />
<Param Name="endTime" Label="End Time" Desc="End time of download window." Type="Query" Template="DateSelectionParam" />
<Param Name="skipAggregation" Label="Skip Aggregation" Desc="Skips aggregating events and leaves them as individual entries instead. By default events are aggregated. Event types that are aggregated: AuditLog.AccessLog." Value="false" Options="true;false" Type="Query" />
<Param Name="batchSize" Label="Batch Size" Desc="Max number of results to return." Value="1000" Type="Query" Hidden="True" />
</Params>
</EndPoint_unused>
<!-- Search for Work Items by Text -->
<EndPoint Name="search_workitems_by_text"
Label="Search for Work Items by Text"
Desc="Search for specific text within work items in the default project of the organization."
Method="POST"
Url="https://almsearch.dev.azure.com/[$Organization$]/[$Project$]/_apis/search/workitemsearchresults"
DotAsPath="True"
JsonRowFormat="Multicontent"
ContentType="application/json"
Filter="$.results[*]"
Template="TextSearchWorkItemOutputColumns"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/search/work-item-search-results/fetch-work-item-search-results?view=azure-devops-rest-7.0">
<Params>
<Param Name="SearchText" Label="Text to Search For" Type="Placeholder" Required="True" Function="JSONENC"/>
</Params>
<Body>
<![CDATA[{
"searchText": "[$SearchText$]",
"$top": 1000
}]]>
</Body>
</EndPoint>
<EndPoint Name="get_team_members"
Label="Get Team Members"
Desc="Lists all members part of a specified Team in the project within the organization (by team Id or team name)."
Method="GET"
Url="/[$Organization$]/_apis/projects/[$Project$]/teams/[$Team$]/members"
ContentType="application/json"
Template="TeamMemberOutputColumns"
Filter="$.value[*]"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/get-team-members-with-extended-properties?view=azure-devops-rest-6.0">
<Params>
<!-- We had to override the API version for this endpoint since 7.0 (that is not preview) does not yet work with this endpoint -->
<Param Name="ApiVersion" Key="api-version" Label="API Version" Value="7.0-preview" Options="7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="Project" Template="ProjectParam" />
<Param Name="Team" Template="TeamParam" />
</Params>
</EndPoint>
<EndPoint Name="get_team_iterations"
Label="Get Team Iterations"
Desc="Lists Team iterations for a specified project / team."
Method="GET"
Filter="$.value[*]"
Template="IterationOutputColumns"
Url="/[$Organization$]/[$Project$]/[$Team$]/_apis/work/teamsettings/iterations"
ContentType="application/json"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/work/iterations/list?view=azure-devops-rest-6.0">
<Params>
<!-- We had to override the API version for this endpoint since 7.0 (that is not preview) does not yet work with this endpoint -->
<Param Name="ApiVersion" Key="api-version" Label="API Version" Value="7.0-preview" Options="7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
<Param Name="Project" Template="ProjectParam" Required="True"/>
<Param Name="Team" Template="TeamParam" Required="True"/>
</Params>
</EndPoint>
<EndPoint Name="get_team_iteration_capacities"
Label="Get Team Iteration Capacities"
Desc="Lists capacity for all team members in a specified project / team / iteration."
Method="GET"
IncludeParentColumns="True"
Filter="$.teamMembers[*].activities[*]"
Url="/[$Organization$]/[$Project$]/[$Team$]/_apis/work/teamsettings/iterations/[$Iteration$]/capacities"
ContentType="application/json"
HelpLink="https://learn.microsoft.com/en-us/rest/api/azure/devops/work/capacities/replace-capacities-with-identity-ref?view=azure-devops-rest-6.0">
<Params>
<!-- We had to override the API version for this endpoint since 7.0 (that is not preview) does not yet work with this endpoint -->
<Param Name="Project" Template="ProjectParam" Required="True"/>
<Param Name="Team" Template="TeamParam" Required="True"/>
<Param Name="Iteration" Template="IterationParam" Required="True" />
<Param Name="ApiVersion" Key="api-version" Label="API Version" Value="7.0-preview" Options="7.0-preview;7.1-preview.2;" Type="Query" Required="True" Hidden="True" />
</Params>
<OutputColumns>
<Column Name="P_teamMembers_teamMember_displayName" DataType="DT_WSTR" Label="TeamMemberDisplayName" Length="500" />
<Column Name="P_teamMembers_teamMember_uniqueName" DataType="DT_WSTR" Label="TeamMemberUniqueName" Length="500" />
<Column Name="P_totalCapacityPerDay" DataType="DT_R4" Label="TeamCapacityPerDay" />
<Column Name="capacityPerDay" DataType="DT_R4" Label="MemberCapacityPerDay" />
<Column Name="P_totalDaysOff" DataType="DT_R4" Label="TotalDaysOff" />
<Column Name="P_teamMembers_teamMember_url" DataType="DT_WSTR" Label="TeamMemberUrl" Length="1350" />
<Column Name="P_teamMembers_teamMember__links_avatar_href" DataType="DT_WSTR" Label="TeamMemberLinksAvatarHref" Length="1160" />
<Column Name="P_teamMembers_teamMember_id" DataType="DT_WSTR" Label="TeamMemberId" Length="500" />
<Column Name="P_teamMembers_teamMember_imageUrl" DataType="DT_WSTR" Label="TeamMemberImageUrl" Length="1160" />
<Column Name="P_teamMembers_teamMember_descriptor" DataType="DT_WSTR" Label="TeamMemberDescriptor" Length="1000" />
<Column Name="P_teamMembers_url" DataType="DT_WSTR" Label="TeamMembersUrl" Length="4000" />
<Column Name="name" DataType="DT_WSTR" Label="Name" Length="500" />
</OutputColumns>
</EndPoint>
</EndPoints>
<Tables>
<Table Name="WorkItems"
SelectEndPoint="query_workitems"
LookupEndPoint="get_workitems_by_ids"
InsertEndPoint="add_workitem"
UpdateEndPoint="update_workitem"
DeleteEndPoint="delete_workitem"
>
<Params>
<Param Name="Query" Label="Wiql Query" Value="SELECT * FROM WorkItems Where [System.TeamProject]='{$Project$}' ORDER BY [System.Id] DESC"
Desc="The text of the WIQL query." Required="True" Functions="JSONENC" />
</Params>
</Table>
<Table Name="WorkItemComments"
SelectEndPoint="query_workitem_comments"
LookupEndPoint="get_workitem_comments,get_workitem_comment"
InsertEndPoint="add_workitem_comment"
UpdateEndPoint="update_workitem_comment"
DeleteEndPoint="delete_workitem_comment"
>
<Params>
<Param Name="Query" Label="Wiql Query" Value="SELECT * FROM WorkItems Where [System.TeamProject]='{$Project$}' ORDER BY [System.Id] DESC"
Desc="The text of the WIQL query." Required="True" Functions="JSONENC" />
</Params>
</Table>
<Table Name="Projects"
SelectEndPoint="get_projects"
LookupEndPoint="get_project"
InsertEndPoint="add_project"
UpdateEndPoint="update_project"
DeleteEndPoint="delete_project"
/>
<Table Name="Teams"
SelectEndPoint="get_teams"
LookupEndPoint="get_team"
InsertEndPoint="add_team"
UpdateEndPoint="update_team"
DeleteEndPoint="delete_team"
/>
</Tables>
<Examples>
<Example Group="ODBC" Slug="list-work-items-default-project" Default="True" Label="List work items (default project)">
<Desc><![CDATA[<p>Returns work items from the default project specified in the connection (or the project you set in the WITH clause). Use this as the baseline list; you can filter by ID, state, or other columns in the WHERE clause, or pass a WIQL query in WITH to filter on the server.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-work-items-for-project" Label="List work items for a project">
<Desc><![CDATA[<p>Lists work items for a specific project by supplying the project name in the WITH clause. Use this when your connection default is one project but you need to query another. You can combine with a WHERE clause or a WIQL query in WITH to narrow results.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems WITH (Project='ProductTesting')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-work-items-with-parentid" Label="List work items with ParentId">
<Desc><![CDATA[<p>By default, relation fields such as ParentId are not returned so that list queries stay fast. When you need parent-child or other link information, set <code>Expand='Relations'</code> in the WITH clause. The result set will then include ParentId and other relation columns so you can join or filter by hierarchy.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems WITH(Expand='Relations')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-work-item-by-id" Label="Get work item by ID">
<Desc><![CDATA[<p>Returns a single work item by its numeric ID. Use the default project from the connection or ensure the work item exists in that project. Filter in a WHERE clause when you need one specific item for detail view or downstream logic.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems WHERE Id=1001]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-work-items-by-ids-commaseparated" Label="Get work items by IDs (comma-separated)">
<Desc><![CDATA[<p>Returns multiple work items in one request by passing a comma-separated list of IDs in the WITH clause. Useful when you have a fixed set of IDs (e.g. from a report or link) and want to load full details without running a WIQL query. The result set includes all columns for each work item.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM get_workitems_by_ids WITH (ids='6444,5578,9467')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="search-work-items-by-text" Label="Search work items by text">
<Desc><![CDATA[<p>Searches for work items that contain the given text in title, description, or other searchable fields. Supply the search phrase in the WITH clause. Use this for ad-hoc lookup when you know a keyword but not the work item ID. Results depend on the project and search indexing.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM search_workitems_by_text WITH (SearchText='Text that I want to search for')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-work-item-by-id-fail-on-404" Label="Get work item by ID (fail on 404)">
<Desc><![CDATA[<p>Same as getting a work item by ID, but the request fails immediately with an error if the work item is not found (404) instead of continuing. Use this when a missing work item should stop the process (e.g. in a script that expects the item to exist). By default the driver can continue on 404; set the option to False to get strict behavior.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems WHERE Id='8563' WITH (ContineOn404Error='False')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-items-by-wiql-filters-and-date-range" Label="Query work items by WIQL (filters and date range)">
<Desc><![CDATA[<p>Use a WIQL (Work Item Query Language) query to filter work items by project, ID range, changed/created dates, work item type, state, priority, and more. The query runs on the server and returns only matching rows. This example shows typical filters: project, ID range, date variables like @Today and @StartOfYear, and ordering by changed date.</p><p>For full syntax and operators, see <a href="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">WIQL syntax</a> and <a href="https://learn.microsoft.com/en-us/azure/devops/boards/queries/query-operators-variables?view=azure-devops">query operators and variables</a>.</p>]]></Desc>
<Code>
<![CDATA[
SELECT * FROM WorkItems WITH (Query='SELECT * FROM WorkItems
WHERE [System.Id] > 2000 AND [System.Id] < 7050
AND [System.TeamProject]=''ProductTesting''
AND [System.ChangedDate] < @Today
AND [System.CreatedDate] > @StartOfYear
AND [System.WorkItemType]=''Task''
AND [System.State]=''Resolved''
AND [Microsoft.VSTS.Common.Priority] >= 1
ORDER BY [System.ChangedDate] DESC
')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-items-modified-after-date-dynamic" Label="Query work items modified after a date (dynamic)">
<Desc><![CDATA[<p>Use placeholder functions (e.g. monthstart, today, yearend) and arithmetic (e.g. monthstart-1d) to build dynamic dates in your WIQL query so the same statement always reflects the intended period without manual date changes. The placeholder is evaluated before the query is sent to Azure DevOps.</p><p>For placeholder syntax and options see <a href="https://zappysys.com/links/?id=10014">placeholder functions</a>. For WIQL see <a href="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">WIQL syntax</a>.</p>]]></Desc>
<Code>
<![CDATA[
SELECT * FROM WorkItems WITH (Query='SELECT * FROM WorkItems
WHERE [System.TeamProject]=''ProductTesting''
AND [System.ChangedDate] >= ''<<monthstart-1d,FUN_TO_DATE>>''
ORDER BY [System.ChangedDate] DESC
')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-items-by-wiql-in-project" Label="Query work items by WIQL in a project">
<Desc><![CDATA[<p>Runs a WIQL query in a specific project by passing both the project name and the query in the WITH clause. Use this when the connection default is different from the project you want to query, or when you need to target one project explicitly. The query can filter by ID, state, type, or any other WIQL criteria.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems WITH (Project='PosProject', Query='SELECT * FROM WorkItems WHERE [System.Id] = 2819')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-items-by-type-eg-task" Label="Query work items by type (e.g. Task)">
<Desc><![CDATA[<p>Returns work items of a given type (e.g. Task, Bug, User Story) by filtering with a WIQL query on <code>System.WorkItemType</code>. Use this to list all tasks, all bugs, or any other type. You can combine with other WIQL conditions (state, project, dates) in the same query string.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItems WITH (Query='SELECT * FROM WorkItems WHERE [System.WorkItemType] = ''Task''')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-work-item-default-project" Label="Create work item (default project)">
<Desc><![CDATA[<p>Creates a new work item in the default project. Specify at least work item type and title; you can add custom or system fields as columns and values. The example shows a task with a few custom fields. Use WITH to set project if the default is not the target project.</p>]]></Desc>
<Code>
<![CDATA[INSERT INTO WorkItems (WorkItemType, Title, [CustomFieldText], [CustomFieldDate], [CustomFieldNumber])
VALUES ('task', 'Fix Issues in System', 'My Custom Text', '2021-01-01T23:59:59.123', 1000)]]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-work-item-in-project" Label="Create work item in a project">
<Desc><![CDATA[<p>Creates a new work item in a specific project by passing the project name in the WITH clause. Use this when the connection default project is not the one you want. Same columns and values as creating in the default project; only the target project changes.</p>]]></Desc>
<Code>
<![CDATA[INSERT INTO WorkItems (WorkItemType, Title, [CustomFieldText], [CustomFieldDate], [CustomFieldNumber])
VALUES ('task', 'Fix Issues in System', 'My Custom Text', '2021-01-01T23:59:59.123', 1000)
WITH(Project='MyProject')
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-work-item-with-many-fields" Label="Create work item with many fields">
<Desc><![CDATA[<p>Creates a work item with a full set of common fields: type, title, description, tags, area and iteration path, assignee, priority, triage, task type, dates, estimates, story points, and more. Use this as a template when you need to set many fields at once. Omit or comment out columns you do not need; add custom fields with the Custom prefix as in the connector docs.</p>]]></Desc>
<Code>
<![CDATA[
INSERT INTO WorkItems (
[WorkItemType]
, [Title]
, [Description]
, [Tags]
, [AreaPath]
, [IterationPath]
, [AssignedTo]
, [Priority]
, [Triage]
--, [StackRank]
, [Blocked]
, [TaskType]
, [RequiresReview]
, [RequiresTest]
, [IntegrationBuild]
, [FoundIn]
, [OriginalEstimate]
, [RemainingWork]
, [CompletedWork]
, [Size]
, [Effort]
, [TargetDate]
, [StartDate]
, [FinishDate]
, [DueDate]
, [StoryPoints]
--, [Discipline]
, [SystemInfo]
, [Steps]
, [ReproSteps]
--, [CustomFieldText] --custom field prefix with CustomYOUR_FIELD_NAME_WITHOUT_SPACE_OR_DASH_OR_DOT
--, [CustomFieldDate]
--, [CustomFieldNumber]
--, [CustomFieldDecimal]
--, [CustomFieldPickListString]
--, [CustomFieldPickListNum]
)
VALUES (
'Bug' -- Task, User Story -- WorkItemType
, 'My Task Title - Created on <<FUN_NOW>>' --Title
, 'Some Description - Created on <<FUN_NOW>>' --Description
, 'odata; api' --Tags
, 'ProductTesting\SSISPowerPack' --AreaPath
, 'ProductTesting\2021.6' --IterationPath
, 'build@mycompany.com' --AssignedTo
, 1 --Priority
, 'Pending' --Triage
--, ??? --[StackRank]
, 'No' --Blocked
, 'Planned' --TaskType
, 'No' --RequiresReview
, 'No' --RequiresTest
, '101.1.2.3' --IntegrationBuild
, '100.1.2.3' --FoundIn
, 9999.111 --OriginalEstimate
, 9999.222 --RemainingWork
, 9999.333 --CompletedWork
, 9999.444 --Size
, 9999.555 --Effort
, '2021-01-31' --TargetDate
, '2022-01-31' --StartDate
, '2023-01-31' --FinishDate
, '2024-01-31' --DueDate
, 100.5 --StoryPoints
--, 'Some Discipline' --Discipline
, 'Windows 10' --SystemInfo
, 'Here are steps' --Steps
, 'Here are steps to reproduce' --ReproSteps
--, 'abcd' --CustomFieldText
--, '2021-01-31' --CustomFieldDate
--, 9999 --CustomFieldNumber
--, 9999.123 --CustomFieldDecimal
--, 'BBB' --CustomFieldPickListString
--, '2' --CustomFieldPickListNum
)
WITH(
Project='ProductTesting'
-- ,BypassRules='true' --Useful to set ReadOnly Fields like ResolvedBy, ClosedBy
-- ,SuppressNotifications='true' --Avoids email notifications on change
-- ,ValidateOnly='true' --Dont perform actual insert - just validate
)
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-work-item-by-id-basic-fields" Label="Update work item by ID (basic fields)">
<Desc><![CDATA[<p>Updates a single work item by ID, changing only the columns you set in the SET clause. Use WHERE Id = ... to target the item. You can update title, description, custom fields, state, and other writable fields. For read-only fields (e.g. ResolvedBy) you must set BypassRules in WITH; see the "Update readonly fields" example.</p>]]></Desc>
<Code>
<![CDATA[UPDATE WorkItems SET
Title = 'Renamed Work Item Title',
CustomMyField = 'New Custom Text'
WHERE Id = 7455]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-work-item-by-id-many-columns" Label="Update work item by ID (many columns)">
<Desc><![CDATA[<p>Updates many columns on a single work item in one statement: title, description, state, tags, area/iteration, assignee, priority, estimates, dates, and more. Use this when you need to apply a broad set of changes to one item. Optional WITH parameters can suppress notifications or validate without saving.</p>]]></Desc>
<Code>
<![CDATA[UPDATE WorkItems
SET [Title] = 'Update-QA Task <<FUN_NOW>>'
, [Description] = 'Updated desc <<FUN_NOW>>'
--, [WorkItemType]='Bug' -- Task
, [State] = 'Active'
, [Tags] = 'odata; api'
, [Revision] = 1
, [AreaPath] = 'ProductTesting\SSISPowerPack'
, [TeamProject] = 'ProductTesting'
, [IterationPath] = 'ProductTesting\2021.6'
, [Reason] = 'Reactivated'
, [AssignedTo] = 'build@mycompany.com'
, [Priority] = 1
--, [Triage] = 'Pending'
--, [StackRank] = ???
, [Blocked] = 'No'
, [TaskType] = 'Planned'
, [RequiresReview] = 'No'
, [RequiresTest] = 'No'
, [ActivatedDate] = '2021-01-31'
--, [ResolvedReason] = 'Complete and Requires Review/Test'
--, [ResolvedBy] = 'John Smith <jsmith@mycompany.com>' --or Just Name or Email (Must set ByPassRules='true' Param to set this readonly field)
, [IntegrationBuild] = '101.1.2.3'
, [FoundIn] = '100.1.2.3'
, [OriginalEstimate] = 9999.123
, [RemainingWork] = 9999.123
, [CompletedWork] = 9999.123
, [Size] = 9999.123
, [Effort] = 9999.123
, [TargetDate] = '2021-01-31'
, [StartDate] = '2021-01-31'
, [FinishDate] = '2021-01-31'
, [DueDate] = '2021-01-31'
, [StoryPoints] = 100.5
-- , [Discipline] = 'abcd'
, [SystemInfo] = 'abcd'
, [Steps] = 'abcd'
, [ReproSteps] = 'abcd'
-- , [CustomFieldText] = 'abcd'
-- , [CustomFieldDate] = '2021-01-31'
-- , [CustomFieldNumber] = 9999
-- , [CustomFieldDecimal] = 9999.123
-- , [CustomFieldPickListString] = 'BBB'
-- , [CustomFieldPickListNum] = '2'
WHERE [Id] = 6455
--WITH(
-- BypassRules='true' --Useful to Update ReadOnly Fields like ResolvedBy, ClosedBy
-- ,SuppressNotifications='true' --Avoids email notifications on change
-- ,ValidateOnly='true' --Dont perform actual update - just validate
--)
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="add-tags-to-an-existing-work-item" Label="Add tags to an existing work item">
<Desc><![CDATA[<p>Adds or replaces tags on a work item by ID. Set the Tags column to a semicolon-separated list; use Operation='add' in WITH to append to existing tags instead of replacing. Optional WITH parameters can bypass rules, suppress email notifications, or validate without applying the update.</p>]]></Desc>
<Code>
<![CDATA[UPDATE WorkItems
SET Tags = 'newtag1; newtag2'
WHERE Id = 6455
WITH(
Project='ProductTesting'
,Operation='add'
-- ,BypassRules='true' --Useful to Update ReadOnly Fields like ResolvedBy, ClosedBy
-- ,SuppressNotifications='true' --Avoids email notifications on change
-- ,ValidateOnly='true' --Dont perform actual update - just validate
)]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-readonly-fields-eg-closedby-resolvedby" Label="Update readonly fields (e.g. ClosedBy, ResolvedBy)">
<Desc><![CDATA[<p>Some fields (e.g. ResolvedBy, ClosedBy) are read-only under normal rules. To update them you must set <code>BypassRules='true'</code> in the WITH clause. Use this only when you need to set system or audit fields; suppress notifications or validate-only options are also available in WITH for testing or reducing email noise.</p>]]></Desc>
<Code>
<![CDATA[UPDATE WorkItems
SET [Title] = 'Update-QA Task <<FUN_NOW>>'
, [Description] = 'Updated desc <<FUN_NOW>>'
, [WorkItemType]='Bug' -- Task
, [State] = 'Resolved'
, [Tags] = 'odata; api'
, [ResolvedBy] = 'some.one@mycompany.com' --(Must set ByPassRules='true' Param to set this readonly field)
WHERE [Id] = 9626
WITH(
BypassRules='true' --Useful to Update ReadOnly Fields like ResolvedBy, ClosedBy
-- ,SuppressNotifications='true' --Avoids email notifications on change
-- ,ValidateOnly='true' --Dont perform actual update - just validate
)]]>
</Code>
</Example>
<Example Group="ODBC" Slug="delete-work-item-by-id" Label="Delete work item by ID">
<Desc><![CDATA[<p>Permanently deletes one work item by its ID. The item is removed from the project. Use with care; deletion is not reversible. Ensure the ID and project context are correct before running.</p>]]></Desc>
<Code>
<![CDATA[DELETE FROM WorkItems WHERE Id = 7455]]>
</Code>
</Example>
<Example Group="ODBC" Slug="delete-work-items-by-wiql-query" Label="Delete work items by WIQL query">
<Desc><![CDATA[<p>Deletes all work items that match a WIQL query. The query in WITH defines which items are removed (e.g. by project and a list of IDs). Run a SELECT with the same query first to confirm the set of items before deleting.</p>]]></Desc>
<Code>
<![CDATA[DELETE FROM WorkItems
Where 1=1
WITH(Query='SELECT * FROM WorkItems Where [System.TeamProject]=''MyProject'' AND ([System.Id]=6469 OR [System.Id]=6468) ')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-work-items-by-wiql-query" Label="Update work items by WIQL query">
<Desc><![CDATA[<p>Updates the same column(s) on every work item that matches a WIQL query. The query in WITH selects the target items; the SET clause defines the new values. Use this to bulk-update title, state, or other fields for a set of items (e.g. all tasks in a sprint). Verify the query scope before running.</p>]]></Desc>
<Code>
<![CDATA[UPDATE WorkItems
Set Title='New Title - Updated on <<FUN_NOW>>'
Where 1=1
WITH(Query='SELECT * FROM WorkItems Where [System.TeamProject]=''MyProject'' AND ([System.Id]=6469 OR [System.Id]=6468) ')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-all-work-item-comments" Label="List all work item comments">
<Desc><![CDATA[<p>Returns all comments across work items in the default (or specified) scope. Use when you need a flat list of comments for reporting or search. Filter by WorkItemId or Id in the WHERE clause to narrow to one work item or one comment.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItemComments]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-comments-for-work-item" Label="List comments for a work item">
<Desc><![CDATA[<p>Returns all comments for a single work item. Filter by WorkItemId in the WHERE clause. Use this to show discussion history for one bug, task, or story. Columns include Id, Text, RenderedText, CreatedDate, CreatedBy, and ModifiedDate.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItemComments
WHERE WorkItemId=6455]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-comment-by-id-for-work-item" Label="Get comment by ID for a work item">
<Desc><![CDATA[<p>Returns one comment by its ID for a given work item. Filter by both WorkItemId and Id to retrieve a single comment row. Use when you need to update or reference a specific comment.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM WorkItemComments
WHERE WorkItemId=6455 and Id=5283490]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-items-using-wiql" Label="Query work items using WIQL">
<Desc><![CDATA[<p>Run a WIQL query to filter work items by project and criteria; the query is passed in the WITH clause and executed on the server. You can select specific columns (e.g. Id, Title, Description, CreatedDate, Url) or use * to return all columns. WIQL supports project, ID, state, work item type, dates, and more.</p><p>For syntax and operators see <a href="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">WIQL syntax</a>.</p>]]></Desc>
<Code>
<![CDATA[SELECT
Id
, Title
, Description
, CreatedDate
, Url
FROM WorkItems
--WHERE Id=5283490 -- uncomment to get just one WorkItem
WITH(Query='SELECT * FROM WorkItems WHERE [System.TeamProject]=''ProductTesting'' and [System.Id]=6455 ORDER BY [System.Id] DESC')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-items-using-wiql-directsql" Label="Query work items using WIQL (#DirectSQL)">
<Desc><![CDATA[<p>Same as the previous example but the query is sent to the server as-is using the #DirectSQL preprocessor, so you can write simpler SQL without wrapping the WIQL in a WITH parameter. Use this when you prefer to author the full WIQL statement directly. Behavior and result columns are the same.</p><p>For WIQL syntax see <a href="https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops">WIQL syntax</a>.</p>]]></Desc>
<Code>
<![CDATA[#DirectSQL SELECT * FROM WorkItems WHERE [System.TeamProject]=''ProductTesting'' and [System.Id]=6455 ORDER BY [System.Id] DESC]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-sprint-hours-by-team-member-estimated-vs-completed" Label="Query sprint hours by team member (estimated vs completed)">
<Desc><![CDATA[<p>Returns aggregated original estimate, remaining work, and completed work per team member for a sprint (iteration path). Useful for sprint burndown or capacity reporting. The query groups by iteration path and assignee; the WITH clause filters to a specific sprint and state (e.g. Resolved, Closed).</p><p>This only gives meaningful results if your team updates Original Estimate and Completed Work on work items as they progress. You can change the iteration path in the query to cover other sprints or the whole product.</p>]]></Desc>
<Code>
<![CDATA[SELECT
IterationPath as Sprint
, AssignedToUniqueName as AssignedTo
, SUM(OriginalEstimate) as OriginalHours_Total
, SUM(RemainingWork) as RemainingWork_Total
, SUM(CompletedWork) as CompletedHours_Total
FROM WorkItems
GROUP BY IterationPath,AssignedToUniqueName
WITH(
Project='ProductTesting'
--//On Preview UI Change [Max Rows] to use more sample rows - else it will use only 100 rows
,Query='SELECT * FROM WorkItems WHERE [System.IterationPath] UNDER ''ProductTesting\Sprint 1'' and State IN(''Resolved'', ''Closed'')'
--Use below to query all sprints for this Product
--,Query='SELECT * FROM WorkItems WHERE [System.IterationPath] UNDER ''ProductTesting\'' and State IN(''Resolved'', ''Closed'')'
)]]>
</Code>
</Example>
<Example Group="ODBC" Slug="read-more-than-20000-work-items-union-all" Label="Read more than 20000 work items (UNION ALL)">
<Desc><![CDATA[<p>The Azure DevOps API returns at most 20000 work items per request. To read more, run multiple queries that each request a different ID range (e.g. 1–19999, 20000–39999) and combine the results. This example uses temp tables and UNION ALL so you get one result set; you can add more ranges by adding more SELECT INTO and UNION ALL lines.</p><p>Run the full script at once. Adjust the ID ranges and the number of temp tables to match your data size.</p>]]></Desc>
<Code>
<![CDATA[ SELECT * INTO #t1 FROM WorkItems WITH(Project='ProductTesting', Query='SELECT * FROM WorkItems WHERE [System.Id]>=1 and [System.Id]<20000');
SELECT * INTO #t2 FROM WorkItems WITH(Project='ProductTesting', Query='SELECT * FROM WorkItems WHERE [System.Id]>=20000 and [System.Id]<40000');
SELECT * INTO #t3 FROM WorkItems WITH(Project='ProductTesting', Query='SELECT * FROM WorkItems WHERE [System.Id]>=40000 and [System.Id]<60000');
--//....
--//add more temp tables above and update UNION ALL too
SELECT * FROM #t1
UNION ALL
SELECT * FROM #t2
UNION ALL
SELECT * FROM #t3
;]]>
</Code>
</Example>
<Example Group="ODBC" Slug="query-work-item-comments-using-wiql" Label="Query work item comments using WIQL">
<Desc><![CDATA[<p>The WIQL query in the WITH clause selects which work items to include; comments for those work items are returned. You can filter by project, ID, or any WIQL criteria. Columns include Id, WorkItemId, Text, RenderedText, CreatedDate, CreatedBy, ModifiedDate, and Url. Use this when you need comments for a specific set of work items defined by a query rather than a single work item ID.</p>]]></Desc>
<Code>
<![CDATA[SELECT
Id
, WorkItemId
, Text
, RenderedText
, Format
, CreatedDate
, CreatedByUniqueName
, CreatedById
, CreatedByDisplayName
, ModifiedDate
, ModifiedByUniqueName
, ModifiedById
, ModifiedByDisplayName
, Url
FROM WorkItemComments
--WHERE Id=5283490 -- get just one comment for specific WorkItem Id
WITH(Query='SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject]=''ProductTesting'' and [System.Id]=6455 ORDER BY [System.Id] DESC')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-work-item-comment" Label="Create work item comment">
<Desc><![CDATA[<p>Adds a new comment to a work item. Supply WorkItemId and the comment Text; the text can include HTML (e.g. bold, links). Specify the project in WITH. The new comment gets an ID and timestamps; you can use it in follow-up updates or links.</p>]]></Desc>
<Code>
<![CDATA[INSERT INTO WorkItemComments(WorkItemId, Text)
VALUES(6455, 'Adding <strong>html comment</strong> - created on <<FUN_NOW>>')
WITH(Project='ProductTesting')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-work-item-comment" Label="Update work item comment">
<Desc><![CDATA[<p>Updates the text of an existing comment. Identify the comment by WorkItemId and Id in the WHERE clause; set the new Text in SET. Specify the project in WITH. Useful for correcting or expanding a comment after creation.</p>]]></Desc>
<Code>
<![CDATA[UPDATE WorkItemComments
SET Text='Updating <strong>html comment</strong> - updated on <<FUN_NOW>>'
Where WorkItemId=6455 and Id=5284411
WITH(Project='ProductTesting')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="delete-work-item-comment-by-id" Label="Delete work item comment by ID">
<Desc><![CDATA[<p>Deletes a single comment by its ID and work item ID. The comment is removed from the work item. Use when you need to remove one comment from the discussion thread.</p>]]></Desc>
<Code>
<![CDATA[DELETE FROM WorkItemComments WHERE WorkItemId=6455 and Id=5284411]]>
</Code>
</Example>
<Example Group="ODBC" Slug="upload-file-attachment" Label="Upload file (attachment)">
<Desc><![CDATA[<p>Upload a file as a work item attachment via the generic request endpoint. The request body is the file (binary); the response includes an attachment ID and URL. Use that URL when adding the attachment as a link to a work item (e.g. with the "Add link to existing work item" example). Replace the Body path with your file path and set your organization and project in the URL.</p>]]></Desc>
<Code>
<![CDATA[SELECT *
FROM generic_request
WITH(
Url='YOUR_ORGANIZATION/YOUR_PROJECT/_apis/wit/attachments?api-version=7.0',
RequestMethod='POST',
RequestContentTypeCode='ApplicationOctetStream', --//Binary upload
--Headers='Content-Type: application/octet-stream', --//same as above
Body='@c:\temp\screenshot-1.png',
IsMultiPart=1,
Meta='id:string(100);url:string(500)' --response columns you like to display
)]]>
</Code>
</Example>
<Example Group="ODBC" Slug="add-link-to-existing-work-item-attachment-as-reference" Label="Add link to existing work item (attachment as reference)">
<Desc><![CDATA[<p>Add an attachment reference to an existing work item using a JSON PATCH body. Use the attachment URL you received from the upload endpoint (or any existing attachment URL). The example adds a history comment and one AttachedFile relation; replace YOUR_ORGANIZATION, YOUR_PROJECT, WORK_ITEM_NUMBER, and ATTACHMENT_ID with your values. Useful for linking screenshots or documents to a work item after upload.</p>]]></Desc>
<Code>
<![CDATA[SELECT *
FROM generic_request
WITH(
Url='YOUR_ORGANIZATION/YOUR_PROJECT/_apis/wit/workitems/WORK_ITEM_NUMBER?api-version=7.0',
RequestMethod='PATCH',
Headers='Content-Type: application/json-patch+json',
Meta='id:int; fields.System.Title:string; fields.System.State:string; fields.System.WorkItemType:string; relations:string(4000)',
Body='
[
{
"op": "add",
"path": "/fields/System.History",
"value": "Adding the necessary spec"
},
{
"op": "add",
"path": "/relations/-",
"value": {
"rel": "AttachedFile",
"url": "https://dev.azure.com/YOUR_ORGANIZATION/YOUR_PROJECT/_apis/wit/attachments/ATTACHMENT_ID?fileName=Screenshot.png",
"attributes": {
"comment": "Error screenshot"
}
}
}
]
'
)]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-projects" Label="List projects">
<Desc><![CDATA[<p>Returns all projects in the organization. Use this to discover project names and IDs for use in other queries or in the connection default project. Columns include Id, Name, Description, Url, State, Revision, Visibility, and LastUpdateTime.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM Projects]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-projects-specific-columns" Label="List projects (specific columns)">
<Desc><![CDATA[<p>Returns projects in the organization with only the columns you select (e.g. Id, Name, Description, Url, State, Revision, Visibility, LastUpdateTime). Use this to reduce payload size or to build a dropdown or report that needs a subset of project fields.</p>]]></Desc>
<Code>
<![CDATA[SELECT Id, Name, Description, Url, State, Revision, Visibility, LastUpdateTime FROM Projects]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-project-by-id" Label="Get project by ID">
<Desc><![CDATA[<p>Returns a single project by its GUID. Use the project Id from the list of projects when you need full details for one project (e.g. name, description, visibility, last update time).</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM Projects WHERE Id='a80fb082-f7c4-4345-911d-1c05ad1b1fc9']]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-project" Label="Create project">
<Desc><![CDATA[<p>Creates a new project in the organization. Supply name, abbreviation, description, source control type (Git or Tfvc), and visibility (private or public). The project is created asynchronously; poll or refresh to see it in the list. Requires appropriate organization permissions.</p>]]></Desc>
<Code>
<![CDATA[INSERT INTO Projects (Name, Abbreviation, Description, SourceControlType, Visibility)
VALUES
('My New Project', 'MNP',
'The system we use for implementing point-of-service walk-in payment systems.',
'Git', 'private')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-project-by-id" Label="Update project by ID">
<Desc><![CDATA[<p>Updates an existing project by its ID. Set the columns you want to change (e.g. Name, Description, Visibility); the WHERE clause targets the project. Use when you need to rename a project, change its description, or update visibility.</p>]]></Desc>
<Code>
<![CDATA[UPDATE Projects SET Description = 'The system we use for implementing point-of-service walk-in payment systems and phone payments.'
WHERE Id='1be9ccef-45d7-4574-af67-7dc6c0699b6a']]>
</Code>
</Example>
<Example Group="ODBC" Slug="delete-project-by-id" Label="Delete project by ID">
<Desc><![CDATA[<p>Deletes a project by its ID. The project and its data are removed. This operation is irreversible and requires appropriate permissions. Confirm the project ID before running.</p>]]></Desc>
<Code>
<![CDATA[DELETE FROM Projects WHERE Id='85kd1641-5555-49b1-9c5e-22c22a61d4c4']]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-teams-default-project" Label="List teams (default project)">
<Desc><![CDATA[<p>Returns all teams in the default project from the connection. Use this to discover team names and IDs for use in queries or when creating work items. Columns include Id, Name, ProjectId, ProjectName, Url, and Description.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM Teams]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-teams-for-project" Label="List teams for a project">
<Desc><![CDATA[<p>Returns all teams in a specific project by passing the project ID (or name) in the WITH clause. Use when the default project is not the one you need or when you are iterating over multiple projects.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM Teams WITH (Project='841e1641-325d-49b1-9c5e-22c11a61d4c4')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-teams-specific-columns" Label="List teams (specific columns)">
<Desc><![CDATA[<p>Returns teams with only the columns you select (e.g. Id, Name, ProjectId, ProjectName, Url, Description, IdentityUrl). Use this to keep result sets small or to build pickers and reports that need a subset of team fields.</p>]]></Desc>
<Code>
<![CDATA[SELECT Id, Name, ProjectId, ProjectName, Url, Description, IdentityUrl FROM Teams]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-team-by-id" Label="Get team by ID">
<Desc><![CDATA[<p>Returns a single team by its GUID. Use the team Id from the list of teams when you need full details for one team (e.g. name, description, project, identity URL).</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM Teams WHERE Id='a0aa750f-1550-44af-a056-223696077df6']]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-team-default-project" Label="Create team (default project)">
<Desc><![CDATA[<p>Creates a new team in the default project. Supply the team name and description. The team is created under the connection's default project. Use "Create team in a project" when you need to target a different project.</p>]]></Desc>
<Code>
<![CDATA[INSERT INTO Teams (Name, Description) VALUES
('PosProject Team', 'This is the team who will be working on the Point of Service project.')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="create-team-in-project" Label="Create team in a project">
<Desc><![CDATA[<p>Creates a new team in a specific project by passing the project ID in the WITH clause. Supply the team name and description. Use when the default project is not the target project.</p>]]></Desc>
<Code>
<![CDATA[INSERT INTO Teams (Name, Description) VALUES
('PosProject Team', 'This is the team who will be working on the Point of Service project.')
WITH (ProjectId='85kd1641-5555-49b1-9c5e-22c22a61d4c4')]]>
</Code>
</Example>
<Example Group="ODBC" Slug="update-team-by-id" Label="Update team by ID">
<Desc><![CDATA[<p>Updates an existing team by its ID. Set the columns you want to change (e.g. Name, Description); the WHERE clause targets the team. Use when renaming a team or updating its description.</p>]]></Desc>
<Code>
<![CDATA[UPDATE Teams SET Name = 'PointOfServiceProject Team' WHERE Id='8djr4d07-5555-5555-9552-0b6d7je99w7f']]>
</Code>
</Example>
<Example Group="ODBC" Slug="delete-team-by-id" Label="Delete team by ID">
<Desc><![CDATA[<p>Deletes a team by its ID. The team is removed from the project. Confirm the team ID before running; deletion is not reversible.</p>]]></Desc>
<Code>
<![CDATA[DELETE FROM Teams WHERE Id='8djr4d07-5555-5555-9552-0b6d7je99w7f']]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-audit-records" Label="List audit records">
<Desc><![CDATA[<p>Returns organization-level audit log entries: who performed which action, when, and from where. Use this for compliance, security review, or troubleshooting. Rows include actor (user), timestamp, scope (project or org), IP address, action ID, and event details. The stream can be large; filter by date range or project in your client if needed.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM AuditRecords]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-audit-records-specific-columns" Label="List audit records (specific columns)">
<Desc><![CDATA[<p>Same as listing all audit records but returns only the columns you need (e.g. Id, Timestamp, ActorUserId, ProjectName, ActionId, EventSummary). Use this to reduce payload size or to focus on specific fields for reporting or export.</p>]]></Desc>
<Code>
<![CDATA[SELECT Id, CorrelationId, ActivityId, ActorCUID, ActorUserId, AuthenticationMechanism,
Timestamp, ScopeType, ScopeDisplayName, ScopeId, IpAddress, UserAgent, ActionId, ProjectId, ProjectName,
ProcessTemplate, ProjectVisibility, StartTime, EndTime, BatchSize, EventSummary, Details, Area, Category,
CategoryDisplayName, ActorDisplayName, ActorImageUrl FROM AuditRecords]]>
</Code>
</Example>
<Example Group="ODBC" Slug="list-predefined-queries" Label="List predefined queries">
<Desc><![CDATA[<p>Returns the list of saved queries (shared and optionally personal) for the project. Each row includes the query ID, name, path, and other metadata. Use the query ID from this result in the "Get work items by predefined query ID" example to run a saved query and get its work items. Specify the project in the WITH clause.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM get_queries
WITH(
Project='Odbc'
)
]]>
</Code>
</Example>
<Example Group="ODBC" Slug="get-work-items-by-predefined-query-id" Label="Get work items by predefined query ID">
<Desc><![CDATA[<p>Returns work items from a saved shared or private query. Supply the query ID (from the result of the "List predefined queries" example or from the Azure DevOps query URL). Optionally specify a project and team; the query runs in that context and returns the same columns you would see in the Boards query view. Useful when you already maintain useful queries in the UI and want to pull the same result set via SQL.</p>]]></Desc>
<Code>
<![CDATA[SELECT * FROM get_workitems_by_query_id
WITH(
Query='e5150e18-1323-485d-8937-6991bf09ab1c' --see get_queries endpoint
, Project='Odbc'
)
]]>
</Code>
</Example>
</Examples>
</ApiConfig>