Billing
Expression Measurement bills for the media you send it, in seconds. Usage is counted per run: one upload request or one realtime session. Time spent connected is not billed, so a realtime session that stays open between frames is billed only for the media the server takes in.
A run that is billed for any media is billed at least 10 seconds. See Minimum charge.
Audio
Audio is billed for its full length, including silence and stretches with no speech. A 60-second recording bills 60 seconds whether it contains one utterance or none.
Video
Each image or frame is billed as one third of a second, whatever rate you send frames at and whether or not a face is found in it. Sending 3 frames per second for 30 seconds bills 30 seconds, and sending 1 frame per second for 60 seconds bills 20 seconds. The number of frames sets the billed time, not the length of the video they come from, so sending fewer frames per second lowers it.
A realtime frame is billed once it passes the send rate check, even if it is then rejected with invalid_image_frame because it is not a JPEG or has more pixels than the limit. To avoid paying for frames that return no result, encode each frame as a JPEG within the frame limits before sending it.
Minimum charge
Every upload request that succeeds, and every realtime session that is billed for any media, is billed at least 10 seconds. The minimum is applied when the run ends, however a session ends. A 4-second audio upload bills 10 seconds, and so does an image upload of 30 images or fewer.
The minimum applies to each run, so measuring many short clips in separate requests or sessions bills at least 10 seconds for each one.
What is not billed
- Frames rejected with
rate_limited, on either realtime endpoint. - Audio frames rejected with
invalid_audio_frame. - Empty video frames, which are rejected with
invalid_image_framebefore the send-rate check. - A realtime session that sends no media, or whose every frame is one of the above. The minimum charge does not apply to it.
- An upload request that fails. On image upload, one rejected image fails the whole request, so none of its images are billed. A run recorded for a failed request reports
metered_secondsas 0.
Checking usage
The metered_seconds field of a run holds its billable seconds. GET /v1/expression/run returns it for each of your organization’s runs, and GET /v1/expression/run/{run_id} for one run. See Run IDs for how to find a run’s ID.
- During a realtime session, the value grows as the server takes in media. The minimum charge is added when the run ends.
- Video values are not rounded to whole seconds. They are counted with limited precision, so a run of 180 frames reads as 59.99999994 rather than 60.

