Professional 3D Printing Service

Turn your
ideas into objects.

Upload your STL, OBJ, or 3MF, get an instant quote in seconds, and receive your part — shipped or ready for pickup.

Loading catalog…

Available Materials

Loading materials…

Upload & Quote

Drop your 3D model file and we'll analyse dimensions and volume in your browser — instantly.

☁️

Drag & drop your 3D model here

.STL .OBJ .3MF

or browse files · max 50 MB

Checkout

Review your order, fill in details, and pay via UPI.

Order Summary

Shipping Details

Checkout

Review your cart, fill in details, and pay via UPI.

Order Summary

Shipping Details

Fulfillment Standard

Track Your Order

Enter your Order ID or tracking number to see live status.

📦
Loading model…
◈ About Us

Affordable 3D Printing
for Everyone

Born from a passion for making — built to bring professional 3D printing within reach of students, creators, and everyday people.

500+
Orders Delivered
20+
Materials & Finishes
3–5 Days
Average Delivery
100%
Transparent Pricing
Our Story

Why We Built PrintForge Studio

3D printing has long been a technology reserved for large companies and well-funded labs. We believe that shouldn't be the case. PrintForge Studio was built to bridge that gap — giving students, small businesses, and everyday people access to professional-grade 3D printing without needing to own an expensive machine or understand complex software.

Our Mission

To make professional 3D printing as simple as uploading a file — affordable, fast, and available to everyone across India.

Who We Serve

3D Printing for Every Need

🎓

Students & Makers

Bring your project ideas to life without expensive equipment. Prototypes, models, science projects — print exactly what you need, one piece at a time.

🎁

Personalised Gifting

Create one-of-a-kind gifts that no shop can offer. Custom figurines, name plates, keepsakes — printed with precision and delivered to your door.

🔧

Repair & Replace

Stop throwing things away when a part breaks. We can print replacement clips, brackets, knobs, and fittings that are no longer available anywhere.

Why 3D Printing?

Traditional manufacturing requires thousands of units to be cost-effective. 3D printing makes every single print cost-effective — no tooling, no minimums, no waste.

No Minimums
Order even 1 piece
Any Shape
Geometry with no limits
Fast Turnaround
Ready in days, not weeks

Ready to print something amazing?

Upload your file, get an instant quote, and we'll handle the rest.

Start Your Print →
Support Centre

Contact & Support

Have a question about your order, a print, or anything else? We're here to help — typically within 1 business day.

Send us a message

We'll get back to you as soon as possible.

Dashboard

Loading stats…

Recent Orders

Loading…

Orders

Loading orders…

Print Config

Printer Types

Loading printers…

Categories

Loading categories…

Catalog Models

Loading catalog…

Cost Engine

🧪 Material Types

Define materials and their physical properties and cost. Colors are configured per-printer in Print Config.

Loading materials…

⚙️ Equipment

Electricity cost settings

Printer Power and Print Speed are configured per-printer in the Printers section.

💼 Business

Fees, overhead, and margins

👁 Customer-facing Display

Electricity, setup fee, overhead & margin are hidden from customers and consolidated into two visible line items.

This percentage of the hidden costs shows as Printing cost; the remainder adds to Material cost. Default: 60.

How it works (example at 60 %):

Material cost (actual)₹10
Hidden costs (elec + setup + overhead + margin)₹40
→ Customer sees "Material cost"₹26 (10 + 40×40%)
→ Customer sees "Printing cost"₹24 (40×60%)

The color used for the 3D model preview before a customer picks a color. Also the default selection in the quote form.

📐 Pricing Formula

Each order price is computed bottom-up: material weight → electricity consumption → overhead → margin → optional priority surcharge → GST. Shipping is added separately and is never taxed here.

/* effective volume accounts for shell (always solid) + infill portion */
eff_vol = vol × (infill/100 × 0.7 + 0.3)
weight_kg = eff_vol × density / 1000
material_cost = weight_kg × mat_kg_price
/* print speed is cm³/hr at 20% infill; scales linearly with infill */
print_time_hrs = (vol / print_speed) × (infill / 20)
elec_cost = (printer_w / 1000) × print_time_hrs × elec_kwh
base = material_cost + elec_cost + base_fee
with_overhead = base × (1 + overhead_pct / 100)
unit_price = ceil(with_overhead × (1 + margin_pct / 100))
/* priority surcharge applied per unit, before GST */
priority_surcharge = priority ? ceil(unit_price × priority_pct / 100) : 0
print_subtotal = (unit_price + priority_surcharge) × quantity
gst_amount = print_subtotal × gst_rate / 100
grand_total = print_subtotal + gst_amount + shipping_cost

Shipping

Shipping Partners

Users

Loading users...

Store Profile

Company Information

Contact Details

Address

Legal & Registration

Social Media Links

Hero Section

Stats Strip

Story & Mission

Who We Serve Cards

🎓 Students & Makers

🎁 Personalised Gifting

🔧 Repair & Replace

Create discount codes, schedule promos, and configure the homepage popup announcement.

Loading coupons…

Site Settings

🏪

Store

💳

Payment

Payments are collected via UPI QR codes shown to customers at checkout.
📁

Uploads

MB

Supported Formats

Only checked formats can be uploaded by customers and from admin. STL · OBJ · 3MF on by default.

🌐

Community Catalog

Control how models shared by customers appear in the public catalog.

⚠️

Admin & moderator uploads are always auto-approved. This setting only affects customer accounts — keeping it on "require review" is strongly recommended to prevent inappropriate content.

🎨

3D Viewer Appearance

Background behind the 3D model in all viewers and auto-thumbnails
Default mesh color for catalog cards and auto-generated thumbnails
📧

Email Delivery

📘

Setup Guide

Gmail / Google Workspace

Driver: SMTP · Host: smtp.gmail.com · Port: 587

Use an App Password (not your login password). Enable 2FA first.

Amazon SES

Driver: Amazon SES · Host: email-smtp.{region}.amazonaws.com · Port: 587

Use SES SMTP credentials (not IAM key/secret). Verify sender domain first.

Disabled mode

All emails are logged to the server console instead of sent. Useful for local development.

🔒

Access & Authentication

💡

Recommendations

Email verification prevents throwaway accounts and spam orders. Enable it once your email driver is configured.

Optional 2FA is a good starting point — it lets power users opt-in without forcing everyone through the setup.

!

Required 2FA is best for admin-only stores or high-value inventory. Make sure all existing users have a TOTP app before enabling.

i

JWT tokens expire after 8 hours. Users are logged out automatically after that period.

🌐

Network Security

CORS: Disabled
⚠️

CORS enforcement is off. All origins are currently allowed. Add your site's domain(s) below and enable enforcement once deployed.

One origin per line. Only http:// and https:// are accepted. All config is stored in the database — no env file needed.

Active CSP Preview

🗺️

Sitemap & Crawling

Include product pages in sitemap

All approved public catalog models will be listed at /product/:id

Enabled

Sitemap: /sitemap.xml

Robots: /robots.txt

🤖

robots.txt

View live

Edit directly — leave blank to use the auto-generated default.

🏷️

Default Meta Tags

global overrides

Override the default site-wide meta tags used on the home page and pages without product-specific data. Leave blank to use auto-generated values from Site Settings.

📊

JSON-LD Structured Data

Auto-generated from Site Settings by default. Enable custom mode to edit the Organization schema directly.

Organization — home page (auto or custom below)
Product + BreadcrumbList — each /product/:id page, generated from catalog data
iOpen Graph + Twitter Card meta tags update per-page on SPA navigation

Rate Limiter

Control how many requests each IP can make per window. Changes take effect immediately without restarting the server.

🌐

General API Limiter

Applied to all /api/* routes except auth and upload endpoints.

📁

Upload / Checkout Limiter

Applied to POST /api/checkout (file upload + order placement).

🛡️

Bypass Roles

Users with these roles are exempt from general and upload rate limits. Auth endpoints are never bypassed.

⚠️

The auth limiter (login / register / password reset) is always enforced regardless of bypass role, to prevent credential stuffing attacks.

API Reference

Complete reference for all PrintForge API endpoints. Base URL: /api. All responses are JSON. Rate limits apply per IP.

🔑 Authentication & Token Types

JWT Session Token

Returned by /api/auth/login. Valid 8 hours. Required for admin UI and user actions. Cannot be used in PAT-only endpoints.

Interim Token (2FA)

Short-lived token issued when 2FA is enabled. Valid 10 minutes. Exchange it with /api/auth/login-2fa to get a full JWT.

Personal Access Token (PAT)

Long-lived scoped tokens prefixed with pf_. Created in Admin → API Tokens. For server-to-server integrations.

Send any token type as a Bearer header on every protected request:

Authorization: Bearer <token>

🌐 Public Endpoints no auth required

These endpoints are open to all clients. Rate limits still apply per IP.

MethodPathDescription
GET/api/healthServer health check. Returns {"status":"ok"}.
GET/api/public/site-infoShop name, logo, currency, social links, UPI details — used to brand the storefront.
GET/api/public/about-infoAbout page settings (enabled cards, stats, content text).
GET/api/catalogPaginated public approved models. Query: page, limit, category_id, q, sort
GET/api/catalog/:idSingle public model detail.
GET/api/categoriesAll product categories.
GET/api/materialsActive materials with display name, colors, density.
GET/api/printer-typesActive printer specs (bed size, materials, nozzle) for compatibility display.
GET/api/pincodesPIN code zone/district lookup for shipping estimation.
GET/api/models/:id/fileStream raw STL/model file for 3D viewer. Rate-limited (30/15 min).
POST/api/quoteInstant price estimate. Body: dim_x_mm, dim_y_mm, dim_z_mm, volume_cm3, material, quantity, fulfillment, infill, color, priority_print, shipping_method, shipping_zip. Rate-limited (20/15 min).
GET/api/track/:trackingNoPublic order tracking by tracking number. No auth needed.
GET/sitemap.xmlDynamic XML sitemap (all public catalog items).
GET/robots.txtCrawler directives. Configurable via Admin → Site Settings → SEO.

👤 Auth Endpoints rate-limited on all POST

Registration, login, password reset, email verification, and 2FA management. Auth endpoints bypass the general rate limiter but have their own stricter limit.

MethodPathDescription
POST/api/auth/registerCreate account. Body: username, email, password. Sends verification email.
POST/api/auth/loginBody: email, password. Returns token (JWT) or interim_token if 2FA is active.
POST/api/auth/login-2faComplete 2FA step. Body: interim_token, code (TOTP). Returns full JWT.
GET/api/auth/meCurrent user profile. Requires auth.
GET/api/auth/verify-email/:tokenVerify email address using token from registration email.
POST/api/auth/resend-verifyRe-send verification email. Requires auth.
POST/api/auth/forgot-passwordSend password reset email. Body: email.
POST/api/auth/reset-passwordSet new password. Body: token, new_password.
GET/api/auth/setup-2faGenerate TOTP secret & QR code for 2FA enrollment. Requires auth.
POST/api/auth/enable-2faConfirm and activate 2FA. Body: secret, code. Requires auth.
DELETE/api/auth/disable-2faTurn off 2FA. Body: code (current TOTP). Requires auth.

📤 Upload & Checkout auth required · upload rate-limited

All upload and checkout endpoints accept multipart/form-data. Max file size is configured via MAX_FILE_SIZE_MB env var (default 50 MB). Accepted formats: .stl, .obj, .3mf.

MethodPathDescription
POST/api/upload-for-cartUpload an STL/OBJ/3MF and get back parsed dimensions, volume, and a session_id. Used before adding to cart. Field: model_file.
POST/api/checkoutSingle-item order. Multipart fields: model_file or catalog_model_id, material, color, quantity, infill, fulfillment, priority_print, shipping_*, notes.
POST/api/cart-checkoutMulti-item group order. JSON body: items[] (each with session_id or catalog_model_id, material, color, qty, infill), plus shared fulfillment, shipping_*. Returns array of created orders with a shared group_id.
POST/api/models/:id/imageUpload/replace preview image for a model you own. Field: image (JPEG/PNG/WebP).
POST/api/catalog/:id/likeToggle like/unlike on a catalog model. Returns liked: bool, total_likes: int.

🙋 User Endpoints /api/user/…

All routes require a valid JWT. Operate on the currently authenticated user only.

MethodPathDescription
GET/api/user/profileFull profile including email, role, 2FA status, addresses.
PATCH/api/user/profileUpdate display name or username. Body: username.
POST/api/user/change-passwordBody: current_password, new_password.
POST/api/user/request-email-changeSend verification email for new address. Body: new_email, password.
GET/api/user/ordersPaginated list of the user's own orders. Query: page, limit, status.
GET/api/user/orders/:idSingle order detail with timeline. Scoped to the authenticated user.
GET/api/user/orders/:id/invoiceDownload PDF invoice for an order. Rate-limited.
GET/api/user/orders/group/:id/invoiceDownload combined group-order PDF invoice.
GET/api/user/2fa-statusReturns {"enabled": bool}.
GET/api/user/addressesList saved delivery addresses.
POST/api/user/addressesSave a new address. Body: label, name, address, city, state, zip, country.
PUT/api/user/addresses/:idReplace an existing saved address.
DELETE/api/user/addresses/:idRemove a saved address.
PATCH/api/user/addresses/:id/defaultSet address as default for checkout autofill.

✉️ Contact Endpoints

Customer support inquiries. Submitting requires auth to prevent spam. Admins manage inquiries via /api/admin/contact.

MethodPathDescription
GET/api/contact/verify-order/:trackingVerify a tracking number belongs to the logged-in user before submitting an inquiry. Requires auth.
POST/api/contactSubmit a support inquiry. Body: subject, message, order_tracking?. Requires auth. Rate-limited.
⚙️

Admin Endpoints — /api/admin/…

Require admin role (JWT) or a PAT with the matching scope. JWT-only endpoints are marked JWT only.

📊 Dashboard & Stats

MethodPathDescription
GET/api/admin/statsRevenue totals, order counts by status, recent activity. Scope: admin:read.
GET/api/admin/cost-settingsCurrent pricing parameters (material costs, electricity rate, margins, GST). Scope: admin:read.
POST/api/admin/price-previewDry-run price calculation with custom inputs. Body: material, volume_cm3, quantity, infill, wattage_w, fulfillment, priority_print. Scope: admin:read.

🛒 Orders

MethodPathDescription
GET/api/admin/ordersAll orders. Query: page, limit, status, q, sort. Scope: orders:read.
GET/api/admin/orders/:idFull order detail with customer, model, printer info. Scope: orders:read.
GET/api/admin/orders/group/:group_idAll orders in a group (cart checkout). Scope: orders:read.
PATCH/api/admin/orders/:id/statusAdvance through FSM: pending→confirmed→printing→post_processing→shipped→delivered. Body: status. Scope: orders:write.
PATCH/api/admin/orders/:id/trackingSet carrier tracking. Body: tracking_number, tracking_url?, shipping_id?. Scope: orders:write.
PATCH/api/admin/orders/:id/printerReassign printer. Body: printer_id (or null to unassign). Scope: orders:write.
PATCH/api/admin/orders/:id/paidManually confirm payment and set status to confirmed. Scope: payment:write.
GET/api/admin/orders/:id/eligible-printersRanked list of all printers with compatibility, proximity, and load scores. Scope: orders:read.
GET/api/admin/orders/:id/notesList internal + customer notes on an order. Scope: orders:read.
POST/api/admin/orders/:id/notesAdd a note. Body: note, is_internal. Scope: orders:write.

📦 Catalog & Models

MethodPathDescription
GET/api/admin/modelsAll models including unapproved. Query: page, limit, q, status. Scope: catalog:read.
PATCH/api/admin/models/:idApprove/unapprove or toggle public. Body: is_approved?, is_public?. Scope: catalog:write.
PATCH/api/admin/models/:id/metaUpdate SEO metadata. Body: seo_title, seo_description, slug. Scope: catalog:write.
PUT/api/admin/models/:idFull model update. Body: name, category_id, material, color, price, notes. Scope: catalog:write.
DELETE/api/admin/models/:idDelete model record and physical file. Scope: catalog:write.
POST/api/admin/models/:id/imageUpload/replace preview image. Field: image. Scope: catalog:write.
DELETE/api/admin/models/:id/imageRemove preview image. Scope: catalog:write.
GET/api/admin/models/:id/downloadDownload raw model file (admin). Scope: catalog:read.
POST/api/admin/catalog-modelsUpload a new catalog model. Multipart: model_file, name, category_id, material, color, price. JWT only.

🖨️ Print Config — Printers, Materials & Categories

MethodPathDescription
GET/api/admin/printer-typesAll printers (active + inactive). Scope: catalog:read.
POST/api/admin/printer-typesAdd printer. Body: name, brand, materials, bed_x_mm, bed_y_mm, bed_z_mm, nozzle_mm, wattage_w, print_speed_cm3_hr, printer_pincode, printer_address, notes. JWT only.
PUT/api/admin/printer-types/:idUpdate printer settings or toggle active. JWT only.
DELETE/api/admin/printer-types/:idDelete printer. Fails if printer has assigned orders. JWT only.
GET/api/admin/materialsAll materials. Scope: catalog:read.
POST/api/admin/materialsAdd material. Body: name, display_name, density_g_cm3, cost_per_kg, colors, notes. JWT only.
PUT/api/admin/materials/:idUpdate material. JWT only.
DELETE/api/admin/materials/:idDelete material. JWT only.
GET/api/admin/categoriesAll categories. Scope: catalog:read.
POST/api/admin/categoriesCreate category. Body: name, icon, description, display_order. JWT only.
PUT/api/admin/categories/:idUpdate category. JWT only.
DELETE/api/admin/categories/:idDelete category (only if no models are assigned). JWT only.

🔧 Settings, Site Content & Rate Limiter

MethodPathDescription
GET/api/admin/settingsAll shop settings keyed by key. Scope: admin:read.
PUT/api/admin/settings/:keyUpdate one setting. Body: value. JWT only.
GET/api/admin/site-infoGeneral + company + social settings combined. Scope: admin:read.
GET/api/admin/about-infoAbout page settings. JWT only.
POST/api/admin/about-infoSave about page settings (bulk key-value). JWT only.
GET/api/admin/company-infoCompany name, logo, address, UPI, social. Scope: admin:read.
POST/api/admin/company-infoUpdate company info (bulk key-value). JWT only.
POST/api/admin/test-emailSend a test email to the admin address to verify SMTP config. JWT only.
GET/api/admin/rate-limiterCurrent rate limit config. Scope: admin:read.
PUT/api/admin/rate-limiterUpdate limits live (no restart). Body: general_window_min, general_max, upload_window_min, upload_max, bypass_roles[]. JWT only.

👥 Users

MethodPathDescription
GET/api/admin/usersPaginated user list. Query: page, limit, q, role. Scope: admin:read.
PATCH/api/admin/users/:idChange role (user/moderator/admin) or toggle active. Body: role?, is_active?. JWT only.
PATCH/api/admin/users/:id/verifyManually mark email as verified. JWT only.

🔐 API Tokens (PAT Management) All JWT only

MethodPathDescription
GET/api/admin/tokensList all PATs (token value never returned after creation).
POST/api/admin/tokensCreate PAT. Body: name, description, permissions[], expires_in_days. Returns plaintext token once only.
PATCH/api/admin/tokens/:id/revokeDisable token (keeps record for audit).
DELETE/api/admin/tokens/:idPermanently delete token and its logs.
POST/api/admin/tokens/bulk-revokeRevoke multiple tokens. Body: ids[].
POST/api/admin/tokens/bulk-deletePermanently delete multiple tokens. Body: ids[].
GET/api/admin/tokens/logsAll PAT access logs (last 500). Scope: admin:read.
GET/api/admin/tokens/:id/logsLogs for one token (last 200). Scope: admin:read.

📬 Contact Inquiries admin + moderator

MethodPathDescription
GET/api/admin/contactAll inquiries. Query: page, limit, status.
GET/api/admin/contact/:idSingle inquiry with message history.
POST/api/admin/contact/:id/replySend reply email to customer. Body: message.
PATCH/api/admin/contact/:id/statusUpdate status: open, in_progress, resolved, closed. Body: status.

🛡️ Moderator Endpoints /api/mod/…

Moderators have a subset of admin capabilities — order fulfilment and catalog moderation, but no access to settings, users, tokens, or cost engine. Require moderator or admin role JWT.

MethodPathDescription
GET/api/mod/ordersAll orders (same as admin). Query: page, limit, status.
GET/api/mod/orders/:idFull order detail.
GET/api/mod/orders/group/:group_idGroup order list.
PATCH/api/mod/orders/:id/statusAdvance order status.
PATCH/api/mod/orders/:id/trackingSet tracking number.
PATCH/api/mod/orders/:id/paidMark order as paid.
GET/api/mod/orders/:id/notesOrder notes.
POST/api/mod/orders/:id/notesAdd internal note.
GET/api/mod/modelsAll models including unapproved.
PATCH/api/mod/models/:id/metaUpdate model metadata.
GET/api/mod/models/:id/downloadDownload model file.
GET/api/mod/categoriesAll categories.
GET/api/mod/materialsAll materials (read + write).
POST/api/mod/materialsAdd material.
PUT/api/mod/materials/:idUpdate material.
DELETE/api/mod/materials/:idDelete material.
GET/api/mod/printer-typesPrinter list (read + write).
POST/api/mod/printer-typesAdd printer.
PUT/api/mod/printer-types/:idUpdate printer.
DELETE/api/mod/printer-types/:idDelete printer.
GET/api/mod/contactContact inquiries.
GET/api/mod/contact/:idSingle inquiry.
POST/api/mod/contact/:id/replyReply to inquiry.
PATCH/api/mod/contact/:id/statusUpdate inquiry status.

🔐 PAT Scopes & Example Calls

Create PATs in Admin → API Tokens. Token prefix is pf_. Replace $PAT and https://your-domain.com in all examples below.

ScopeWhat it unlocks
orders:readGET orders, order detail, group orders, order notes, eligible printers
orders:writePATCH status, tracking, printer assignment, printer notes
payment:writePATCH orders/:id/paid — mark payment confirmed
catalog:readGET all models (including unapproved), printer-types, materials, categories, model download
catalog:writePATCH/PUT/DELETE models, approve/reject, model images, meta updates, catalog upload
admin:readGET stats, users, settings, cost-settings, price-preview, rate-limiter, site-info, company-info, token logs
orders:read List orders + fetch eligible printers for order 42

curl

curl -H "Authorization: Bearer $PAT" \
  "https://your-domain.com/api/admin/orders?page=1&limit=20"

curl -H "Authorization: Bearer $PAT" \
  https://your-domain.com/api/admin/orders/42/eligible-printers

PowerShell

$h = @{ Authorization = "Bearer $PAT" }
Invoke-RestMethod -Uri `
  "https://your-domain.com/api/admin/orders?page=1&limit=20" `
  -Headers $h

Invoke-RestMethod -Uri `
  "https://your-domain.com/api/admin/orders/42/eligible-printers" `
  -Headers $h
orders:write Advance status → reassign printer → add note

curl

curl -X PATCH -H "Authorization: Bearer $PAT" \
  -H "Content-Type: application/json" \
  -d '{"status":"printing"}' \
  https://your-domain.com/api/admin/orders/42/status

curl -X PATCH -H "Authorization: Bearer $PAT" \
  -H "Content-Type: application/json" \
  -d '{"printer_id":3}' \
  https://your-domain.com/api/admin/orders/42/printer

PowerShell

$h = @{ Authorization="Bearer $PAT"; "Content-Type"="application/json" }
Invoke-RestMethod -Method PATCH -Headers $h `
  -Uri "https://your-domain.com/api/admin/orders/42/status" `
  -Body '{"status":"printing"}'

Invoke-RestMethod -Method PATCH -Headers $h `
  -Uri "https://your-domain.com/api/admin/orders/42/printer" `
  -Body '{"printer_id":3}'
payment:write Mark order paid — use from payment gateway webhook

curl

curl -X PATCH \
  -H "Authorization: Bearer $PAT" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://your-domain.com/api/admin/orders/42/paid

PowerShell

Invoke-RestMethod -Method PATCH `
  -Uri "https://your-domain.com/api/admin/orders/42/paid" `
  -Headers @{ Authorization="Bearer $PAT"; "Content-Type"="application/json" } `
  -Body '{}'
catalog:write Approve model + update metadata

curl

curl -X PATCH \
  -H "Authorization: Bearer $PAT" \
  -H "Content-Type: application/json" \
  -d '{"is_approved":true,"is_public":true}' \
  https://your-domain.com/api/admin/models/88

PowerShell

Invoke-RestMethod -Method PATCH `
  -Uri "https://your-domain.com/api/admin/models/88" `
  -Headers @{ Authorization="Bearer $PAT"; "Content-Type"="application/json" } `
  -Body '{"is_approved":true,"is_public":true}'
admin:read Dashboard stats + price preview

curl

curl -H "Authorization: Bearer $PAT" \
  https://your-domain.com/api/admin/stats

curl -X POST \
  -H "Authorization: Bearer $PAT" \
  -H "Content-Type: application/json" \
  -d '{"material":"PLA","volume_cm3":12.5,"quantity":2}' \
  https://your-domain.com/api/admin/price-preview

PowerShell

$h = @{ Authorization = "Bearer $PAT" }
Invoke-RestMethod -Uri `
  "https://your-domain.com/api/admin/stats" -Headers $h

Invoke-RestMethod -Method POST -Headers `
  ($h + @{"Content-Type"="application/json"}) `
  -Uri "https://your-domain.com/api/admin/price-preview" `
  -Body '{"material":"PLA","volume_cm3":12.5,"quantity":2}'

Errors & Rate Limits

All errors return a JSON body with an error key and the matching HTTP status code.

{"error": "Descriptive message here."}
400Bad request / validation
401Missing or expired token
403Insufficient role or scope
404Resource not found
429Rate limit exceeded

Default Rate Limits

LimiterApplies toDefault
GeneralAll /api/* except auth & upload100 req / 15 min per IP
Upload / Checkout/api/checkout, /api/upload-for-cart, /api/cart-checkout10 req / 60 min per IP
AuthLogin, register, forgot/reset password, 2FA15 req / 15 min per IP
Quote/api/quote20 req / 15 min per IP
Model file/api/models/:id/file30 req / 15 min per IP

Limits can be adjusted live via PUT /api/admin/rate-limiter. Admin role bypasses the general limiter by default.

API Tokens

Create long-lived Personal Access Tokens for server-to-server API calls. Each token carries its own permission scope and optional expiry.

Loading tokens…

Access Log

Every API request authenticated with a PAT is logged here.

Loading logs…

Contact Inquiries

Messages submitted through the public contact form. Reply directly via SMTP.

Loading…

My Account

My Addresses

Email Address

Change Password

Two-Factor Authentication

Loading...