Credits
Credits pay for AI generation on X3D — what a run costs, how many you start with, where more come from, and why they never pay for a physical print.
Credits buy AI generation: turning a prompt or a photo into a 3D model, re-texturing one you already made, and generating or editing images. A new account starts with 5. This page lists what every operation costs, where more credits come from, what happens when you run out, and whether they expire.
What a credit buys#
| Operation | Credits | Notes |
|---|---|---|
| 3D generation, fast draft | 1 + add-ons | The default mode. See the add-ons below. |
| 3D generation, hi-fi | 2 + add-ons | Prompt enhancement and engine routing are model-written rather than local. |
| Re-texture an existing model | 1 | Flat. Mesh quality and texture settings do not change it. |
| Image generation | 1 per image | 2 per image at 4K. 1 to 4 images per request, so 1 to 8 credits. |
| Image edit | 1 | 2 at 4K. Charged once per request, however many source images you send. |
| Printability check | 0 | Free, and it works without an account. |
| Model import from a URL | 0 | Free. |
| Price quote | 0 | Free and public. |
3D generation add-ons#
The base cost is 1 for fast draft, 2 for hi-fi. Everything below is added on top of it:
| Option | Added |
|---|---|
| Input is an image, image plus text, or multiview | +1 |
| Mesh quality high | +1 |
| Mesh quality ultra | +2 |
| Texture resolution 4k | +1 |
| Texture resolution 8k | +2 |
| Refinement pass | +2 |
- Text prompt, fast draft, standard mesh, 2k texture: 1 credit.
- Photo, fast draft, standard mesh: 2 credits.
- Text prompt, hi-fi, ultra mesh: 4 credits.
- Photo, hi-fi, ultra mesh, 8k texture, refinement pass: 9 credits.
Where credits come from#
| Source | Credits | Price | Cadence |
|---|---|---|---|
| Signup grant | 5 | Free | Once, when your account's credit record is created at email verification |
| Maker plan | 100 | $19 / month | Added on every paid invoice |
| Pro Studio plan | 400 | $49 / month | Added on every paid invoice |
| Small pack | 60 | $10 ($0.17 each) | One-time |
| Medium pack | 150 | $22 ($0.15 each) | One-time |
| Large pack | 400 | $50 ($0.13 each) | One-time |
Both plans also carry a monthly dollar print credit — $5 on Maker, $10 on Pro. That is a separate balance in cents, applied to a print order, and it is not interchangeable with generation credits in either direction.
/api/checkoutSigned inCreate a Stripe Checkout session for a credit pack or a plan. This is what the buttons on /pricing call.
typestringrequired- Use credits for a top-up pack, subscription for a plan.
creditssubscriptionproduct packstringoptional- Required when type is credits. Anything else returns 400 'Invalid credit pack'.
smallmediumlarge planstringoptional- Required when type is subscription. Anything else returns 400 'Invalid plan'.
makerpro
The response is { url, sessionId }; send the customer to url. Signed-out callers get 401 'Authentication required', and 503 'Stripe not configured' means billing is switched off in that environment. POST /api/billing/checkout is the equivalent route on the billing surface: it takes the same three packs under type credit_topup and the same two plans under type subscription, and it refuses print orders outright because a print has to be priced from the stored model rather than from a number the browser sent.
Do they expire?#
No. Generation credits are a plain running balance with no expiry date and no monthly reset. A plan's allowance is added to whatever you already hold each time an invoice is paid, so an unused month carries forward. Cancelling a plan clears the plan flag and zeroes the dollar print credit, but the generation balance you have already accumulated is left alone and stays spendable.
| Balance | On a paid invoice | On cancellation |
|---|---|---|
| Generation credits | Allowance is added to the balance | Untouched |
| Print credit (dollars) | Set to the plan's amount for the cycle | Set to $0 |
Running out#
Credits are checked and deducted before the engine is called, so an underfunded request is refused rather than half-run. The refusal is machine-readable and tells you exactly how short you are.
{
"error": "no_credits",
"message": "This generation costs 4 credits but you only have 2. Add credits to continue.",
"needsPayment": true,
"creditsRequired": 4,
"creditsAvailable": 2
}| Endpoint | Status when out of credits |
|---|---|
| POST /api/generate | 403 |
| POST /api/retexture | 403 |
| POST /api/images/generate | 402 |
| POST /api/images/edit | 402 |
needsPayment is true until you have paid us for credits at least once — buying any pack or paying any plan invoice flips it. It is a hint for the interface about which prompt to show, not a permission.
Refunds#
Because the charge happens first, a failure has to give the credits back. Three things do that:
- A generation that returns a non-2xx response or throws is refunded on the spot and its history row is marked failed.
- A generation still unfinished after 60 minutes is expired by a sweep, marked failed, and refunded.
- A re-texture that fails after the credit was taken is refunded the same way.
Every refund is written against an idempotency key derived from the generation id, so the live request and the sweep can race without paying out twice. A refund restores generation credits only — it never changes your plan or your paid-account state.
Checking your balance#
Your balance is attached to your session and re-read on every request, so it is current on any signed-in page without a refresh. The generation API also returns creditsCharged on every successful run, which is the cheapest way for an integration to reconcile what it spent. There is one balance per account, keyed on your email address: a generation started from the Chrome extension spends the same credits as one started on the site.