I am fine-tuning the models for multiple customers using a single account. I want to transparently pass on the fine-tuning cost to them, therefore tracking the cost is important. To track the cost, I fetch the fine-tune job details using: “/v1/fine_tuning/jobs/:job_id” endpoint. However, in the response, for gpt-4o-mini-2024-07-18 model, I get “usage_metrics”: null, which as per the support chatbot, can be used to calculate the fine-tuning cost.
Is this a bug that I get usage-matrics value as null or do I have to pass some query parameters to explicitly and ask for it? Is there any workaround to obtain the fine-tuning cost?
thank you in advance!
I think the cost could be derived from “trained tokens” and the model. This should include all passes from n_epochs.
A good place to mention: if you want predictable costs, don’t let OpenAI decide hyperparameters for you:
Thanks _j! Open AI mentions 5 parameter to cost: training time, input, output, cached tokens, and model. Now, the job details returns training tokens (no breakup) and not core training time. So I believe the cost calculation from ‘trained tokens’ and model would be kind of approximate?
Training pricing is given in millions of tokens, except for reasoning model(s) that only use reinforcement fine-tuning (that also bill grading generations besides the run time.)
Note that each n_epoch used is a billed pass through your training file.
The remaining figures are for inference: the price when you are using the model you’ve created.
I’ve had AI assistance in creating this pricing table for using fine-tuning models, then caught at least a few of its foibles, so you can compare the price to its base model:
| Model | Input | Fine-tune Input | Cached Input | Fine-tune Cached Input | Output | Fine-tune Output |
|---|---|---|---|---|---|---|
| o4-mini-2025-04-16 | $1.10 | $4.00 | $0.275 | $1.00 | $4.40 | $16.00 |
| o4-mini-2025-04-16 with data sharing | free/10M | $2.00 | per day | $0.50 | - | $8.00 |
| gpt-4.1-2025-04-14 | $2.00 | $3.00 | $0.50 | $0.75 | $8.00 | $12.00 |
| gpt-4.1-mini-2025-04-14 | $0.40 | $0.80 | $0.10 | $0.20 | $1.60 | $3.20 |
| gpt-4.1-nano-2025-04-14 | $0.10 | $0.20 | $0.025 | $0.05 | $0.40 | $0.80 |
| gpt-4o-2024-08-06 | $2.50 | $3.75 | $1.25 | $1.875 | $10.00 | $15.00 |
| gpt-4o-mini-2024-07-18 | $0.15 | $0.30 | $0.075 | $0.15 | $0.60 | $1.20 |
| gpt-3.5-turbo | $0.50 | $3.00 | - | - | $1.50 | $6.00 |
| davinci-002 | $2.00 | $12.00 | - | - | $2.00 | $12.00 |
| babbage-002 | $0.40 | $1.60 | - | - | $0.40 | $1.60 |
Note that the fine tuning of gpt-3.5 has two models selectable, where the normal price diverges.
So, as I understood from the tables above is that the fine-tuning cost is based on only hourly basis (the first table). Is there a way to get the actual training time from the ft-job?
Only o4-mini uses “reinforcement fine tuning” that bills by computation hours. I don’t know how to get or control the cost, apart from using the usage interface in the platform site.
All other models have billing for “supervised training”, which is by token, and the price shown in the screenshot table is the bill you’d get for training on one million tokens.

