REST API — audit, repair, FEM

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, fix topology issues, run a structural stress check — 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/stress-check

MFEM linear-elastic FEM. Default scenario: gravity + thermal shrinkage with bottom-fixed BC. Returns safety factor, peak von Mises, mass / inertia, and thin-wall hotspots. The extended CLI flags (--load-spec, --body, --drop-height, --g-load, --printer) are CLI-only for now — call admeshio.exe via the Cloud CLI if you need them from a server context.

Request
file(required) STL, OBJ, 3MF, GLB, glTF, PLY
materialPLA / ABS / PETG / Resin / Nylon / PA12 (default PLA, case-insensitive)
fixed_zOverride the default 0.5 mm bottom-fix slab.
load_axialN newtons applied along -Z to the load region.
load_regionz>X or z<X. Default: top 1 mm slab.
Response

200 with the JSON envelope (no output file — read-only analysis).

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 / stress_check / diff / units / thickness / catalog.

FEM, decimate, pipeline

# FEM stress check (default scenario)
fem = admeshio.stress_check("part.stl", material="PLA")
print(fem.safety_factor, fem.structurally_safe)
# Custom load case
fem = admeshio.stress_check("bracket.stl", material="ABS",
    fixed_z=5, load_axial=100, load_region="z>20")
# 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.
429Monthly quota exceeded AND no wallet credits. Buy credits or upgrade plan.
500Internal error. Retry; if persistent, contact support with the request ID.

Usage headers

Every metered response includes:

X-Admeshio-UsageCredits used this month
X-Admeshio-LimitMonthly credit limit for your plan (or "unlimited")
X-Admeshio-Credits-UsedCredits billed for this request

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.