This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Download Microsoft Edge
More info about Internet Explorer and Microsoft Edge
Your client application may connect to multiple Dataverse environments. Use the Global Discovery Service to find which environments the user of your application can access.
In
Power Apps
you can select from a list of environments available to you. The Global Discovery Service is the source of that data. Within your own app, you can provide a select control to allow users to choose which environment they want to use. Their choice will determine which environment your app must connect to.
With Dataverse, server and organization allocation may change as part of datacenter management and load balancing. Therefore, the Global Discovery Service provides a way to discover which server is serving an instance at a given time.
More information:
Choose an environment
Environments overview
Global Discovery Service
The Global Discovery service, sometimes called GDS, is a set of OData v4.0 endpoints that are available for 5 different clouds.
While both the Dataverse Web API and the Global Discovery Service are OData v4.0 endpoints, they are separate endpoints with different behaviors.
The following table provides the GDS location for each cloud.
Cloud
URL and Description
Commercial
https://globaldisco.crm.dynamics.com
Used by private sector companies. This is the most commonly used cloud.
https://globaldisco.crm9.dynamics.com
Government Community Cloud. Used by public sector employees and contractors in the United States.
https://globaldisco.crm.microsoftdynamics.us
Used by United States Federal government employees and contractors. Also known as GCC High.
https://globaldisco.crm.appsplatform.us
Used by Unites States Department of Defense employees and contractors.
China
https://globaldisco.crm.dynamics.cn
Used by companies in China to comply with regulatory requirements.
More information:
Dynamics 365 US Government
Power Platform and Dynamics 365 apps - operated by 21Vianet in China
Limitations
The Global Discovery Service does not return information where:
The user's account is disabled.
Users have been filtered out based on an instance security group.
The user has access as a result of being a delegated administrator.
If the calling user has access to no instances, the response simply returns an empty list.
Authentication
The calling user must aquire an OAuth 2.0 token from Azure Active Directory (AD), and then add that token in the Authorization header of the API calls. More information:
Use OAuth authentication with Microsoft Dataverse
.
CORS support
The Discovery Service supports the CORS standard for cross-origin access. For more information about CORS support see
Use OAuth with Cross-Origin Resource Sharing to connect a Single-Page Application
.
Use Postman to connect to the Global Discovery Service
You can use the same approach described for the Dataverse Web API here:
Set up a Postman environment
, but instead of the environment variables described in that topic, use the following to access the commercial cloud.
Variable
Initial Value
Use
{{globalDiscoUrl}}
as the
Request URL
and in the
Authorization
tab, click
Get New Access Token
.
You should now be able to query the Global Discovery Service using Postman.
More information:
YouTube: Get started using Postman with Microsoft Dataverse Web API
Service Documents
To access the Global Discovery service for each cloud, append
/api/discovery/v2.0/
to the URL. Perform a
GET
request on this url to view the service document, which contains only a single EntitySet:
Instances
.
Append
$metadata
to the cloud URL and send a
GET
request to view the CSDL (Common Schema Definition Language) service document. This XML document provides details on the
Instance
entity and the alternate keys defined for it.
Instance EntitySet
The following table describes the properties of the
Instance
Entity from the $metadata CDSL Service document.
Property
Description
DatacenterName
String
The name of the data center where the instance is located. This value is typically null.
EnvironmentId
String
The EnvironmentId for the instance.
FriendlyName
String
A name for the instance that is displayed in powerapps.com and other client applications that allow selecting instances.
The OrganizationId for the environment.
IsUserSysAdmin
Boolean
Whether the calling user has the system administrator role for the environment.
LastUpdated
DateTimeOffset
When the environment was last updated.
OrganizationType
Int32
The type of the organization. Values correspond to the
OrganizationType EnumType
Purpose
String
Information for the purpose provided when the environment was created.
Region
String
A 2-3 letter code for region where the environment is located.
SchemaType
String
For internal use only.
State
Int32
Whether the organization is
0
:enabled or
1
:disabled.
StatusMessage
Int32
One of the following values:
0
:
InstanceLocked
1
:
PendingServiceInstanceMove
2
:
InstanceFailed
3
:
Provisioning
4
:
InActiveOrganizationStatus
5
:
NewInstance
6
:
InstancePickerReady
TenantId
The Id of the tenant associated to the instance
TrialExpirationDate
DateTimeOffset
The date when the trial period for the instance expires.
UniqueName
String
The Unique Name for the instance.
UrlName
String
The name used for the URL.
Version
String
The current version of the environment.
String
The application url for the environment.
You can use these property names with the OData
$select
query parameter to retrieve just the data you need. In most cases, all you will need are the
FriendlyName
and
ApiUrl
properties. For example:
Request
GET https://globaldisco.crm.dynamics.com/api/discovery/v2.0/Instances?$select=ApiUrl,FriendlyName HTTP/1.1
Authorization: Bearer <truncated for brevity>
Response
HTTP/1.1 200 OK
Content-Length: 625
Content-Type: application/json; odata.metadata=minimal
odata-version: 4.0
"@odata.context":"https://10.0.1.76:20193/api/discovery/v2.0/$metadata#Instances(ApiUrl,FriendlyName)",
"value":[
"ApiUrl":"https://yourorganization.api.crm.dynamics.com",
"FriendlyName":"Your Organization"
Use the FriendlyName
property for your application UI so the user will recognize the name of the environment. Use the ApiUrl
to connect to Dataverse.
The rest of the properties are primarily for filtering.
Filtering
There are two ways you can filter the instances returned:
Using key values
Use OData $filter
query options
Use one of the key values
You can use the Id
or UniqueName
value to filter the list to return a only the specified instance.
Unlike the Dataverse Web API, the Global Discovery Service doesn't provide for retrieving a specific Instance
using the Id
or any of the alternate keys defined for it. GDS always returns an array of values.
Both of these queries will an array with a single item:
GET https://globaldisco.crm.dynamics.com/Instances(6bcbf6bf-1f2a-4ab9-9901-2605b314d72d)?$select=ApiUrl,FriendlyName,Id,UniqueName
GET https://globaldisco.crm.dynamics.com/Instances(UniqueName='unq6bcbf6bf1f2a4ab999012605b314d')?$select=ApiUrl,FriendlyName,Id,UniqueName
You can also use any of the following alternate key values: Region
, State
, Version
to filter on specific values. For example, use the query below to return only those instances where the Region is NA
representing North America.
GET https://globaldisco.crm.dynamics.com/Instances(Region='NA')?$select=FriendlyName,Region,State,Version,ApiUrl
Use OData $filter query options
You can use OData $filter
query options as well with any of the properties that apply, including the alternate key properties.
You can use the following comparison, logical and grouping operators:
Operator
Description
Example
Logical and
$filter=TrialExpirationDate gt 2022-07-14T00:00:00Z and IsUserSysAdmin eq true
Logical or
$filter=TrialExpirationDate gt 2022-07-14T00:00:00Z or IsUserSysAdmin eq true
Logical negation
$filter=not contains(Purpose,'test')
Grouping Operators
Unlike the Dataverse Web API, Global Discovery Service search strings are case sensitive.
Use Dataverse ServiceClient
For .NET applications you can use Dataverse.Client.ServiceClient.DiscoverOnlineOrganizationsAsync Method to call the Global Discovery Services.
// Set up user credentials
var creds = new System.ServiceModel.Description.ClientCredentials();
creds.UserName.UserName = userName;
creds.UserName.Password = password;
//Call DiscoverOnlineOrganizationsAsync
DiscoverOrganizationsResult organizationsResult = await ServiceClient.DiscoverOnlineOrganizationsAsync(
discoveryServiceUri: new Uri($"{cloudRegionUrl}/api/discovery/v2.0/Instances"),
clientCredentials: creds,
clientId: clientId,
redirectUri: new Uri(redirectUrl),
isOnPrem: false,
authority: "https://login.microsoftonline.com/organizations/",
promptBehavior: PromptBehavior.Auto);
return organizationsResult;
While the DiscoverOnlineOrganizationsAsync
method uses the same OData endpoint and enables that it be passed in the discoveryServiceUri
parameter, it does not return data in the shape of an Instance. Data is returned as an DiscoverOrganizationsResult Class that includes a OrganizationDetailCollection Property which contains a collection of OrganizationDetail Class instances. This class contains the same information as the Instance
types returned by the OData service.
While the DiscoverOnlineOrganizationsAsync.discoveryServiceUri
parameter accepts a URL to the Global Discovery Service, any $select
or $filter
query options used will be ignored. The DiscoverOnlineOrganizationsAsync.discoveryServiceUri
parameter is optional and if not provided will default to the Commercial cloud.
Use CrmServiceClient
For .NET Framework applications you can continue to use the CrmServiceClient.DiscoverGlobalOrganizations Method to call the Global Discovery Service.
// Set up user credentials
var creds = new System.ServiceModel.Description.ClientCredentials();
creds.UserName.UserName = userName;
creds.UserName.Password = password;
// Call to get organizations from global discovery
var organizations = CrmServiceClient.DiscoverGlobalOrganizations(
discoveryServiceUri:new Uri($"{cloudRegionUrl}/api/discovery/v2.0/Instances"),
clientCredentials: creds,
user: null,
clientId: clientId,
redirectUri: new Uri(redirectUrl),
tokenCachePath: "",
isOnPrem: false,
authority: string.Empty,
promptBehavior: PromptBehavior.Auto);
return organizations.ToList();
Like the ServiceClient.DiscoverOnlineOrganizationsAsync
method, the CrmServiceClient.DiscoverGlobalOrganizations
method also does not return data as an Instance. It returns a OrganizationDetailCollection which contains a collection of OrganizationDetail Class instances that contains the same information as the Instance
types returned by the OData service.
See Also
Sample: Global Discovery Service Sample (C#)
Sample: Access the Discovery service using CrmServiceClient
Sample: Blazor WebAssembly with Global Discovery