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.
Source: Purchase commitment tier pricing
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
Source: Autoscale Foundry Tools limits
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"}'
Source: Content Safety text quickstart
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 ( |
Document Intelligence |
Read, layout, and several prebuilt models (v4.0 containers for read and layout). |
Content Safety |
Text and image analysis (gated). |
Source: Foundry Tools containers
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}]'
Source: Enable diagnostic logging
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
Source: Enable diagnostic logging
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)"
Related pages
-
Monitoring and Observability covers Log Analytics, KQL and alerts in depth.
-
Cost Management covers budgets, cost analysis and tagging.
-
Resources, Endpoints and Authentication covers single-service kinds, which commitment tiers and disconnected containers need.
-
Choosing a Foundry Tool (or a Foundry Model) compares prebuilt tool costs with LLM token costs.