A personalized dashboard is stored in the Dataverse userform table; because your dashboard is visible in the app but absent from SQL 4 CDS, query userformid with type = 0 under the same user identity that owns or can access the dashboard.
The screenshot’s Assign action is also consistent with a user-owned dashboard: user dashboards can be assigned or shared, while organization-owned dashboards are stored in systemform and cannot be assigned or shared.^1^
SQL 4 CDS query
Run this first without a name filter:
SELECT
userformid,
name,
type,
ownerid,
owneridname,
owninguser,
owningteam,
createdon,
modifiedon
FROM userform
WHERE type = 0
ORDER BY name;
For userform, userformid is the primary ID, name is the primary name, and type = 0 means Dashboard; type = 103 means Power BI Dashboard.^2^
Then query the GUID from the dashboard URL directly, removing URL encoding and braces if present:
SELECT
userformid,
name,
type,
owneridname,
formxml,
formjson
FROM userform
WHERE userformid = '00000000-0000-0000-0000-000000000000';
The dashboard layout is held in formxml or formjson, depending on the dashboard representation.^2^
userquery and savedquery contain personal and system views/queries, not the dashboard record itself. Those views may be referenced by components inside the dashboard’s layout, but searching them for the dashboard ID is not expected to return the dashboard.
Dataverse Web API
The entity-set name is plural: userforms. Retrieve the URL’s dashboard ID directly:
GET [Organization URI]/api/data/v9.2/userforms(00000000-0000-0000-0000-000000000000)?$select=userformid,name,type,_ownerid_value,formxml,formjson
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Or list ordinary personalized dashboards:
GET [Organization URI]/api/data/v9.2/userforms?$select=userformid,name,type,_ownerid_value,createdon,modifiedon&$filter=type eq 0&$orderby=name
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Microsoft documents GET /userforms(<userformid>) and GET /userforms as the supported retrieve operations.^2^ Dataverse Web API queries support $select, $filter, and $orderby against an entity-set collection.^3^
If both queries return no row
The userform table is user-owned, and another user can view a dashboard only according to its access privileges.^1^ SQL 4 CDS and the Web API therefore return records available to their connection identity; they do not provide a separate unrestricted dashboard catalog.
Check these differences between the app and SQL 4 CDS/API sessions:
- Environment: both connections must target the same Dataverse environment.
- Identity: SQL 4 CDS may be connected as an administrator, application user, or another interactive user rather than the dashboard owner.
- Record access: the personal dashboard must be owned by or shared with the querying principal. A community case reports the same zero-row behavior when retrieving another user’s dashboards without the necessary access.^4^
If an integration must query as the owner, Dataverse Web API supports impersonation using the CallerObjectId header:
GET [Organization URI]/api/data/v9.2/userforms?$select=userformid,name,type&$filter=type eq 0
CallerObjectId: aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Use the owner’s Microsoft Entra object ID, not the systemuserid. The calling account needs the Act on Behalf of Another User privilege, and effective permissions are the intersection of the caller’s and impersonated user’s privileges.^5^
If a direct GET userforms(<dashboard-id>) still returns not found while the same identity can open it in the same environment, capture the complete dashboard URL and the Web API HTTP status/body. That will distinguish an ID mismatch from record-level access filtering.
References
- Analyze data with dashboards
- User Dashboard (UserForm) table/entity reference (Microsoft Dataverse)
- Use OData to query data
- How to fetch user owned dashboards for a different user???
- Impersonate another user by using the Web API