Gpt-5.6: usage.output_tokens is ~9x actual generation (re-summed once per reasoning item), exceeds max_output_tokens, and is what gets billed

On GPT-5.6 (sol and terra, Responses API), usage.output_tokens appears to be a cumulative re-sum of the running reasoning total — re-added once per reasoning item in output[] — rather than the number of tokens actually generated. The inflated value is what appears on the bill.

No earlier model is affected, because every model before 5.6 emits exactly one reasoning item per response, where the defect is a no-op. That’s why this is showing up now.

Measured over 22,922 reasoning calls from my own logs (1,054 of them on 5.6).

Request shape — nothing exotic enabled

I ask the model for a single chess move. No tools, no multi-agent, no pro mode:

{
  "model": "gpt-5.6-terra",
  "input": "<a chess position; instructs the model to reply with only a move>",
  "max_output_tokens": 128000,
  "reasoning": {"effort": "high", "summary": "auto"},
  "background": true,
  "store": true
}

Every response echoes back tools: [], reasoning.mode: "standard", no multi_agent key, and tool_usage with web_search: {num_requests: 0}. Nothing that could legitimately add output tokens is on.

The symptom

Worst example (gpt-5.6-terra, 2026-07-11 03:31:38 UTC):

field value
status "completed"
incomplete_details null
max_output_tokens (echoed back) 128,000
usage.output_tokens 466,818
usage.output_tokens_details.reasoning_tokens 21,064
visible assistant output d1d4 — four characters
reasoning items in output[] 41

466,818 output tokens cannot be reconciled with 21,064 reasoning tokens plus a four-character answer.

Secondary bug: the reported output_tokens is 3.6x my requested max_output_tokens while status is completed and incomplete_details is null. Per the reasoning guide, max_output_tokens bounds total generated tokens including reasoning, and blowing through it should surface as status: "incomplete" with incomplete_details.reason: "max_output_tokens". 31 of my 710 5.6 reasoning calls report output_tokens over the cap while claiming completed.

The pattern: a triangular re-sum

Let R = reasoning_tokens, k = number of reasoning items in output[]. The reported value fits a cumulative re-sum — i.e. the running total is re-added at every reasoning item:

output_tokens  ≈  R × (k + 1) / 2

output_tokens reasoning_tokens k predicted R × (k+1)/2 error
466,818 21,064 41 442,344 −5.2%
382,610 18,842 37 357,998 −6.4%
363,022 18,371 36 339,863 −6.4%
344,408 18,128 35 326,304 −5.3%
344,166 18,007 35 324,126 −5.8%

Holds within 5–7% across a 20x range. The residual is consistent with later reasoning segments being larger than earlier ones, so the running total isn’t perfectly linear in k.

Why it’s invisible before 5.6. With k = 1, (k+1)/2 = 1 and the formula returns the correct value. Every pre-5.6 model emits a median of one reasoning item:

model calls median reasoning items median output_tokens / reasoning_tokens
gpt-5 2,134 1 1.01x
gpt-5.1 2,429 1 1.00x
gpt-5.2 1,594 1 1.00x
gpt-5.4 1,388 1 1.00x
gpt-5.5 1,269 1 1.00x
o3 2,915 1 1.01x
gpt-5.6-terra 644 4 3.61x
gpt-5.6-sol 66 9 6.02x

5.6 is the first model I’ve seen emit many reasoning items per response, and the inflation tracks that count almost exactly.

It’s billed

Summing the output_tokens the API returned to me, per model, and applying the published output rates reproduces my dashboard line items to the tenth of a cent:

model my summed output_tokens rate computed dashboard line item
gpt-5.6-sol 3,747,903 $30 / 1M $112.437 $112.437
gpt-5.6-terra 13,856,978 $15 / 1M $207.855 $207.855

So billing is computed from the defective field. Using reasoning_tokens + visible output as the honest count, real output cost across these calls was ~$36 against ~$320 billed — about 8.9x.

Input accounting, for contrast, looks correct (my terra input bills below the undiscounted rate, consistent with the cached-input discount). The defect appears isolated to output_tokens.

Possibly related

Three older models report output_tokens at a near-constant 2.0x their reasoning_tokens despite a median of one reasoning item — where the triangular formula predicts 1.0x. Different shape, possibly the same class of accounting defect:

model calls median reasoning items median ratio
o3-mini 2,131 1 2.02x
gpt-5.4-nano 1,152 1 2.00x
o1 80 1 2.01x

My visible output on those calls is also a single chess move (~4 tokens), so a 2x multiple of the reasoning count isn’t explained by emitted text.

Ask

Can OpenAI confirm whether usage.output_tokens on 5.6 is double-counting, and whether billing is being computed from it? Happy to supply response IDs and full stored response bodies to staff.

Anyone else running 5.6 with reasoning: worth comparing usage.output_tokens against usage.output_tokens_details.reasoning_tokens on your own calls. If your response has more than one reasoning item in output[], the ratio should not be ~1.0x — and if it isn’t, you’re likely paying the difference.

It’s true.

Test request:

  • Model: gpt-5.6-luna
  • Responses API, direct OpenAI API key
  • No tools
  • reasoning.effort: “high”
  • background: true
  • max_output_tokens: 16,384

Returned result:
status: incomplete
incomplete_details.reason: max_output_tokens
requested max_output_tokens: 16,384
reported reasoning_tokens: 16,384
reported output_tokens: 273,250
reasoning items in output[]: 32
visible assistant message: none

So, although this run correctly marked itself incomplete at the real reasoning limit, it reported 273,250 output tokens—16.68× the cap—despite producing no visible answer and no tool output.

The pattern matches the report extremely closely:
triangular prediction = 16,384 × (32 + 1) / 2 = 270,336
reported output tokens = 273,250
difference = 2,914 tokens (1.08%)

Thank you! This is better evidence than anything in my original post for two reasons:

1. It kills the only remaining defense. Your run halted with status: incomplete, reason: max_output_tokens, and reasoning_tokens came back as exactly 16,384, precisely the cap you requested. So the generator counted correctly, stopped at the real limit, and reported the truncation honestly, while the usage field simultaneously claimed 273,250 output tokens.

If 273,250 tokens had actually been generated, the cap would have fired long before 16,384. It didn’t. That rules out every “the tokens were really produced” explanation, discarded samples, parallel chains, hidden turns. The enforcement path and the accounting path disagree, and we now know which one is right.

2. It corrects me. I claimed as a secondary bug that max_output_tokens isn’t being honored, because 31 of my calls reported output_tokens above the cap while saying completed. That was wrong. Your run shows the cap is enforced correctly against the true count — in my case real reasoning never came near 128,000 (worst was 21,064), so the cap never fired and completed was correct. What I saw was a symptom of the reporting bug, not a second bug. The right framing is narrower and stronger: the response contradicts itself. It reports output_tokens above a cap it also claims it never hit. Both cannot be true.


Your data point fixed my formula

I’d fit output_tokens ≈ R × (k+1)/2 from my five largest calls. Checking it against all 710 of my GPT-5.6 calls, it misses by a median of 32% — and it misses worst at small k. That’s the tell: a constant term is missing. The correct form is

output_tokens  ≈  R  +  R × (k+1)/2   =   R × (k+3)/2
                  ^     ^^^^^^^^^^^^
               correct   spurious re-sum

Median absolute error 2.6% across 710 calls, stable at every k (−1.8% at k=1, −1.6% at k≥16):

output_tokens R k R × (k+3)/2 error
466,818 21,064 41 463,408 −0.7%
382,610 18,842 37 376,840 −1.5%
363,022 18,371 36 358,235 −1.3%
344,408 18,128 35 344,432 +0.0%
344,166 18,007 35 342,133 −0.6%

So output_tokens is the correct reasoning count plus a spurious cumulative re-sum of the running total, re-added once per reasoning item.

This also explains the “2x” models

If the bug is R + R×(k+1)/2, then at k = 1 it reduces to R + R = 2R – a flat 2x. And sure enough:

model calls median k median output_tokens / R
gpt-5, gpt-5.1, gpt-5.2, gpt-5.4, gpt-5.5, o3 ~13,000 1 1.00–1.07x (correct)
o3-mini 2,131 1 2.02x
o1 80 1 2.01x
gpt-5.4-nano 1,152 1 2.00x
gpt-5.6-terra 644 4 3.61x
gpt-5.6-sol 66 9 6.02x

o1, o3-mini and gpt-5.4-nano appear to have been silently overbilled 2x for as long as they’ve existed. GPT-5.6 didn’t introduce the defect – it’s the first family to emit many reasoning items, which is what turned a quiet 2x into a 9x.

Why it explodes: 512-token chunks → quadratic cost

Your numbers nail the mechanism: 16,384 / 32 = 512.0 exactly, and ceil(16384/512) = 32 = k. In my data, k = ceil(R/512) holds for 80% of calls. Reasoning is emitted in ~512-token items, so k grows with reasoning length. Substituting:

output_tokens  ≈  R² / 1024  +  3R/2

The overcharge is quadratic in how long the model thinks. Double the reasoning, quadruple the bill. Worst exactly where reasoning models are most valuable.

One open question – can you test this?

Your truncated run fits R × (k+1)/2 (+1.1%) better than R × (k+3)/2 (+4.9%). All 710 of my calls completed, and all 710 need the +R. I have zero incomplete runs, so I can’t separate these.

Hypothesis: the extra +R is added at completion, when the final message is emitted, so a truncated run never gets it.

If you re-run your exact request with a cap high enough to finish (or with a lower effort so it completes), does the ratio move from (k+1)/2 to (k+3)/2? That would localize where the spurious add happens, which is probably the single most useful thing anyone can hand the engineer who picks this up.

And it is definitely billed

Summing the output_tokens the API returned to me and applying the published rates reproduces my dashboard line items to the tenth of a cent: 3,747,903 tokens → $112.437 for sol (dashboard: $112.437), 13,856,978 → $207.855 for terra (dashboard: $207.855). Real output was ~9x lower, so ~$284 of the ~$320 billed is overcharge. Input accounting, for contrast, looks correct, the defect is isolated to output_tokens.

You were billed ~16.7x for a request that returned no answer at all.

This is fun. From Terra:

Same direct Responses API setup on gpt-5.6-luna, with no tools and background: true; I changed the effort to medium and used max_output_tokens: 12,288.

status: completed
incomplete_details: null
reasoning_tokens (R): 3,624
reasoning items (k): 7
visible final answer: 4 characters
usage.output_tokens: 18,124

Your completed-call formula predicts:
R × (k + 3) / 2
= 3,624 × (7 + 3) / 2
= 18,120

The API returned 18,124—just 4 tokens higher, matching the four-character UCI final answer.

So this looks effectively exact:
output_tokens
≈ R + R × (k + 1) / 2 + visible-output-tokens

The incomplete run fit the no-completion form; this completed run adds the missing +R and then the visible answer. That localizes the extra addition to completion/final-message accounting very convincingly.

Two updates. Your completed-run test nailed the mechanism exactly, and separately I’ve confirmed this is not a GPT-5.6 bug at all: it has been overbilling o1, o3-mini and gpt-5.4-nano at 2x for months.

Context on where the data comes from, since it’s what makes the discrepancy so legible: these calls are from ChessBench (chessbench.ai), which runs chess games between language models. Every request asks for a single move, so the visible output is always about four tokens, and I have roughly 23,000 stored reasoning responses across a dozen models to compare against. When a response bills 466,818 output tokens to answer d1d4, it stands out.

1. The mechanism, exactly (thanks to your two runs)

Your two luna runs together isolate the defect, because they differ in exactly one variable: whether the response completed.

your run status what fits error
cap 16,384 incomplete Σ Cᵢ ≈ R × (k+1)/2 +1.1%
cap 12,288 completed Σ Cᵢ + R + visible exact (18,124)

So:

CORRECT:  output_tokens = visible + R

ACTUAL:   output_tokens = visible + R + Σᵢ₌₁..ₖ Cᵢ
                                        ^^^^^^^^^^
                       Cᵢ = running reasoning total after reasoning item i

There is an accumulator that adds the running reasoning total once per reasoning item during generation, and the correct final accounting (visible + R) is then added on top at completion. Your incomplete run never reached completion, so it exposed the accumulator alone, which is why it fit without the +R. Your completed run has both terms and lands on the nose: 3,624 + 4 + (3,624 × 8/2) = 18,124, exactly what the API returned.

R × (k+1)/2 is just the closed form of Σ Cᵢ when the reasoning items are equal-sized. That also explains the residuals in my data: across all 710 of my GPT-5.6 calls the error runs consistently in one direction (actual slightly above prediction, median 2.6%), which is what you’d expect if later reasoning items are somewhat larger than earlier ones. Your k=7 run had even chunks, so it came out exact.

For anyone at OpenAI reading: the place to look is whatever increments the usage counter on each reasoning item emission. It is adding a cumulative running total where it should add a delta, or should not be adding at all, given the correct total is already accounted for at completion.

2. This is not a GPT-5.6 bug. It predates it by months.

I went back and checked the older reasoning models against OpenAI’s own usage export (the Usage page, download CSV) rather than against my own records, using the same reconciliation that proved 5.6 billing is computed from the inflated field.

May 2026, my account:

model OpenAI’s billed output tokens true count (R + visible) ratio verdict
o3-mini 25,408,973 12,376,132 2.02x overbilled
gpt-5.4-nano 11,718,610 5,844,140 2.00x overbilled
o1 778,989 335,944 2.01x overbilled
o4-mini 12,054,680 9,160,567 1.01x correct

OpenAI’s billed figures track the inflated field, not the true count.

And it falls straight out of the same formula. At k = 1 (one reasoning item, which is what every pre-5.6 model emits) the bug reduces to:

visible + R + C₁   =   visible + R + R   =   2R + visible

A flat 2x. Quiet, plausible-looking, and easy to never notice. GPT-5.6 didn’t introduce the defect. It’s simply the first family to chunk reasoning into many items (k = ceil(R/512) holds for 80% of my calls), so k grows with thinking time and the same accumulator compounds into:

output_tokens ≈ R²/1024 + 3R/2

Quadratic in how long the model thinks. That’s how a quiet 2x became a 9x.

o4-mini is the control

This is the one I’d point staff at. o4-mini is a reasoning model, k = 1, called through the exact same code path as the others, and it reconciles at 1.01x. So reasoning_tokens is trustworthy, my request shape isn’t at fault, and this isn’t “just how reasoning models report usage.” Some models report correctly. o1, o3-mini and gpt-5.4-nano do not.

Scope

That table is one month of one hobby account: roughly $80 of overbilling on the older models, on top of ~$284 on GPT-5.6 in two days.

o1 and o3-mini have been generally available for a long time. If this 2x has applied to every reasoning call every customer has made against them over that period, the aggregate is not small.

Check your own bill. Download your usage CSV, and for any o1 / o3-mini / gpt-5.4-nano traffic compare the billed output_tokens against usage.output_tokens_details.reasoning_tokens plus your visible output. If the ratio is ~2.0x, you’ve been paying double.

I’ve sent all of this to support (case 11305877) and asked them to investigate the retrospective scope, not just credit my account. Happy to hand full stored response bodies to anyone from OpenAI who wants them.

I wonder if its not the cause of unusual codex usage limit draining problem codex users have been reporting the past 24 hours. I am investigating the oauth api path.

I thought so too, however the codex-specific Responses API does not seem to be affected.

Hi folks,

Thank you for the detailed report and for sharing the reproduction data. We appreciate the time and care that went into documenting the discrepancy.

To help our team investigate further, could you please share the relevant request IDs and timestamps (including timezone) for the affected calls? If possible, please also include the model used and whether the response completed or was marked incomplete.

Thank you again, we’ll review the details with the appropriate team.

-Mark G.

Thanks Mark. Everything you asked for is below: request IDs, UTC timestamps, model, and completion status. I have 710 GPT-5.6 calls stored with full response bodies and can hand over any of them.

The affected calls (GPT-5.6)

All direct OpenAI API key, Responses API, background: true, store: true, no tools, no multi-agent. Timestamps are UTC. Every one is status: completed with incomplete_details: null.

request id model created (UTC) status max_output_tokens reported output_tokens reasoning_tokens (R) reasoning items (k) visible answer
resp_0e9413a664c7f4dd006a51b91a625481969d9e2e30348795e4 gpt-5.6-terra 2026-07-11T03:31:38Z completed 128,000 466,818 21,064 41 d1d4
resp_074c5535e4a2784e006a51b8455b608190b4a0fb68dd3d2f2c gpt-5.6-terra 2026-07-11T03:28:05Z completed 128,000 382,610 18,842 37 f4f5
resp_0bf5e319470f73bd006a512478736081948d15b2ee824057b3 gpt-5.6-sol 2026-07-10T16:57:28Z completed 128,000 363,022 18,371 36 c7c6
resp_0c561adc443b319d006a51b57e19ac8193bcc452c859a33624 gpt-5.6-terra 2026-07-11T03:16:14Z completed 128,000 344,408 18,128 35 g2g3
resp_0bfe37c5b6373def006a51165989688193ab39f4ae101fc6b4 gpt-5.6-sol 2026-07-10T15:57:13Z completed 128,000 344,166 18,007 35 e5e4
resp_0b151d2203e22d72006a51b87b38348193825a3cfc4131cbb8 gpt-5.6-terra 2026-07-11T03:28:59Z completed 128,000 325,288 17,373 34 h4h5
resp_0ae5455ca0e8cf2a006a51b459e4f881939f092ccf478345f1 gpt-5.6-terra 2026-07-11T03:11:21Z completed 128,000 6,794 1,841 4 g4f5
resp_0d75a9d0b425fdb6006a51b1fea86081959290e316aa862648 gpt-5.6-terra 2026-07-11T03:01:18Z completed 128,000 6,778 1,833 4 Qh5+
resp_05afff4bf5b6e8f5006a51b1e6636481958416cd738c189c66 gpt-5.6-terra 2026-07-11T03:00:54Z completed 128,000 34 13 1 e4
resp_007a15ef615f0ff9006a51ac583e6c8193b98d0c4d6430e025 gpt-5.6-terra 2026-07-11T02:37:12Z completed 128,000 32 11 1 e2e4

Note the last two rows: at k = 1 the inflation collapses to roughly 2x. The bug scales with the number of reasoning items, so those small calls are the same defect in miniature.

31 of my 710 GPT-5.6 calls report output_tokens above the max_output_tokens of 128,000 they were given, while still reporting status: completed and incomplete_details: null. Those two statements cannot both be true. That alone shows the field is wrong, without needing any of the analysis below.

I have a CSV of all 5,780 stored reasoning calls (request id, model, UTC timestamp, status, max_output_tokens, reported output_tokens, reasoning_tokens, reasoning item count, visible answer). Say the word and I’ll attach it, or send it wherever is useful.

The mechanism

With R = reasoning_tokens and k = number of reasoning items in output[]:

CORRECT:  output_tokens = visible + R

ACTUAL:   output_tokens = visible + R + Σᵢ₌₁..ₖ Cᵢ
                                        ^^^^^^^^^^
                       Cᵢ = running reasoning total after reasoning item i

An accumulator adds the running reasoning total once per reasoning item during generation, and the correct accounting (visible + R) is then applied on top at completion.

@dogleg’s two luna runs isolate this cleanly, because they differ in exactly one variable: whether the response completed.

run status what fits error
cap 16,384 incomplete Σ Cᵢ alone +1.1%
cap 12,288 completed Σ Cᵢ + R + visible exact (18,124)

The incomplete run never reached completion, so it shows the accumulator on its own. The completed run has both terms: 3,624 + 4 + (3,624 × 8/2) = 18,124, precisely what the API returned.

Σ Cᵢ reduces to R × (k+1)/2 for equal-sized reasoning items, giving output_tokens ≈ R × (k+3)/2 + visible. Median absolute error 2.6% across all 710 of my GPT-5.6 calls.

GPT-5.6 chunks reasoning into roughly 512-token items (k = ceil(R/512) holds for 80% of my calls), so k grows with thinking time and the error compounds to R²/1024, quadratic in how long the model thinks. That is why my worst calls are ~20x and not ~2x.

The place to look is whatever increments the usage counter as each reasoning item is emitted. It is adding a cumulative running total where it should add a delta, or should not add at all, given the correct total is already accounted for at completion.

The control: gpt-5.5, identical request shape

This is the one I would point the team at.

gpt-5.5, called with the same request shape as 5.6 (reasoning.summary: "detailed", background: true, store: true, no tools), same client, same code path, same prompt structure, across 1,269 calls, reconciles at 1.00x.

So the request shape is not the cause, my code is not the cause, reasoning_tokens is a trustworthy field, and this is not “just how reasoning models report usage.” Some models report correctly. GPT-5.6 does not.

It is billed

Summing the output_tokens the API returned to me and applying the published output rates reproduces my dashboard line items to the tenth of a cent:

model my summed output_tokens rate computed dashboard line item
gpt-5.6-sol 3,747,903 $30 / 1M $112.437 $112.437
gpt-5.6-terra 13,856,978 $15 / 1M $207.855 $207.855

Real output was about 9x lower, so roughly $284 of the $320 billed is overcharge, over two days. Input accounting looks correct, so the defect appears isolated to output_tokens.

Briefly: this is not only GPT-5.6

Checking older models against my usage export CSV (so, OpenAI’s own billed numbers, not my records), May 2026:

model OpenAI’s billed output tokens true count (R + visible) ratio
o3-mini 25,408,973 12,376,132 2.02x
gpt-5.4-nano 11,718,610 5,844,140 2.00x
o1 778,989 335,944 2.01x

These emit k = 1, where the formula reduces to visible + R + R, a flat 2x. Quiet, and easy to never notice. Clean over the same period: gpt-5, gpt-5-mini, gpt-5-nano, gpt-5.1, gpt-5.2, gpt-5.4, gpt-5.4-mini, gpt-5.5, o3.

One I want to flag honestly rather than overstate: o4-mini reconciles at 1.01x across 1,495 calls in May, but at 2.01x across 212 calls in July. I changed my request shape between those two periods (I added reasoning.summary and background), so I cannot separate “o4-mini regressed” from “something about the newer request shape triggers it on o4-mini.” Worth someone at OpenAI checking, since if it is a regression then the affected set is still growing. I am not running fresh calls to disambiguate, for the reason below.

On further testing

I have disabled these models and stopped my runner, because I am not willing to keep paying an inflated bill to generate more evidence. Everything above comes from stored responses. I am glad to hand over complete response bodies for any request ID here.

(Re: the codex question upthread, my traffic is all direct API key, so I can’t speak to the OAuth path either way.)

I sent these in on case: 11319595.

Case A - cap reached, no final message

  • response_id: resp_045bd2037e31b32d006a526552f97081928f3e858ff5ecbb05
  • timestamp: 2026-07-11 15:46:27 UTC (created_at in the response)
  • model: gpt-5.6-luna
  • status: incomplete; incomplete_details.reason: max_output_tokens

Case B - completed, repeated direct API reproduction

  • response_id: resp_01b702c98f1b6416006a52b538afd081a187684d5dc126486d
  • request timestamp: 2026-07-11 21:27:20.366515 UTC
  • model: gpt-5.6-luna
  • status: completed

Thanks @Ben_B and @dogleg for providing the requested IDs and timestamps. I've escalated this to our specialized support team so they can investigate further.

We'll share any updates here as soon as we have them.

-Mark G.

Hey Mark G, checking in on the escalation from last week. Since then we ran a full adversarial re-verification of our own data and pipeline, specifically trying to prove the problem was on our side. It is not, and three new findings may help your team localize the bug:

1. The billed figures are physically impossible. Our wall-clock measurements (our own timers, independent of the usage object) show that if output_tokens were real generation, our worst call sustained roughly 2,000 tokens per second for 226 seconds. If reasoning_tokens is the real count, all 715 of our GPT-5.6 calls fall in a consistent 60 to 92 tokens per second band, and duration correlates with reasoning_tokens at 0.92.

2. An exact, zero-parameter formula. Reported output_tokens equals visible + R + sum over i of min(512 * i, R), where R is reasoning_tokens and i indexes the reasoning items. That is the running reasoning total re-added at each reasoning-item boundary. It fits our GPT-5.6 calls with under 1 percent median error, and at k = 1 it reduces to 2R + visible, which is exactly what o1, o3-mini, and gpt-5.4-nano report.

3. The defect switches on and off server-side at specific times. With identical client code and request shape on both sides of the boundary, o3 went from 0 percent inflated to 100 percent inflated between 2026-05-29T21:21:35Z and 2026-05-29T21:24:58Z, and on 2026-05-30 every model we ran that day inflated (o3, gpt-5.1, gpt-5-mini, gpt-5-nano, o3-mini, gpt-5.4-nano). Similar episodes hit the gpt-5.4/5.5 family on 06-10 and 06-11, affecting only calls with reasoning_tokens <= 516. Those timestamps should map directly to something in your deployment history.

One more data point: in topic 1386256, andyw1 confirmed on Jul 10 that GPT-5.6 launched with a token-accounting bug in cache billing, “certain types of requests not getting accounted correctly,” which was fixed with refunds calculated retroactively. Is the output_tokens accounting issue in this thread part of that same review? And will refunds be handled the same way once it is confirmed?

Happy to provide more request IDs, the per-call CSV (already supplied has 5,780 calls), or full stored response bodies. All of our affected responses were sent with store: true, so your team can also pull them by ID server-side.

Hi Ben,
Since the release of GPT 5.6 i also have noticed a sharp change in usage limits in the subscription model. rough comparisons between Opus 4.8 medium vs Sol 5.6 medium on the same exact task yielded around 8.6x usage limit consumption. Right now even with 5h limits removed, it just feels like the old 5h limits on daily usage, rendering codex unusable on the 20$ plan, even though previously it was very generous about 2-3x work output vs anthropic subscription.

The worrying part is after a very long back and forth with OpenAI support, providing evidence of this sharp discrepancy, they flagged it as intended behavior.

So i am starting to feel the change is a silent cut to usage limits or a multiplication to api costs, hidden by frequent resets on subscriptions but per token users get the full blast radius, until most users forget and just think this is the new normal.

It has been close to 11 days since 5.6 released, and i think most casual users are not noticing this, although some min maxing users have reported multiple issues in codex github.

Of course i want to try and be constructive, but without any clear feedback, and the last info being that there is no known problem whatsoever, would indirectly confirm it is 100% as intended.

Edit:
For comparison, Claude Code subscription with Opus 4.8 roughly accomplishes 2-3 epics per 5h limit, and the weekly limits consisting of about 10x 5h limits translating to 20-30 tasks done per week. Prior to 5.6 and the admitted usage drain issue, Codex was around double that. Now with the 5h limits removed on codes, the whole weekly limit only covers 2-3 tasks completed (at roughly the same scope, while to be fair not entirely exact) and thats it for the week.

Same result for me today with a 4096 token limit. Matches @Ben_B’s estimate almost exactly:

Model Requests Input Output recorded
GPT-5.5 1 93 4,096
GPT-5.6 Sol 1 93 18,586

Case A — GPT-5.5 control, cap reached, no final message

response_id: resp_054f64291c064469006a5e55f7b42081a2b1d52e316dff6ca9
timestamp: 2026-07-20 17:08:07 UTC (created_at in the response)
model: gpt-5.5-2026-04-23
status: incomplete; incomplete_details.reason: max_output_tokens
output_tokens: 4,096; reasoning_tokens: 4,096

Case B — GPT-5.6 Sol reproduction, cap reached, no final message

response_id: resp_0d11d41dcd3d7c4d006a5e564ad4f0819cb3d28a731d1a8b31
timestamp: 2026-07-20 17:09:30 UTC (created_at in the response)
model: gpt-5.6-sol
status: incomplete; incomplete_details.reason: max_output_tokens
output_tokens: 18,586; reasoning_tokens: 4,096

And API charged similarly - 5.5 = $0.123345, and 5.6 Sol = $0.558045.
Expected 5.6 cost to match 5.5.

Hi everyone, since mid-July I’ve been experiencing a consumption of almost 5 times higher than my weekly consumption and credits using chatgpt 5.6 sol hight. Here’s just an example of my consumption. As you can see, between June and July I’ve gone from 300 credits to 1000 credits just for today. In 4 hours, it seems excessive to me.

24 lug 2026 Desktop App 1.012,616 crediti
21 lug 2026 Desktop App 138,212 crediti
21 lug 2026 Desktop App 111,357 crediti
21 lug 2026 Desktop App 0,112 crediti
20 lug 2026 Desktop App 773,004 crediti
12 lug 2026 Extension 1.063,578 crediti
18 giu 2026 Extension 315,002 crediti
17 giu 2026 Desktop App 116,859 crediti
17 giu 2026 Extension 212,885 crediti
16 giu 2026 Desktop App 229,112 crediti

We received an update today that the Codex team has been digging into this and made some improvements.

Hey @Mark_G – how are we doing on this?