Image API usage shows 0 tokens: where the cost is on Sume
POST /v1/images returns usage.prompt_tokens, completion_tokens and total_tokens as 0 in v1. The billed amount is usage.cost in USD, metered per image.

In Sume's POST /v1/images response, usage.prompt_tokens, completion_tokens and total_tokens are always 0 in v1, and usage.cost is the USD amount billed to your wallet. Image models are metered per image, and per-token accounting is not plumbed through yet.
From Sume's Image API docs, read 2026-09-30.
What does the usage block look like?
The documented response for a Seedream 4.5 example:
{
"created": 1748372400,
"model": "bytedance-seed/seedream-4.5",
"data": [{ "url": "https://media.sume.com/img/01J.../0.png", "media_type": "image/png" }],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0,
"cost": 0.04
}
}Which field do I record?
Record usage.cost. The model field echoes the id you requested, so sume/auto stays sume/auto. Endpoint pricing lines are the amount charged with Sume's margin already applied, so cost_usd x n is what you pay for n images.
| Field | Meaning in v1 |
|---|---|
usage.prompt_tokens | Always 0 |
usage.completion_tokens | Always 0 |
usage.total_tokens | Always 0 |
usage.cost | USD billed to your wallet |
Why does GPT Image 2.5 still mention tokens?
Sume's docs describe ChatGPT Image 2.5 pricing from Fal token rates and estimated token counts, but the response still reports per-image cost. The docs say the response token counts are always 0 in v1, so use usage.cost.
What about failed generations?
Billing is all-or-nothing: completed generations are billed in full, failed or cancelled ones are not billed, and failed requests return 502. A 202 job returns the result later from GET /v1/jobs/{id}/result, in the standard job shape rather than this body.
How do I check this myself?
If your dashboards multiply tokens by a rate, they will show zero for images. Sum usage.cost per request instead. The linked docs pages and the catalog endpoint show the current values, and this post reflects them as of 2026-09-30.
Sources
Related posts
More in Developers
- Inngest step return 4 MiB limit: return the Sume artifact URL
Inngest caps one step return at 4 MiB and run state at 32 MiB. Return the media.sume.com artifact URL from step.run instead of the video bytes.
- Instagram API is_comment_prompt_used: comment prompts on Reels
Set is_comment_prompt_used to true on the media container to attach a comment prompt, then read replies from prompt_response. One add-on per media, no poll.
- Instagram API media_url missing: copyrighted audio and reels
Since 2026-07-30 Instagram omits media_url for video with copyrighted audio or reels with downloads off. Treat it as optional and import files you own.
- Instagram API poll_attachment on Reels: how the add-on works
Set poll_attachment when creating a Reel container: two to four options, 3 days by default, Facebook Login only. What Sume prepares before that call.
Written by Sume