Printy3D

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#

GET/v1/balanceusage:read
included_creditsintegerrequired

Credits that come with your plan each period. They expire at the end of the period.

purchased_creditsintegerrequired

Credits you bought. They never expire, and they can go below zero when a job runs longer than the balance covered.

held_creditsintegerrequired

Credits reserved by live jobs that have not finished.

available_creditsintegerrequired

included + purchased − held: what new jobs can hold.

period_start, period_endstring (date-time)

The current monthly period.

lowbooleanrequired

Fewer credits available than one typical repair holds.

exhaustedbooleanrequired

Not enough credits to admit any job.

The console shows the same balance once your account is approved.

Holds and settlement#

  1. 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_credits shows it.
  2. Refusal. If the hold is more than your available_credits, POST /v1/jobs answers 402 insufficient_credits with required and available, and nothing is queued.
  3. 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.
OutcomeChargecharge_basis
SucceededRun 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)10minimum
Cancelled before it started0free
Cancelled while runningRun time so far (at least 10)run_time
Failures on our side: invalid_result, transfer_failed, verification_timeout, lease_expired, capacity_exhausted0free
An Exact Check stopped by its limits: time_limit, memory_limit0free

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#

Every movement of your credits, newest first. Pass the page's next_before as before to read further back.

kindMeaning
plan_grantIncluded credits of a new period.
expireUnused included credits at the end of a period.
topupCredits purchased.
adjustA correction by the Printy3D team.
holdA live job reserved credits (held_delta).
settleA live job finished: the hold is released and the charge taken.
GET /v1/balance/transactions?limit=2
{
  "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
}