Getting started
PolyQuote is a simple API for pricing 3D prints. You send the details of your print — filament type, weight, time — and you get back a recommended sale price that covers your material, electricity, and chosen markup. No spreadsheets, no guesswork.
You can be up and running in three steps:
- Sign up. Head to api.polyformprints.co.uk and pick a plan. There's a free tier — no credit card needed.
- Check your email. Your API key arrives instantly. It starts with
pp_followed by a string of letters and numbers. - Make your first request. See the quote endpoint below for a copy-paste example.
Authentication
Every request to the paid /quote endpoint must include your API key in a header called x-api-key. That's the only authentication step — no OAuth, no tokens to refresh.
x-api-key: pp_your_key_here
Keep your key private. Anyone who has it can spend your monthly call quota. Don't paste it into public chats, GitHub repos, or client-side JavaScript on a public website.
If you think your key has been exposed, email [email protected] and we'll rotate it for you straight away.
Endpoints
All requests go to this base URL:
https://3d-print-quote-api.polyform-api.workers.dev
| Method | Path | What it does | Auth |
|---|---|---|---|
| GET | / |
Health check — confirms the API is up | None |
| POST | /quote |
Calculates a price for a print | API key |
| POST | /demo/quote |
Same as /quote but capped at 5 calls per hour |
None |
| GET | /demo/quote/csv |
CSV output for Google Sheets IMPORTDATA |
None |
The quote endpoint
POST /quote — requires authentication.
This is the main workhorse. Send your print details, get a price back.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
filament_type | string | Yes | — | One of: PLA, PETG, ABS, TPU, PLA+, PLA-SILK, PLA-MATTE, PETG-MATTE |
weight_grams | number | Yes | — | Weight of filament used in grams |
print_hours | number | Yes | — | Total print time in hours |
markup_percent | number | No | 100 |
Your profit markup percentage |
quantity | number | No | 1 |
Number of units |
kwh_rate | number | No | 0.29 |
Your electricity rate in £/kWh |
filament_price_per_kg | number | No | System default | Your actual filament cost in £/kg — overrides the system default for this request |
failure_rate_percent | number | No | 0 |
Percentage of prints that fail — adds a cost buffer to material and electricity (0–100) |
packaging_cost | number | No | 0 |
Flat packaging cost in £ per unit — added to base cost before markup |
printer_depreciation_per_hour | number | No | 0 |
Hourly printer wear cost in £ — added to base cost before markup |
printer_wattage | number | No | 200 |
Your printer's power consumption in watts (1–2000). Used to calculate electricity cost |
labour_cost_per_hour | number | No | 0 |
Your hourly labour rate in £ — multiplied by print time and added to base cost before markup |
shipping_cost | number | No | 0 |
Flat postal/shipping cost in £ per unit — added after markup (not marked up itself) |
vat_percent | number | No | 0 |
VAT percentage applied to the final price including shipping (0–100) |
platform | string | No | none |
Platform fee breakdown — one of: none, etsy, ebay, shopify, amazon |
Example request
cURLcurl -X POST https://3d-print-quote-api.polyform-api.workers.dev/quote \
-H "Content-Type: application/json" \
-H "x-api-key: pp_your_key_here" \
-d '{
"filament_type": "PETG",
"weight_grams": 85,
"print_hours": 3.5,
"markup_percent": 120,
"quantity": 1,
"printer_wattage": 200,
"labour_cost_per_hour": 0,
"shipping_cost": 2.85,
"vat_percent": 0,
"platform": "etsy"
}'
Example response
{
"input": {
"filament_type": "PETG", // The filament type you sent
"weight_grams": 85, // The weight you sent
"print_hours": 3.5, // The print time you sent
"markup_percent": 120, // The markup you sent
"quantity": 1, // The quantity you sent
"kwh_rate": 0.29, // Electricity rate used
"filament_price_per_kg": 14, // Filament price used (default or yours)
"failure_rate_percent": 0, // Failure rate buffer applied
"packaging_cost": 0, // Packaging cost per unit
"printer_depreciation_per_hour": 0, // Depreciation cost per hour
"printer_wattage": 200, // Printer power consumption in watts
"labour_cost_per_hour": 0, // Hourly labour rate
"shipping_cost": 2.85, // Flat shipping cost per unit
"vat_percent": 0, // VAT percentage applied
"platform": "etsy" // Platform selected
},
"costs": {
"material_cost_gbp": 1.19, // Filament cost for this print
"electricity_cost_gbp": 0.20, // Electricity cost for this print
"packaging_cost_gbp": 0, // Packaging cost
"depreciation_cost_gbp": 0, // Printer wear cost for this print
"labour_cost_gbp": 0, // Labour cost (print_hours x rate)
"total_base_cost_gbp": 1.39, // Total before markup
"shipping_cost_gbp": 2.85, // Shipping (added after markup)
"vat_gbp": 0 // VAT amount applied
},
"recommended_price": {
"GBP": 5.91, // Recommended sale price in GBP
"USD": 7.51, // Approximate USD equivalent
"EUR": 6.91 // Approximate EUR equivalent
},
"currency": "GBP",
"platform_fees": {
"platform": "etsy",
"transaction_fee_gbp": 0.38, // Etsy 6.5% transaction fee
"listing_fee_gbp": 0.16, // Etsy listing fee ($0.20, live FX rate)
"payment_processing_gbp": 0.44, // Etsy 4% + £0.20 payment processing
"regulatory_fee_gbp": 0.10,
"total_platform_fees_gbp": 1.08 // Total fees on this sale
},
"calls_remaining": 4999 // Calls left in your monthly quota
}
The demo endpoint
POST /demo/quote — no authentication needed.
The demo endpoint accepts exactly the same parameters as the quote endpoint and runs exactly the same pricing calculation. It's the easiest way to kick the tyres before signing up — or to embed a live calculator on your own site.
Limits
The demo is capped at 5 requests per IP address per hour. When you hit the limit you'll get a 429 response with a friendly message and a sign-up link.
How the response differs
Two extra fields, and one missing field:
"demo": true— confirms this came from the demo endpoint"demo_requests_remaining"— how many demo calls you have left this hour- No
calls_remaining— that's for paying customers - A
"cta"field nudges you toward signing up for a real key
Example response
{
"input": { /* same as /quote */ },
"costs": { /* same as /quote */ },
"recommended_price": {
"GBP": 3.43,
"USD": 4.36,
"EUR": 4.01
},
"recommended_price_gbp": 3.43,
"currency": "GBP",
"demo": true,
"demo_requests_remaining": 4,
"cta": "Want unlimited quotes? Sign up free at https://api.polyformprints.co.uk"
}
CSV endpoint (Google Sheets)
GET /demo/quote/csv — no authentication needed.
Returns a two-row CSV (headers + values) designed for use with Google Sheets' IMPORTDATA function. Same demo rate limit as the POST endpoint: 5 requests per IP per hour.
All parameters are passed as query string values rather than a JSON body.
Parameters
Accepts the same parameters as the quote endpoint, passed as query parameters: filament_type, weight_grams, print_hours, markup_percent, failure_rate_percent, packaging_cost, printer_depreciation_per_hour, printer_wattage, labour_cost_per_hour, shipping_cost, vat_percent.
Example URL
https://3d-print-quote-api.polyform-api.workers.dev/demo/quote/csv?filament_type=PETG&weight_grams=85&print_hours=3.5&markup_percent=120
Google Sheets formula
=IMPORTDATA("https://3d-print-quote-api.polyform-api.workers.dev/demo/quote/csv?filament_type=PETG&weight_grams=85&print_hours=3.5&markup_percent=120")
Returns headers in row 1 and values in row 2. You can make the formula dynamic by referencing cell values instead of hardcoded parameters.
CSV columns
filament_type, weight_grams, print_hours, markup_percent, material_cost_gbp, electricity_cost_gbp, packaging_cost_gbp, depreciation_cost_gbp, labour_cost_gbp, shipping_cost_gbp, vat_gbp, total_base_cost_gbp, recommended_price_gbp, demo_requests_remaining
IMPORTDATA periodically, so keep this in mind if you're making frequent changes. For higher-volume spreadsheet integrations, sign up for a key and call /quote from a script instead.
Error codes
Errors always come back as JSON with an error field describing what went wrong.
| Status | Message | What it means | How to fix it |
|---|---|---|---|
400 | Invalid input | A required parameter is missing or one of your values isn't valid (e.g. a negative weight) | Check the parameters table and your request body |
401 | Unauthorised | Your API key is missing, malformed, or unknown to us | Make sure the x-api-key header is present and the key is correct |
429 | Monthly limit reached | You've used all the API calls included in your plan this month | Upgrade your plan, or wait for your monthly reset |
429 | Demo limit reached | You've made 5 demo requests in the last hour from this IP | Sign up for a free key — or wait an hour |
500 / 502 | Server error | Something went wrong on our end | Try again in a few seconds, or email [email protected] |
Pricing & limits
| Plan | Price | Calls / month | Best for |
|---|---|---|---|
| Free | £0 / mo | 200 | Hobbyists and first-time integrators |
| Maker | £5 / mo | 5,000 | Automate your own shop or quoting workflow |
| Pro | £15 / mo | 25,000 | Print farms and developers building on top |
Your call limit resets on the same date each month as your subscription start date — so a plan started on the 13th resets on the 13th every month.
Sign up or change plan ->
Manage your subscription (Stripe portal) ->
Try the API in Postman ->
FAQ
What filament prices does PolyQuote use?
Our default prices reflect typical UK retail costs: PLA £14/kg, PETG £14/kg, ABS £18/kg, TPU £20/kg, PLA+ £18/kg, PLA Silk £16/kg, PLA Matte £15/kg, PETG Matte £16/kg. You can override any of these by passing filament_price_per_kg in your request.
My filament cost is different to the default — can I use my own price?
Yes. Pass your actual cost per kg using the optional filament_price_per_kg parameter. For example, if you bought JAYO PETG at £10.90/kg, send "filament_price_per_kg": 10.90 and the quote will calculate against your real cost rather than the system default.
Can I use PolyQuote outside the UK?
Yes. Pass your local electricity rate using the kwh_rate parameter so the maths reflects your actual costs. Prices are returned in GBP, USD, and EUR — exchange rates are fetched live and updated hourly.
When does my call limit reset?
On the same date each month as your subscription start date. If you subscribed on the 13th, your quota resets on the 13th of every month.
How does the failure rate work?
Pass failure_rate_percent to account for prints that fail and waste material. A value of 10 means 10% of your prints are expected to fail — the API adds 10% to your material and electricity costs as a buffer. It does not affect your markup or packaging cost.
How does shipping cost work?
Pass shipping_cost with your flat postage rate (e.g. 2.85 for Royal Mail Large Letter). Shipping is added after your markup is applied — it is not marked up itself, since postage is a pass-through cost.
How does VAT work?
Pass vat_percent (e.g. 20 for UK standard rate). VAT is calculated on the final price including shipping and added to the recommended price. The response includes a vat_gbp field showing the VAT amount.
Can I set my printer's wattage?
Yes. Pass printer_wattage with your printer's power consumption in watts (1–2000). The default is 200W. A lower wattage will reduce the electricity cost in the calculation.
Can I include my time/labour in the price?
Yes. Pass labour_cost_per_hour with your hourly rate in £. The API multiplies it by your print time and adds it to the base cost before markup. For example, a 3.5-hour print at £10/hour adds £35 to the base cost.
What happens if I hit my limit?
Requests start returning a 429 Monthly limit reached error. You can either upgrade your plan from the Stripe portal or wait for your next monthly reset.
How do I cancel?
Open your subscription management page and click cancel — your plan stays active until the end of the current billing period. Or email [email protected] and we'll handle it for you.
How do platform fees work?
Pass platform with a value of etsy, ebay, shopify, or amazon and the response will include a platform_fees block showing a full fee breakdown for that platform. Fees are calculated against your recommended sale price. Note: eBay fees vary by category — we use a typical UK rate of 11.34%. Shopify fees vary by plan — we use the Basic plan rate of 2%. Amazon uses a 15.3% referral fee plus a £0.25 closing fee. The Etsy listing fee ($0.20) is converted using a live GBP/USD exchange rate. Omit the parameter or pass none to skip fee calculation.
What currencies does PolyQuote return?
All responses return recommended_price as an object with GBP, USD, and EUR values. Exchange rates are fetched live and cached hourly — they are intended as a guide rather than a real-time financial feed.
Is my data safe?
We store only your email address and a count of how many API calls you've made. We never store the contents of your quote requests — your designs and pricing logic stay yours. See our Privacy Policy for full details.