# Changelog

> Dated, API-visible changes to the X3D print API and MCP server since the API launched on 30 July 2026: new fields, price changes, and what each one means for a caller.

Source: https://x3dstudios.com/docs/api/changelog  ·  Updated: 2026-10-21

This is every change to the print API that a caller could notice, since it went live on 30 July 2026, and every change to the MCP server at /api/mcp since it opened on 29 September. It is short because the API is small and has changed slowly. Most entries are price changes and added fields rather than shape changes: no request field has ever been removed, and no response field has ever been renamed.

> **No versions, no deprecation window** — There is no /v1 in the path and no version header to pin. Changes land on the same endpoints for everyone at once. Read this page before assuming a price you cached last month still holds.

## 2026

| Date | Change |
| --- | --- |
| 21 October | Normal print, which every API and MCP order is printed at, ships in 4–5 business days, up from 3–4. An API order's farm ship-by day is five business days from the order, not four. list_materials reports 4–5. Prices are unchanged. |
| 20 October | US standard postage is free from a $49.50 goods subtotal, down from $50. The $7 standard and $15 express rates, express never being free, and international at $30 flat, free at $500, are unchanged. |
| 18 October | TPU $0.13 → $0.25/g. Every other rate, the $1.00 minimum, density and the quantity discounts are unchanged. tpu in a colour we do not stock is also $0.25/g, since the $0.20/g floor is below it. |
| 17 October | A model made with POST /api/retexture can be ordered: it is saved with its measurement, so Print & Ship and the cart no longer refuse it with a 422. The response adds printability, and printStatus can be repaired or needs-redesign as well as ready or supports. |
| 16 October | MCP: list_materials reports the website's print speeds, Normal and Priority. Priority print is not sold through the API or MCP. track_order can report picked_up. |
| 15 October | PRINTED is set automatically, with its email, when the last farm print job for the order completes. |
| 14 October | TPU density 1.21 → 1.24 g/cm³, so a TPU mesh order weighs about 2.5% more. |
| 13 October | A sliced .gcode.3mf whose plate uses five or more filaments pays the $25 second-AMS fee. breakdown adds secondAmsFee and colours when it is charged; MCP quotes add price.second_ams_fee. |
| 9 October | MCP: an API order that is ACCEPTED or PRINTING reports the stage queued, not placed. |
| 8 October | MCP: track_order and get_order accept website order numbers, with or without a #. track_order stops looking after ten misses an hour for one email. |
| 6 October | email takes up to five addresses, and every one gets every order email. Responses add email and notifyEmails. |
| 29 September | The MCP server opened at /api/mcp. An order with no color now prices at the material rate. Unpaid submit responses add chargeOutcome. |
| 16 September | shippingSpeed on submit: standard ($7) or express ($15, US only). breakdown adds shippingSpeed. |
| 13 September | API orders appear on /orders, its statement and GET /api/orders. Printed, shipped and delivered emails for API orders, and a daily carrier check that marks shipped orders DELIVERED. |
| 10 September | The international list became the website's: ten more countries accepted. |
| 9 September | These API docs published. No change to any endpoint. |
| 9 September | Stock colour palette fixed at twelve names; every other colour prices at a $0.20/g floor. |
| 7 September | US postage $5 → $7. PLA $0.10 → $0.12/g, PETG $0.11 → $0.12/g. |
| 30 August | The per-gram rate became all-in. Per-part minimum $3.00 → $1.00, premium quality became a 1.75× multiplier, billable weight now rounds up to the whole gram, PLA density 1.24 → 1.26 g/cm³. |
| 24 August | Already-sliced files priced from the slicer's measured filament and time, not from geometry. |
| 19 August | Build volume check raised from a 256 mm cube to 340 × 320 × 340 mm. |
| 6 August | modelUrl accepted as an alternative to a file upload. Chrome-extension tokens accepted on submit. |
| 30 July | The print API launched: submit, read status, manage keys, billed to the card on file. |

### 21 October 2026: Normal print ships in 4–5 business days

- Normal print now ships in 4–5 business days, up from 3–4. Every order placed through POST /api/print/orders or create_print_order is printed at Normal print, so this is the window an API order is held to. Priority print, sold only on the website, still ships in 1–2, and no price moved.
- The farm gives an API order a ship-by day five business days after it was placed, not four. That day is worked out from the order date rather than stored, so an order already in the queue moves out by one business day too.
- MCP: list_materials reports shipping.printSpeeds.normal.shipsInBusinessDays and shipping.handlingDaysBeforeDispatch as min 4, max 5, and its sentence says 4–5. Door to door, Normal print with standard postage is now 8–11 business days, and with express postage 6–8. get_lead_time is unchanged: it is still the live figure off the fleet and the queue.

### 20 October 2026: free US postage from $49.50

- US standard postage is waived once the goods subtotal reaches $49.50, down from $50. An order whose goods come to $49.50 to $49.99 used to pay $7 of postage and now pays nothing; every other order is charged exactly what it was.
- The rates did not move: $7 standard, $15 express and never free, and $30 flat to the international list, free at $500. The price endpoint still adds the flat rate whatever the subtotal, as it always has.
- MCP: list_materials reports freeOver 49.5 for US standard, and estimate_price reports freeShippingOver 49.5.

### 18 October 2026: TPU is $0.25 per gram

- material=tpu now bills at $0.25 per gram, up from $0.13. A 22 g TPU part was $2.86 and is now $5.50; ten of them were $25.74 and are now $49.50. PLA, PETG and ABS stay at $0.12/g and ASA at $0.14/g.
- The custom-colour rate is a floor of $0.20/g, and TPU is already above it, so a TPU order in a colour we do not stock is $0.25/g, the same as in a stock colour. For every other material an off-palette colour still raises the rate to $0.20/g.
- Nothing else moved: TPU's density is still 1.24 g/cm³, billable weight still rounds up to the whole gram, the $1.00 minimum per part still applies (a TPU part now reaches it at 4 g or less), and quantity discounts are unchanged. list_materials and estimate_price on the MCP server report the new rate.

### 16 October 2026: print speeds on the MCP server, and pickup

- The website checkout added Priority print: $5 per order, printed ahead of Normal print. It is not offered through POST /api/print/orders or create_print_order. Every API and MCP order is queued as Normal print, and shippingSpeed=express still buys only faster postage.
- list_materials adds shipping.printSpeeds, with normal and priority each giving fee and shipsInBusinessDays, and its sentence says how soon a website print ships at each speed. Call get_lead_time for the live figure.
- An order the farm hand-enters can now be a pickup, which ends at Picked up instead of Shipped and Delivered. track_order's stage can therefore be picked_up. Orders placed through the API are always posted.

### 15 October 2026: printed when the printing is done

An API order accepted onto a printer is linked to the farm job that prints it. When every job linked to the order is done, the order moves to PRINTED by itself and every address on it gets the printed email. A failed or cancelled plate does not count, so an order waits for its reprint rather than moving early. An operator can still mark an order printed by hand. Nothing about the request or the response shape changed.

### 14 October 2026: TPU weighs what the farm's preset says

TPU's density moved from 1.21 to 1.24 g/cm³, the figure on the Generic TPU preset the farm prints TPU with. A TPU mesh order is priced from its volume times that density, so it comes out about 2.5% heavier, and so about 2.5% dearer, than before. The other materials did not change, and an already-sliced file is still priced from the grams in the file.

### 13 October 2026: the second-AMS fee on sliced plates

- A .gcode.3mf whose plate uses five or more filaments is charged the $25 second-AMS fee, once per order whatever the quantity, as every other way of buying a print already was. The count is the plate's own list of filaments it uses. A plain .gcode lists every filament its project defined, used or not, so it is still priced as one colour.
- When the fee is charged the 201 adds breakdown.secondAmsFee (25) and breakdown.colours, and estimatedCost includes it. Orders without it are unchanged, field for field.
- On the MCP server, quote_print adds price.second_ams_fee and names the fee in its sentence, so the quoted total includes what the order will charge.
- The farm prints a plate of five to eight colours only on a printer with that many filaments loaded, so such an order can wait longer than the live lead time.

### 8 and 9 October 2026: order numbers and stages on the MCP server

- Website orders are now numbered, like 2610014. track_order and get_order accept that number with or without a leading #. X3D- codes from the print API are unchanged.
- track_order counts lookups that find nothing against the email they named. After ten in an hour it answers that the order was not found without looking, unless the caller's key belongs to that email.
- Stages read by track_order, get_order and list_my_orders gained queued. An API order at ACCEPTED or PRINTING now reports queued; before 9 October it reported placed.

### 6 October 2026: more than one address for order emails

- The email field on POST /api/print/orders takes one to five addresses. Repeat the field, or separate addresses with commas or semicolons in one field. The first is the main contact.
- Every address gets every order email: the confirmation, printed, shipped with tracking, and delivered.
- The 201 response and GET /api/print/orders/{code} return email (the main contact) and notifyEmails (the others, possibly empty).
- Addresses are now checked. An address that is not valid, or more than five, is a 400 that names the problem; before this, a single address was stored without a check. Name <address> still works and uses the address. A comma or semicolon inside one field now separates two addresses, unless it is inside a quoted name.
- Each address gets its own message, so one address that cannot be delivered does not stop the others, and nobody sees the other addresses.

### 29 September 2026: the MCP server, and the Default colour

- POST /api/mcp opened: a Model Context Protocol server with tools to quote, order and track prints, using the same x3d_live_ key. Ordering through it takes a quote_id and confirm: true. See /docs/api/mcp.
- An order sent with no color is stored as "Default" and now prices at the material's own rate, because Default means our choice and our choice is always a stock spool. From 9 to 29 September it priced at the $0.20/g custom-colour floor.
- A 201 with paid: false adds chargeOutcome: "not-charged" when the card was provably not charged, "unknown" when the charge may have gone through and only its confirmation was lost. The message says which.

### 16 September 2026: express shipping

- POST /api/print/orders takes shippingSpeed: standard ($7, free from a $50 print subtotal) or express ($15, never free). Leaving it out is standard.
- Express is US only. Asking for it on any other country is a 400, and so is any value other than the two words.
- breakdown adds shippingSpeed, because the amount alone cannot say which service was bought: $15 is express, and it is also two standard parcels.

### 13 September 2026: API orders join the rest

- Orders placed with a key appear on /orders, on its printable statement and in GET /api/orders, beside the account's website orders. Before this they were readable only one code at a time.
- Every address on an API order is emailed when the order is printed, when it ships with the tracking number, and when it is delivered. Until then the confirmation was the only email.
- A daily check asks the carrier about every SHIPPED order with a tracking number, and moves the delivered ones to DELIVERED.
- Carriers are stored as ids such as ups or usps, so tracking.carrier on a new order reads that way.

### 10 September 2026: one list of countries

The print API accepted 13 international destinations and the website checkout 22, and neither list contained the other. The API now accepts the website's list, the union of both: ten more countries, Portugal and Japan among them. Nothing that was accepted before is refused now.

### 9 September 2026 — colours

Twelve colours are stocked and print at the material's own rate: Black, White, Red, Cyan, Sakura Pink, Sunny Orange, Green, Yellow, Mint Green, Lavender, Silver and Brown. Anything else has to be bought in as a spool, so it prices at a floor of $0.20/g. Names are matched case-insensitively, and a hex value matching a stock spool counts as stock.

> **Omitting color got more expensive that day, until 29 September** — An order with no color field is stored as "Default", which was not on the stock list, so from 9 September it priced at the custom-colour floor of $0.20/g. That was fixed on 29 September: Default now prices at the material rate.

### 7 September 2026 — postage and two materials

- US postage went from $5 to $7 flat. The free-shipping threshold stayed at $50, and international stayed at $30 flat, free at $500.
- PLA went from $0.10 to $0.12 per gram; PETG from $0.11 to $0.12. ABS, ASA and TPU were unchanged at $0.12, $0.14 and $0.13.
- Nothing about the request or response changed — the same fields came back with different numbers in them.

### 30 August 2026 — one rate, all in

Before this, a quote was filament plus an hourly machine charge on every print, floored at $3.00 per part. After it, the per-gram rate covers filament and normal machine time together, and machine time is billed separately only where weight cannot explain it — filament changes, and sliced files whose measured hours far exceed what their weight implies. Premium quality became a 1.75× multiplier on the rate rather than a separate slower price.

- The per-part minimum dropped from $3.00 to $1.00, so small parts finally cost roughly what their weight implies.
- Billable weight rounds up to the whole gram, so quotes agree with what a slicer displays.
- PLA density moved from a generic 1.24 to 1.26 g/cm³, the figure the spools the farm actually loads are specified at. Weights came out about 2% heavier as a result.

### 24 August 2026 — sliced files bill what the slicer measured

Submitting a .gcode or .gcode.3mf now prices from the filament weight and print time in the file rather than from an estimate of its geometry. This matters most for multi-colour plates: every filament change purges the hotend, so four colours on one model can use three times the material and forty times the time of a single-colour print of the same shape, and no volume estimate can see that. Meshes are unaffected.

### 19 August 2026 — a bigger plate

The size check rejected anything over a 256 mm cube, a limit inherited from a printer the farm no longer runs. It is now 340 × 320 × 340 mm, measured against the model's best orientation rather than axis by axis, so a long part that fits when rotated is accepted. Models between those two sizes started going through instead of coming back as a 422.

### 6 August 2026 — ordering a model we already hold

- modelUrl became an alternative to uploading a file: pass the storage URI of a model your account generated and we read it from our own storage. Ownership is re-checked on every call — someone else's URI is a 403.
- Chrome-extension tokens (x3d_ext_…) became acceptable on POST /api/print/orders alongside print-API keys. They still are not accepted on the status endpoint, which takes an x3d_live_ key only.

### 30 July 2026 — launch

- POST /api/print/orders — submit a model plus a shipping address as multipart/form-data.
- GET /api/print/orders/{code} — read one order you own.
- GET, POST and DELETE /api/account/api-key — read your key's status, issue or rotate the key, and revoke it, all from a signed-in session.
- Orders are auto-billed to the card on file at submission, and a card is required before a key can be issued at all.
- nozzleDiameter, nozzleFlow and layerHeight are accepted on submit and feed the price.
- STL, GLB, .gcode and .gcode.3mf accepted, up to 100 MB. OBJ has never been accepted here.

---

> **What has never changed** — The key format (x3d_live_ plus 48 hex characters), both accepted headers, the order-code format (X3D- plus six characters), the one-key error envelope, and the nine status values. If you built against those on launch day, they still hold.

- [API billing](https://x3dstudios.com/docs/api/billing) — Current rates, a worked example, and what the card charge covers.
- [Errors](https://x3dstudios.com/docs/api/errors) — Every status code and the exact message that comes with it.
- [Submit an order](https://x3dstudios.com/docs/api/submit-order) — The current request shape, field by field.

## Frequently asked

**Is the X3D API versioned?**

No. There is no version segment in the path and no version header. Every change lands on the same URLs, which is why this page exists — it is the only record of what moved and when.

**Will a price change affect an order I already placed?**

No. An order is quoted and charged during the submission request, so it is priced at the rates in force at that moment. A later change cannot alter what you were charged, but it does change the next quote — do not cache a price across days.
