Connect Azure DevOps to Axify to measure your whole delivery flow — work items, pull requests, incidents, deliverables, and deployments — from a single integration.
Axify only reads from Azure DevOps. The integration makes no change to your organization: it never creates, edits, approves, completes, or deletes anything. What it reads is listed in What Axify reads from Azure DevOps.
What you get
One Azure DevOps integration feeds five parts of Axify. You choose which ones to use when you link it to a project.
| Capability | What it powers |
|---|---|
| Work items | Process metrics — cycle time, throughput, workflow stability, and work in progress, from your work items and their revisions |
| Source control | Technical metrics — pull request cycle time, review activity, pull request size, and work in progress |
| Incidents | Change failure rate and time to restore service |
| Deliverables | Value Stream and delivery forecasting, from your boards, iterations, and work item hierarchy |
| Deployments | Deployment frequency and lead time for changes, from your releases, pipeline runs, and environments |
You only need to add the integration once. A single Azure DevOps integration can be linked to as many Axify projects as you like.
Authentication methods
Axify connects to Azure DevOps in one of two ways. Axify recommends the Microsoft account method, and it is the one offered first when you add the integration.
| Method | How it works | Permissions come from |
|---|---|---|
|
Microsoft account Recommended |
You are redirected to Azure and sign in with your Microsoft account to authorize Axify. | The Microsoft account that authorizes |
| Manual (access token) | You create a personal access token in Azure DevOps and paste it into Axify along with your organization name. | The Azure DevOps account that created the token |
Personal access token scopes
If you use the manual method, create the token with these eight scopes. Every one is read-only.
| Scope | Why it is needed |
|---|---|
| Work items (read) | Read work items and their revision history — the source of your Process metrics |
| Analytics (read) | Query the Analytics service for work items, and for the last-change dates used to suggest which projects to import |
| Project and Team (read) | List projects, teams, their members, and team settings |
| Code (read) | Read repositories, pull requests, commits, and review threads |
| Build (read) | Read build definitions and pipeline runs |
| Release (read) | Read release definitions and deployments |
| Environment (read) | Read environments and their deployment records |
| Graph (read) | Resolve contributors to a person in Axify |
A token carries its owner's permissions. Whatever the person who created the token can see in Azure DevOps, Axify can read. Create it from an account whose project access covers everything you want measured — a service account is a good choice, so the integration does not break when someone leaves.
Prerequisites
- An Azure DevOps organization, and an account with access to the projects you want to measure
- An Axify admin account — only Axify admins can add integrations
- For the manual method, the ability to create a personal access token on that account
Setup instructions
In Axify, go to Settings → Integrations and click Add integration, then select Azure DevOps.
Option 1: Microsoft account — recommended
- Choose Microsoft account. You are redirected to Azure.
-
Sign in with the Microsoft account that has access to your Azure DevOps organization.
-
Accept the permissions Azure DevOps asks for, so that Axify can read the data in your projects.
- You are returned to Axify with a confirmation. Choose the organization you want to track.
Already connected with an access token? You do not need to start over. Change the authentication method on the existing integration and follow the steps above — your projects stay linked, so there is nothing to reconnect.
Option 2: Manual (access token)
-
In Azure DevOps, create a personal access token with the eight read scopes listed above. Copy it — Azure DevOps shows it only once.
- Back in Axify, fill in the connection details:
- Integration name — internal to Axify, used as a label to identify the integration.
-
Azure DevOps organization name — just the organization, not the full URL. For
https://dev.azure.com/acme, enteracme. - Personal access token — the token you just created.
- Confirm to create the integration.
Connecting through a proxy
If your Azure DevOps instance sits behind a proxy or expects particular request headers, two optional fields on the manual form handle it:
- Azure DevOps instance proxy URL — enter the proxy address and Axify sends its requests through it.
- Additional headers for Azure DevOps requests — any headers you add here are attached to every request Axify sends to your instance.
Link the integration to a project
Adding the integration makes it available to your organization; it does not start collecting anything on its own. Link it to an Axify project, choosing which capabilities you want. Depending on how much history your projects hold, the first synchronization can take several minutes.
What Axify reads from Azure DevOps
Axify reads the following. Everything here is used to compute your metrics.
| Area | What is read |
|---|---|
| Projects and teams | Projects, teams, team members, team settings, iterations, and the process configuration that defines your work item types |
| Work items | Work items, their fields, and their full revision history — this is what produces cycle time and workflow metrics |
| Boards | Board configuration and column layout |
| Pull requests | The pull request and its state, its iterations, and its commits. Axify counts the changed entries in the latest iteration to derive the size of the pull request |
| Review threads | Pull request threads, so Axify can distinguish a review comment from a system message such as a vote or an approval |
| Commits | Commit metadata — message, author, date, and identifier |
| Builds and deployments | Build definitions, pipeline runs, release definitions and deployments, environments, and their deployment records |
| Identity | The accounts available to the connection, and the users who appear on the work above |
What Axify does not do
-
No writes. Axify never creates, edits, assigns, transitions, approves, completes, or deletes anything in Azure DevOps. Two calls use
POST— the work item query and the commit batch — but both are read queries that carry their filter in the request body. - No file contents. Axify does not clone your repositories or read the contents of your files. For pull request size it counts how many entries changed; it does not read what changed inside them.
- Nothing outside the connection's reach. Axify sees only the projects the connected account can already see.
API reference
These are the Azure DevOps endpoints the integration calls, grouped by area. All are reads.
Projects and teams
| Endpoint | Purpose |
|---|---|
GET /_apis/projects, GET /_apis/projects/{id}
|
List and read projects |
GET /_apis/teams, GET /_apis/projects/{id}/teams
|
List teams |
GET /_apis/projects/{id}/teams/{teamId} |
Read one team |
GET /_apis/projects/{id}/teams/{teamId}/members |
Read team membership |
GET /{project}/{team}/_apis/work/teamsettings |
Read a team's settings |
GET /{project}/{team}/_apis/work/teamsettings/iterations |
Read iterations for delivery forecasting |
GET /{project}/_apis/work/processconfiguration |
Read the process configuration that defines your work item types |
Work items and boards
| Endpoint | Purpose |
|---|---|
GET /{project}/_apis/wit/workitems, GET /{project}/_apis/wit/workitems/{id}
|
Read work items |
GET /{project}/_apis/wit/workitems/{id}/revisions |
Read a work item's history — the source of cycle time |
POST /{project}/{team}/_apis/wit/wiql |
Find the work items in scope. A read query; the WIQL statement travels in the request body |
GET /{project}/{team}/_apis/work/boards/{board} |
Read board configuration and columns |
GET /{project}/_odata/{version}/WorkItems |
Read work items from the Analytics service |
GET /_odata/{version}/WorkItemBoardSnapshot |
An aggregate query returning the most recent work item change date per project and team. Used when suggesting which projects and teams are worth importing — no board contents are read |
Repositories and pull requests
| Endpoint | Purpose |
|---|---|
GET /{project}/_apis/git/repositories, GET /{project}/_apis/git/repositories/{id}
|
List and read repositories |
GET /{project}/_apis/git/repositories/{id}/pullrequests |
List pull requests |
GET /{project}/_apis/git/repositories/{id}/pullrequests/{prId} |
Read one pull request |
GET .../pullrequests/{prId}/iterations |
Read a pull request's iterations |
GET .../pullrequests/{prId}/iterations/{iterationId}/changes |
Count the changed entries, to derive pull request size |
GET .../pullrequests/{prId}/threads |
Read review threads and votes |
GET .../pullrequests/{prId}/commits |
List the commits on a pull request |
GET /{project}/_apis/git/repositories/{id}/commits/{commitId} |
Read one commit |
POST /{project}/_apis/git/repositories/{id}/commitsbatch |
Read a batch of commits. A read query; the filter travels in the request body |
Builds, releases, and environments
| Endpoint | Purpose |
|---|---|
GET /{project}/_apis/build/definitions |
List build definitions |
GET /{project}/_apis/build/builds/{buildId} |
Read one build |
GET /{project}/_apis/pipelines/{pipelineId}/runs/{runId} |
Read a pipeline run |
GET /{project}/_apis/release/definitions |
List release definitions |
GET /{project}/_apis/release/deployments |
Read deployments |
GET /{project}/_apis/distributedtask/environments |
List environments |
GET /{project}/_apis/distributedtask/environments/{id}/environmentdeploymentrecords |
Read deployment records for an environment |
Identity
| Endpoint | Purpose |
|---|---|
GET /_apis/accounts |
List the organizations available to the connection |
GET /_apis/graph/users |
Resolve contributors to a person in Axify |
Errors
| What you see | What it means | What to do |
|---|---|---|
| We couldn't validate your permissions | The token is missing one or more of the eight scopes, or the account behind it lacks access to the projects. | Create a new token with every scope listed above. Scopes cannot be added to an existing token. |
| We could not add the configured Azure DevOps integration | The organization name or token is wrong. Entering the full URL instead of just the organization is the most common cause. | Enter only the organization — acme, not https://dev.azure.com/acme — and check the token has not expired. |
| Synchronization stopped. This configuration was rejected by the provider. | Azure DevOps refused the credentials after the integration had been working — usually an expired or revoked token, or an account that lost access. | Unlink and relink the integration, as the message advises, with valid credentials. |
| Some projects never appear | The connected account cannot see them. | Grant that account access in Azure DevOps, or reconnect with an account that already has it. |
| No deployments appear | Axify reads deployments from releases, pipeline runs, and environments. If none of these record your deployments, there is nothing to read. | Confirm your deployments run through Azure Pipelines or Releases, or add a deployment webhook instead. |
Troubleshooting
The first sync is taking a long time
Axify walks the revision history of every work item and the iterations of every pull request in scope. Organizations with a long history take longer — several minutes is normal, and very large ones take longer still.
My workflow stages look wrong
Axify maps your Azure DevOps states onto its own stages using your process configuration. Review the mapping rather than changing Azure DevOps — see Workflow mapping of your issues.
Our instance is behind a proxy
Use the proxy URL and additional headers fields on the manual connection form. Both apply to every request Axify sends to your instance.
I want to switch from a token to a Microsoft account
You can change the authentication method from the integration's settings without removing and re-adding it.
Disconnecting the integration
Go to Settings → Integrations, find the Azure DevOps integration, and unlink or remove it. Unlinking it from a project stops that project's metrics from updating.
Need help?
Reach out to help@axify.io and we'll be happy to help.