Both reads answer
Cache-Control: no-store. The *Microusd fields are integers in micro-USD, so 1000000 is one dollar; usd and usdDisplay are strings. No money figure in this API is a float.
The five terminal states
status is running until the run lands, and then it is exactly one of these and never changes again. A polling loop should treat any status other than running as the end.
Reading a stopped or exhausted run
Thefinal event in result carries stopped: true and stopped_at whatever the early ending was: your stop, the spend ceiling, the balance running out, the deadline, or a lost process. So result.stopped tells you the table is partial, and status tells you why it is partial. One without the other is not enough.
Cost on the run
billableAccruedMicrousd is on the same scale as the usd on a cost event: what you are charged, with nothing in it that the cost events do not also report. The amount actually captured when the run settles is billableAccruedMicrousd + billableInFlightMicrousd as of the moment it ended, capped at the hold, so a run that was mid-call when it stopped is charged for that call.
The hold itself is not a field on the run. It is released down to the captured amount when the run settles, and the settlement lands before status becomes terminal, so a terminal run is never still holding money. See Cost.
