{"name":"FabTally Agent API","version":"0.2.0","summary":"Pay-per-call utilities for AI agents. (1) Instant, slicer-accurate quotes for FDM 3D printing — give it a 3D model, get print time, material usage and a price. (2) Signed point-in-time URL attestations — a neutral third party records what a page returned, when.","operator":"Sunstone Soft","contact":"hello@fabtally.com","terms":"B2B only. Uploaded models are streamed to the slicer, never persisted, never used for training.","pricingModel":"This /agent lane is the PER-CALL x402 (USDC on Base) / prepaid-credit interface for agents, production and high volume. Personal & INTERACTIVE use (a human in Claude/ChatGPT Desktop via the FabTally MCP server, or the public quote path) is FREE with fair-use daily limits — real slice metrics, full DFM, orientation, printer/material/settings advisors, all at no charge. Only the G-code FILE download and preview PNG are paid. Higher volume or programmatic use: pay per call here, or buy prepaid credits at https://fabtally.com/buy.","bringYourOwnPricing":"POST /agent/v1/quote accepts OPTIONAL pricing overrides — material_cost_per_kg, machine_rate_per_hour, setup_fee, margin, markup_percent, minimum_price, currency. Omit them for the hobbyist default quote; pass your own costs/margins to price on your economics (business). Configuration is FREE — the per-call USDC price is unchanged. The response echoes a `pricing_basis` object showing which numbers were default vs custom.","payment":{"protocol":"x402","x402Version":2,"scheme":"exact","network":"eip155:8453","chainId":"eip155:8453","asset":"USDC","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","facilitator":"https://facilitator.payai.network"},"endpoints":[{"key":"overview","method":"GET","url":"https://fabtally.com/agent/overview","price":"free","description":"This document. Service description, pricing, and the live material profile list."},{"key":"quote","method":"POST","url":"https://fabtally.com/agent/v1/quote","price":"$0.005","priceUsdc":"5000","description":"Real FDM 3D-printing quote from a real slicer. Upload an STL/3MF/STEP and get print time, filament grams and a priced quote (material + machine time + setup, volume discounts). Runs a production slicing engine against calibrated machine profiles — not an estimate.","inputSchema":{"bodyType":"multipart","bodyFields":{"file":{"type":"string","description":"3D model file to quote (STL, 3MF, OBJ, STEP). Max 64 MB.","required":true},"material":{"type":"string","description":"Material/profile id. One of: pla, pla-cf, petg, petg-cf, abs, abs-cf, asa, asa-cf, nylon, pc, pet, tpu.","required":false},"quantity":{"type":"string","description":"Number of parts, 1-10000. Volume discounts apply automatically. Default 1.","required":false},"material_cost_per_kg":{"type":"string","required":false,"description":"Override the material $/kg with your real filament cost."},"machine_rate_per_hour":{"type":"string","required":false,"description":"Your machine time rate ($/hour). Default 2.00."},"setup_fee":{"type":"string","required":false,"description":"Per-job setup/handling fee. Default 1.50."},"margin":{"type":"string","required":false,"description":"Margin as a fraction on cost (0.30 = 30%). Default 0.30."},"markup_percent":{"type":"string","required":false,"description":"Extra % markup on top of margin (0 = none)."},"minimum_price":{"type":"string","required":false,"description":"Per-job price floor. Default 5.00."},"currency":{"type":"string","required":false,"description":"Currency label echoed back (e.g. USD, EUR, CAD). Default USD."}},"bringYourOwnPricing":"Optional. Omit every pricing field for the hobbyist default quote; pass your own costs/margins to price on YOUR economics. Config is free — the per-call USDC price is unchanged. The response echoes a `pricing_basis` object showing default-vs-custom per field."},"outputSchema":{"type":"object","properties":{"model":{"type":"string"},"material":{"type":"string"},"print_time_sec":{"type":"integer"},"print_time_human":{"type":"string"},"filament_g":{"type":"number"},"quote":{"type":"object","properties":{"currency":{"type":"string"},"unit":{"type":"object","properties":{"material_cost":{"type":"number"},"machine_cost":{"type":"number"},"setup_fee":{"type":"number"},"price":{"type":"number"}}},"quantity":{"type":"integer"},"quantity_discount":{"type":"number"},"total":{"type":"number"}}},"quoted_at":{"type":"string","format":"date-time"}},"example":{"model":"bracket.stl","material":"pla","print_time_sec":988,"print_time_human":"16m28s","filament_g":4.16,"quote":{"currency":"USD","unit":{"material_cost":0.1,"machine_cost":0.69,"setup_fee":1.5,"price":5},"quantity":1,"quantity_discount":0,"total":5},"quoted_at":"2026-07-30T16:40:00Z"}}},{"key":"attest-schema","method":"GET","url":"https://fabtally.com/agent/v1/attest/schema","price":"free","description":"Attestation input/output schema, limits, and the ed25519 public key used to verify signed attestations."},{"key":"attest","method":"POST","url":"https://fabtally.com/agent/v1/attest","price":"$0.01","priceUsdc":"10000","description":"Independent point-in-time observation of a public URL, signed with ed25519. Fetches the URL from a neutral third-party host and returns HTTP status, final URL after redirects, sha256 of the exact bytes received, size, and cache headers — plus your chosen check (exists / contains a string / content hash). Useful when an agent needs a durable, verifiable record that a page said something at a specific moment.","inputSchema":{"bodyType":"json","type":"object","required":["url","check"],"properties":{"url":{"type":"string","description":"Absolute http(s) URL to observe. Must resolve to a public IP address; private, loopback, link-local and other reserved ranges are refused at every redirect hop."},"check":{"type":"string","enum":["exists","contains","hash"],"description":"What to assert. \"exists\" → boolean, true when the fetch ended in a 2xx. \"contains\" → boolean, true when the response body contains `needle` (case-sensitive, UTF-8). \"hash\" → the sha256 hex of the body, or null when the fetch was not 2xx."},"needle":{"type":"string","description":"Substring to look for. Required when check=\"contains\", ignored otherwise. 1024 chars max."}},"example":{"url":"https://example.com/pricing","check":"contains","needle":"$49/mo"}},"outputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The URL as requested (normalized)."},"fetchedAt":{"type":"string","format":"date-time","description":"UTC ISO-8601 timestamp of the observation."},"check":{"type":"string","enum":["exists","contains","hash"]},"needle":{"type":["string","null"]},"httpStatus":{"type":["integer","null"],"description":"Status of the final hop; null if the fetch failed."},"finalUrl":{"type":["string","null"],"description":"URL after following redirects."},"redirects":{"type":"array","description":"Every redirect hop taken, in order.","items":{"type":"object","properties":{"from":{"type":"string"},"status":{"type":"integer"},"to":{"type":"string"}}}},"result":{"type":["boolean","string","null"],"description":"Boolean for exists/contains; sha256 hex string for hash; null if unobtainable."},"sha256":{"type":["string","null"],"description":"sha256 (hex) of the exact response bytes received."},"bodyBytes":{"type":["integer","null"]},"headersSubset":{"type":"object","properties":{"content-type":{"type":["string","null"]},"last-modified":{"type":["string","null"]},"etag":{"type":["string","null"]}}},"error":{"type":["object","null"],"description":"Set when the observation could not be completed as a 2xx fetch (DNS failure, timeout, blocked address, non-2xx status, oversized body). The attestation is still returned and still signed — 'the URL did not respond at time T' is itself an observation.","properties":{"code":{"type":"string"},"message":{"type":"string"}}},"attestor":{"type":"string","enum":["attest.fabtally.com/v0"]},"disclaimer":{"type":"string","enum":["point-in-time observation, not a legal attestation"]},"signature":{"type":"object","description":"ed25519 signature over the canonical JSON of this object with the `signature` field removed and keys serialized in the documented order. Verify with the public key from GET /agent/v1/attest/schema.","properties":{"alg":{"type":"string"},"keyId":{"type":"string"},"publicKeySpkiB64":{"type":"string"},"value":{"type":"string","description":"base64 signature"},"canonicalization":{"type":"string"}}}},"example":{"url":"https://example.com/pricing","fetchedAt":"2026-07-30T19:05:00.000Z","check":"contains","needle":"$49/mo","httpStatus":200,"finalUrl":"https://example.com/pricing","redirects":[],"result":true,"sha256":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","bodyBytes":18422,"headersSubset":{"content-type":"text/html; charset=utf-8","last-modified":null,"etag":"W/\"47f0-x\""},"error":null,"attestor":"attest.fabtally.com/v0","disclaimer":"point-in-time observation, not a legal attestation","signature":{"alg":"ed25519","keyId":"…","publicKeySpkiB64":"…","value":"…","canonicalization":"…"}}}},{"key":"analyze","method":"POST","url":"https://fabtally.com/agent/v1/analyze","price":"$0.002","priceUsdc":"2000","description":"Model geometry only (bounding box mm, volume cm³, triangle count, watertight, fits-on-bed) — no slice. Fast + cheap. Multipart: file (+ optional printer)."},{"key":"preview","method":"POST","url":"https://fabtally.com/agent/v1/preview","price":"$0.005","priceUsdc":"5000","description":"A base64 PNG render of the model — no slice. Multipart: file."},{"key":"slice","method":"POST","url":"https://fabtally.com/agent/v1/slice","price":"$0.005","priceUsdc":"5000","description":"Full slice on any of the supported printers: print time, filament g/m, layer count, model geometry + fits-on-bed. Multipart: file, printer, material, quality|layer_height, infill_percent, supports.","variants":[{"url":"https://fabtally.com/agent/v1/slice/preview","price":"$0.01","priceUsdc":"10000","adds":"preview PNG"},{"url":"https://fabtally.com/agent/v1/slice/gcode","price":"$0.015","priceUsdc":"15000","adds":"sliced g-code (gzip+base64)"},{"url":"https://fabtally.com/agent/v1/slice/full","price":"$0.02","priceUsdc":"20000","adds":"preview PNG + g-code"}]},{"key":"dfm-preview","method":"POST","url":"https://fabtally.com/agent/v1/dfm-preview","price":"free","description":"FREE teaser: geometry-only DFM (printable-so-far verdict, watertight, wall-thickness estimate, overhang heuristic) — no slice. See the exact support/material deltas by paying for POST /v1/dfm. Multipart: file (+ optional printer/material)."},{"key":"dfm","method":"POST","url":"https://fabtally.com/agent/v1/dfm","price":"$0.01","priceUsdc":"10000","description":"DFM / printability report: printable verdict (yes/with-warnings/no), watertight/manifold, wall-thickness estimate vs the 0.4 mm nozzle, overhang analysis, plus EXACT support-material and infill material-saving deltas from real slices. Every field labelled exact vs heuristic. Multipart: file, printer, material, quality|layer_height, infill_percent."},{"key":"orient","method":"POST","url":"https://fabtally.com/agent/v1/orient","price":"$0.02","priceUsdc":"20000","description":"Orientation optimiser: really slices up to 4 candidate orientations with automatic supports and recommends the one using the least support material (exact, slice-derived). Multipart: file, printer, material, quality|layer_height, infill_percent."}],"pricingTiers":{"dfm-preview":"free","analyze":"$0.002","quote":"$0.005","slice":"$0.005","slice+preview":"$0.01","dfm":"$0.01","slice+gcode":"$0.015","slice+preview+gcode":"$0.02","orient":"$0.02","preview":"$0.005","attest":"$0.01"},"machine":{"technology":"FDM","slicer":"production slicing engine","printers":"12 selectable — see the live `fleet` field below (Bambu A1/P1S/X1C, Prusa MK4/MINI, Creality Ender-3 V3/K1, Voron 2.4, Anycubic Kobra, Elegoo Neptune 4 Max). GET /agent/overview returns bed size + nozzle for each.","quality_presets":{"draft":"0.28mm","standard":"0.20mm","fine":"0.12mm"}},"materials":["abs","abs-cf","asa","asa-cf","nylon","pc","pet","petg","petg-cf","pla","pla-cf","tpu"],"materialCount":12,"fleet":[{"id":"elegoo-neptune4-max","name":"Elegoo Neptune 4 Max","bed":{"x":420,"y":420,"z":480},"nozzle_mm":0.4,"source_preset":"Elegoo Neptune 4 Max (0.4 nozzle)"},{"id":"bambu-a1","name":"Bambu Lab A1","bed":{"x":256,"y":256,"z":256},"nozzle_mm":0.4,"source_preset":"Bambu Lab A1 0.4 nozzle"},{"id":"bambu-a1-mini","name":"Bambu Lab A1 mini","bed":{"x":180,"y":180,"z":180},"nozzle_mm":0.4,"source_preset":"Bambu Lab A1 mini 0.4 nozzle"},{"id":"bambu-p1s","name":"Bambu Lab P1S","bed":{"x":256,"y":256,"z":250},"nozzle_mm":0.4,"source_preset":"Bambu Lab P1S 0.4 nozzle"},{"id":"bambu-x1c","name":"Bambu Lab X1 Carbon","bed":{"x":256,"y":256,"z":250},"nozzle_mm":0.4,"source_preset":"Bambu Lab X1 Carbon 0.4 nozzle"},{"id":"prusa-mk4","name":"Prusa MK4","bed":{"x":250,"y":210,"z":220},"nozzle_mm":0.4,"source_preset":"Prusa MK4 0.4 nozzle"},{"id":"prusa-mini","name":"Prusa MINI","bed":{"x":180,"y":180,"z":180},"nozzle_mm":0.4,"source_preset":"Prusa MINI 0.4 nozzle"},{"id":"ender3-v3","name":"Creality Ender-3 V3","bed":{"x":220,"y":220,"z":250},"nozzle_mm":0.4,"source_preset":"Creality Ender-3 V3 0.4 nozzle"},{"id":"creality-k1","name":"Creality K1","bed":{"x":220,"y":220,"z":250},"nozzle_mm":0.4,"source_preset":"Creality K1 (0.4 nozzle)"},{"id":"creality-k1-max","name":"Creality K1 Max","bed":{"x":300,"y":300,"z":300},"nozzle_mm":0.4,"source_preset":"Creality K1 Max (0.4 nozzle)"},{"id":"voron-24-350","name":"Voron 2.4 350","bed":{"x":350,"y":350,"z":325},"nozzle_mm":0.4,"source_preset":"Voron 2.4 350 0.4 nozzle"},{"id":"anycubic-kobra2","name":"Anycubic Kobra 2","bed":{"x":220,"y":220,"z":250},"nozzle_mm":0.4,"source_preset":"Anycubic Kobra 2 0.4 nozzle"}],"printerCount":12,"upstream":"ok","cacheAgeSec":0,"fetchedAt":"2026-08-03T09:40:22.249Z"}