Pricing, Quotas, Containers and Monitoring

This content was generated with the assistance of AI and should be verified against the official documentation before being relied on in production.

See the section bibliography for the reference material consulted while preparing these pages.

This page targets Azure CLI 2.90.0, checked on 2026-10-06. Prices change often and differ by region, so this page describes the billing units and links the official pricing pages rather than quoting amounts. Limits are the defaults documented on each tool’s service limits page. Many can be raised with a support request.

Pricing

F0 vs S0

  • F0 (free) is available on single-service resources for most tools. It has a small monthly allowance (for example 5,000 Language text records, 2 million Translator characters, 5 audio hours of speech to text, 500 Document Intelligence pages) and low rate limits. One F0 resource per tool per subscription. Good for prototypes, never for production.

  • S0 (standard) is pay-as-you-go. A Foundry resource (AIServices) only offers S0.

Billing units per tool

Tool Billing unit

Speech to text

Audio hours (real-time, fast and batch priced differently). Custom speech adds endpoint hosting per hour.

Text to speech

Characters synthesized (neural and HD voices priced differently). Custom voice adds training and hosting.

Voice Live

Per token, by tier (Pro, Standard, Lite).

Translator

Characters for NMT text and document translation. Tokens for LLM translation.

Language

Text records of up to 1,000 characters each.

Vision, Face

Transactions (one image and one feature per transaction).

Document Intelligence

Pages, priced per model family (read, prebuilt, custom) and add-on.

Content Understanding

Content extraction per page, minute or image, plus the tokens of the models you bring for field extraction.

Content Safety

Text records (1,000 characters) and images.

Azure AI Search

Search units per hour (separate resource), plus semantic ranker queries and agentic retrieval tokens.

Commitment tiers

A commitment tier is a prepaid monthly quantity (for example a fixed number of audio hours or pages) at a lower unit price, with overage at a discounted rate. Commitment tiers are purchased on single-service resources (SpeechServices, TextTranslation, TextAnalytics, FormRecognizer and so on), not on the Foundry resource. They are also how disconnected containers are billed.

Estimate costs with the Azure pricing calculator and the Foundry Tools pricing pages.

Quotas and rate limits

S0 resources start at about 10 transactions per second (TPS) per tool, with higher defaults on some tools:

Tool Default limits (S0)

Language

Up to 1,000 requests per minute; sync requests take up to 5 documents (25 for some features, 1,000 for language detection) of 5,120 characters each.

Translator

50,000 characters per request (NMT). 2 million characters per hour per resource (S1 rate).

Speech to text

100 concurrent real-time requests. Fast transcription: files up to 500 MB and 5 hours.

Document Intelligence

15 TPS for analyze; 50 TPS for get-result polling.

Content Safety

1,000 requests per 10 seconds for text and image analysis.

Vision Image Analysis

30 TPS (S1).

Autoscale

Autoscale (dynamicThrottlingEnabled) lets a resource temporarily exceed its default rate limit when the backend has capacity. It doesn’t guarantee capacity, so you still need retries.

az resource update \
  --ids "$(az cognitiveservices account show --name "$FOUNDRY" --resource-group "$RG" --query id -o tsv)" \
  --set properties.dynamicThrottlingEnabled=true

Handling 429

When you exceed a limit, the tool returns 429 Too Many Requests, usually with a Retry-After header. The Azure SDKs retry automatically with exponential backoff. Tune their retry policy rather than writing your own loop:

from azure.ai.textanalytics import TextAnalyticsClient
from azure.identity import DefaultAzureCredential

client = TextAnalyticsClient(
    endpoint="https://foundry-bookshelf.cognitiveservices.azure.com/",
    credential=DefaultAzureCredential(),
    retry_total=6,           # attempts
    retry_backoff_factor=1.0,  # seconds, exponential
    retry_backoff_max=60,
)
using Azure.AI.TextAnalytics;
using Azure.Core;
using Azure.Identity;

var options = new TextAnalyticsClientOptions();
options.Retry.Mode = RetryMode.Exponential;
options.Retry.MaxRetries = 6;
options.Retry.Delay = TimeSpan.FromSeconds(1);
options.Retry.MaxDelay = TimeSpan.FromSeconds(60);

var client = new TextAnalyticsClient(
    new Uri("https://foundry-bookshelf.cognitiveservices.azure.com/"),
    new DefaultAzureCredential(), options);

For REST calls, honor Retry-After:

curl -s -o /dev/null -w "%{http_code} %header{retry-after}\n" \
  "https://$FOUNDRY.cognitiveservices.azure.com/contentsafety/text:analyze?api-version=2024-09-01" \
  -H "Authorization: Bearer $(az account get-access-token --resource https://cognitiveservices.azure.com --query accessToken -o tsv)" \
  -H "Content-Type: application/json" -d '{"text":"hello"}'

Containers

Many tools ship as Docker containers from mcr.microsoft.com/azure-cognitive-services/. The container runs the model on your hardware, so data never leaves your network. A connected container still sends usage metering (not your data) to an Azure resource for billing.

Tool Containers

Speech

Speech to text, custom speech to text, neural text to speech, fast transcription (preview), language identification.

Language

NER, PII, sentiment, key phrases, language detection, CLU, Text Analytics for health, summarization.

Translator

Text translation and document translation (gated).

Vision

Read OCR (read).

Document Intelligence

Read, layout, and several prebuilt models (v4.0 containers for read and layout).

Content Safety

Text and image analysis (gated).

Disconnected containers run fully offline, for air-gapped sites. They need an approved application form, a commitment tier on a single-service resource, and a license file downloaded once while connected. Usage is recorded locally and uploaded later.

Typical uses are hospitals that can’t send patient audio or notes to the cloud, factories with poor connectivity, and defense or government sites with air-gapped networks.

Run a connected Language container:

docker run --rm -it -p 5000:5000 --memory 8g --cpus 1 \
  mcr.microsoft.com/azure-cognitive-services/textanalytics/language:latest \
  Eula=accept \
  Billing="https://foundry-bookshelf.cognitiveservices.azure.com/" \
  ApiKey="$LANGUAGE_KEY"

curl -s "http://localhost:5000/language/:analyze-text?api-version=2024-11-01" \
  -H "Content-Type: application/json" \
  -d '{"kind":"LanguageDetection","analysisInput":{"documents":[{"id":"1","text":"Bonjour"}]}}'

Eula, Billing and ApiKey are required. Containers need a key: they can’t use Entra ID for billing, so a resource with disableLocalAuth can’t meter containers.

Monitoring

Diagnostic settings

Send logs and metrics to Log Analytics. The categories are Audit (control-plane and key access), RequestResponse (one row per data-plane call, without request bodies) and AllMetrics.

az monitor diagnostic-settings create \
  --name diag-foundry \
  --resource "$(az cognitiveservices account show --name "$FOUNDRY" --resource-group "$RG" --query id -o tsv)" \
  --workspace "$(az monitor log-analytics workspace show --resource-group "$RG" --workspace-name law-bookshelf --query id -o tsv)" \
  --logs '[{"category":"Audit","enabled":true},{"category":"RequestResponse","enabled":true}]' \
  --metrics '[{"category":"AllMetrics","enabled":true}]'

Requests and errors per operation over the last day:

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where Category == "RequestResponse"
| where TimeGenerated > ago(1d)
| summarize calls = count(), throttled = countif(ResultSignature == "429"),
            errors = countif(toint(ResultSignature) >= 500), p95_ms = percentile(DurationMs, 95)
  by OperationName, bin(TimeGenerated, 1h)
| order by TimeGenerated desc

Usage

az cognitiveservices account list-usage --name "$FOUNDRY" --resource-group "$RG" --output table

Alerts

The ClientErrors metric counts every 4xx response (400, 401, 403, 404, 429), so a metric alert on it fires on bad requests and auth failures as well as throttling. To alert on throttling only, use a log search alert on the RequestResponse logs from the diagnostic setting above, filtered to ResultSignature == "429":

az monitor scheduled-query create \
  --name alert-foundry-429 --resource-group "$RG" \
  --scopes "$(az monitor log-analytics workspace show --resource-group "$RG" --workspace-name law-bookshelf --query id -o tsv)" \
  --condition "count 'Throttled' > 50" \
  --condition-query Throttled="AzureDiagnostics | where ResourceProvider == 'MICROSOFT.COGNITIVESERVICES' and Category == 'RequestResponse' and ResultSignature == '429'" \
  --window-size 5m --evaluation-frequency 5m \
  --action-groups "$(az monitor action-group show --resource-group "$RG" --name ag-bookshelf-oncall --query id -o tsv)"

Budgets and cost alerts per resource group are covered on Cost Management.

Clean up

Remove the alert rule and the diagnostic setting this page created. The Log Analytics workspace and the action group belong to the wider Bookshelf setup, so they stay.

az monitor scheduled-query delete --name alert-foundry-429 --resource-group "$RG" --yes

az monitor diagnostic-settings delete --name diag-foundry \
  --resource "$(az cognitiveservices account show --name "$FOUNDRY" --resource-group "$RG" --query id -o tsv)"