Azure OpenAI and Amazon Bedrock do not appear as one "AI" line on the bill. They appear as meters and usage types per model, token type, deployment type and capacity model. Azure OpenAI cost allocation starts with reading those fields, then establishing which resource, profile or identity made the call. The bill cannot tell you which product feature or customer was behind it; for that you need structure and tags at resource level, plus your own logs.
What the bill shows, and what it does not
Both providers charge by model, token type (input, output, cache, batch), deployment type or region, and reserved capacity. Each line belongs to a resource, an account or an identity. The bill does not carry the prompt, the individual request, retries after errors, the feature that triggered the call or the customer. Anything you want to know about those must be built into the structure before the call or logged by the application.
Reading Azure OpenAI in cost details
Microsoft lists Azure OpenAI in Cost Management under the Cognitive Services service classification; to filter across a subscription, use Service tier: Azure OpenAI (MeterSubCategory in the export). The Azure Retail Prices API already names the same service Foundry Models, with products such as Azure OpenAI and Azure OpenAI GPT5. Check which MeterCategory value your export carries before you hard-code it in a query.
The meter name carries model, token type and deployment type. Examples from the Retail Prices API for Sweden Central:
gpt 4.1 Inp glbl Tokens,gpt 4.1 Outp Data Zone Tokens,gpt 4.1 cached Inp regnl Tokens,gpt 4.1 Batch Inp glbl Tokens, unit 1KGPT 5.1 inp Gl 1M Tokens,GPT 5.1 cd inp Dz 1M Tokens, unit 1MProvisioned Managed Global Unit,Provisioned Managed Data Zone Unit,Provisioned Managed Regional Unit, unit 1/Hour
Abbreviations are inconsistent (glbl, Gl; Data Zone, DZone, Dz; regnl) and the unit switches between a thousand and a million tokens. Maintain a mapping table from meter to model, token type and deployment type rather than parsing names with a regex.
Deployment types determine where data is processed and what you pay: Global (may be processed in any Azure region), Data Zone (only within the US, EU or APAC zone; the EU zone follows the EU Data Boundary and can include EFTA countries such as Norway and Switzerland) and Standard or Regional Provisioned (within the Azure geography you choose). In Germany West Central, the Retail Prices API currently lists only Global and Data Zone meters for GPT-4.1. Which option is acceptable is a question for your data protection concept, not the price list.
Provisioned throughput (PTU) is charged per deployed PTU per hour, prorated; a deployment cannot be paused and billing stops only when it is deleted. Reservations run for one month or one year, bought separately for Global, Data Zone and Regional; they are not matched by model or deployment, and PTUs beyond the reservation are charged at the hourly rate. Fine-tuned models add an hourly hosting charge even when nobody calls them.
Partner models billed through Azure Marketplace appear as meters under "Global" resources in the format model-name-GUID, cannot be paid with Azure Prepayment and carry no project tag.
Reading Amazon Bedrock in CUR 2.0
In CUR 2.0, AWS sets product_product_family to the unified value Amazon Bedrock for Bedrock line items. For Bedrock, the product map column holds the keys provider, model, inference_type (such as input tokens, output tokens) and feature (such as On-Demand, Batch); in Cost Explorer the filter is Product attribute, with data from 1 September 2026. The AWS Price List spreads Bedrock across several offers (AmazonBedrock, AmazonBedrockService, AmazonBedrockFoundationModels), so a filter on a single line_item_product_code falls short.
Usage types follow the pattern region, model, token type: for example EUC1-NovaPro-input-tokens, EUC1-NovaPro-output-tokens, EUC1-NovaPro-input-tokens-batch and EUC1-NovaPro-cache-read-input-token-count in eu-central-1. Service tiers (Reserved, Priority, Standard, Flex) show up as suffixes such as -priority or -flex. Provisioned Throughput is billed hourly per model unit, with no commitment, one month or six months, until you delete it: EUC1-TitanEmbeddingsG1-Text-ProvisionedThroughput-1month-ModelUnits.
Watch for this: AWS issues an AWS Marketplace bill for certain models because the model provider is the seller. AWS states, for example, that Anthropic services on Bedrock are sold by Anthropic. These lines carry bill_billing_entity = 'AWS Marketplace', product names in the Price List such as "Claude Sonnet 4.5 (Amazon Bedrock Edition)" and usage types such as EUC1-MP:EUC1_InputTokenCount-Units. Check whether your credits cover them: the AWS Promotional Credit terms exclude Marketplace unless AWS authorises otherwise.
Query sketches for both providers
For the Azure cost details export (column names vary slightly in spelling by agreement type):
SELECT
ResourceId,
MeterSubCategory,
MeterName,
UnitOfMeasure,
PricingModel,
ChargeType,
SUM(Quantity) AS quantity,
SUM(CostInBillingCurrency) AS cost
FROM azure_cost_details
WHERE MeterCategory IN ('Cognitive Services', 'Foundry Models')
GROUP BY ResourceId, MeterSubCategory, MeterName, UnitOfMeasure, PricingModel, ChargeType
ORDER BY cost DESC;
For CUR 2.0 in Athena:
SELECT
bill_billing_entity,
product['provider'] AS model_provider,
product['model'] AS model,
product['inference_type'] AS inference_type,
product['feature'] AS serving_mode,
line_item_usage_type,
line_item_iam_principal,
SUM(line_item_usage_amount) AS usage_amount,
SUM(line_item_unblended_cost) AS unblended_cost
FROM cur2
WHERE (product_product_family = 'Amazon Bedrock'
OR product['product_name'] LIKE '%(Amazon Bedrock Edition)%')
AND bill_billing_period_start_date = TIMESTAMP '2026-10-01 00:00:00'
GROUP BY 1, 2, 3, 4, 5, 6, 7
ORDER BY unblended_cost DESC;
line_item_iam_principal is populated only when you include caller identity in a new CUR 2.0 export; existing exports do not gain it retroactively. AWS CUR 2.0 or FOCUS explains how the two exports differ.
Preparing allocation: resources, profiles and tags
| Question | Azure | AWS | Limit |
|---|---|---|---|
| Which application? | Separate Foundry resource or deployment per application; Cost analysis by deployment or project tag (preview) | Application inference profile with tags (InvokeModel, Converse) or Project on bedrock-mantle (Responses, Chat Completions) | One profile per model; grain is usage type and tag |
| Which team or identity? | Subscription, resource group, resource tags | IAM principal and iamPrincipal/ tags | A shared gateway role hides individual users |
| Which request or customer? | Application logs, Azure Monitor metrics by ModelDeploymentName | Invocation logs with requestMetadata | An estimate, not invoice evidence |
| Is capacity used? | PTU hours against token metrics | Model unit hours against invocations | Idle time is still cost |
AWS cost allocation tags apply only from the moment they are activated. A backfill of up to twelve months helps only if the tag was already on the resource at the time. Set the structure up before a feature launches, not after the first large bill. If you will later report AI cost per customer, start from the metric in Cloud cost per customer.
Common mistakes
- Searching Cost analysis for an "Azure OpenAI" service and finding nothing, because it sits under Cognitive Services.
- Adding meters priced per 1K and per 1M tokens as if the units were the same.
- Leaving a PTU deployment or a fine-tuned model running after a test, paying every hour. Test environments belong in their own accounts or subscriptions, as Non-production cloud costs: control staging, dev and preview explains.
- Buying a Global PTU reservation while the deployment runs as Data Zone.
- Filtering on the product code
AmazonBedrockalone and missing models billed under other Bedrock offers or through AWS Marketplace. - Calling an application inference profile through the Responses API, which AWS rejects with a 400 error.
Reconcile AI costs to your logs only for an invoiced month: Azure costs are estimates until the invoice, and in CUR bill_invoice_id stays empty until the bill is final. Cloud costs at month-end covers how to treat late charges. The next decision follows the largest meter: if token volume grows, the product team decides; if capacity sits idle or the deployment type is wrong, platform engineering; if reservations, Marketplace or credits are involved, finance and procurement.
Where Costfluent fits
Costfluent reads Azure and AWS billing data through read-only native connectors; see the Azure integration. In cost reports you see AI spend by provider, account, service, resource and tag, and can show effective cost instead of billed cost. Costfluent does not read token telemetry, prompts or invocation logs; request-level attribution stays in your own logs.
Sources and method
Checked on 10 October 2026: Microsoft Foundry: plan and manage costs, Foundry deployment types, Azure OpenAI provisioned throughput billing, Azure OpenAI monitoring reference, Azure Retail Prices API, Foundry Models, Azure group and filter options, Understand Cost Management data, AWS CUR 2.0 product columns, AWS CUR 2.0 line item columns, AWS CUR 2.0 bill columns, Cost Explorer filters, AWS Price List offer index, Bedrock Provisioned Throughput, Bedrock service tiers, Bedrock application inference profiles, Bedrock IAM principal attribution, Bedrock request metadata, Bedrock FAQ, Bedrock third-party models, AWS cost allocation tag backfill, AWS Promotional Credit terms. Meter examples come from the Retail Prices API (Sweden Central, Germany West Central) and the AWS Price List for eu-central-1. The tables and checks are Costfluent recommendations.



