Upload and print
Upload an STL, GLB, 3MF, slicer project or sliced plate at /print, get a quote weighed from a real slice, print a project in its own colours, then order the part printed in Austin and shipped.
The /print page takes your own file, validates it, weighs it with a real slice, and turns it into an order we print in Austin, Texas and ship to you. You choose material, colour, quality, quantity, scale and infill; the price comes from the grams the slicer says will leave the nozzle. You do not need an account to upload and see a price. You sign in to order, because the order is billed to an account and filed under it.
What you can upload#
| Kind | Extensions | Size limit | What we read from it |
|---|---|---|---|
| Mesh | .stl | 100MB | Bounding box, volume, triangle count |
| Mesh | .glb | 100MB | Bounding box, volume, triangle count |
| Model or project | .3mf | 40MB | Bounding box, volume, triangle count; for a project, its filament table and the colours it assigns |
| Sliced | .3mf, .gcode.3mf | 40MB | Print footprint, filament grams, print time, plate preview |
A mesh must fit the plate: 340 × 320 × 340 mm on a Bambu Lab H2S. The three dimensions are sorted before they are compared, so a part that only fits when rotated still passes. An already-sliced file skips this check entirely — your slicer already arranged it on a plate, and the footprint it reports can include purge lines and prime towers that are not part of the model.
How the upload works#
The bytes go from your browser straight to storage, not through the app. There is a 32 MiB cap on request bodies in front of the service, and anything over it is rejected before the app ever sees it — so a 100MB model could never arrive as an ordinary POST. It used to fail as a confusing validation error rather than a size error. Now the app hands the browser a signed URL, the browser uploads to storage, and the app validates the stored object afterwards.
- 1The page asks for an upload URL
It sends the filename and the size. Format and size are checked here, before a single byte moves — an unsupported extension or an oversize file is refused now rather than after the transfer.
json{ "fileName": "bracket.stl", "size": 48213004 } - 2Your browser uploads to storage
A signed PUT URL comes back, valid for 15 minutes, pointing at a staging path. The transfer is browser to storage, so its speed is your connection, not ours.
- 3We validate what actually landed
The app measures the stored object itself rather than trusting the size the browser claimed, parses the bytes that actually landed, and only then copies the exact bytes it validated out of staging into their final path. That copy is the point of the staging step: the signed URL stays writable for its full 15 minutes, so validating and printing from the same writable object would let a small part be priced and a large one printed.
- 4The model is weighed
As soon as the file is stored, a slice is queued in the background. Until it lands the page shows Calculating, because showing an estimate and then quietly replacing it reads as the site changing its mind about the price. Move the scale slider and, once it rests, that size is sliced too: the weight line reads Weighing at 300% until it lands, and a size you have already weighed comes back at once.
/api/print-upload/initNo authReserve a staging path and return a 15-minute signed upload URL. Signed in, or signed out with the visitor cookie this route hands out.
/api/print-upload/completeNo authValidate the uploaded object, store it, and return its measurements, for the same account or the same browser that started the upload.
Uploading without an account#
Signed out, you can upload, import from a link, move the scale slider and check a project's colours exactly as a signed-in customer does, and every price is the same real slice. The page remembers your uploads with a cookie in this browser rather than an account, so it needs cookies allowed for the site.
- Press Print & Ship or Add to Cart and you are asked to sign in or create an account. Your choices are kept, and when you come back the upload and its quote are moved onto your account without uploading the file again.
- Only the browser that uploaded a file can see it. A signed-out upload is not in anyone's history and not in the community gallery.
- Uploads you never sign in to claim are deleted after 14 days, the record and the file together.
- A signed-out browser can upload 10 files an hour and 30 a day, and import 10 links an hour. There are also limits per connection and a daily ceiling across every signed-out visitor. Each refusal says that signing in is the way past it, because an account has its own, larger allowance. File size limits are the same either way.
What the quote is computed from#
Weight. One all-in rate per gram covers filament and normal machine time together, so a 21 g PLA part costs exactly 21 × $0.12 = $2.52 and nothing else is added except postage.
| Material | Rate | Density |
|---|---|---|
| PLA | $0.12/g | 1.26 g/cm³ |
| PETG | $0.12/g | 1.27 g/cm³ |
| ABS | $0.12/g | 1.04 g/cm³ |
| ASA | $0.14/g | 1.07 g/cm³ |
| Flexible TPU | $0.25/g | 1.24 g/cm³ |
- Billable weight rounds up to the whole gram, like postage — so the figure agrees with the whole grams Bambu Studio shows you.
- There is a $1.00 minimum per part.
- A colour outside the twelve stock spools is priced at a floor of $0.20/g (Flexible TPU keeps its own $0.25/g), because the spool has to be bought in for your order and most of it will go unused.
- Ordering several copies of one part discounts it: 5% off at 5 or more, 10% off at 10 or more.
- Shipping is $7 standard or $15 express in the US, and $30 flat to the 23 international destinations (standard only). Checking out through the cart makes US standard free over $49.50 and international free over $500; Print & Ship adds the postage for the destination you choose, with no free threshold.
- Priority print is $5, or 10% of the items when that is more, once per order if you choose it, beside the shipping choice, and is added to the total as its own row. Normal print is included.
The grams come from a real OrcaSlicer slice wherever one is possible, not from a volume estimate. The estimate reads a part as 30% solid walls plus infill, which undercounts anything thin badly — a stencil that weighed 21 g on the plate estimated at 12.9 g. That is why checkout refuses to sell an unmeasured print: it would sell below the advertised rate. An already-sliced plate is priced from the filament figure in its own header rather than from that estimate.
curl -s https://x3dstudios.com/api/price \
-H "Content-Type: application/json" \
-d '{"bboxMm":{"x":120,"y":80,"z":60},"material":"pla","quality":"standard","quantity":1,"color":"Black"}'{
"filamentChanges": 0,
"multiColorGrams": 0,
"multiColorHours": 0,
"grams": 320,
"printHours": 15.84,
"materialCost": 38.4,
"machineCost": 0,
"shipping": 7,
"baseFee": 0,
"perUnit": 38.4,
"subtotal": 38.4,
"total": 45.4,
"currency": "USD",
"material": "pla",
"quality": "standard",
"quantity": 1,
"color": "Black",
"customColor": false,
"pricePerGram": 0.12
}The options you choose#
materialstringoptionaldefaultpla- The plastic. Changes the per-gram rate and the density used to turn volume into weight. Custom filament asks us to buy a spool you name, with an optional product link, at $0.20/g, weighed at the density of the plastic the name states; it prints in one colour. See /docs/materials.
plapetgabsasatpucustom colorstringoptionaldefaultBlack- One of the twelve stock swatches, or a hex or name you type beside the custom swatch. Off-palette prices at the $0.20/g floor (Flexible TPU stays at $0.25/g), and the page says so where you pick it rather than at checkout.
qualitystringoptionaldefaultstandard- Standard is 0.2mm layers at 1×. Premium is 0.1mm layers at 1.75× — finer surface, roughly twice the machine time.
standardpremium quantityintegeroptionaldefault1- 1 to 20 per order line. Bulk factors apply at 5 and at 10.
scalePercentintegeroptionaldefault100- 50% to 300%, in steps of 5. Every size other than 100% is priced from its own slice at that size, never from the 100% slice multiplied up. Plastic grows more slowly than the cube of the scale, because walls and top and bottom skins keep their thickness while only the infill inside grows: one model measured 5.85 times the plastic at 200% and 17.3 times at 300%, not 8 and 27. Ordering waits until that size is weighed, and a size the slicer cannot weigh cannot be ordered, though other sizes still can. The scaled part still has to fit 340mm. A sliced file, a Bambu Studio or OrcaSlicer project and a print in colour are 100% only.
infillintegeroptionaldefault20- 10% to 100%, in steps of 5. Higher infill means a stronger, heavier, more expensive part. Above 35% the slice — run at the profile's sparse default — stops being representative, and the quote falls back to the volume estimate, which approaches solid volume exactly where the slice diverges.
notestringoptional- Free text kept with the order and shown to the operator on the work order: orientation preferences, colour matching, anything a human should see. Trimmed to 900 characters.
A project in its own colours#
Upload a Bambu Studio or OrcaSlicer project that assigns two or more filaments and a Project colours card appears: the colours it uses, each with its slot number and material, and a choice between Print in N colours and One colour instead. Colour is selected by default. We slice each plate in its own colours in the background, and the card shows progress such as Slicing plate 2 of 7 with a clock. While that runs the price reads Slicing in colour and the order buttons wait; One colour instead orders straight away.
- When the slice is done the price is what it measured, and colours are counted by what actually prints. Five or more adds the $25 second-AMS fee once for the line, shown as its own row in the price.
- In colour, scale is 100%, quality is standard 0.2mm, infill comes from our profile, and the material is the plastic the project's filaments name. Those controls are locked until you choose One colour instead.
- If colour is not possible (a plate using two filament types, even PLA and PLA-CF, different base plastics on different plates, a colour change at a set layer height, more than eight colours, or only one filament really printing) the card says why and the project is sold in one colour.
- Add to Cart keeps the choice, and the cart and checkout price it from the same slice. Checkout never swaps a colour order for one colour.
Placing the order#
Under the price, choose where it is going (United States or International), the shipping speed, and the print speed. Print & Ship then goes straight to Stripe checkout for that one file. Add to Cart holds it so you can order several files together, and the cart re-prices every print server-side before checkout — the number stored in your browser is never trusted. Either way you get a confirmation email, the order appears on /orders, and it moves through placed, queued, printed, packed, shipped, delivered, with an email at each step after placed.
| Print speed | Price | Ships in |
|---|---|---|
| Normal print | Included | 4–5 business days |
| Priority print | $5, or 10% of the items when that is more, once per order | 1–2 business days |
Troubleshooting#
| What you see | What it means | What to do |
|---|---|---|
| Unsupported file type. Use STL, GLB, or 3MF (a model or a sliced plate). | The extension is not one we print. OBJ and a bare .gcode are the common cases. | Convert an OBJ to STL. For a .gcode, export the plate sliced file (.gcode.3mf) from your slicer. |
| File too large (max 100MB for STL files). | Over the ceiling for that format — 100MB for STL and GLB, 40MB for 3MF. | Decimate the mesh, or for a sliced plate re-export with fewer objects on it. |
| This model is 412×180×95mm — larger than the 340×320×340mm build volume. | It does not fit in any orientation. | Scale it down, or split it and order the pieces. |
| We couldn't read a printable mesh from that file. Make sure it's a valid, watertight STL/GLB. | The parser could not get triangles and a bounding box out of it. | Re-export from your CAD tool, and run the free check at /docs/studio/printability first. |
| We couldn't read the print footprint/filament from that sliced file. | The file is a sliced plate, but its G-code header carries no usable filament or footprint numbers. | In Bambu Studio or OrcaSlicer, slice the plate again and use Export plate sliced file, or upload the saved project and let us slice it. |
| Couldn't upload that file to storage. Check your connection and try again. | The direct browser-to-storage transfer failed part way, or the signed URL had already expired. | Select the file again to get a fresh 15-minute link. |
| That upload reference isn't valid. | The staging path or its token did not match your account. | Choose the file again rather than retrying the same reference. |
| Too many uploads — try again shortly. | You are over 40 uploads in the last hour. | Wait for the window to roll over. The response carries Retry-After. |
| We're still measuring this model. | Checkout was reached before the slice finished. We do not sell a print we have not weighed. | Give it up to a minute and try again. |
| We could not recognise this browser. Allow cookies for this site, or sign in to continue. | You are signed out, and the browser did not send the cookie that ties an upload to it. | Allow cookies for x3dstudios.com, or sign in. |
| Too many uploads from this browser in the last hour. Sign in to keep going. | A signed-out browser is over 10 uploads in an hour (or 30 in a day, which says today instead). | Sign in. An account is counted on its own allowance of 40 an hour. |
Questions
What file formats can I upload to print?
STL, GLB and 3MF: a model, a Bambu Studio or OrcaSlicer project, or a plate you sliced and exported as .gcode.3mf. A bare .gcode is not accepted, because the farm starts every print from a plate 3MF, so use Export plate sliced file instead. OBJ is not accepted either, so convert it to STL first. STL and GLB are capped at 100MB, every 3MF at 40MB.
Can I print a Bambu Studio or OrcaSlicer project in its colours?
Yes. Upload the saved project and the page lists its colours with Print in N colours or One colour instead. We slice each plate in those colours in the background and show which plate it is on; the colour price is that slice, and ordering in colour opens when it is done. In colour, scale is 100%, quality is standard and the material is the project's own. Five or more printing colours adds a $25 second-AMS fee once per order line.
Do I need an account to get a price?
No. Anyone can upload a file at /print and see its sliced price. You sign in only when you press Print & Ship or Add to Cart, and the upload and its quote carry over to your account, so nothing is uploaded twice.
Why does the price say Calculating for a few seconds?
Prints are sold by weight, so every uploaded model is sliced with OrcaSlicer before a price is shown. That takes roughly 10 to 60 seconds. Checkout refuses an unmeasured print rather than charging a volume estimate, which undercounts thin, wall-heavy parts.
Why doesn't a model at 200% cost eight times as much?
Because we weigh it again at that size rather than multiplying. Doubling every side makes the volume eight times bigger, but a print is not solid: its walls and its top and bottom skins stay the same thickness, and only the sparse infill inside grows with it. One model we measured used 5.85 times the plastic at 200% and 17.3 times at 300%, against the 8 and 27 times its volume grew. You pay for the slice at the size you order, so the price follows the plastic.
How big a part can you print?
340 × 320 × 340 mm, the plate on a Bambu Lab H2S. The check sorts your dimensions before comparing them, so a long part that fits when rotated is accepted. Anything larger has to be scaled down or split.
Can I change the layer height or infill on a file I already sliced?
No. A sliced plate (.gcode.3mf) is the print instruction — layer height, infill, supports and plate position are fixed inside it. It is ordered at 100% scale and priced from the filament it says it uses. Re-slice and upload again to change any of that.
Related guides
- What Is a 3MF File? Why It Beats STLWhat is a 3MF file? The 3MF file format zips your mesh with millimetre units, colour, materials and print settings. See what is inside and why it beats STL.
- How to Export G-code From Bambu Studio (.gcode.3mf)Export G-code from Bambu Studio: slice, then Export Plate Sliced File to make a 3MF file in Bambu Studio (.gcode.3mf). Plus how to fix a bad export.
- STL vs 3MF vs OBJ vs STEP: 3D Export Formats ExplainedSTL vs 3MF for 3D printing, plus OBJ and STEP: what each export format stores, which one to upload, and when each one is the right choice.