REST API — audit, verify, repair

Each call returns a structured JSON report — checklist across three groups (Geometry / Print readiness / G-code execution), billing per processing stage, every finding fully traceable. Audit a mesh, verify the slicer output, or fix topology issues — single file or whole folder. You get a checklist of pre-print findings, each with a measurable value; you set the thresholds for your workflow.

Note. Programmatic API keys are coming with the paid plans. For now, audit + verify run through the web app and CLI only. Need API access earlier? Contact us for a pilot slot.
<1s median 99.9% success Stable v1 envelope Python + C# SDKs

Quick Start

Audit a mesh with one call:

curl -X POST https://api.admeshio.com/v1/admeshio/audit \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F [email protected] \
  -F recipe=bambu_x1c_pla_standard

Response — admeshio-report/v1 envelope:

{
  "schema": "admeshio-report/v1",
  "version": "1.0.0",
  "op": "audit",
  "input": { "path": "part.stl", "hash": "fnv1a:ab63...", "bytes": 7084, "format": "stl" },
  "profile": "bambu_x1c__pla",
  "success": true,
  "audited_at": "2026-04-19T15:05:11Z",
  "verdict": {
    "gri_overall": 87, "gri_geometry": 92,
    "gri_readiness": 90, "gri_inspection": 87,
    "bottleneck": "readiness"
  },
  "stages": [
    { "name": "diagnose", "status": "executed" },
    { "name": "audit_geometry", "status": "executed" },
    { "name": "slice", "status": "executed" },
    { "name": "verify_output", "status": "executed" }
  ],
  "billing": { "credits_charged": 4, "tier": "full_audit_internal" },
  "flags": [],
  "errors": [],
  "timings": { "total_ms": 85 }
}

HTTP status signals the result at a glance: 200 when the audit ran and produced findings, 422 when the engine cannot evaluate the mesh (empty file, unreadable format, fundamentally broken topology). Use flags[] for the per-check findings and verdict.gri_* + verdict.bottleneck for the numeric snapshot. AdMeshio returns a checklist of pre-print findings, each with a measurable value; you set the thresholds that matter for your workflow.

Who uses this

AI 3D Platforms

Meshy, Tripo, Rodin — audit AI-generated meshes before handing downloads to users. 15–40% of AI meshes have geometry defects a slicer will mask or mangle.

Print Services & Farms

Audit each customer upload with admeshio audit <file>. Catch defects before they become failed prints and support tickets.

3D Marketplaces

Audit uploads at ingestion time. Catch self-intersection, open boundaries, and non-manifold edges before they reach buyers — even when a slicer would silently mask the damage.

Endpoints

Analysis endpoints return the admeshio-report/v1 JSON envelope. Mesh-modification endpoints (repair) stream the result back as binary STL.

POST /v1/admeshio/audit

End-to-end print-readiness audit. Runs diagnose → audit_geometry → slice → verify_output as a chain, early-aborts on broken geometry, and returns the admeshio-report/v1 envelope shown in Quick Start above.

Request
file(required) STL, OBJ, 3MF, GLB, glTF, PLY
profilePrinter profile (enables full chain). Without it, mode = GEOMETRY_ONLY
depthquick (topology only) or full (default: full if profile is set)
HTTP status

200 on every verdict except NOT_PRINTABLE (422). The envelope is returned in both cases — 422 just signals "do not print this".

POST /v1/admeshio/verify

Post-slice execution check on a slicer output: G-code (FDM) or CTB / cbddlp / pwmx / pwmo / goo (resin). Auto-detects format by extension + magic bytes. Source mesh is not inspected — gri_geometry will be -1 and mode = EXECUTION_ONLY.

Request
file(required) FDM: .gcode / .gco / .g · Resin: .ctb / .cbddlp / .pwmx / .pwmo / .goo
profileOptional printer profile for Tier 2 checks (exposure windows, bottom layer count, lift / retract speed compare)

Returns the same admeshio-report/v1 envelope as audit, with op: "verify" (FDM) or op: "verify_ctb" (resin). On resin, execution_analysis.is_resin = true and the block carries the file's recorded machine_name / material_name / lift cycle / 3D vacuum-trap diagnostic. HTTP 415 if the file extension isn't recognized.

POST /v1/admeshio/repair

Closes cracks and overlaps. Streams the repaired binary STL back as the response body. The pipeline is built so the output is never measurably worse than the input — if a step would damage topology, it rolls itself back automatically.

Request
file(required) STL, OBJ, 3MF, GLB, glTF, PLY
strict_quality0 (default) or 1 — pass 1 to roll back any step that fails the safety check
Response

200 with Content-Type: application/octet-stream and the repaired STL as body. The audit report is returned in the X-Admeshio-Report header (base64-encoded) so you can read it without a second request.

POST /v1/admeshio/diagnose

Topology counters + intent opening classifier. SI / NM / degenerate / boundary loops + per-hole shape metrics (planarity, circularity, regularity) for distinguishing intentional openings from cracks.

Request
file(required) STL, OBJ, 3MF, GLB, glTF, PLY

POST /v1/admeshio/decimate

QEM decimation with the safety gate from the CLI verb (rejects collapses that would create new self-intersections; bow-tie vertex pre-split runs by default). Streams the decimated binary STL back as the response body.

Request
file(required) STL, OBJ, 3MF, GLB, glTF, PLY
ratioKeep this fraction of faces (0.0 – 1.0). Mutually exclusive with target_faces.
target_facesDecimate to exactly N faces.
Response

200 with Content-Type: application/octet-stream. The op envelope is in the X-Admeshio-Decimate header (base64-encoded).

POST /v1/admeshio/pipeline

Run a recipe of repair / cleanup / boolean / shrinkage steps in order. Recipe steps include repair, fix_si, decimate, smooth, orient, boolean_union / boolean_subtract / boolean_intersect (Wave I), shrinkage with per-material catalog (Wave K), and more — see RECIPE_REFERENCE for the full list.

Request
file(required) STL, OBJ, 3MF, GLB, glTF, PLY
recipe(required) Built-in recipe name OR raw recipe JSON inline.
Response

200 with the modified mesh as binary STL body and the per-step envelope in X-Admeshio-Pipeline (base64-encoded). Use /pipeline/stream for SSE progress updates on long recipes.

POST /v1/admeshio/fdm-slice

Wraps PrusaSlicer / OrcaSlicer / Bambu Studio CLI. Captures the produced G-code and runs verify on it in the same call so you get the GRI-I score in one round-trip.

Request
file(required) STL / OBJ / 3MF
recipeBuilt-in profile or recipe name (binds slicer + material + quality).
Response

200 with the G-code as response body and the slice + verify envelope in X-Admeshio-Fdm-Slice (base64-encoded).

GET /v1/admeshio/catalog

Machine-readable capability spec. Fetch once per session, cache, use for LLM / agent verb discovery and verdict-mode → user-copy mapping.

Response
{
  "schema": "admeshio-catalog/v1",
  "version": "1.0.0",
  "verbs": [
    { "name": "audit", "inputs": ["stl", "obj", "3mf", ...], "flags": [...] },
    { "name": "verify", ... },
    ...
  ],
  "groups": ["geometry", "readiness", "inspection"],
  "principle": "AdMeshio reports findings; you set the thresholds for your workflow."
}

Folder batch (via CLI)

The REST API is single-file per call. For folder-scale workloads use the CLI — every verb auto-detects directory input and parallelizes the run. Replaces the legacy bench verb and --batch flag in the single-file-per-call era.

# Audit every mesh in a folder
admeshio audit ./orders --recursive --workers 8 \
  --recipe bambu_x1c_pla_standard
# HTML dashboard across the folder
admeshio audit ./orders --recipe bambu_x1c_pla_standard \
  --summary report.html

audit and verify emit JSONL to stdout — one envelope per line, parseable line-by-line. Each file's report is written next to the source file.

SDKs

Typed clients return AuditReport objects with the same shape as the JSON output: verdict.gri_overall + per-axis scores + flags[] with each finding's code and severity. Folder input auto-detects and returns a list.

Python

# pip install admeshio
import admeshio
# Audit
r = admeshio.audit("part.stl", recipe="bambu_x1c_pla_standard")
print(r["verdict"]["gri_overall"])  # 87
# Branch on what you care about
if r["verdict"]["gri_overall"] >= 85:
    send_to_printer(r["input"]["path"])
elif any(f["code"] == "SELF_INTERSECTION" for f in r.get("flags", [])):
    alert("mesh has overlapping surfaces — fix in modelling tool")
# Repair
admeshio.repair("input.stl", "output.stl")
# Folder batch — returns list of envelopes
reports = admeshio.audit("./orders", recursive=True, workers=8)
weak = [r for r in reports if r["verdict"]["gri_overall"] < 60]
# Capability discovery (offline, no network)
cat = admeshio.catalog()
for verb in cat.verbs: print(verb.name, verb.summary)

SDK exposes audit / verify / diagnose / repair / decimate / pipeline / diff / units / thickness / catalog.

Decimate & pipeline

# Decimate
admeshio.decimate("dense.stl", ratio=0.5, output="lite.stl")
# Chained pipeline — recipe as dict
admeshio.pipeline("input.stl", recipe={
    "name": "safe", "steps": [
      {"op": "fix_si", "params": {"strict_quality": 1}},
      {"op": "decimate", "params": {"ratio": 0.5}},
    ]}, output="ready.stl")

Both SDKs work against the local binary or the hosted API — set ADMESHIO_BIN for local, or pass a base_url to hit the HTTP service. Same typed return shape either way.

Integration examples

Node.js / JavaScript

import fs from 'fs';
const form = new FormData();
form.append('file', fs.createReadStream('part.stl'));
form.append('recipe', 'bambu_x1c_pla_standard');
const res = await fetch('https://api.admeshio.com/v1/admeshio/audit', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${process.env.ADMESHIO_KEY}` },
  body: form,
});
const report = await res.json();
console.log(`GRI=${report.verdict.gri_overall} bottleneck=${report.verdict.bottleneck}`);
// HTTP 422 = audit could not run on this file
if (res.status === 422) {
  console.log('flags:', report.flags.map(f => f.code));
}

CI/CD — GitHub Actions

# .github/workflows/mesh-audit.yml
- name: Audit 3D models
  run: |
    admeshio audit ./models \
      --recursive --workers 4 \
      --recipe bambu_x1c_pla_standard \
      --summary audit-report.html
  # Exit code 1 only on engine error; parse the JSON for finding-level policy
- uses: actions/upload-artifact@v4
  if: always()
  with: { name: audit-report, path: audit-report.html }

Parse the JSONL output and decide your own policy — e.g. fail the build only when verdict.gri_overall < 60 or when specific flags[].code entries appear (SELF_INTERSECTION, OPEN_BOUNDARY, etc.).

HTTP status & errors

StatusMeaning
200Audit ran. Inspect flags[] + verdict.gri_* in the body.
401Missing or invalid API key
413File too large for your plan (see plan limits)
415Unsupported file format (for /verify, extension not recognized)
422Audit could not run on this file (empty mesh, fundamentally broken topology). Body still describes what was attempted.
429Plan usage limit reached for this month. Upgrade to a higher plan or wait for the next billing cycle.
500Internal error. Retry; if persistent, contact support with the request ID.

Usage headers

Every metered response includes:

X-Admeshio-UsageUsage units consumed this billing month
X-Admeshio-LimitMonthly usage cap for your plan (or "unlimited")
X-Admeshio-Credits-UsedUsage units billed for this request (legacy header name kept for backward compatibility)

Self-hosted deployment

Run the engine on your own infrastructure. Single binary, zero dependencies, air-gapped OK. Enterprise tier includes updates, security patches, dedicated CSM, and SLA — see pricing.

# Single binary — no Docker, no database
admeshio audit part.stl --recipe bambu_x1c_pla_standard
admeshio audit ./orders --recursive
# Or run as an HTTP service (FastAPI wrapper)
pip install admeshio-server
ADMESHIO_BIN=/path/to/admeshio admeshio-server --port 8000

Single binary, runs offline — no phone-home. Contact sales for evaluation and enterprise onboarding.