Multi-colour printing
Up to four colours per plate, from a plate you sliced yourself: how colours map to AMS trays, what a filament change really costs, and what we do and do not charge for it today.
The farm prints multiple colours the way a Bambu AMS does: one nozzle, four trays, and a filament change whenever the plate moves from one colour to the next. Up to four colours per plate — from a file you painted and sliced yourself, which is the only multi-colour route that reaches a printer today. That is why colour costs what it costs in changes rather than in hues: the purge each change throws away, and the machine time it burns.
What a filament change actually costs#
Every change parks the current filament, cuts it, purges the hotend, primes the next one and wipes. Two costs come out of that, and they scale very differently.
| Cost | Figure | Where it comes from |
|---|---|---|
| Purge per change | 84 mm³ | The Bambu H2S profile OrcaSlicer ships: flush_volumes_matrix 280 mm³ × flush_multiplier 0.3. |
| Time per change | 1.3 minutes | Park, cut, purge, prime, wipe. The conservative end of an observed figure nearer 1.5. |
| Changes | layers × (colours − 1) | A colour distributed through a part changes on essentially every layer. Layer count comes from the slice when we have one, otherwise from the part's height at 0.2mm. |
That is the model of what a multi-colour plate really costs: purge grams land on the print's weight before it rounds up to the whole gram, at the material's normal per-gram rate, and the change hours bill at $1.50 per hour on top of the all-in rate. Time is what makes multi-colour expensive, not plastic. The maths is written down, tested, and deliberately switched off at the quote — one flag in the pricing code holds it there until the farm can cut a genuine multi-colour plate — so a model we slice is quoted at one colour however many colours its texture holds.
What it comes to#
A 40 g PLA part, 300 layers. The change count, purge weight and hours below are what the overhead model computes — the real cost of running that part in two, three and four colours. None of it reaches a quote on this site today: the same part is $4.80 whatever colours it was designed in, and a plate you sliced yourself is priced from its own measured numbers instead.
| Colours | Filament changes | Purge added | Machine time added | Billable weight | Per part |
|---|---|---|---|---|---|
| 1 | 0 | 0 g | 0 h | 40 g | $4.80 |
| 2 | 300 | 31.75 g | 6.5 h | 72 g | $18.39 |
| 3 | 600 | 63.50 g | 13 h | 104 g | $31.98 |
| 4 | 900 | 95.26 g | 19.5 h | 136 g | $45.57 |
Where the colours come from#
There are two routes a colour count can reach us, and only one of them currently reaches a printer.
A model generated in the Studio#
The design page has Single color and Multi-color (as generated) buttons, and the multi-colour one is disabled — it says on the page that multi-colour prints are not available yet, that the farm prints these in your chosen filament, and that you are charged the single-colour price. The detection behind it is real and still runs where it is called. The count is detected, never asked for: the model's own baseColor texture is sampled at triangle centroids (falling back to vertex colours, then the flat material colour), clustered, near-identical shades merged, clusters covering under 6% of the surface dropped as texture noise, and the result capped at the AMS's four trays. The answer is cached on the generation, because it cannot change.
/api/detect-colorsSigned inCount the distinct filament colours in a generated model and return its palette.
generationIdstringrequired- The generation to analyse. It must be yours and its model must be in managed storage.
{
"colorCount": 3,
"palette": ["#2f6f4e", "#e8e2d0", "#8c2f2f"],
"detectedAt": "2026-09-09T12:00:00.000Z",
"cached": false
}- 401 Unauthorized — you are not signed in.
- 429 Too many analyses — try again shortly. The budget is 30 per hour per account.
- 400 generationId required — the body carried no generation id.
- 404 Generation not found — no such generation of yours, or it has no model file.
- 409 This model is not in managed storage — a model we cannot fetch cannot be sampled.
- 410 The model file is unavailable — the stored object could not be read.
- 422 Could not read colours from this model — no texture, vertex colours or material colour to sample.
A file of your own#
A plain STL cannot be printed in several colours, and no option on the site will make it one. Colour needs geometry assigned to filaments, and an unpainted mesh has no colour regions — slicing the same cube at one, two and four colours returns identical G-code with zero filament changes. To print your own model in several colours, paint it in your slicer, export the sliced plate, and upload that.
Preparing a multi-colour file#
- 1Paint the model in Bambu Studio or OrcaSlicer
Assign regions to filaments with the colour painting tool. Four filaments maximum: that is what one AMS holds, and a fifth would need somebody to swap a spool mid-print.
- 2Slice it for the plate we run
Bambu Lab H2S, 340 × 320 × 340 mm, 0.4mm nozzle. Your slicer's settings become the print: layer height, infill, supports, orientation and plate position are all fixed inside the file once it is exported.
- 3Read the change count before you export
The slicer tells you the filament changes, the filament total and the print time. The grams and the hours are what a price follows — the change count is the reason they moved — so it is worth a second look before you commit to a layout.
- 4Export plate sliced file
You want a .gcode.3mf, not a saved project — a project 3MF has no G-code inside it and is rejected. A plain .gcode uploads and previews at /print but cannot be checked out there, because checkout asks for a slice of our own first; send one of those through the print order API instead. Keep it under 40MB.
- 5Upload it at /print
The header's filament list is read straight out of the file. On this page the price follows the filament total it reports; the hours only bill on an order placed through the print order API (/docs/api/submit-order), which reads both.
text; filament_type = PLA;PLA;PETG;PLA ; filament_colour = #1F1F1DFF;#F5F5F5FF;#B03024FF;#3498DBFF
How colours reach the trays#
The AMS holds four spools, and a tray is a slot, not a colour — tray 1 is red today and blue after the next swap. So the job records what was loaded when it was queued, and that record is re-checked before the print starts.
- The filament list comes out of the sliced file: semicolon-separated filament_type and filament_colour header fields, one entry per extruder. Tray colours arrive from the printer as 8-digit hex with an alpha channel, which is stripped — a spool has no transparency.
- The operator picks a tray for each entry. A tray matches when the polymer matches and the colour is within a redmean distance of 40. PLA-CF satisfies a PLA order — same plastic with fibre in it — while ASA and ABS stay distinct, because UV behaviour is usually why someone chose ASA.
- A wrong-plastic tray is not silently accepted. Queuing stays blocked until the operator confirms the substitution, and the confirmation names both materials.
- What was in those trays is stored as a fingerprint (PLA:#1F1F1D). At print time it is compared against live telemetry: unchanged, the job starts; changed, the dialog reopens and says a spool changed since this job was queued.
An already-sliced file is charged from its own numbers#
When you send a sliced file, the slicer has already done the arithmetic — its filament total includes every purge and its time includes every tool change. Those numbers are used and the colour count is ignored, because counting the purge a second time would be a real overcharge. An order placed through the print order API takes both figures verbatim; an upload at /print is priced from the filament total.
One surcharge still applies to a sliced file ordered through the print API: hours that weight cannot explain. A 120 g plate that runs 20 hours spent most of that swapping, not extruding. The quote works out what a normal print of that weight would take and bills the excess at $1.50/h — 120 g of PLA at $0.12 is $14.40, the 14.05 excess hours are $21.07, and the part comes to $35.47 before postage.
| Path | Grams and hours from | Colour surcharge | Excess-hour surcharge |
|---|---|---|---|
| Your sliced .gcode / .3mf | The file's own header | None — already in the file | On a print-API order, yes: hours beyond what the weight implies |
| Our slice of your mesh | OrcaSlicer, single-colour baseline | None — the plate is cut in one colour | No; a baseline slice has no excess hours |
| No slice yet | Volume estimate (walls plus infill) | None | No |
Fewer changes cost less#
- Changes are counted per layer, so a taller part in the same colours costs more. Halving the height roughly halves the change count.
- Two colours cost a third of what four cost in changes: 300 against 900 on a 300-layer part.
- Colour bands by height change filament far less often than colours mixed through a part. The overhead model assumes the expensive layout on purpose, so slice a banded model yourself and the price follows the grams and hours your slicer measured rather than that assumption.
- Printing parts separately in single colours and assembling them is often cheaper than one multi-colour plate, and it costs nothing in machine time.
- A logo or an inlay on one face needs only the layers it occupies. The estimate cannot see that; a slice can.
- Colour count is clamped to four at checkout, and the change count is capped at 5000 so a mistaken layout cannot become a runaway quote.