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
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
Analysing model geometry…
Change file
Model Analysis
Print Settings
India Post rates + 18% GST · Pincode required for shipping estimate
⚡ Priority Print
Rush your job to the front of the print queue (+25%)
Price Breakdown
INR ₹Checkout
Review your order, fill in details, and pay via UPI.
Sign in to continue
Order Summary
📦 Shipping cost will be calculated from your PIN code
Order Placed!
Scan the QR or copy the link in any UPI app to pay and confirm printing.
Order Details
Checkout
Review your cart, fill in details, and pay via UPI.
Order Summary
Group Order Placed!
Scan the QR or copy the link in any UPI app to pay and confirm all parts for printing.
Order Details
Track Your Order
Enter your Order ID or tracking number to see live status.
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.
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.
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.
Ready to print something amazing?
Upload your file, get an instant quote, and we'll handle the rest.
Start Your Print →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.
Daily limit reached
You can send another message in:
Sign in to contact us
You must be logged in to send a message. This helps us link your inquiry to your account and respond faster.
Dashboard
Recent Orders
Orders
Print Config
Printer Types
Add Printer Type
No materials configured yet. Add a material to get started.
Printer Owners
Moderators who can manage this printerCategories
Add Category
Catalog Models
Upload Catalog Model
Edit Model
Image
JPG, PNG, WebP · max 10 MB · uploads automatically on selection
Cost Engine
🧪 Material Types
Define materials and their physical properties and cost. Colors are configured per-printer in Print Config.
Add Material
⚙️ 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 %):
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.
Shipping
Shipping Partners
Add Partner
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.
New Coupon
Site Settings
Store
Payment
Uploads
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
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.
JWT tokens expire after 8 hours. Users are logged out automatically after that period.
Network Security
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
Sitemap: /sitemap.xml
Robots: /robots.txt
Default Meta Tags
global overridesOverride 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.
/product/:id page, generated from catalog dataRate 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.
Contact Form Limits
Per-user daily limits for the Contact Us form. Applied globally unless a user-specific override is set below.
Non-order topics: feedback, account help, etc. Set 0 to block entirely.
Order issue, payment query, shipping update. Higher limit since users may have multiple orders.
User-Specific Overrides
Override contact limits for individual users — raise for trusted users, lower for abusive ones.
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:
🌐 Public Endpoints no auth required
These endpoints are open to all clients. Rate limits still apply per IP.
| Method | Path | Description |
|---|---|---|
| GET | /api/health | Server health check. Returns {"status":"ok"}. |
| GET | /api/public/site-info | Shop name, logo, currency, social links, UPI details — used to brand the storefront. |
| GET | /api/public/about-info | About page settings (enabled cards, stats, content text). |
| GET | /api/catalog | Paginated public approved models. Query: page, limit, category_id, q, sort |
| GET | /api/catalog/:id | Single public model detail. |
| GET | /api/categories | All product categories. |
| GET | /api/materials | Active materials with display name, colors, density. |
| GET | /api/printer-types | Active printer specs (bed size, materials, nozzle) for compatibility display. |
| GET | /api/pincodes | PIN code zone/district lookup for shipping estimation. |
| GET | /api/models/:id/file | Stream raw STL/model file for 3D viewer. Rate-limited (30/15 min). |
| POST | /api/quote | Instant 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/:trackingNo | Public order tracking by tracking number. No auth needed. |
| GET | /sitemap.xml | Dynamic XML sitemap (all public catalog items). |
| GET | /robots.txt | Crawler 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.
| Method | Path | Description |
|---|---|---|
| POST | /api/auth/register | Create account. Body: username, email, password. Sends verification email. |
| POST | /api/auth/login | Body: email, password. Returns token (JWT) or interim_token if 2FA is active. |
| POST | /api/auth/login-2fa | Complete 2FA step. Body: interim_token, code (TOTP). Returns full JWT. |
| GET | /api/auth/me | Current user profile. Requires auth. |
| GET | /api/auth/verify-email/:token | Verify email address using token from registration email. |
| POST | /api/auth/resend-verify | Re-send verification email. Requires auth. |
| POST | /api/auth/forgot-password | Send password reset email. Body: email. |
| POST | /api/auth/reset-password | Set new password. Body: token, new_password. |
| GET | /api/auth/setup-2fa | Generate TOTP secret & QR code for 2FA enrollment. Requires auth. |
| POST | /api/auth/enable-2fa | Confirm and activate 2FA. Body: secret, code. Requires auth. |
| DELETE | /api/auth/disable-2fa | Turn 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.
| Method | Path | Description |
|---|---|---|
| POST | /api/upload-for-cart | Upload an STL/OBJ/3MF and get back parsed dimensions, volume, and a session_id. Used before adding to cart. Field: model_file. |
| POST | /api/checkout | Single-item order. Multipart fields: model_file or catalog_model_id, material, color, quantity, infill, fulfillment, priority_print, shipping_*, notes. |
| POST | /api/cart-checkout | Multi-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/image | Upload/replace preview image for a model you own. Field: image (JPEG/PNG/WebP). |
| POST | /api/catalog/:id/like | Toggle 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.
| Method | Path | Description |
|---|---|---|
| GET | /api/user/profile | Full profile including email, role, 2FA status, addresses. |
| PATCH | /api/user/profile | Update display name or username. Body: username. |
| POST | /api/user/change-password | Body: current_password, new_password. |
| POST | /api/user/request-email-change | Send verification email for new address. Body: new_email, password. |
| GET | /api/user/orders | Paginated list of the user's own orders. Query: page, limit, status. |
| GET | /api/user/orders/:id | Single order detail with timeline. Scoped to the authenticated user. |
| GET | /api/user/orders/:id/invoice | Download PDF invoice for an order. Rate-limited. |
| GET | /api/user/orders/group/:id/invoice | Download combined group-order PDF invoice. |
| GET | /api/user/2fa-status | Returns {"enabled": bool}. |
| GET | /api/user/addresses | List saved delivery addresses. |
| POST | /api/user/addresses | Save a new address. Body: label, name, address, city, state, zip, country. |
| PUT | /api/user/addresses/:id | Replace an existing saved address. |
| DELETE | /api/user/addresses/:id | Remove a saved address. |
| PATCH | /api/user/addresses/:id/default | Set address as default for checkout autofill. |
✉️ Contact Endpoints
Customer support inquiries. Submitting requires auth to prevent spam. Admins manage inquiries via /api/admin/contact.
| Method | Path | Description |
|---|---|---|
| GET | /api/contact/verify-order/:tracking | Verify a tracking number belongs to the logged-in user before submitting an inquiry. Requires auth. |
| POST | /api/contact | Submit 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
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/stats | Revenue totals, order counts by status, recent activity. Scope: admin:read. |
| GET | /api/admin/cost-settings | Current pricing parameters (material costs, electricity rate, margins, GST). Scope: admin:read. |
| POST | /api/admin/price-preview | Dry-run price calculation with custom inputs. Body: material, volume_cm3, quantity, infill, wattage_w, fulfillment, priority_print. Scope: admin:read. |
🛒 Orders
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/orders | All orders. Query: page, limit, status, q, sort. Scope: orders:read. |
| GET | /api/admin/orders/:id | Full order detail with customer, model, printer info. Scope: orders:read. |
| GET | /api/admin/orders/group/:group_id | All orders in a group (cart checkout). Scope: orders:read. |
| PATCH | /api/admin/orders/:id/status | Advance through FSM: pending→confirmed→printing→post_processing→shipped→delivered. Body: status. Scope: orders:write. |
| PATCH | /api/admin/orders/:id/tracking | Set carrier tracking. Body: tracking_number, tracking_url?, shipping_id?. Scope: orders:write. |
| PATCH | /api/admin/orders/:id/printer | Reassign printer. Body: printer_id (or null to unassign). Scope: orders:write. |
| PATCH | /api/admin/orders/:id/paid | Manually confirm payment and set status to confirmed. Scope: payment:write. |
| GET | /api/admin/orders/:id/eligible-printers | Ranked list of all printers with compatibility, proximity, and load scores. Scope: orders:read. |
| GET | /api/admin/orders/:id/notes | List internal + customer notes on an order. Scope: orders:read. |
| POST | /api/admin/orders/:id/notes | Add a note. Body: note, is_internal. Scope: orders:write. |
📦 Catalog & Models
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/models | All models including unapproved. Query: page, limit, q, status. Scope: catalog:read. |
| PATCH | /api/admin/models/:id | Approve/unapprove or toggle public. Body: is_approved?, is_public?. Scope: catalog:write. |
| PATCH | /api/admin/models/:id/meta | Update SEO metadata. Body: seo_title, seo_description, slug. Scope: catalog:write. |
| PUT | /api/admin/models/:id | Full model update. Body: name, category_id, material, color, price, notes. Scope: catalog:write. |
| DELETE | /api/admin/models/:id | Delete model record and physical file. Scope: catalog:write. |
| POST | /api/admin/models/:id/image | Upload/replace preview image. Field: image. Scope: catalog:write. |
| DELETE | /api/admin/models/:id/image | Remove preview image. Scope: catalog:write. |
| GET | /api/admin/models/:id/download | Download raw model file (admin). Scope: catalog:read. |
| POST | /api/admin/catalog-models | Upload a new catalog model. Multipart: model_file, name, category_id, material, color, price. JWT only. |
🖨️ Print Config — Printers, Materials & Categories
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/printer-types | All printers (active + inactive). Scope: catalog:read. |
| POST | /api/admin/printer-types | Add 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/:id | Update printer settings or toggle active. JWT only. |
| DELETE | /api/admin/printer-types/:id | Delete printer. Fails if printer has assigned orders. JWT only. |
| GET | /api/admin/materials | All materials. Scope: catalog:read. |
| POST | /api/admin/materials | Add material. Body: name, display_name, density_g_cm3, cost_per_kg, colors, notes. JWT only. |
| PUT | /api/admin/materials/:id | Update material. JWT only. |
| DELETE | /api/admin/materials/:id | Delete material. JWT only. |
| GET | /api/admin/categories | All categories. Scope: catalog:read. |
| POST | /api/admin/categories | Create category. Body: name, icon, description, display_order. JWT only. |
| PUT | /api/admin/categories/:id | Update category. JWT only. |
| DELETE | /api/admin/categories/:id | Delete category (only if no models are assigned). JWT only. |
🔧 Settings, Site Content & Rate Limiter
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/settings | All shop settings keyed by key. Scope: admin:read. |
| PUT | /api/admin/settings/:key | Update one setting. Body: value. JWT only. |
| GET | /api/admin/site-info | General + company + social settings combined. Scope: admin:read. |
| GET | /api/admin/about-info | About page settings. JWT only. |
| POST | /api/admin/about-info | Save about page settings (bulk key-value). JWT only. |
| GET | /api/admin/company-info | Company name, logo, address, UPI, social. Scope: admin:read. |
| POST | /api/admin/company-info | Update company info (bulk key-value). JWT only. |
| POST | /api/admin/test-email | Send a test email to the admin address to verify SMTP config. JWT only. |
| GET | /api/admin/rate-limiter | Current rate limit config. Scope: admin:read. |
| PUT | /api/admin/rate-limiter | Update limits live (no restart). Body: general_window_min, general_max, upload_window_min, upload_max, bypass_roles[]. JWT only. |
👥 Users
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/users | Paginated user list. Query: page, limit, q, role. Scope: admin:read. |
| PATCH | /api/admin/users/:id | Change role (user/moderator/admin) or toggle active. Body: role?, is_active?. JWT only. |
| PATCH | /api/admin/users/:id/verify | Manually mark email as verified. JWT only. |
🔐 API Tokens (PAT Management) All JWT only
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/tokens | List all PATs (token value never returned after creation). |
| POST | /api/admin/tokens | Create PAT. Body: name, description, permissions[], expires_in_days. Returns plaintext token once only. |
| PATCH | /api/admin/tokens/:id/revoke | Disable token (keeps record for audit). |
| DELETE | /api/admin/tokens/:id | Permanently delete token and its logs. |
| POST | /api/admin/tokens/bulk-revoke | Revoke multiple tokens. Body: ids[]. |
| POST | /api/admin/tokens/bulk-delete | Permanently delete multiple tokens. Body: ids[]. |
| GET | /api/admin/tokens/logs | All PAT access logs (last 500). Scope: admin:read. |
| GET | /api/admin/tokens/:id/logs | Logs for one token (last 200). Scope: admin:read. |
📬 Contact Inquiries admin + moderator
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/contact | All inquiries. Query: page, limit, status. |
| GET | /api/admin/contact/:id | Single inquiry with message history. |
| POST | /api/admin/contact/:id/reply | Send reply email to customer. Body: message. |
| PATCH | /api/admin/contact/:id/status | Update 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.
| Method | Path | Description |
|---|---|---|
| GET | /api/mod/orders | All orders (same as admin). Query: page, limit, status. |
| GET | /api/mod/orders/:id | Full order detail. |
| GET | /api/mod/orders/group/:group_id | Group order list. |
| PATCH | /api/mod/orders/:id/status | Advance order status. |
| PATCH | /api/mod/orders/:id/tracking | Set tracking number. |
| PATCH | /api/mod/orders/:id/paid | Mark order as paid. |
| GET | /api/mod/orders/:id/notes | Order notes. |
| POST | /api/mod/orders/:id/notes | Add internal note. |
| GET | /api/mod/models | All models including unapproved. |
| PATCH | /api/mod/models/:id/meta | Update model metadata. |
| GET | /api/mod/models/:id/download | Download model file. |
| GET | /api/mod/categories | All categories. |
| GET | /api/mod/materials | All materials (read + write). |
| POST | /api/mod/materials | Add material. |
| PUT | /api/mod/materials/:id | Update material. |
| DELETE | /api/mod/materials/:id | Delete material. |
| GET | /api/mod/printer-types | Printer list (read + write). |
| POST | /api/mod/printer-types | Add printer. |
| PUT | /api/mod/printer-types/:id | Update printer. |
| DELETE | /api/mod/printer-types/:id | Delete printer. |
| GET | /api/mod/contact | Contact inquiries. |
| GET | /api/mod/contact/:id | Single inquiry. |
| POST | /api/mod/contact/:id/reply | Reply to inquiry. |
| PATCH | /api/mod/contact/:id/status | Update 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.
| Scope | What it unlocks |
|---|---|
| orders:read | GET orders, order detail, group orders, order notes, eligible printers |
| orders:write | PATCH status, tracking, printer assignment, printer notes |
| payment:write | PATCH orders/:id/paid — mark payment confirmed |
| catalog:read | GET all models (including unapproved), printer-types, materials, categories, model download |
| catalog:write | PATCH/PUT/DELETE models, approve/reject, model images, meta updates, catalog upload |
| admin:read | GET stats, users, settings, cost-settings, price-preview, rate-limiter, site-info, company-info, token logs |
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 $hcurl
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/printerPowerShell
$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}'curl
curl -X PATCH \
-H "Authorization: Bearer $PAT" \
-H "Content-Type: application/json" \
-d '{}' \
https://your-domain.com/api/admin/orders/42/paidPowerShell
Invoke-RestMethod -Method PATCH `
-Uri "https://your-domain.com/api/admin/orders/42/paid" `
-Headers @{ Authorization="Bearer $PAT"; "Content-Type"="application/json" } `
-Body '{}'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/88PowerShell
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}'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-previewPowerShell
$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.
Default Rate Limits
| Limiter | Applies to | Default |
|---|---|---|
| General | All /api/* except auth & upload | 100 req / 15 min per IP |
| Upload / Checkout | /api/checkout, /api/upload-for-cart, /api/cart-checkout | 10 req / 60 min per IP |
| Auth | Login, register, forgot/reset password, 2FA | 15 req / 15 min per IP |
| Quote | /api/quote | 20 req / 15 min per IP |
| Model file | /api/models/:id/file | 30 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.
Create Personal Access Token
Copy your token now — it won't be shown again
Store it securely (e.g. environment variable). If you lose it, revoke and create a new one.
Access Log
Every API request authenticated with a PAT is logged here.
Contact Inquiries
Messages submitted through the public contact form. Reply directly via SMTP.
Reply to Inquiry
My Account
My Addresses
Add New Address
Email Address
Your email is not verified. Some features (like 2FA) require a verified email. Check your inbox or request a new link.
We'll send a verification link to your new address. Your email won't change until you click it.
Change Password
Two-Factor Authentication
Loading...
Scan this QR code with Google Authenticator or Authy:
Enter your password to disable 2FA: