Kamil
Kamil

Reputation: 306

Get all organizations in Azure DevOps using REST API

I am trying to retrieve all the organizations in my account but in the documentation an organization is always required in the API call.

https://dev.azure.com/{organization}/_apis/...

Upvotes: 16

Views: 10826

Answers (5)

Nikheel
Nikheel

Reputation: 225

you can do it simply by making a call to get all the account you are member/ owner of. However for that you need your id, which can be easily fetched by making get profile call. Here are steps below:

  1. Make a VSTS API call to get profile details using Bearer token or PAT

https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=5.1

This will return you, your Id:

{
    "displayName": "xxxx",
    "publicAlias": "xxx",
    "emailAddress": "xxx",
    "coreRevision": xxx,
    "timeStamp": "2019-06-17T09:29:11.1917804+00:00",
    "id": "{{We need this}}",
    "revision": 298459751
}
  1. Next, make a call to get all the accounts you are member of or owner of:

https://app.vssps.visualstudio.com/_apis/accounts?api-version=5.1&memberId={{Your Id}}

Response:

{
    "count": 1,
    "value": [
        {
            "accountId": "xxx",
            "accountUri": "xxx",
            "accountName": "xxx",
            "properties": {}
        }
    ]
}

It will return list of accounts you are associated with.

Upvotes: 6

Morten_564834
Morten_564834

Reputation: 1667

I'm getting a sign-in response for both "app.vssps.visualstudio.com/_apis/accounts" and Post https://dev.azure.com/{organization1}/_apis/Contribution/HierarchyQuery?api-version=5.0-preview.1

StatusCode : 203 StatusDescription : Non-Authoritative Information

EDIT: Nevermind, it worked using the static MSA clientid and replyURL:

internal const string clientId = "872cd9fa-d31f-45e0-9eab-6e460a02d1f1";          //change to your app registration's Application ID, unless you are an MSA backed account
            internal const string replyUri = "urn:ietf:wg:oauth:2.0:oob";                     //change to your app registration's reply URI, unless you are an MSA backed account

 //PromptBehavior.RefreshSession will enforce an authn prompt every time. NOTE: Auto will take your windows login state if possible
            result = ctx.AcquireTokenAsync(azureDevOpsResourceId, clientId, new Uri(replyUri), promptBehavior).Result;
            Console.WriteLine("Token expires on: " + result.ExpiresOn);

            var bearerAuthHeader = new AuthenticationHeaderValue("Bearer", result.AccessToken);

// Headers
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("User-Agent", "ManagedClientConsoleAppSample");
            client.DefaultRequestHeaders.Add("X-TFS-FedAuthRedirect", "Suppress");
            client.DefaultRequestHeaders.Authorization = authHeader;


            //Get Organizations
            client.BaseAddress = new Uri("https://app.vssps.visualstudio.com/");
            HttpResponseMessage response1 = client.GetAsync("_apis/accounts").Result;

Upvotes: -1

Mister Iks
Mister Iks

Reputation: 195

We've been using "https://app.vssps.visualstudio.com/_apis/accounts" without specifying any API version and this returns all our accountnames

This is still working for us, but because of some other issues we have I'm adding the api version to all our api calls, however. For this I also run into the fact that https://learn.microsoft.com/en-us/rest/api/azure/devops/account/accounts/list?view=azure-devops-rest-5.0 requires an member or owner id.

Retrieving that needs an account/organization so it is a bit of a catch 22 situation.

For now I'll stay with just "https://app.vssps.visualstudio.com/_apis/accounts" I guess

Upvotes: 2

Matt
Matt

Reputation: 4065

If you load the current landing page, it displays all your organizations tied to your account. I assumed it had to get that information some way. I captured the network traffic and I believe you could get to the data you want using a system API call. However, it might change or might become unsupported without notice, so use at your own discretion.

You can get the information you want using this API:

Post https://dev.azure.com/{organization1}/_apis/Contribution/HierarchyQuery?api-version=5.0-preview.1

Body:

{
    "contributionIds": ["ms.vss-features.my-organizations-data-provider"],
    "dataProviderContext":
        {
            "properties":{}
        }
}

Response:

{
    "dataProviderSharedData": {},
    "dataProviders": {
        "ms.vss-web.component-data": {},
        "ms.vss-web.shared-data": null,
        "ms.vss-features.my-organizations-data-provider": {
            "organizations": [
                {
                    "id": "{redacted id}",
                    "name": "{organization1}",
                    "url": "https://{organization1}.visualstudio.com/"
                },
                {
                    "id": "{redacted id}",
                    "name": "{organization2}",
                    "url": "https://dev.azure.com/{organization2}/"
                }
            ],
            "createNewOrgUrl": "https://app.vsaex.visualstudio.com/go/signup?account=true"
        }
    } }

Upvotes: 15

PatrickLu-MSFT
PatrickLu-MSFT

Reputation: 51183

A REST API request/response pair can be separated into five components:

The request URI, in the following form:

VERB https://{instance}[/{team-project}]/_apis[/{area}]/{resource}?api-version={version}

instance: The Azure DevOps Services organization or TFS server you're sending the request to.

They are structured as follows: Azure DevOps Services: dev.azure.com/{organization}

The REST API's are organization specific. This is not documented at present. You could submit a feature request here: https://developercommunity.visualstudio.com/spaces/21/index.html

Our PM and product team will kindly review your suggestion. Sorry for any inconvenience.

As a workaround, you could use the API which captured from network traffic just as Matt mentioned.

Upvotes: 2

Related Questions