# Account and billing

> Signing up and signing in, what each plan costs and includes, managing a subscription and card, where invoices live, and how to get your data out.

Source: https://x3dstudios.com/docs/studio/account  ·  Updated: 2026-10-17

An account is an email, a username and a password. It holds your generation credits, your plan, your orders and — if you use the print API — a card on file. This page covers every way in, what each plan actually includes, how to change or cancel a subscription, where the receipts are, and what you can and cannot do about your data.

## Creating an account

Registration is one form at /auth/signup and then a six-digit code by email. The code is what turns a registered account into one that can sign in, so nothing is usable until you enter it.

1. **Register** — Name, username, email, password and password confirmation. All five are required, and the two passwords have to match.

2. **Enter the code we email you** — Six digits, valid for 10 minutes. Five wrong attempts destroy the code and you have to request a new one. A code can be re-sent, but only three verification emails go to one address in any 15 minutes.

3. **You are signed in** — Verifying creates your credit balance with 5 free generation credits and signs you in through the same password provider you would use next time.

`POST /api/auth/signup`

One endpoint, three actions: register, verify, resend.

Auth: public

**Register**

```bash
curl -X POST https://x3dstudios.com/api/auth/signup \
  -H "Content-Type: application/json" \
  -d '{
    "action": "register",
    "name": "Ada Lovelace",
    "username": "ada_l",
    "email": "ada@example.com",
    "password": "correct-horse-battery",
    "confirmPassword": "correct-horse-battery"
  }'
# => {"step":"verify","email":"ada@example.com"}
```

**Verify**

```bash
curl -X POST https://x3dstudios.com/api/auth/signup \
  -H "Content-Type: application/json" \
  -d '{ "action": "verify", "email": "ada@example.com", "code": "418305" }'
# => {"verified":true}
```

| Field | Rule |
| --- | --- |
| Email | The identity of the account, stored lowercased. One account per address. |
| Username | 3 to 20 characters, lowercase letters, digits and underscores only. Must be unused. |
| Password | At least 8 characters. Stored as a salted scrypt hash, never in plain text. |

> **An unverified account cannot sign in** — Sign-in refuses an account that has never entered its code, and gives the same generic failure as a wrong password. If a fresh account will not log in, the code is usually the reason — request a new one from the signup screen.

## Signing in

There is exactly one sign-in method: a password. The first field accepts either your username or your email address, so whichever you remember works. Sign in at /auth/login; /auth/signin redirects there. A session lasts 30 days from your last visit, and signing out from /profile ends it on that device only.

You sign in once per browser. Every page and every open tab picks the sign-in up straight away, the Ask X3D assistant included, and so does a sign-out. Every Sign in link brings you back to the page you were on, query string and all. Open the sign-in page while already signed in and it sends you on instead of asking again. The site has one address, x3dstudios.com. www.x3dstudios.com redirects there, so a sign-in on either is the same sign-in.

Forgot the password: /auth/forgot-password emails a six-digit code, and the second step takes that code plus a new password of at least 8 characters. The first step answers the same way whether or not the address has an account, so it cannot be used to find out who has one.

`POST /api/auth/reset-password`

action "send-code" emails a code; action "reset" takes email, code and the new password.

Auth: public

Changing a username or password while signed in is done from /profile, or directly against the profile endpoint. Changing a password requires the current one.

`PATCH /api/profile`

Send username, or currentPassword plus newPassword. GET returns name, username, email and createdAt.

Auth: session

## Plans

Two subscriptions exist, both monthly, both cancellable at any time. Every account, plan or not, starts with 5 generation credits. Generation credits and print credit are separate balances: credits are spent generating models, print credit is a dollar amount that comes off a print order.

|  | No plan | Maker | Pro Studio |
| --- | --- | --- | --- |
| Price | $0 | $19 / month | $49 / month |
| Generation credits | 5 to start, then buy packs | 100 each month | 400 each month |
| Print credit | None | $5 each month | $10 each month |
| Print discount | None | None | 10% off Print & Ship orders |

The credits arrive when each monthly invoice is paid, granted once per invoice, so a retry or a duplicate webhook cannot double-grant. Cancelling clears the plan and its print credit as soon as Stripe reports the subscription ended; generation credits already in your balance stay there.

> **Where the Pro discount applies** — The 10% is applied by the Print & Ship checkout at /print, on the quoted total before print credit is taken off. That total already has the postage folded into it — $7 standard or $15 express in the US, $30 international — so the discount comes off the parcel as well as the print. It is not applied to a basket checked out from the cart.

The Enterprise card on /pricing is a conversation, not a plan you can buy — checkout accepts only maker and pro. Use /contact for dedicated capacity, bulk SLAs or white-label API terms.

### Free trial codes

A trial code starts a new Maker or Pro Studio subscription with its first month free. The current one is DESIGNFREE: 30 days, valid for new subscriptions until 30 November 2026. A link of the form /pricing?code=DESIGNFREE fills it in, and the code survives a trip through sign-in or sign-up; it can also be typed into the box above the plans. With a code applied, the plan cards show $0 for 30 days and the date the plan price begins.

- A card is taken at checkout and nothing is charged that day. Stripe charges the plan price when the 30 days end unless the subscription is cancelled first, from Manage Subscription on /pricing.
- The free month grants 100 generation credits, on either plan, and the plan's features. The monthly print credit is not part of the trial: it arrives with the first paid invoice, along with that month's full credits.
- One per account. The code is held while Stripe's page is open, spent the moment the trial starts, and given back if the checkout is abandoned. An account that already has a plan cannot start a trial beside it.
- It is not a discount. Typed into the cart it is refused with a pointer to /pricing, because a free month of design must not become a free print.

### Credit packs

Credits can be bought outright without a subscription. A pack tops up the same balance a plan grants into.

| Pack | Credits | Price | Per credit |
| --- | --- | --- | --- |
| small | 60 | $10 | $0.17 |
| medium | 150 | $22 | $0.15 |
| large | 400 | $50 | $0.13 |

`POST /api/billing/checkout`

Opens a Stripe Checkout session for a subscription or a credit pack.

Auth: session

**Body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | string (subscription \\| credit_topup) | yes | Anything else is a 400. Print orders are explicitly rejected here — they go through /api/print-order so the price is calculated from the stored model. |
| `plan` | string (maker \\| pro) | no | Required when type is subscription. |
| `code` | string | no | Optional, with type subscription: a trial code such as DESIGNFREE. A code that is unknown, expired, already used on this account, or offered by an account that already has a plan is a 400 with the reason and codeRejected: true, and no checkout is opened. |
| `pack` | string (small \\| medium \\| large) | no | Required when type is credit_topup. |

The response is { url, sessionId } — send the customer to url. Without a session the endpoint returns 401, and if payments are not configured it returns 503 rather than a broken checkout page.

## Changing a plan or a payment method

Upgrades, downgrades, cancellation and card changes all happen in the Stripe billing portal rather than in a form here, so card details never touch this site. Ask for a portal link and open it.

`POST /api/billing/manage`

Returns { url } for a Stripe billing portal session that comes back to /pricing.

Auth: session

An account with no Stripe customer id on record answers 400 with "No active subscription found. Please subscribe first." Only a subscription writes that id: a credit pack is a one-off payment and the card saved for the print API is held separately, so neither of those opens the portal. Subscribe once and it opens from then on.

## Receipts, invoices and statements

There are three places money is shown, and each answers a different question.

- Payment History on /orders — your last 50 Stripe charges with the amount, date, status and a Receipt link straight to Stripe's hosted receipt. The list is charges only; a refund shows up in Stripe's receipt rather than as its own row.
- /orders/statement — a printable statement for any date range, defaulting to the range you have filtered on the orders page. It lists date, order, items and amount, totals them, and shows anything not charged (cancelled, refunded, failed) in a separate list rather than hiding it. Issued as Xpress 3D Print, Austin, Texas, and it covers your print API orders as well as your website ones. Download PDF renders it on the server as a PDF on our letterhead; Print uses your browser's print dialog instead, with the page furniture hidden.
- The Stripe billing portal, via /api/billing/manage — subscription invoices and their payment status.

> **Statement totals are summed in cents** — Every line is added as an integer number of cents and divided once at the end, so a hundred orders cannot drift a penny away from what was charged.

## A card on file for the print API

Orders submitted through the developer print API are charged automatically on submission, so a saved card is a precondition for having a key at all. Both live on /profile.

1. **Add the card** — The Add a card on file button opens a Stripe-hosted setup page and returns you to /profile#api. Nothing is charged when you save it.

2. **Generate the key** — The plaintext key is shown exactly once — copy it then. Afterwards only its prefix is displayed, because only a hash is stored. Generating again rotates the key and invalidates the old one.

3. **Revoke when you are done** — The revoke button clears the key immediately. Any request using it fails from that moment.

`POST /api/account/api-key`

Creates or rotates the print API key. Returns 402 with code CARD_REQUIRED when no card is on file.

Auth: session

The card status endpoint reports the brand, last four digits and expiry of the saved card, which is what the badge on /profile reads. Connected Chrome extensions carry a separate token type and are revoked separately, individually or all at once. See /docs/api/keys and /docs/integrations/chrome-extension.

## Getting your data out, and closing the account

Being straight about this: there is no delete-my-account button and no one-click export. What exists is the following, and anything beyond it is a person at contact@x3dstudios.com.

- Order history: /orders lists your last 50 orders, and /orders/statement turns any date range into a document you can save as a PDF.
- Payment records: each charge has a Stripe receipt link, and subscription invoices sit in the billing portal.
- Credentials: change your username or password at /profile at any time.
- Access: revoke the API key from /profile, and sign out there to end the session on a device. A connected extension is revoked with POST /api/extension/revoke from a signed-in browser — /profile has no extension section yet.
- Deletion: email contact@x3dstudios.com from the account's address. Financial records attached to completed orders are kept for accounting.

---

- [Credits](https://x3dstudios.com/docs/studio/credits) — What a generation costs in credits, and how refunds work.
- [Pricing](https://x3dstudios.com/docs/pricing) — What a print costs, per gram and per part.
- [Orders and tracking](https://x3dstudios.com/docs/studio/orders) — The stages an order moves through and what emails you.
- [API keys](https://x3dstudios.com/docs/api/keys) — Creating, rotating and using a print API key.

[Open your account](https://x3dstudios.com/profile)

## Frequently asked

**Can I sign in with Google?**

No. There is one sign-in method: a username or email plus a password. There is no Google, GitHub or magic-link option, and email codes are used only for verifying a new account and resetting a password.

**What do the plans cost?**

Maker is $19 a month for 100 generation credits and $5 of print credit. Pro Studio is $49 a month for 400 generation credits, $10 of print credit and 10% off Print & Ship orders. Without a plan you get 5 credits when you verify your account and can buy credit packs.

**Is there a free trial?**

With a trial code, yes. DESIGNFREE gives a new subscriber their first 30 days of Maker or Pro Studio free, with 100 design credits, until 30 November 2026. Open x3dstudios.com/pricing?code=DESIGNFREE, or type the code into the box on /pricing. A card is needed to start and nothing is charged that day; the plan price begins when the 30 days end unless you cancel before then from Manage Subscription on /pricing. One per account.

**Where do I find a receipt or invoice?**

The Payment History section of /orders lists your Stripe charges with a Receipt link for each one. For a date range across several orders, /orders/statement builds a statement with a Download PDF button.

**How do I delete my account?**

Email contact@x3dstudios.com. There is no self-serve delete or export button. You can revoke your API key yourself from /profile and export your own order history as a statement PDF. A connected Chrome extension is revoked by calling POST /api/extension/revoke from a signed-in browser — there is no extension list on /profile yet.
