12

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/...
Matt
  • 3,658
  • 3
  • 14
  • 27
Kamil
  • 176
  • 2
  • 14

5 Answers5

12

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"
        }
    } }
Matt
  • 3,658
  • 3
  • 14
  • 27
  • Excellent, it is working just fine ! Thank you for the share – Kamil Feb 20 '19 at 10:46
  • What is {organization1} in the request? After auth the only thing I have is a token which I can use to make API requests. I don't have any organizations. How can I get the first one? – Andrew May 18 '20 at 17:21
  • It should just be any of the organizations. I would expect that you have to have at least one. More than likely it will be whatever by default is after dev.azure.com/ – Matt May 19 '20 at 14:48
  • Do you know what permission scope I need to provide to my PAT to call this API? – Yogeesh Seralathan Feb 01 '22 at 09:18
6

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.

Krzysztof Madej
  • 32,704
  • 10
  • 78
  • 107
Nikheel
  • 215
  • 4
  • 7
2

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.

PatrickLu-MSFT
  • 49,478
  • 5
  • 35
  • 62
1

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

Mister Iks
  • 165
  • 1
  • 4
  • 13
  • I'm getting `The remote server returned an error: (401) Unauthorized.` when attempting "https://app.vssps.visualstudio.com/_apis/accounts" calls. I'm using a WebClient and the standard headers requested by other AzDO REST APIs. – CrazyIvan1974 Mar 14 '20 at 11:50
-1

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;
Morten_564834
  • 1,479
  • 3
  • 15
  • 26