Reference
Credits & billing
Live jobs are paid in credits. One credit is one second of a job's run time on the GPU worker. Test keys never use credits.
What a credit is#
A job's run time is measured by Printy3D from the moment a worker takes the job until it has handed its results back: downloading the input, running the engine and uploading the outputs. Time spent queued is free. Each finished live job costs its run time in whole seconds, with a minimum of 10 credits.
Your balance#
/v1/balanceusage:readincluded_creditsintegerrequiredCredits that come with your plan each period. They expire at the end of the period.
purchased_creditsintegerrequiredCredits you bought. They never expire, and they can go below zero when a job runs longer than the balance covered.
held_creditsintegerrequiredCredits reserved by live jobs that have not finished.
available_creditsintegerrequiredincluded + purchased − held: what new jobs can hold.
period_start, period_endstring (date-time)The current monthly period.
lowbooleanrequiredFewer credits available than one typical repair holds.
exhaustedbooleanrequiredNot enough credits to admit any job.
The console shows the same balance once your account is approved.
Holds and settlement#
- Hold. When you create a live job, it holds the credits it is expected to need. The default hold is 600 credits for an inspect or tool job and 1,800 for a repair, doubled for inputs from 100 MB and tripled from 1 GB. Once enough similar jobs have run, the hold follows their measured run time instead. The job's
usage.held_creditsshows it. - Refusal. If the hold is more than your
available_credits,POST /v1/jobsanswers402 insufficient_creditswithrequiredandavailable, and nothing is queued. - Settlement. When the job finishes, the hold is released and the job is charged (
usage.charged_credits,usage.charge_basis). Included credits are spent first, purchased credits after. A job that ran longer than its hold is still finished and charged in full.
| Outcome | Charge | charge_basis |
|---|---|---|
| Succeeded | Run time (at least 10) | run_time |
engine_failed, engine_timeout (an Exact Check: free, a failure on our side) | Run time (at least 10) | run_time |
invalid_input (the engine could not use the file) | 10 | minimum |
| Cancelled before it started | 0 | free |
| Cancelled while running | Run time so far (at least 10) | run_time |
Failures on our side: invalid_result, transfer_failed, verification_timeout, lease_expired, capacity_exhausted | 0 | free |
An Exact Check stopped by its limits: time_limit, memory_limit | 0 | free |
A lost attempt that is retried is never charged; only the attempt that finishes counts. An export conversion is a convert tool job and is billed like one. An Exact Check can carry a max_credits ceiling that caps its hold, its charge and the checker's run time, and its evaluations are free.
Transactions#
/v1/balance/transactionsusage:readEvery movement of your credits, newest first. Pass the page's next_before as before to read further back.
| kind | Meaning |
|---|---|
plan_grant | Included credits of a new period. |
expire | Unused included credits at the end of a period. |
topup | Credits purchased. |
adjust | A correction by the Printy3D team. |
hold | A live job reserved credits (held_delta). |
settle | A live job finished: the hold is released and the charge taken. |
{
"data": [
{ "sequence": 42, "kind": "settle", "job_id": "job_01J...", "included_delta": -312,
"purchased_delta": 0, "held_delta": -1800, "available_after": 35176,
"note": null, "created_at": "2026-10-29T10:14:03Z" },
{ "sequence": 41, "kind": "hold", "job_id": "job_01J...", "included_delta": 0,
"purchased_delta": 0, "held_delta": 1800, "available_after": 33688,
"note": null, "created_at": "2026-10-29T10:08:51Z" }
],
"next_before": 41
}