Conversion API.

The MeshWeave converter, from your own server. SolidWorks, STEP, Parasolid, IGES, Rhino, STL, OBJ and 3MF in; the format your product needs out. One key, two endpoints, billed by the month.

25 conversions a month free on any account. No card to try it.

Create free account then API keys… in the account menu.

PlansPer calendar month, UTC
Free trial
$0
25 conversions included · 1 at once
Any account. 25 conversions a month, then refused until the 1st. Every format and every conversion option.
API Starter
$49/mo
500 conversions included · 2 at once
Then $0.15 per conversion, up to 2,500 a month. Every format and every conversion option.
API Pro
$199/mo
3,000 conversions included · 4 at once
Then $0.08 per conversion, up to 15,000 a month. Largest files. Every format and every conversion option.

Extras on top of a conversion (Fine or Ultra detail, repair, a larger triangle budget) are paid in credits, as on the pricing page; each API plan includes credits every month, and each key has its own credit ceiling.

Quick startTwo calls
  1. Make a key. Sign in, open API keys… in the account menu, add your server's address, make the key and copy it. It is shown once.
  2. Send the file. POST /api/convert with the file and a target_format. The answer is 202 with a job id.
  3. Collect the result. GET /api/convert-job/<id> until it is not 202. A 200 is the converted file.
curl -s https://meshweave.app/api/convert \
  -H "Authorization: Bearer $MESHWEAVE_API_KEY" \
  -F file=@bracket.step \
  -F target_format=stl
# 202 {"job": "3f9c0a1e5b7d2c4e6a8f0b1d"}
curl -s -o bracket.stl -w "%{http_code}\n" \
  -H "Authorization: Bearer $MESHWEAVE_API_KEY" \
  https://meshweave.app/api/convert-job/3f9c0a1e5b7d2c4e6a8f0b1d
# 202 while it runs; 200 with the file when done; 4xx/5xx with {"detail": "..."} if not
import os, time, httpx

API = "https://meshweave.app"
HEAD = {"Authorization": f"Bearer {os.environ['MESHWEAVE_API_KEY']}"}

def convert(path: str, target: str) -> bytes:
    with httpx.Client(base_url=API, headers=HEAD, timeout=60, follow_redirects=False) as c:
        with open(path, "rb") as f:
            r = c.post("/api/convert", files={"file": f}, data={"target_format": target})
        r.raise_for_status()
        job = r.json()["job"]
        deadline = time.time() + 600
        while time.time() < deadline:
            r = c.get(f"/api/convert-job/{job}")
            if r.status_code == 202:
                time.sleep(2)
                continue
            if r.status_code == 200:
                return r.content
            raise RuntimeError(r.json().get("detail", r.text))
    raise TimeoutError(job)
ReferenceEvery endpoint a key reaches

POST /api/convert

Multipart form. file (required), target_format (required, e.g. stl, step, 3mf), and the same options the converter page offers: quality (standard, fine, ultra), repair (1), target_release (a SolidWorks year, for SLDPRT out). Always answers 202 {"job": id} or an error; it never holds the connection while it converts.

GET /api/convert-job/<id>

202 {"status": "running", "elapsed": s} while it runs; 200 with the file (its name in Content-Disposition) when done; the conversion's error when not. Results are kept for a short while, then deleted.

GET /api/convert/formats

Every input format and what it can become.

GET /api/api-usage

This month: used, included, hardCap, overage, inflightLimit. The same count rides on every API answer as X-MeshWeave-Quota-Used, -Included and -Limit.

Formats

The live list is at GET /api/convert/formats.

Errors

Every error has a JSON body {"detail": "..."} written for a person: log it or show it.

400The file or the format pair cannot be converted; or a key was sent in a URL (that key is then marked exposed).
401The key is not valid, has expired or was revoked.
402The month’s limit for the plan is reached, or the key’s credit ceiling for extras.
403The key may not call this path, the request came from an address off the key’s list, or from a web page.
404No such job, or it belongs to another account.
409The file needs a choice first (several bodies, a triangle budget); the body says which.
413The file is larger than the plan converts.
429Too many requests a minute, or too many conversions running at once. Wait for Retry-After.
Keys and securityWhat a key can and cannot do
  • A key converts and reads its own count, nothing else. It cannot reach your projects, files, billing or other keys.
  • Send it only in the header Authorization: Bearer <key>. A key found in a URL is refused and marked exposed, because URLs are logged.
  • Servers only. A request carrying a browser Origin is refused: a key in a web page can be read by anyone who opens it.
  • Limit it to your addresses. Requests from anywhere else are refused, and the owner is emailed.
  • Give it an expiry if it is for a test or a contractor. You are emailed when a key is made or revoked.
  • We store only a hash of the key. Lost it? Revoke it and make a new one.
Questions6 answered
What counts as one conversion?
One file converted successfully. A request that is refused, or a conversion that fails, is not counted. Polling a finished job again is not counted again. An assembly counts one conversion per ten parts.
When does the month reset?
On the 1st of each month, 00:00 UTC. Overage is added to your next bill after the month closes.
What happens to the files I send?
They are converted by machine on our own servers in Germany and deleted within 24 hours. An API conversion is never kept in your account’s files, never shared and never used to train AI.
Can I limit where a key is used from?
Yes, and we recommend it: give each key the addresses of your servers. A request from any other address is refused and you get an email.
How do I rotate a key?
Make a new key, move your server to it, then revoke the old one. Both work at once, so nothing stops in between.
Do you need more than 15,000 a month?
Write to us from your account (Support) and we will size a plan for you.

See also the privacy policy, the terms and the refund policy.