Dial in your settings here, then use API/Script to batch process.
living starts with the handover. A product designer sends me a Dropbox link containing a 300MB High-Res `.OBJ` file. Then comes the "Oh Sh*t" moment when I try to load this file into Three.js or Shopify. The browser crashes, or the frame rate drops to 1 FPS.
Now I'm forced into the context switch. I have to stop coding, download Blender, and open a UI that looks like the cockpit of a 747. What follows is the manual labor; I spend 45 minutes watching YouTube tutorials on "How to bake normals" and "Retopology." I manually delete vertices, break the UV maps, and ruin the textures. Finally, the export. I export a `.glb`. It looks terrible. I try again. I'll eventually get it right but hey, time.
That's when the scale issue hits me. I realize I have 500 more products in the catalog to do.
Your Solution: I delete Blender, run one `curl` command, and go back to work, my regular work that is.
This is the "JPEG of 3D" and what Shopify/iPhone requires.*
The expected workflow is to spend some credits on the Web UI. Once you've got your dials right, use the API to zip through your files.
✨ Bonus credits start at $50!
Remaining Credits: --
| Date | Activity | Amount |
|---|
If you're logged in, click the "API Key" button in the sidebar to view, copy, or regenerate your key.
Not logged in? Use the "Log in or get free credits" link and enter your email address. You'll be logged in automatically, and we'll also email your API key for programmatic use (scripts, CLI, etc.).
Cost: 1 Credit
Best for: Reducing file size while keeping the exact same geometry structure. Good for CAD models or models that are already clean.
How it works: It intelligently reduces polygons. It does not create new textures.
Cost: 2 Credits
Best for: 3D Scans, Photogrammetry, and Organic shapes.
How it works: It builds a brand new "clean" mesh (Retopology) and "bakes" the details from the high-quality original onto the new one using Normal Maps. This is the professional workflow for games and AR.
.bin buffer files. If your GLTF
has external buffers, upload as a ZIP containing the
.gltf and all .bin files together.
.mtl, .bin, textures)
into one archive. Easiest way to keep everything organized together.
.mtl and
.jpg/.png files separately (max 50 textures).
Supported texture formats: .png, .jpg, .jpeg, .tga, .bmp, .tif, .tiff
We use a simple credit system. You purchase a pack of credits, and they are deducted when you run a job. ALREADY HAVE CREDITS? BUYING MORE ADDS TO YOUR CREDIT BALANCE.
We're here to help! Whether you have a question about privacy, need technical support, or want to provide feedback, we'd love to hear from you.
Fill out the form below and we'll respond within 24-48 hours.
Last Updated: December 2025
Key Promise: We never sell your data or your 3D models. Your files are yours.
Welcome to MeshOpt ("we," "our," or "us"). We are committed to protecting your privacy and ensuring the security of your 3D assets. This Privacy Policy explains how we collect, use, and safeguard your information when you use our website and API services.
By using our service, you agree to the collection and use of information in accordance with this policy.
Usage Data: API requests, timestamps, file sizes (for credit usage and abuse prevention), IP addresses (for security and rate-limiting).
User Content: We temporarily process your 3D files (OBJ, FBX, GLB, etc.) and textures, and generate optimized versions (GLB, USDZ).
Service Provision: To provide the 3D optimization service, manage your credit balance, and authenticate your API requests.
Communications: To send transaction receipts, notify you of critical service updates, and respond to your support requests.
Your Intellectual Property: You retain full ownership of all files you upload and the optimized files we generate. We claim no ownership rights.
Access Control: Your files are not accessible to the public. Download links are signed and expire automatically.
3D Files: All uploaded files and generated results are automatically deleted from our servers after 1 hour.
Account Data: We retain billing emails and transaction history indefinitely for tax and accounting purposes.
Stripe: We use Stripe to process payments. We receive confirmation that payment succeeded and your email address. See Stripe's Privacy Policy.
No Analytics or Tracking: We do NOT use Google Analytics, Facebook Pixel, or any third-party tracking or analytics services.
You have the right to: Access your personal data, Correct inaccurate data, Delete your account and data, Export your transaction history (available in the app), and Object to processing for specific purposes.
To exercise any of these rights, please contact us using the Contact form.
We implement industry-standard measures: SSL/TLS encryption, secure database with access controls, file isolation during processing, automatic deletion after processing, no permanent file storage, and API key authentication.
We use a secure, HttpOnly session cookie for authentication. This cookie is encrypted and cannot be accessed by JavaScript, protecting you from XSS attacks. We do NOT use analytics cookies, advertising cookies, social media tracking pixels, cross-site tracking, or third-party cookies of any kind.
Your API key is stored securely server-side and is only accessible through our authenticated API Settings page.
We may update this Privacy Policy from time to time. The "Last Updated" date will reflect when changes were made. For material changes, we will notify users via email.
If you have questions, concerns, or requests regarding this Privacy Policy or your personal data, please use our Contact Form.
We will respond to privacy inquiries within 30 days.
Last Updated: December 2025
Summary: You own your files. We process them for you. Pay with credits. Don't abuse the service. That's it.
By accessing or using MeshOpt ("the Service"), operated by DBA Brian Ginn ("we," "us," or "our"), you agree to be bound by these Terms of Service. If you do not agree to these terms, do not use the Service.
MeshOpt provides 3D mesh optimization services, including decimation (polygon reduction) and remeshing with texture baking. The Service is available via web interface and API.
Credit System: The Service operates on a prepaid credit system. Credits are purchased through Stripe and deducted when optimization jobs are processed.
Credit Expiration: Purchased credits never expire.
Pricing: Credit costs for different operations (Decimate, Remesh) are displayed in the application before purchase and before processing.
Free Re-optimization: Re-processing the same file with different settings within 24 hours of the original paid job is free.
Automatic Refunds: If the Service fails to process your file due to a system error, timeout, or processing failure, your credits are automatically refunded.
Manual Refunds: If you are unsatisfied with the Service for any reason, contact us within 7 days of purchase. We will review refund requests on a case-by-case basis.
No Refunds For: Credits that have been successfully used for completed optimization jobs, or accounts terminated for Terms of Service violations.
Ownership: You retain full ownership of all 3D files you upload and the optimized files we generate. We claim no intellectual property rights over your content.
License to Process: By uploading files, you grant us a limited, temporary license to process, transform, and store your files solely for the purpose of providing the Service.
Deletion: All uploaded and generated files are automatically deleted from our servers within 1 hour.
You agree NOT to use the Service to:
We reserve the right to terminate accounts that violate these terms without refund.
API Keys: Your API key is confidential. You are responsible for all activity under your key. Do not share or expose your key publicly.
Rate Limits: We may impose rate limits to ensure fair access and system stability. Exceeding limits may result in temporary throttling.
As-Is Basis: The Service is provided "as is" and "as available" without warranties of any kind, either express or implied.
No Uptime Guarantee: We do not guarantee uninterrupted or error-free service. We may perform maintenance, updates, or experience downtime.
Modifications: We reserve the right to modify, suspend, or discontinue any part of the Service at any time.
To the maximum extent permitted by law, DBA Brian Ginn shall not be liable for any indirect, incidental, special, consequential, or punitive damages, including but not limited to loss of profits, data, or business opportunities, arising from your use of the Service.
Our total liability for any claim arising from these Terms or the Service shall not exceed the amount you paid us in the 12 months preceding the claim.
You agree to indemnify and hold harmless DBA Brian Ginn from any claims, damages, losses, or expenses (including legal fees) arising from your use of the Service, your content, or your violation of these Terms.
We may update these Terms from time to time. The "Last Updated" date will reflect when changes were made. Continued use of the Service after changes constitutes acceptance of the new Terms.
These Terms are governed by the laws of the United States. Any disputes shall be resolved in the courts of the United States.
Questions about these Terms? Use our Contact Form.
Base URL: https://webdeliveryengine.com
Authentication: All protected endpoints require Authorization: Bearer YOUR_API_KEY
The API uses an asynchronous 3-step workflow:
/optimize and receive a job ID/job/:id until status is Completed or FailedSubmit a 3D model for processing. Returns a job ID for polling. Requires authentication.
| Field | Type | Required | Description |
|---|---|---|---|
file | file | Yes | 3D model file (.obj, .fbx, .glb, .gltf), .zip, or multiple files (model + .mtl + textures). Max 50 texture files. |
mode | string | No | decimate (default) or remesh |
ratio | float | No | 0.0-1.0 quality ratio for decimate mode (default: 0.5) |
faces | int | No | Target face count for remesh mode (default: 5000) |
texture_size | int | No | Texture resolution for remesh: 512, 1024, 2048, 4096 (default: 2048) |
format | string | No | Output format: glb, usdz, or both (default: glb) |
callback_url | string | No | HTTPS URL to receive webhook on job completion/failure |
Supported auxiliary files: .mtl, .png, .jpg, .jpeg, .tga, .bmp, .tif, .tiff, .bin
{
"jobId": "1734012345678",
"status": "processing"
}
Header X-Credits-Remaining contains your updated balance.
| Status | Meaning |
|---|---|
400 | Bad request (no valid 3D model, missing external buffers, etc.) |
401 | Unauthorized (invalid or missing API key) |
402 | Payment required (insufficient credits) |
Poll job status. No authentication required.
{ "status": "Processing" }
{
"status": {
"Completed": {
"output_size": 245678,
"glb_url": "/download/1734012345678/model_opt.glb",
"usdz_url": "/download/1734012345678/model_opt.usdz",
"expires_at": "2024-12-16T15:30:00Z",
"original_faces": 50000,
"output_faces": 5000,
"remesh_method": "quadriflow"
}
}
}
remesh_method is only present for remesh jobs: "quadriflow" (retopology) or "decimate" (fallback).
{
"status": {
"Failed": { "error": "Timeout" }
}
}
If you provide a callback_url when submitting a job, we'll POST the result to your endpoint when the job completes or fails. This is ideal for batch processing where polling many jobs is impractical.
{
"jobId": "1734012345678",
"status": {
"Completed": {
"output_size": 245678,
"glb_url": "/download/1734012345678/model_opt.glb",
"usdz_url": "/download/1734012345678/model_opt.usdz",
"expires_at": "2024-12-16T15:30:00Z",
"original_faces": 50000,
"output_faces": 5000,
"remesh_method": "quadriflow"
}
}
}
Your endpoint should respond with 2xx within 10 seconds. Failed webhooks are not retried.
Get your current credit balance. Requires authentication.
{ "credits": 97 }
Get your transaction history (last 50). Requires authentication.
{
"history": [
{
"id": 42,
"timestamp": "2024-12-16T15:30:00Z",
"type": "optimize",
"credits": -1,
"filename": "chair.obj",
"mode": "decimate",
"parameters": "50%"
},
{
"id": 41,
"timestamp": "2024-12-15T10:00:00Z",
"type": "purchase",
"credits": 100
}
]
}
Entry types: optimize, purchase, refund, free_credits, other. Fields like filename, mode, parameters only appear for optimize entries.
Get current pricing and configuration. No authentication required.
Loading...
| Status | Meaning |
|---|---|
400 | Bad Request — No supported 3D model found in upload |
401 | Unauthorized — Missing or invalid API key |
402 | Payment Required — Insufficient credits |
404 | Not Found — Job ID or resource not found |
500 | Server Error — Something went wrong on our end |
# Option A: Using a ZIP file (simplest approach)
curl -X POST 'https://webdeliveryengine.com/optimize' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-F '[email protected]' \
-F 'mode=decimate' \
-F 'ratio=0.5'
# Option B: Multi-file upload (OBJ with 6 textures)
curl -X POST 'https://webdeliveryengine.com/optimize' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-F '[email protected]' \
-F '[email protected]' \
-F '[email protected]' \
-F '[email protected]' \
-F '[email protected]' \
-F '[email protected]' \
-F '[email protected]' \
-F '[email protected]' \
-F 'mode=decimate' \
-F 'ratio=0.5'
# 2. Poll for completion (replace JOB_ID)
curl 'https://webdeliveryengine.com/job/JOB_ID'
# 3. Download results when complete
curl -O 'https://webdeliveryengine.com/download/JOB_ID/model_opt.glb'
curl -O 'https://webdeliveryengine.com/download/JOB_ID/model_opt.usdz'
Tip: ZIP files are often easier to manage and keep your textures organized together.
This command reflects your current settings. Use it to process assets via the API.
.obj or .fbx files with textures. Package the model + materials + images together — keeps everything organized.
.mtl and texture files (max 50) as separate -F 'file=@...' entries.
.glb files since they have textures embedded inside. You don't need to zip these.
Transaction History will record the name of the inner model file found inside your ZIP (e.g., my_model.obj), not the ZIP filename itself.
Copied to clipboard!
PowerShell Note: Save as .ps1 and run with powershell -ExecutionPolicy Bypass -File script.ps1
Process multiple files by wrapping the API call in a loop:
PowerShell Note: Run with powershell -ExecutionPolicy Bypass -File script.ps1
Loading...
Paste your file paths below (one per line). We'll generate a complete script that uploads each file, tracks progress, and downloads results as they finish.
Paste file paths above to generate script...
Copied to clipboard!
PowerShell's default execution policy may block unsigned scripts. To run this script, use one of these methods:
powershell -ExecutionPolicy Bypass -File script.ps1Set-ExecutionPolicy -Scope Process -ExecutionPolicy BypassSet-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
Run this script from your terminal. Optimized files will be saved to ./output/
I was supposed to code a 3D printer project for myself while on a working vacation in NH in early Dec 2025. I told an LLM about my upcoming needs, but it misunderstood me. Instead, it told me about 3D Mesh, which actually sounded interesting. So, I built that instead.
I'm not steeped in this 3D world, but I can code. I thought, "I may be able to help you."
Let me know in the email form below if I succeeded.
— Brian Ginn
/history endpoint for usage tracking.Try MeshOpt for free! Enter your email below to get started with -- free credits.
Use this key for programmatic access (scripts, CLI, CI/CD).
••••••••••••••••••••••••••••••
This will invalidate your current key immediately. Any scripts using the old key will stop working.