{
  "name": "ModelDirectory.org",
  "summary": "A directory of 3D printable models with stored files, not just links. Most files carry a SHA-256 fingerprint, more than 275,000 also carry a geometric shape fingerprint used for duplicate detection, and creators can anchor the file fingerprint on-chain so the record is permanent. Anyone can check it.",
  "url": "https://modeldirectory.org",
  "contact": "https://modeldirectory.org/contact.html",
  "llms_txt": "https://modeldirectory.org/llms.txt",
  "openapi": "https://modeldirectory.org/api/openapi.json",
  "human_docs": "https://modeldirectory.org/provenance.html",
  "catalog": {
    "formats": [
      "STL",
      "OBJ",
      "STEP",
      "3MF"
    ],
    "sources": [
      "Printables",
      "Thingiverse",
      "MyMiniFactory",
      "Sketchfab",
      "direct creator upload"
    ]
  },
  "authentication": "None of the endpoints below need a key or a login. They return the same data the site itself shows for published models.",
  "usage": "Please be considerate. Space out heavy crawls, cache the sitemap, and pull a single model by id rather than scraping pages.",
  "endpoints": [
    {
      "method": "GET",
      "path": "/api/health",
      "auth": false,
      "returns": "Service health and load."
    },
    {
      "method": "GET",
      "path": "/api/status",
      "auth": false,
      "returns": "Database, payment, and email service status."
    },
    {
      "method": "GET",
      "path": "/api/models/stats",
      "auth": false,
      "returns": "Catalog totals: models, fingerprinted count, on-chain count, creators."
    },
    {
      "method": "GET",
      "path": "/api/models/",
      "auth": false,
      "returns": "Browse and search published models. Supports query parameters."
    },
    {
      "method": "GET",
      "path": "/api/search",
      "auth": false,
      "returns": "Relevance search (q required): weighted full-text + typo-tolerant fuzzy + synonyms. Returns results, an exact total, and facet counts (platform/category/format/difficulty). Params: q, platform, category, format, scope, difficulty, sort (best|most-downloaded|most-liked|new), limit, page."
    },
    {
      "method": "GET",
      "path": "/api/suggest",
      "auth": false,
      "returns": "Autocomplete suggestions for a partial query (q, ≥2 chars). Typo-tolerant."
    },
    {
      "method": "GET",
      "path": "/api/models/{id}",
      "auth": false,
      "returns": "One published model as JSON, including any confirmed on-chain anchors."
    },
    {
      "method": "GET",
      "path": "/api/models/verify?hash={sha256}",
      "auth": false,
      "returns": "Looks up a SHA-256 fingerprint in the registry and reports whether it is on-chain."
    },
    {
      "method": "GET",
      "path": "/api/models/{id}/proof",
      "auth": false,
      "returns": "Blockchain proof for a published model, checked live against the chain."
    },
    {
      "method": "GET",
      "path": "/api/models/{id}/certificate",
      "auth": false,
      "returns": "Signed certificate plus any on-chain proof for a published model."
    },
    {
      "method": "GET",
      "path": "/api/models/{id}/verify-ots",
      "auth": false,
      "returns": "Live-checked Bitcoin OpenTimestamps proof, including ots_proof_url, a direct download of the raw .ots file for independent offline verification."
    },
    {
      "method": "GET",
      "path": "/api/creators/",
      "auth": false,
      "returns": "List of creators."
    },
    {
      "method": "GET",
      "path": "/api/creators/{name}",
      "auth": false,
      "returns": "A creator profile and their published models."
    },
    {
      "method": "GET",
      "path": "/api/leaderboard/",
      "auth": false,
      "returns": "Public leaderboard."
    },
    {
      "method": "GET",
      "path": "/api/blockchain/status",
      "auth": false,
      "returns": "On-chain stamping worker status and contract address."
    }
  ],
  "verification": {
    "fingerprint": "Every file we register gets a SHA-256 hash. You can recompute it yourself and compare.",
    "shape_fingerprint": "More than 275,000 models also carry a 128-dimension geometric fingerprint sampled from the model surface. It recognizes the same shape across re-exports and re-meshes, where a file hash breaks. We use it internally for duplicate detection across the catalog; there is no public similarity endpoint yet.",
    "check_a_file": "https://modeldirectory.org/verify.html computes the hash in your browser and looks it up. No upload of the file leaves your machine.",
    "polygon": "Live. A fast, public transaction. When a fingerprint is stamped, the transaction is on Polygon and verifiable on PolygonScan. Registry contract: 0x687F2e6F96288Ac58fe22E2Eb000D1a628aEEB65 (also returned by /api/blockchain/status).",
    "bitcoin_opentimestamps": "Live. Fingerprints are also anchored on Bitcoin through OpenTimestamps for the most durable proof. Check one at /verify-ots.html.",
    "rule": "Treat a model as anchored only when its /proof or /certificate endpoint returns a confirmed transaction."
  },
  "sitemaps": [
    "https://modeldirectory.org/sitemap-index.xml",
    "https://modeldirectory.org/sitemap.xml"
  ],
  "open_source": {
    "verifier": "https://github.com/ModelDirectory/verify"
  },
  "first_aired": {
    "page": "https://modeldirectory.org/first-aired.html",
    "api": "https://modeldirectory.org/api/first-aired?hash={sha256}",
    "note": "byte-identical matches across indexed platforms plus partner-registered publications"
  },
  "partners": {
    "page": "https://modeldirectory.org/partners.html",
    "summary": "platforms register upload hashes at publish time; independent anchoring on Polygon and Bitcoin; public badge per hash"
  }
}
