# File formats

> STL, GLB, 3MF and sliced plates: what X3D accepts, the size limits, a mesh we slice versus a file printed exactly as sent, and how a slicer project prints in its colours.

Source: https://x3dstudios.com/docs/file-formats  ·  Updated: 2026-10-16

You can upload three kinds of file at /print: STL, GLB and 3MF. STL and GLB are meshes we slice for you, and a 3MF can be either: a model or a slicer project we slice, or a sliced plate export (.gcode.3mf) we print exactly as sent. Which kind you upload decides what you can change afterwards and how the price is worked out. A bare .gcode is not accepted on the website; export the plate as .gcode.3mf instead.

## What you can upload

| Extension | Kind | Limit on the website | What happens to it |
| --- | --- | --- | --- |
| .stl | Mesh | 100 MB | We slice it. You pick material, colour, quality, scale and infill. |
| .glb | Mesh (binary glTF) | 100 MB | We slice it. Same options as an STL. |
| .gcode | Already sliced, without the plate | Not accepted | Export the plate sliced file (.gcode.3mf) instead. The print API still takes one. |
| .3mf | Model, slicer project, or sliced plate export | 40 MB | A plate export with G-code inside prints as is. A model or project is sliced by us, and a project with colours assigned can print in them. |
| .gcode.3mf | Already sliced (Bambu / Orca bundle) | 40 MB | Printed as-is. Treated as a 3MF. |

> **OBJ is not accepted for print upload** — Choose an .obj and the page answers Unsupported file type. Use STL, GLB, or 3MF (a model or a sliced plate). Convert it to STL first. The Studio's generation options list OBJ among their output formats, but every model X3D generates is stored as a GLB, and GLB is accepted — so a generated model goes straight to print. Only a hand-made OBJ from another tool needs converting.

> **A .3mf can be a project or a sliced plate** — 3MF is used for two different things. A Bambu Studio or OrcaSlicer project save is a 3MF, and so is a sliced plate export, but only the second contains G-code. We look inside to tell them apart. A plate export prints exactly as exported. A project is sliced by us, and when it assigns two or more filaments it can be printed in those colours: see A project in its own colours below.

The size limits are memory limits, not policy. A mesh is read as raw bytes, but a sliced file is turned into text and a 3MF's inner G-code decompresses several times over on top of that, so a big sliced file costs far more memory than a big mesh. That is why the sliced ceiling is lower than the mesh ceiling.

## Mesh or pre-sliced: the difference that matters

|  | A mesh we slice (STL, GLB, model or project 3MF) | A file you sliced (plate 3MF) |
| --- | --- | --- |
| Who chooses the print settings | You choose material, colour, quality, scale and infill; we choose the rest | You did, in your slicer. We do not touch them. |
| Can you change it after upload | Yes — every option re-quotes live | No. Scale is locked at 100% and the file is treated as fully specified. |
| Where the weight comes from | A real slice where we can run one, otherwise a volume estimate | The filament figure written in the file's own header |
| Where the print time comes from | Throughput for the chosen quality and nozzle | The time estimate written in the file's own header |
| Build-volume check | Enforced — 340×320×340mm, measured in the model's best orientation | Skipped. Your slicer already fitted it to a plate. |
| Multi-colour | A project 3MF prints in its own colours once our slice of it proves two or more print. An STL or GLB prints in the one colour you pick. | Whatever your file does. The purge is already in your grams and hours, so only the second-AMS fee is added, at five or more colours. |

## A mesh we slice for you

Upload an STL or a GLB and the model is yours to configure. Material and colour set the rate per gram. Quality picks the layer height — Standard is 0.2mm, Premium is 0.1mm and costs 1.75× the rate. Scale runs from 50% to 300% and infill from 10% to 100%; both change the weight, and the quote updates as you move them.

- Units: an STL is read as millimetres. A GLB carries no unit declaration, so it is read as metres and converted — the glTF convention. If a GLB comes out a thousand times too big or too small, that is why.
- Build volume: the model's three dimensions are sorted and compared against 340 × 340 × 320, so a long thin part that only fits diagonally is still accepted. Anything larger is rejected with its measured size in the message.
- Quotes come from a real OrcaSlicer slice wherever we can run one, not a volume guess. Slicing takes ten seconds to a minute, so the first number on the page may still be the estimate; it settles once the slice returns.
- Above 35% requested infill we fall back to the estimate, because our slice runs at the profile's sparse default and stops being representative of what you asked for.
- Checkout will not sell a print we have not measured. If a slice has not landed yet, checkout answers with a 409 and the message that we price by weight and will not charge before we know it.

## A project in its own colours

A Bambu Studio or OrcaSlicer project already says what prints in which colour: it carries a filament table, a filament for every part, and any painting you did. Upload the project as you saved it and the page lists its colours, with each filament's slot number and material, and offers Print in N colours or One colour instead.

- Colour is checked by doing it. We slice each plate in the project's own colours in the background, one plate at a time, and the page shows which plate it is on. A small project takes under a minute; one with many plates can take several. You can order in one colour at any point without waiting.
- Colours are counted by what prints. A filament the project assigns but the slicer never feeds, such as a sliver of paint with no solid behind it, is dropped, and the count, the price and what the operator loads all follow the filaments that lay down plastic.
- The price is that slice: its grams and hours, purge and filament changes included, at the project's plastic's rate. Up to eight colours print. A print using five or more adds the $25 second-AMS fee once per order line.
- In colour the project prints at 100% scale on our standard 0.2mm profile, in its own plastic, keeping its parts, filament assignments and paint. Its project-wide print settings are not used. Those controls are locked on the page; choose One colour instead to change them.
- The farm prints a multi-plate project as one job per plate, each loaded with that plate's colours.

| What the project does | What you can order |
| --- | --- |
| Uses two filament types on one plate, such as PLA and PETG, or PLA and PLA-CF | One colour. Each plate prints from one filament type. |
| Uses different base plastics on different plates, such as PLA on one and PETG on another | One colour. A colour order is priced as one plastic, so PLA on one plate and PLA-CF on another is fine, at PLA's rate. |
| Changes colour at a set layer height, or with a height-range modifier | One colour. Only filaments assigned to parts and painted areas are printed in colour. |
| Assigns more than eight filaments that print | One colour. Eight is two AMS units. |
| Assigns one filament, or only one actually prints | One colour, which is what it is. |
| Colours its parts with 3MF colour groups instead of filaments | One colour. Assign the colours to filaments in your slicer and upload the saved project. |

*In every case the page says why, and the project can still be ordered in one colour.*

## A file you already sliced

A sliced plate export (.3mf or .gcode.3mf with G-code inside) is not a model — it is a set of instructions for a specific printer with a specific nozzle. We read the footprint, the filament it says it uses, the estimated time and the embedded plate preview out of the file, and then print it. Nothing is re-sliced, re-oriented or re-arranged.

- Layer height, infill, wall count, supports, brim, orientation and plate position are whatever you set. None of them can be changed here.
- Scale is locked at 100%. The scale slider does not appear for a sliced file, and the quote treats it as solid rather than applying an infill factor.
- Price is worked out from the filament figure in the file, adjusted for the density of the material you select — so material and colour still change what you pay, because they change the rate per gram.
- The build-volume check is skipped, because your slicer already fitted the plate. The reported footprint can include purge lines and calibration moves, which is why we do not second-guess it.
- A file sliced for a different printer model is a hard failure at the farm, not a warning. Slice for a Bambu H2S or P2S — those are the machines in the fleet.

> **Leave quality on Standard for a sliced file** — The quality choice is a price multiplier, and Premium multiplies the rate by 1.75. Your sliced file already carries its own layer height, so choosing Premium on it raises the price without changing anything about the print.

## Importing from a model site

Instead of a file you can paste a link. Thingiverse, MakerWorld, Printables, Cults3D, MyMiniFactory and Thangs are supported, as is a direct link to an .stl, .glb or .zip. A ZIP holding several STLs is merged into one file. Whatever comes back is then uploaded and checked exactly like a file you picked yourself, so all the rules above still apply.

## Through the print API

`POST /api/print/orders`

Submit a file and a shipping address as multipart/form-data.

Auth: api-key

The API accepts STL, GLB, .gcode, and 3MF as a sliced plate export, and applies one 100 MB ceiling to all of them — the 40 MB 3MF limit is a website limit, not an API limit. An extension it does not recognise comes back as 415 with the message: Unsupported file. Send an STL or GLB model, or an already-sliced .gcode / .gcode.3mf.

**Submitting an STL**

```bash
curl -X POST https://x3dstudios.com/api/print/orders \
  -H "Authorization: Bearer $X3D_API_KEY" \
  -F "file=@bracket.stl" \
  -F "material=petg" \
  -F "color=Black" \
  -F "quantity=2" \
  -F "recipientName=Ada Lovelace" \
  -F "street1=1 Main St" \
  -F "city=Austin" \
  -F "state=TX" \
  -F "zip=78750"
```

> **That request places a real order** — A successful POST to /api/print/orders charges the card on file and queues the part at the farm. There is no sandbox mode. Use /api/price or the /print page while you are experimenting.

## Common rejections

| What you see | What it means |
| --- | --- |
| Unsupported file type. Use STL, GLB, or 3MF (a model or a sliced plate). | On /print, the extension is not STL, GLB or 3MF. OBJ, FBX, STEP, ZIP and a bare .gcode all land here. |
| That file is too large (max 40MB for 3MF) | A 3MF over the 40 MB ceiling. Export fewer plates, or send the mesh instead and let us slice it. |
| No sliced GCode found in this .3mf | Through the print API only: a project save sent where a plate export is needed. Slice, then Export plate sliced file. On the website a project is accepted. |
| We couldn't read a printable mesh from that file. | The mesh could not be parsed, or has no triangles. Re-export it and check it is watertight. |
| This model is …mm — larger than the 340×320×340mm build volume. | Scale it down, or split it into parts and order them together. |

- [Printability check](https://x3dstudios.com/docs/studio/printability) — Upload a mesh and get holes, non-manifold edges and thin walls back before you order.
- [Pricing model](https://x3dstudios.com/docs/pricing) — How grams become a price, and how a sliced file's numbers are used.
- [Bambu Studio](https://x3dstudios.com/docs/integrations/bambu-studio) — Slicing on your own machine and sending the plate to the farm.

[Upload a file](https://x3dstudios.com/print)

## Frequently asked

**Can I upload an OBJ file?**

No. Print upload at /print accepts STL, GLB and 3MF only, a 3MF being a model, a slicer project or a sliced plate (.gcode.3mf). Convert an OBJ to STL first — every mesh tool exports one, and nothing about the model changes in the conversion.

**Can I upload a .gcode file?**

Not at /print. The farm starts every print from a plate 3MF, so a bare .gcode could be paid for and then never start. In Bambu Studio or OrcaSlicer use File, Export, Export plate sliced file, and upload the .gcode.3mf it writes: that prints exactly as you sliced it. The print API still accepts a .gcode.

**Can I upload a Bambu Studio or OrcaSlicer project .3mf?**

Yes, on the website. A project save has no G-code in it, so we slice it ourselves. If it assigns two or more filaments, we slice each plate in those colours in the background and offer it in colour once that slice proves at least two of them print; you can always order it in one colour instead. The print API still needs a sliced plate export (.gcode.3mf) for a 3MF.

**What is the file size limit?**

On the website, 100 MB for a mesh (STL, GLB) and 40 MB for any 3MF, whether a model, a project or a sliced plate. Through the print API, one 100 MB limit applies to every file.

**If I upload my own sliced file, can I still change the layer height or infill?**

No. A sliced file is the print instruction, so layer height, infill, supports, orientation and plate position are already fixed inside it. To change any of those, re-slice and upload the new file.
