GPT Image 2 and 2.5: zero cached image inputs despite reusing reference images

I’m using gpt-image-2 and gpt-image-2.5 to generate illustrated stories, and I’m seeing no cached image-input usage despite repeatedly reusing the same character reference image.

Our setup:

  • We call /v1/images/edits, uploading the reference image through multipart image[].
  • Each request uses the same reference image bytes but a different scene prompt.
  • Some requests run concurrently, but others happen sequentially: we generate a cover and first-page preview, then generate the remaining pages later using the same reference image.

Both models list cached input pricing, but my usage dashboard shows zero cached image inputs. For example, filtering to gpt-image-2 and our development API key shows approximately 75.2K uncached input tokens and zero cache-read tokens.

I understand concurrent requests might arrive before a cache is populated. However, that doesn’t fully explain the absence of cache hits when we reuse the reference image in later requests.

Does image-input caching actually work on /v1/images/edits for these models? Does changing the text prompt prevent the reference image from being cached, even when its bytes are identical? Are there specific timing, input-order, or request-format requirements?

Has anyone confirmed successful caching through their usage dashboard or billing? A minimal working example would be very helpful.

This topic has been raised before.

Below this topic, you’ll find a Related topics section. You may want to check those discussions to see what others have reported and whether any solutions or workarounds have been found.


Side note: I did try using Discourse AI search to find more relevant topics, the search result needs work.

I could not find any official response from the OpenAI team or any user that stated that could get the discounted rate for cached input images. Considering that we got a usage graph for this on the OpenAI Billing section, I expect that this is not the desired behavior.

Same as it ever was: list a discount; do not deliver the discount.

Made easier when they also don’t deliver the pricing the thing costs?