{"x402Version":2,"name":"FabTally Agent API","description":"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.","contact":"hello@fabtally.com","discovery":"https://fabtally.com/agent/overview","resources":[{"resource":"https://fabtally.com/agent/v1/quote","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/quote","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.","mimeType":"application/json","maxTimeoutSeconds":300}],"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"}}},{"resource":"https://fabtally.com/agent/v1/attest","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/attest","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.","mimeType":"application/json","maxTimeoutSeconds":60}],"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":"…"}}}},{"resource":"https://fabtally.com/agent/v1/analyze","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/analyze","description":"Model geometry only (bbox, volume, triangles, watertight, fits-on-bed) — no slice.","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/preview","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/preview","description":"Base64 PNG render of the model — no slice.","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/slice","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/slice","description":"Full slice: print time, filament, layers, geometry + fits-on-bed.","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/slice/preview","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/slice/preview","description":"Slice + preview PNG.","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/slice/gcode","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"15000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/slice/gcode","description":"Slice + sliced g-code (gzip+base64).","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/slice/full","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"20000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/slice/full","description":"Slice + preview + g-code.","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/dfm","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/dfm","description":"DFM / printability report: verdict + watertight + wall-thickness + overhangs + exact support/material slice deltas.","mimeType":"application/json","maxTimeoutSeconds":300}]},{"resource":"https://fabtally.com/agent/v1/orient","type":"http","method":"POST","x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","amount":"20000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","payTo":"0xccB5d25C698FdfdaA7B21d54088774cF512A90e3","resource":"https://fabtally.com/agent/v1/orient","description":"Orientation optimiser: slices up to 4 orientations, recommends the least-support one.","mimeType":"application/json","maxTimeoutSeconds":300}]}],"lastUpdated":"2026-09-13T14:22:38.938Z"}