Enable metered APIs and services in Microsoft Graph not working for evaluation mode - I am trying to get the transcripts, of Team calls but I get a 402 error.

Anis Achkar 40 Reputation points
2025-03-18T10:37:49.95+00:00

1. The reason I am creating the ticket:

1.1 The end goal:

  • Link my subscription to an app registration to start using metered API and services in Microsoft Graph.
  • To be more precise, I would like to be able to call the {userId}/onlineMeetings/{online-meeting-id}/transcripts/{transcript-id}/content graph api call without getting the "PaymentRequired" error when the 600 minutes per month per tenant per app is exceeded.

1.2 The error I am receiving:

{
    "error": {
        "code": "PaymentRequired",
        "message": "Evaluation capacity for the month has exceeded. To continue beyond the evaluation limits complete billing onboarding. Visit https://docs.microsoft.com/en-us/graph/teams-licenses for API specific requirements.",
        "innerError": {
            "date": "2025-03-17T09:32:37",
            "request-id": "9862e5d3-a634-4aee-93c2-0a5465aadd28",
            "client-request-id": "9862e5d3-a634-4aee-93c2-0a5465aadd28"
        }
    }
}
 

2. The actual steps I went through:

User's image

2.2 I Enable metered APIs and services in Microsoft Graph

2.2.1 Covering the known limitations

There are 3 known limitations that are mentioned in the documentation: https://learn.microsoft.com/en-us/graph/metered-api-setup

  1. Metered APIs and services in Microsoft Graph are currently available only in the Microsoft global environment and not in national cloud deployments, including Microsoft 365 GCC deployments accessed through the worldwide Microsoft Graph endpoint. For details about national clouds, see National cloud deployments.
  2. The target application must be a confidential client application (for example, web application, web API, or daemon/service). Public client applications (desktop and mobile applications) aren't supported.
  3. Azure managed identities aren't supported to call metered APIs. For more information, see Azure services that support managed identities.
  1. The resource group we are using is in France Central. Actually, all the resources we have are in France Central, so this shouldn't be a problem. ✅
  2. The target application must be a confidential client application. The application used, has a client secret and is not using public client flows. ✅
  3. We tried calling the API with openid 0auth2 and with client id client secret, but still didn't work. ✅

So in a nutshell, unless I missed something, we cover all the known limitations

2.2.2 Covering the pre-requisites

  1. Create an application registration in Microsoft Entra ID for the application that will be making calls to the metered Microsoft 365 APIs and services.
  2. If you don't have an Azure subscription, create one now in the tenant that includes the application registration.
  3. You must have contributor permissions to the active Azure subscription you want to use, as well as application owner permissions for the target application registration.
  1. Done ✅
  2. Done ✅
  3. Done ✅

➡️ So in a nutshell, we have all the pre-requisites.

2.2.3 Enable an application

Here is what needs to be done:

Copy the following command into your preferred command-line interface (PowerShell, Bash, or Windows command prompt), replace the parameters listed in the table with your own values, and type <Enter>. If the command succeeds, the response includes a JSON representation of the newly created billing resource. PowerShell: az graph-services account create --resource-group myRG --resource-name myGraphAppBilling --subscription mySubscriptionGUID --location global --app-id AppRegGUID

And a positive outcome should look like this:

 {
  "extendedLocation": null,
  "id": "/subscriptions/<mySubscriptionGUID>/resourceGroups/<myRG>/providers/Microsoft.GraphServices/accounts/<myGraphAppBilling>",
  "identity": null,
  "kind": null,
  "location": "Global",
  "managedBy": null,
  "name": "<myGraphAppBilling>",
  "plan": null,
  "properties": {
    "appId": "<myAppGUID>",
    "billingPlanId": "123e4567-e89b-12d3-a456-426655440000",
    "provisioningState": "Succeeded"
  },
  "resourceGroup": "<myRG>",
  "sku": null,
  "systemData": {
    "createdAt": "2023-01-31T00:12:20.7893671Z",
    "createdByType": "User",
    "lastModifiedAt": "2023-01-31T00:12:20.7893671Z",
    "lastModifiedByType": "User"
  },
  "tags": null,
  "type": "microsoft.graphservices/accounts"
}

Here is the outcome that I received: which looks like the one on the documentation ✅


[
    {
        "id": "/subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.GraphServices/accounts/<graph_app_billing>",
        "location": "global",
        "name": "<graph_app_billing>",
        "properties": {
            "appId": "<app_guid>",
            "billingPlanId": "<billing_plan_id>",
            "provisioningState": "Succeeded"
        },
        "resourceGroup": "<rg_name>",
        "systemData": {
            "createdAt": "2025-03-10T14:13:00.1834193Z",
            "createdByType": "User",
            "lastModifiedAt": "2025-03-10T15:04:10.1041147Z",
            "lastModifiedByType": "User"
        },
        "type": "microsoft.graphservices/accounts"
    }
]

➡️ So in a nuthsell our outcome is same as the one described in the documentation.

2.2.4 Verify Set-up

I ran the following command as requested

az resource show --resource-group myRg --name myGraphAppBilling --resource-type Microsoft.GraphServices/accounts

And got the following result.

[
  {
    "changedTime": "2025-03-10T14:23:00.815465+00:00",
    "createdTime": "2025-03-10T14:13:00.021207+00:00",
    "extendedLocation": null,
    "id": "/subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.GraphServices/accounts/<graph_app_billing>",
    "identity": null,
    "kind": null,
    "location": "global",
    "managedBy": null,
    "name": "<graph_app_billing>",
    "plan": null,
    "properties": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "<rg_name>",
    "sku": null,
    "systemData": {
      "createdAt": "2025-03-10T14:13:00.1834193Z",
      "createdByType": "User",
      "lastModifiedAt": "2025-03-10T14:18:47.0456159Z",
      "lastModifiedByType": "User"
    },
    "tags": null,
    "type": "Microsoft.GraphServices/accounts"
  }
]

Finally I ran the following command as specified in the doc:

az resource show --resource-group myRg --name myGraphAppBilling --resource-type Microsoft.GraphServices/accounts

And I got the following:

{
  "extendedLocation": null,
  "id": "/subscriptions/<subscription_id>/resourceGroups/<rg_name>/providers/Microsoft.GraphServices/accounts/<my_graph_app_billing>",
  "identity": null,
  "kind": null,
  "location": "global",
  "managedBy": null,
  "name": "<my_graph_app_billing>",
  "plan": null,
  "properties": {
    "appId": "<app_guid>",
    "billingPlanId": "billing_plan_id",
    "provisioningState": "Succeeded"
  },
  "resourceGroup": "<rg_name>",
  "sku": null,
  "systemData": {
    "createdAt": "2025-03-10T14:13:00.1834193Z",
    "createdByType": "User",
    "lastModifiedAt": "2025-03-10T15:04:10.1041147Z",
    "lastModifiedByType": "User"
  },
  "tags": null,
  "type": "microsoft.graphservices/accounts"
}

➡️ So in a nuthsell our outcome is same as the one described in the documentation.

The final result

  • Even after enabling metered API and services, we get the same error (Its been more than 2 weeks now)
  • In Azure I can't find the Service name: Microsoft Graph Services under cost management even though I am suppose to (mentioned in this doc: https://learn.microsoft.com/en-us/graph/teams-licenses in this section: "View the costs billed for the metered Microsoft Teams APIs")
  • User's image

➡️ Can someone please help out? Am I missing something here? Or is there something missing on Microsoft's side.

Microsoft Graph
Microsoft Graph
A Microsoft programmability model that exposes REST APIs and client libraries to access data on Microsoft 365 services.
13,479 questions
0 comments No comments
{count} votes

1 answer

Sort by: Most helpful
  1. Vivek Munka - MSFT 10 Reputation points Microsoft External Staff
    2025-03-26T20:40:21.08+00:00

    Hi,

    Thank you for reaching out to Microsoft.

    As per the ask, you would like to be able to call the {userId}/onlineMeetings/{online-meeting-id}/transcripts/{transcript-id}/content graph API call without getting the "PaymentRequired" error when the 600 minutes per month per tenant per app is exceeded.

    I have reviewed the steps which you have mentioned in order to enable metered API for your application and see that all known limitations have been covered to avoid the '402' error.

    There are 3 known limitations that are mentioned in the documentation: https://learn.microsoft.com/en-us/graph/metered-api-setup

    1. Metered APIs and services in Microsoft Graph are currently available only in the Microsoft global environment and not in national cloud deployments, including Microsoft 365 GCC deployments accessed through the worldwide Microsoft Graph endpoint. For details about national clouds, see National cloud deployments.
    2. The target application must be a confidential client application (for example, web application, web API, or daemon/service). Public client applications (desktop and mobile applications) aren't supported.
    3. Azure managed identities aren't supported to call metered APIs. For more information, see Azure services that support managed identities.

    I believe the second limitation mentioned above might be the reason for the '402' error in your case. Please follow the below steps to verify if the known limitation has been hit:

    1. To verify you are not using a 'Public Client Application', please fetch the access token used to call the API : {userId}/onlineMeetings/{online-meeting-id}/transcripts/{transcript-id}/content
    2. Decode the access token on jwt.ms.
    3. Check the 'appidacr' value on the access token. If the 'appidacr' value is '0', this indicates the application is using a public client flow.

    Please see the documentation for access token and check the 'appidacr' description. https://learn.microsoft.com/en-us/entra/identity-platform/access-token-claims-reference

    Please see the below documentation for Public and Confidential Client application.

    https://learn.microsoft.com/en-us/entra/identity-platform/msal-client-applications

    Also refer the documentation for the flow

    https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-client-creds-grant-flow

    Even after following the provided suggestion, the issue still persists, I recommend you raise a support case with Microsoft Graph, a Support Engineer will be able to look into this issue and assist you better. You can raise support ticket from New support request - Microsoft Entra admin center or https://admin.microsoft.com/#/support/requests.

    Hope this helps.

    If the answer is helpful, please click Accept Answer and kindly upvote it. If you have any further questions about this answer, please click **Comment. ** Thank you for choosing Microsoft.Hi,

    Thank you for reaching out to Microsoft.

    As per the ask, you would like to be able to call the {userId}/onlineMeetings/{online-meeting-id}/transcripts/{transcript-id}/content graph API call without getting the "PaymentRequired" error when the 600 minutes per month per tenant per app is exceeded.

    I have reviewed the steps which you have mentioned in order to enable metered API for your application and see that all known limitations have been covered to avoid the '402' error.

    There are 3 known limitations that are mentioned in the documentation: https://learn.microsoft.com/en-us/graph/metered-api-setup

    1. Metered APIs and services in Microsoft Graph are currently available only in the Microsoft global environment and not in national cloud deployments, including Microsoft 365 GCC deployments accessed through the worldwide Microsoft Graph endpoint. For details about national clouds, see National cloud deployments.
    2. The target application must be a confidential client application (for example, web application, web API, or daemon/service). Public client applications (desktop and mobile applications) aren't supported.
    3. Azure managed identities aren't supported to call metered APIs. For more information, see Azure services that support managed identities.

    I believe the second limitation mentioned above might be the reason for the '402' error in your case. Please follow the below steps to verify if the known limitation has been hit:

    1. To verify you are not using a 'Public Client Application', please fetch the access token used to call the API : {userId}/onlineMeetings/{online-meeting-id}/transcripts/{transcript-id}/content
    2. Decode the access token on jwt.ms.
    3. Check the 'appidacr' value on the access token. If the 'appidacr' value is '0', this indicates the application is using a public client flow.

    Please see the documentation for access token and check the 'appidacr' description.
    https://learn.microsoft.com/en-us/entra/identity-platform/access-token-claims-reference

    Please see the below documentation for Public and Confidential Client application.

    https://learn.microsoft.com/en-us/entra/identity-platform/msal-client-applications

    Also refer the documentation for the flow

    https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-client-creds-grant-flow

    Even after following the provided suggestion, the issue still persists, I recommend you raise a support case with Microsoft Graph, a Support Engineer will be able to look into this issue and assist you better. You can raise support ticket from New support request - Microsoft Entra admin center or https://admin.microsoft.com/#/support/requests.

    Hope this helps.

    If the answer is helpful, please click Accept Answer and kindly upvote it. If you have any further questions about this answer, please click Comment.

    Thank you for choosing Microsoft.

    Similar question: https://learn.microsoft.com/en-us/answers/questions/2236182/enable-metered-apis-and-services-in-microsoft-grap?page=1&orderby=helpful&translated=false#answers

    1 person found this answer helpful.

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.