{
  "data": {
    "similar": [
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/adam-cad.json",
        "name": "Adam",
        "score": 59.4,
        "shared": null,
        "slug": "adam-cad"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/zoo.json",
        "name": "Zoo",
        "score": 58.7,
        "shared": null,
        "slug": "zoo"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/onshape.json",
        "name": "Onshape",
        "score": 55.7,
        "shared": null,
        "slug": "onshape"
      },
      {
        "grade": "E",
        "json": "https://www.anchorterminal.com/tools/autodesk-platform-services.json",
        "name": "Autodesk Platform Services",
        "score": 44.3,
        "shared": null,
        "slug": "autodesk-platform-services"
      },
      {
        "grade": "E",
        "json": "https://www.anchorterminal.com/tools/simscale.json",
        "name": "SimScale",
        "score": 41,
        "shared": null,
        "slug": "simscale"
      },
      {
        "grade": "E",
        "json": "https://www.anchorterminal.com/tools/ntop.json",
        "name": "nTop",
        "score": 40.2,
        "shared": null,
        "slug": "ntop"
      }
    ],
    "tool": {
      "slug": "prusalink",
      "name": "PrusaLink",
      "vendor": "Prusa Research a.s.",
      "vendorUrl": "https://www.prusa3d.com",
      "kind": "http-api",
      "category": "cad",
      "summary": "PrusaLink is Prusa Research's local web interface and HTTP API for Original Prusa 3D printers, built into current models or run on a Raspberry Pi. It reports status, uploads files and starts, pauses and stops prints over the local network.",
      "url": "https://www.anchorterminal.com/tools/prusalink",
      "markdownUrl": "https://www.anchorterminal.com/tools/prusalink.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/prusalink.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/prusalink.json",
      "dns": "prusalink.grade.anchorterminal.com",
      "repo": "https://github.com/prusa3d/Prusa-Link",
      "license": "The Prusa-Link Python package declares its licence as Freeware in setup.py and ships no licence file. The Prusa-Link-Web interface is GPL-3.0, and its OpenAPI spec names AGPLv3. The firmware editions are part of Prusa's printer firmware.",
      "transports": [],
      "packages": [
        {
          "registry": "pypi",
          "name": "PrusaLink"
        }
      ],
      "auth": "mixed",
      "authNotes": "On a Buddy-firmware printer (CORE One, MK4/S, MK3.9, MK3.5, XL, MINI/+) the printer shows a username and password under Settings \u003e Network \u003e PrusaLink, and the OpenAPI spec declares HTTP digest authentication on every operation. On the Raspberry Pi edition for the MK3/S/+ and MK2.5/S, one API key is set or reset in PrusaLink's settings and sent as X-Api-Key; keys are trimmed of whitespace since the unreleased 0.9.0 change. One credential per printer, with no scopes or read-only mode.",
      "pricing": "free",
      "pricingNotes": "The software is free and ships in the printer firmware or as a free Raspberry Pi image and PyPI package. It needs an Original Prusa printer, and the Pi edition a Raspberry Pi Zero 2 W, Zero W, 3, 4 or 5. Prusa Connect, the cloud service PrusaLink can register with, is free for Prusa owners with 1 GB of storage, per the help centre.",
      "priceSummary": "Free",
      "where": "local",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the OpenAPI spec, the repository or the help centre (checked 3 November 2026). Nothing is sold through the API.",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 219,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-11-03"
      },
      "docsUrl": "https://github.com/prusa3d/Prusa-Link-Web/blob/master/spec/openapi.yaml",
      "openapi": "https://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml",
      "capabilities": [
        "cad.print"
      ],
      "tags": [
        "local",
        "official",
        "openapi",
        "api-key",
        "free",
        "python",
        "self-hosted",
        "hardware",
        "eu"
      ],
      "lastRelease": "2024-07-02",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 49.4,
        "grade": "D",
        "agentReady": false,
        "rank": 1036,
        "ranked": true,
        "rankOf": 1349,
        "categoryRank": 4,
        "methodology": "0.7",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 48,
          "maintenance": 17,
          "payments": 60,
          "reliability": 55,
          "schema": 60,
          "security": 36,
          "transparency": 64
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "breakdown": [
          {
            "key": "reliability",
            "name": "Reliability",
            "weight": 16,
            "effectiveWeight": 20,
            "score": 55,
            "points": 11,
            "reason": "Read with the local-software lines, as software the owner runs on the printer or a Raspberry Pi. The Pi edition installs from the PrusaLink package on PyPI or a Raspberry Pi OS image, with supported Pi models and printer firmware 3.14.0 stated in the release notes, and the firmware editions ship with the printer; the PyPI page answered a script challenge and was not read (17 of 20). A python-tests.yml workflow and four test modules are in the repository, and a CI fix was committed on 9 October 2026, but no run result was read (15 of 25). 102 open issues on 3 November 2026; the newest 25 run from August 2024 to May 2026, include print failures, parse errors and a Pi that stops after reboot, and show no maintainer reply (8 of 25). The ChangeLog marks the 0.7.1rc1 rename of ro to read_only as a breaking API change and records API version bumps, but there is no stated versioning rule (10 of 15). The Pi edition is 0.8.1 and the spec is 1.0.0-draft, though both have shipped to customers for years (5 of 15). 17 + 15 + 8 + 10 + 5 = 55.",
            "checked": "2026-11-03"
          },
          {
            "key": "performance",
            "name": "Performance",
            "weight": 10,
            "effectiveWeight": 0,
            "pending": true,
            "points": 0,
            "reason": "Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes."
          },
          {
            "key": "schema",
            "name": "Schema \u0026 documentation",
            "weight": 13,
            "effectiveWeight": 16.25,
            "score": 60,
            "points": 9.75,
            "reason": "OpenAPI 3.0.1 in the Prusa-Link-Web repository covering 19 paths and 33 operations, marked 1.0.0-draft, last changed 18 July 2024, with malformed 204 lines and keys containing spaces (20 of 25). No llms.txt or Markdown docs for agents (0). One-line summaries per operation and no guidance on when to use or avoid one (8 of 20). Enums for printer, job, storage, transfer and file types, required fields on response schemas, and ?0 or ?1 header switches; request bodies are binary or empty (11 of 15). Error responses listed per operation with an Error schema of title and text, and few request examples (9 of 15). /api/v1 paths, GET /api/version, and a dated ChangeLog in the Pi repository (12 of 15). 20 + 0 + 8 + 11 + 9 + 12 = 60.",
            "checked": "2026-11-03"
          },
          {
            "key": "ergonomics",
            "name": "Agent ergonomics",
            "weight": 13,
            "effectiveWeight": 16.25,
            "score": 48,
            "points": 7.8,
            "reason": "Read as an API. Responses are small telemetry and file objects, but a status call returns everything with no field selection (15 of 25). File listings are flat with no paging, filter or size control (5 of 20). Documented 401, 404, 409, 408 and 503 responses with a title and text an agent can read, though 409 does not say which state blocked the call (12 of 20). Pause, resume and upload are PUT, Overwrite guards uploads and Force guards folder deletes, but there is no idempotency key and a repeated POST to start a print depends on the printer's state (10 of 20). Few parameters and sensible defaults, no official SDK in any language (6 of 15). 15 + 5 + 12 + 10 + 6 = 48.",
            "checked": "2026-11-03"
          },
          {
            "key": "security",
            "name": "Security \u0026 auth",
            "weight": 14,
            "effectiveWeight": 17.5,
            "score": 36,
            "points": 6.3,
            "reason": "One credential per printer, a digest username and password shown on a Buddy printer's screen or one API key on the Pi edition, resettable but without scopes or expiry; digest keeps the secret out of the request (12 of 30). No read-only mode and no confirmation before a stop, a delete or a firmware update (2 of 20). The API returns the owner's own file names and telemetry, so little untrusted content (10). No audit log or per-call visibility documented (2 of 15). Prusa's security.txt is valid to 1 June 2027 with a policy page that rewards reports and answers within 5 working days; no bug bounty amounts, SOC 2 or ISO 27001, and the policy covers websites rather than printers by name (10 of 20). 12 + 2 + 10 + 2 + 10 = 36.",
            "checked": "2026-11-03"
          },
          {
            "key": "payments",
            "name": "Payments \u0026 pricing",
            "weight": 10,
            "effectiveWeight": 12.5,
            "score": 60,
            "points": 7.5,
            "reason": "Read with the self-hosted rule. No payment protocol (0). The software is free with nothing to buy, so 20, 20 and 20 on the last three lines. It needs an Original Prusa printer, and the Pi edition a Raspberry Pi, which are hardware the owner already has.",
            "checked": "2026-11-03"
          },
          {
            "key": "tasks",
            "name": "Task success",
            "weight": 10,
            "effectiveWeight": 0,
            "pending": true,
            "points": 0,
            "reason": "Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored."
          },
          {
            "key": "maintenance",
            "name": "Maintenance \u0026 community",
            "weight": 7,
            "effectiveWeight": 8.75,
            "score": 17,
            "points": 1.49,
            "reason": "The Pi edition's last release is 0.8.1 of 2 July 2024, more than 180 days ago; commits on 14 and 17 October and 2 and 3 November 2026 bump the version to 0.9.0.dev0 and fix the multi-instance image without a release (5 of 30). No release in the last 90 days (0). Of the newest 25 open issues, those from 2025 and 2026 have 0 to 9 comments and none shows a maintainer reply; the forum and help centre answer owners (5 of 25). No official SDK; PrusaSlicer is a client (0 of 15). CI workflow, ruff and dependabot bumps as recent as 2 November 2026 (7 of 10). 5 + 0 + 5 + 0 + 7 = 17.",
            "checked": "2026-11-03"
          },
          {
            "key": "transparency",
            "name": "Transparency \u0026 trust",
            "weight": 7,
            "effectiveWeight": 8.75,
            "score": 64,
            "points": 5.6,
            "note": "editorial 44, provenance 83",
            "reason": "Source for the Pi edition and the web interface is public, but setup.py declares Freeware with no licence file, the web interface is GPL-3.0 and the spec names AGPLv3, so the licence of the Python edition is unclear (15 of 30). Local software whose data stays on the printer unless registered with Prusa Connect; Prusa's privacy policy of 1 August 2022 gives retention periods per service and names processors and group companies, but says nothing about PrusaLink itself (15 of 30). The ChangeLog flags one breaking change and the website terms promise 30 days' notice for service changes, with no API deprecation policy (6 of 20). Telemetry goes to Prusa Connect only when the owner registers the printer, which the wizard makes optional, and no separate telemetry disclosure was found (8 of 20). 15 + 15 + 6 + 8 = 44.",
            "checked": "2026-11-03"
          }
        ],
        "assessment": {
          "date": "2026-11-03",
          "basis": "public evidence",
          "confidence": "medium",
          "notes": {
            "ergonomics": "Read as an API. Responses are small telemetry and file objects, but a status call returns everything with no field selection (15 of 25). File listings are flat with no paging, filter or size control (5 of 20). Documented 401, 404, 409, 408 and 503 responses with a title and text an agent can read, though 409 does not say which state blocked the call (12 of 20). Pause, resume and upload are PUT, Overwrite guards uploads and Force guards folder deletes, but there is no idempotency key and a repeated POST to start a print depends on the printer's state (10 of 20). Few parameters and sensible defaults, no official SDK in any language (6 of 15). 15 + 5 + 12 + 10 + 6 = 48.",
            "maintenance": "The Pi edition's last release is 0.8.1 of 2 July 2024, more than 180 days ago; commits on 14 and 17 October and 2 and 3 November 2026 bump the version to 0.9.0.dev0 and fix the multi-instance image without a release (5 of 30). No release in the last 90 days (0). Of the newest 25 open issues, those from 2025 and 2026 have 0 to 9 comments and none shows a maintainer reply; the forum and help centre answer owners (5 of 25). No official SDK; PrusaSlicer is a client (0 of 15). CI workflow, ruff and dependabot bumps as recent as 2 November 2026 (7 of 10). 5 + 0 + 5 + 0 + 7 = 17.",
            "payments": "Read with the self-hosted rule. No payment protocol (0). The software is free with nothing to buy, so 20, 20 and 20 on the last three lines. It needs an Original Prusa printer, and the Pi edition a Raspberry Pi, which are hardware the owner already has.",
            "reliability": "Read with the local-software lines, as software the owner runs on the printer or a Raspberry Pi. The Pi edition installs from the PrusaLink package on PyPI or a Raspberry Pi OS image, with supported Pi models and printer firmware 3.14.0 stated in the release notes, and the firmware editions ship with the printer; the PyPI page answered a script challenge and was not read (17 of 20). A python-tests.yml workflow and four test modules are in the repository, and a CI fix was committed on 9 October 2026, but no run result was read (15 of 25). 102 open issues on 3 November 2026; the newest 25 run from August 2024 to May 2026, include print failures, parse errors and a Pi that stops after reboot, and show no maintainer reply (8 of 25). The ChangeLog marks the 0.7.1rc1 rename of ro to read_only as a breaking API change and records API version bumps, but there is no stated versioning rule (10 of 15). The Pi edition is 0.8.1 and the spec is 1.0.0-draft, though both have shipped to customers for years (5 of 15). 17 + 15 + 8 + 10 + 5 = 55.",
            "schema": "OpenAPI 3.0.1 in the Prusa-Link-Web repository covering 19 paths and 33 operations, marked 1.0.0-draft, last changed 18 July 2024, with malformed 204 lines and keys containing spaces (20 of 25). No llms.txt or Markdown docs for agents (0). One-line summaries per operation and no guidance on when to use or avoid one (8 of 20). Enums for printer, job, storage, transfer and file types, required fields on response schemas, and ?0 or ?1 header switches; request bodies are binary or empty (11 of 15). Error responses listed per operation with an Error schema of title and text, and few request examples (9 of 15). /api/v1 paths, GET /api/version, and a dated ChangeLog in the Pi repository (12 of 15). 20 + 0 + 8 + 11 + 9 + 12 = 60.",
            "security": "One credential per printer, a digest username and password shown on a Buddy printer's screen or one API key on the Pi edition, resettable but without scopes or expiry; digest keeps the secret out of the request (12 of 30). No read-only mode and no confirmation before a stop, a delete or a firmware update (2 of 20). The API returns the owner's own file names and telemetry, so little untrusted content (10). No audit log or per-call visibility documented (2 of 15). Prusa's security.txt is valid to 1 June 2027 with a policy page that rewards reports and answers within 5 working days; no bug bounty amounts, SOC 2 or ISO 27001, and the policy covers websites rather than printers by name (10 of 20). 12 + 2 + 10 + 2 + 10 = 36.",
            "transparency": "Source for the Pi edition and the web interface is public, but setup.py declares Freeware with no licence file, the web interface is GPL-3.0 and the spec names AGPLv3, so the licence of the Python edition is unclear (15 of 30). Local software whose data stays on the printer unless registered with Prusa Connect; Prusa's privacy policy of 1 August 2022 gives retention periods per service and names processors and group companies, but says nothing about PrusaLink itself (15 of 30). The ChangeLog flags one breaking change and the website terms promise 30 days' notice for service changes, with no API deprecation policy (6 of 20). Telemetry goes to Prusa Connect only when the owner registers the printer, which the wizard makes optional, and no separate telemetry disclosure was found (8 of 20). 15 + 15 + 6 + 8 = 44."
          },
          "sources": [
            {
              "what": "OpenAPI spec",
              "url": "https://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link repository, shallow clone (ChangeLog, setup.py, CI, tests)",
              "url": "https://github.com/prusa3d/Prusa-Link",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link-Web repository, shallow clone (LICENSE, spec history)",
              "url": "https://github.com/prusa3d/Prusa-Link-Web",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link README",
              "url": "https://github.com/prusa3d/Prusa-Link/blob/master/README.md",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link releases",
              "url": "https://api.github.com/repos/prusa3d/Prusa-Link/releases",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link commits",
              "url": "https://api.github.com/repos/prusa3d/Prusa-Link/commits",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link repository metadata",
              "url": "https://api.github.com/repos/prusa3d/Prusa-Link",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa-Link open issues",
              "url": "https://github.com/prusa3d/Prusa-Link/issues",
              "seen": "2026-11-03"
            },
            {
              "what": "Prusa Connect and PrusaLink explained",
              "url": "https://help.prusa3d.com/article/prusa-connect-and-prusalink-explained_302608",
              "seen": "2026-11-03"
            },
            {
              "what": "Wi-Fi and Prusa Connect/Link setup guide (PDF of 13 May 2026)",
              "url": "https://help.prusa3d.com/wp-content/uploads/generated/prusa-connect-prusalink_1636_guide_413293_en_2026-05-13.pdf",
              "seen": "2026-11-03"
            },
            {
              "what": "about us",
              "url": "https://www.prusa3d.com/page/about-us_77/",
              "seen": "2026-11-03"
            },
            {
              "what": "website terms",
              "url": "https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226",
              "seen": "2026-11-03"
            },
            {
              "what": "privacy policy",
              "url": "https://www.prusa3d.com/page/privacy-policy_231258/",
              "seen": "2026-11-03"
            },
            {
              "what": "security.txt",
              "url": "https://www.prusa3d.com/.well-known/security.txt",
              "seen": "2026-11-03"
            },
            {
              "what": "security policy",
              "url": "https://www.prusa3d.com/page/security-policy_230500/",
              "seen": "2026-11-03"
            },
            {
              "what": "robots.txt",
              "url": "https://help.prusa3d.com/robots.txt",
              "seen": "2026-11-03"
            },
            {
              "what": "RDAP for prusa3d.com",
              "url": "https://rdap.verisign.com/com/v1/domain/prusa3d.com",
              "seen": "2026-11-03"
            }
          ],
          "openQuestions": [
            "unchecked: the PyPI release list for PrusaLink (pypi.org answered the project page with a script challenge, and its JSON endpoint is disallowed by robots.txt). Release dates come from GitHub releases and the ChangeLog",
            "unchecked: the result of the python-tests.yml workflow on the default branch, and the Buddy firmware's own PrusaLink implementation (prusa3d/Prusa-Firmware-Buddy was not read), including whether an API key still works beside digest on current firmware",
            "unchecked: the Prusa Connect terms and conditions, which the website terms name as governing PrusaLink and Prusa Connect; their URL was not found on the pages read",
            "firstReleased is 23 November 2020, the ChangeLog's oldest dated entry (0.1.2). The repository was created on 1 June 2020",
            "Judgement call on the licence. setup.py declares Freeware and the repository has no licence file, while Prusa-Link-Web is GPL-3.0 and the spec names AGPLv3, so transparency scores the Python edition as unclear rather than open source",
            "Judgement call on the surface. One listing covers the firmware editions and the Pi edition, since both answer the same /api/v1 spec; the Pi edition's ChangeLog says its API version tracks the one xBuddy reports",
            "Prusa's website terms forbid automated extraction of website content including scraping, recorded as a fact; the help centre asks for 10 seconds between requests, which was kept"
          ]
        },
        "negative": 0,
        "verdict": "An agent on the same network can read printer status, upload G-code and start, pause or stop a print through a documented OpenAPI surface with one credential per printer. The spec is a 2024 draft, the Pi edition's last release is July 2024 with 102 open issues, and there is no read-only mode, pagination or SDK.",
        "bestFor": "An agent on the owner's network that queues and watches prints on an Original Prusa printer.",
        "strengths": [
          "OpenAPI 3.0.1 spec with enums for printer and job states and documented 401, 404 and 409 responses on most operations",
          "Free, local and offline; the printer needs no cloud account, and the API answers on the printer's own address",
          "Shipped in the firmware of every current Original Prusa printer, with a Raspberry Pi edition for the MK3 and MK2.5",
          "Prusa publishes a valid security.txt and a disclosure policy that rewards reports",
          "Source of the Pi edition and the web interface on GitHub, with CI and dependabot updates"
        ],
        "weaknesses": [
          "One credential per printer, a digest password or an API key, with no scopes, read-only mode or confirmation before a stop or delete",
          "The Pi edition's last release is 0.8.1 of 2 July 2024, and the spec is marked 1.0.0-draft with malformed YAML lines",
          "102 open issues with no visible maintainer reply in the newest 25, and no official SDK",
          "No pagination, filtering or output-size control on file listings, and no idempotency keys",
          "The Python package's licence is declared as Freeware with no licence file, while the web interface is GPL-3.0"
        ],
        "agentNotes": [
          "Reach the printer by its local address only; use HTTP digest with the username and password from Settings \u003e Network \u003e PrusaLink on a Buddy printer, or X-Api-Key on the Pi edition",
          "Check GET /api/v1/status before any change and expect 409 when the printer is busy; a stop or delete has no confirmation step",
          "Upload with PUT /api/v1/files/{storage}/{path}, set Print-After-Upload to ?1 to start at once, and send Overwrite ?1 only when replacing a file on purpose",
          "Read GET /api/version first, since the Pi edition and the firmware editions report different API versions and the Pi edition lacks Buddy-only fields",
          "Expect no rate limits or retry guidance; poll status at a modest interval rather than on every turn"
        ],
        "metrics": {
          "kind": "local",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "D",
            "methodology": "0.7",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 49.4
          }
        ],
        "editorialScores": {
          "ergonomics": 48,
          "maintenance": 17,
          "payments": 60,
          "reliability": 55,
          "schema": 60,
          "security": 36,
          "transparency": 44
        },
        "provenanceScore": 83,
        "checked": {
          "categories": {
            "ergonomics": "2026-11-03",
            "maintenance": "2026-11-03",
            "payments": "2026-11-03",
            "reliability": "2026-11-03",
            "schema": "2026-11-03",
            "security": "2026-11-03",
            "transparency": "2026-11-03"
          },
          "last": "2026-11-03",
          "oldest": "2026-11-03",
          "stale": false,
          "staleAfterDays": 90
        },
        "scoreHistory": [
          {
            "date": "2026-11-03",
            "grade": "D",
            "kind": "listed",
            "method": "0.7",
            "score": 49.4
          }
        ]
      },
      "connect": {
        "install": "pip install PrusaLink",
        "http": "curl --digest -u \"$PRUSALINK_USER:$PRUSALINK_PASSWORD\" http://\u003cprinter-ip\u003e/api/v1/status"
      },
      "letme": {
        "capability": "https://letme.dev/cad.print",
        "tool": "https://letme.dev/prusalink"
      },
      "notable": [
        "OpenAPI 3.0.1 spec titled PrusaLink Web, version 1.0.0-draft, with 19 paths and 33 operations under /api/v1 for info, status, job, storage, transfer, files, cameras and update, last changed on 18 July 2024 (https://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml)",
        "Built into CORE One, XL, MK4/S, MK3.9, MK3.5, SL1 and SL1S firmware; the MINI/+ needs its Wi-Fi module, the MK3/S/+ a Raspberry Pi Zero over GPIO or a Pi 3, 4 or 5 over USB, and the MK2.5/S a Pi over USB. xBuddy printers need firmware 6.4.0 or newer (https://help.prusa3d.com/article/prusa-connect-and-prusalink-explained_302608)",
        "A print is started with POST /api/v1/files/{storage}/{path} and a file uploaded with PUT and the Print-After-Upload and Overwrite headers; jobs are paused, resumed and stopped by id, with 409 when the printer is busy (https://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml)",
        "The Pi edition's last release is 0.8.1 of 2 July 2024; the ChangeLog has an unreleased 0.9.0 and the repository was committed to on 17 October and 3 November 2026 (https://github.com/prusa3d/Prusa-Link/releases)",
        "102 open issues on 3 November 2026, the newest 25 opened between August 2024 and May 2026 with no visible maintainer reply (https://github.com/prusa3d/Prusa-Link/issues)",
        "Prusa's security.txt names security@prusa3d.com with a policy page that promises a reply within 5 working days and a reward for relevant reports, valid to 1 June 2027 (https://www.prusa3d.com/.well-known/security.txt)",
        "Prusa's website terms of 20 April 2026 forbid automated extraction of website content including scraping, and name PrusaLink and Prusa Connect as services under separate Prusa Connect terms (https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226)"
      ],
      "area": "design-diagrams",
      "details": [
        {
          "label": "Surface listed",
          "value": "The local HTTP API under /api/v1 as described by the OpenAPI spec in prusa3d/Prusa-Link-Web, the prusa3d/Prusa-Link Python edition (clones of both repositories), the PrusaLink and Prusa Connect help articles and guide, and Prusa Research's legal and security pages, read on 3 November 2026. No printer was called"
        },
        {
          "label": "Editions",
          "value": "A firmware edition on Buddy and xBuddy printers (CORE One, MK4/S, MK3.9, MK3.5, XL, MINI/+) and SL1 and SL1S, and a Python edition for a Raspberry Pi attached to an MK3/S/+ or MK2.5/S. The Pi edition's ChangeLog bumps its API version to match the one xBuddy reports"
        },
        {
          "label": "Endpoints",
          "value": "GET /api/version, /api/v1/info, /api/v1/status, /api/v1/job, /api/v1/storage, /api/v1/transfer; DELETE job and transfer by id; PUT job pause, resume and continue; GET, PUT, POST, HEAD and DELETE on /api/v1/files/{storage}/{path}; camera list, snapshot, config and Connect registration; GET and POST /api/v1/update/{env}"
        },
        {
          "label": "Enums",
          "value": "Printer state IDLE, BUSY, PRINTING, PAUSED, FINISHED, STOPPED, ERROR, ATTENTION, READY; job state PRINTING, PAUSED, FINISHED, STOPPED, ERROR; storage LOCAL, SDCARD, USB; print file printer_model MK3, MK3S, MINI"
        },
        {
          "label": "Prusa Connect",
          "value": "PrusaLink can register the printer with connect.prusa3d.com, Prusa's cloud service, which has its own terms and a camera API. Prusa Connect is not graded here"
        },
        {
          "label": "Clients",
          "value": "PrusaSlicer sends files to PrusaLink by DNS service discovery and the API, per the help centre. No official SDK; third-party libraries exist"
        },
        {
          "label": "Legal entity",
          "value": "Prusa Research a.s., Partyzánská 188/7a, 170 00 Prague 7, Czech Republic, Id. No. 06649114, named in the website terms, the privacy policy and the about page"
        }
      ],
      "provenance": {
        "legalEntity": "Prusa Research a.s.",
        "domain": "prusa3d.com",
        "domainRegistered": "2013-10-30",
        "endpointOnVendorDomain": null,
        "terms": "https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226",
        "privacy": "https://www.prusa3d.com/page/privacy-policy_231258/",
        "statusPage": "",
        "changelog": "https://github.com/prusa3d/Prusa-Link/blob/master/ChangeLog",
        "securityTxt": "valid",
        "checked": "2026-11-03",
        "notes": [
          "The general terms and conditions of use of the Prusa websites apply from 20 April 2026 and name Prusa Research a.s. Article 9.1 forbids manual or automated extraction of website content including scraping, recorded as a fact; the GitHub repositories and the help centre were read, and help.prusa3d.com's robots.txt asks for 10 seconds between requests, which was kept.",
          "The privacy policy is in effect from 1 August 2022 with retention periods by service and a list of processors and group companies.",
          "www.prusa3d.com/.well-known/security.txt names security@prusa3d.com, expires 1 June 2027 and links the security policy page.",
          "status.prusa3d.com exists for Prusa's online services; it is not recorded for PrusaLink, which runs on the printer.",
          "RDAP gives prusa3d.com a registration date of 30 October 2013.",
          "pypi.org answered the PrusaLink project page with a script challenge, so the PyPI release list was not read."
        ],
        "score": 83,
        "checks": [
          {
            "check": "Legal entity named",
            "value": "Prusa Research a.s.",
            "points": 20,
            "max": 20,
            "state": "ok"
          },
          {
            "check": "Domain age",
            "value": "prusa3d.com, registered 2013-10-30 (13 years)",
            "points": 15,
            "max": 15,
            "state": "ok"
          },
          {
            "check": "Endpoint on the vendor's domain",
            "value": "no hosted endpoint",
            "points": 0,
            "max": 0,
            "state": "na"
          },
          {
            "check": "Terms of service",
            "value": "read, states 6 of the 7 things a reader expects, and has 1 clause that costs points",
            "points": 7.1,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Privacy policy",
            "value": "read, states 5 of the 8 things a reader expects",
            "points": 7.8,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Status page",
            "value": "not found",
            "points": 0,
            "max": 10,
            "state": "no"
          },
          {
            "check": "Changelog",
            "value": "published",
            "points": 10,
            "max": 10,
            "state": "ok"
          },
          {
            "check": "security.txt",
            "value": "valid",
            "points": 10,
            "max": 10,
            "state": "ok"
          },
          {
            "check": "People named",
            "value": "1 named with their role, none with a public profile",
            "points": 7,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Support route",
            "value": "a support address, help pages, a community",
            "points": 5,
            "max": 5,
            "state": "ok"
          }
        ],
        "policies": [
          {
            "kind": "terms",
            "url": "https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226",
            "state": "read",
            "readAt": "2026-11-03",
            "words": 6609,
            "points": 7.1,
            "max": 10,
            "expected": [
              {
                "key": "terms.date",
                "label": "Gives the date it was last updated",
                "found": false
              },
              {
                "key": "terms.law",
                "label": "Names the governing law or courts",
                "found": true,
                "quote": "Any disputes arising from the relationships hereunder shall be resolved by the competent courts of the Czech Republic, exclusively in accordance with the laws of the Czech Republic.",
                "says": "The law of Czech Republic"
              },
              {
                "key": "terms.liability",
                "label": "States a limit on its liability",
                "found": true,
                "quote": "Where the Provider's liability under Article 3.3 is not excluded, the Provider's liability for damage caused to the user in any one calendar year is limited to the amount of the price paid by the user for PRUSA Services in the preceding 12 months, subject to a maximum of EUR 500.",
                "says": "Capped at the fees paid in the 12 months before the claim or EUR 500"
              },
              {
                "key": "terms.termination",
                "label": "Says how the agreement or account can be ended",
                "found": true,
                "quote": "from annual to monthly), all ancillary services, bonuses and benefits shall automatically terminate without any entitlement to compensation."
              },
              {
                "key": "terms.changes",
                "label": "Says how changes to the terms are announced",
                "found": true,
                "quote": "In the case of free services: modify the scope of or discontinue the provision of services with at least 30 days' prior notice via e-mail or a platform notification.",
                "says": "Gives 30 days of notice before a change"
              },
              {
                "key": "terms.use",
                "label": "Lists what users may not do",
                "found": true,
                "quote": "however, for the duration of such a situation, you will not be able to use the relevant PRUSA Service beyond the agreed scope."
              },
              {
                "key": "terms.sla",
                "label": "Refers to a service level or uptime commitment",
                "found": true,
                "quote": "Types of printers (FDM/SLA)"
              }
            ],
            "toKnow": [
              {
                "key": "terms.automated",
                "label": "Restricts automated access",
                "found": true,
                "quote": "In particular, the user is obliged to refrain from any activities aimed at unauthorised copying, manual or automated extraction of the contents of the Websites including scraping, artificial increase in inquiries and burdening of the accessibility capacity of PRUSA Services",
                "costsPoints": true
              },
              {
                "key": "terms.cutoff",
                "label": "Says access can be ended without notice or for any reason",
                "found": true,
                "quote": "The Provider reserves the right to restrict the user's access to PRUSA Services without prior notice and without any compensation in the event of a breach of these GTC, generally binding legal regulations or good morals within the meaning of applicable law by the user"
              }
            ],
            "notes": [
              {
                "date": "2026-11-03",
                "text": "Liability in any calendar year is limited to the price paid in the preceding 12 months, up to EUR 500, except for intent, gross negligence or injury.",
                "quote": "Where the Provider's liability under Article 3.3 is not excluded, the Provider's liability for damage caused to the user in any one calendar year is limited to the amount of the price paid by the user for PRUSA Services in the preceding 12 months, subject to a maximum of EUR 500."
              },
              {
                "date": "2026-11-03",
                "text": "Materials and files from PRUSA Services are not intended for professional use or as a substitute for certified or regulated products.",
                "quote": "The underlying materials, print or source files and other information available through PRUSA Services are not intended for professional use or as a substitute for certified, accredited or otherwise regulated products."
              },
              {
                "date": "2026-11-03",
                "text": "Users may request an export of their stored data in a commonly used format.",
                "quote": "The user has the right to request an export of their stored data in a commonly used format."
              }
            ]
          },
          {
            "kind": "privacy",
            "url": "https://www.prusa3d.com/page/privacy-policy_231258/",
            "state": "read",
            "readAt": "2026-11-03",
            "words": 3431,
            "points": 7.8,
            "max": 10,
            "expected": [
              {
                "key": "privacy.date",
                "label": "Gives the date it was last updated",
                "found": false
              },
              {
                "key": "privacy.collected",
                "label": "Says what personal data is collected",
                "found": false
              },
              {
                "key": "privacy.retention",
                "label": "Says how long data is kept",
                "found": true,
                "quote": "For the purposes of sending commercial communications, we use the e-mail address you provided, which we keep for a period of 5 years from its provision.",
                "says": "Names a period of 5 years"
              },
              {
                "key": "privacy.processors",
                "label": "Says who else receives the data",
                "found": false
              },
              {
                "key": "privacy.sale",
                "label": "Says whether personal data is sold or shared for advertising",
                "found": true,
                "quote": "General Terms and Conditions of Use of the PRUSA Websites"
              },
              {
                "key": "privacy.rights",
                "label": "Says what rights people have over their data",
                "found": true,
                "quote": "Under the terms of the GDPR, you have the following rights as a data subject:"
              },
              {
                "key": "privacy.contact",
                "label": "Gives a privacy contact",
                "found": true,
                "quote": "To exercise the above rights, you can use the contact form on the PRUSA websites, the e-mail address [email protected] or you can contact us by sending a written request to Partyzánská 188/7a, Holešovice, 170 00 Prague 7, Czech Republic.",
                "says": "Gives an email address, hidden from our reader by the page"
              },
              {
                "key": "privacy.transfers",
                "label": "Says where data is transferred or stored",
                "found": true,
                "quote": "the right to receive a copy of the standard contractual clauses concluded by the Controller under Article 46 of the GDPR.",
                "says": "Relies on standard contractual clauses"
              }
            ]
          }
        ]
      },
      "humans": {
        "slug": "prusalink",
        "checked": "2026-11-03",
        "company": "Prusa Research a.s.",
        "people": [
          {
            "name": "Josef Průša",
            "role": "Founder",
            "founder": true,
            "bio": "Josef Průša founded Prusa Research in Prague in 2012 as a one-man startup, after taking up 3D printing in 2009 through the RepRap project while studying at the University of Economics in Prague. The company's about page says it started with no investors and no Kickstarter campaign and now has more than 1,200 people.",
            "bioSources": [
              "https://www.prusa3d.com/page/about-us_77/"
            ],
            "page": "/people/josef-prusa/"
          }
        ],
        "peopleNote": "Prusa Research's about page names Josef Průša as founder and no other executives. The page links the company's Facebook, Instagram, Twitter and YouTube accounts; no LinkedIn, X or GitHub account for Josef himself is linked from the pages read, so none is listed. PrusaLink's maintainers are seen only as GitHub logins in the repository. Investors were looked for on the about page, which says the company began with no investors and no Kickstarter campaign, and in the website terms and privacy policy, which name Prusa Development a.s. and other group companies; no funding round or outside investor was found and no outside search was made for a founder-run company that says it took none.",
        "companySocial": {
          "x": "https://x.com/prusa3d",
          "github": "https://github.com/prusa3d"
        },
        "support": {
          "emails": [
            "link@prusa3d.cz"
          ],
          "urls": [
            "https://help.prusa3d.com/",
            "https://help.prusa3d.com/article/prusa-connect-and-prusalink-explained_302608"
          ],
          "community": [
            {
              "label": "Prusa forum",
              "url": "https://forum.prusa3d.com/",
              "kind": "forum"
            },
            {
              "label": "Prusa-Link issues",
              "url": "https://github.com/prusa3d/Prusa-Link/issues",
              "kind": "github"
            }
          ],
          "contactEmails": [
            "security@prusa3d.com"
          ]
        },
        "sources": [
          "https://www.prusa3d.com/page/about-us_77/",
          "https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226",
          "https://www.prusa3d.com/page/privacy-policy_231258/",
          "https://www.prusa3d.com/",
          "https://www.prusa3d.com/.well-known/security.txt",
          "https://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml",
          "https://github.com/prusa3d/Prusa-Link"
        ],
        "ownership": {
          "status": "private",
          "checked": "2026-11-03",
          "sources": [
            "https://www.prusa3d.com/page/about-us_77/",
            "https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226"
          ]
        }
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/prusalink.json",
      "live": {
        "slug": "prusalink",
        "securityTxt": {
          "url": "https://prusa3d.com/.well-known/security.txt",
          "state": "valid",
          "expires": "2027-06-01T00:00:00.000Z",
          "checkedAt": "2026-11-04T15:53:25.511645444Z"
        },
        "updatedAt": "2026-11-04T15:53:25.511645444Z"
      }
    },
    "verify": {
      "accepts": "a page on prusa3d.com or one of its subdomains, or the README at the root of github.com/prusa3d/Prusa-Link",
      "badgeUrl": "https://www.anchorterminal.com/badges/prusalink.svg",
      "body": {
        "slug": "prusalink",
        "url": "the page with the badge or the link"
      },
      "docs": "https://www.anchorterminal.com/builders/#verify",
      "effect": "none, it never changes a grade, rank or review",
      "endpoint": "https://www.anchorterminal.com/api/v1/verify",
      "listingUrl": "https://www.anchorterminal.com/tools/prusalink",
      "mcpTool": "verify_listing",
      "recheck": "weekly; two failed checks in a row and it lapses, a later pass restores it",
      "snippets": {
        "html": "\u003ca href=\"https://www.anchorterminal.com/tools/prusalink\"\u003e\u003cimg src=\"https://www.anchorterminal.com/badges/prusalink.svg\" alt=\"PrusaLink on Anchor Terminal\" height=\"20\"\u003e\u003c/a\u003e",
        "markdown": "[![PrusaLink on Anchor Terminal](https://www.anchorterminal.com/badges/prusalink.svg)](https://www.anchorterminal.com/tools/prusalink)",
        "link": "\u003ca href=\"https://www.anchorterminal.com/tools/prusalink\"\u003ePrusaLink on Anchor Terminal\u003c/a\u003e"
      }
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/prusalink",
    "json": "https://www.anchorterminal.com/tools/prusalink.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/prusalink.md",
    "mcp": "https://www.anchorterminal.com/mcp",
    "pricing": "https://www.anchorterminal.com/tools/prusalink#pricing",
    "reviews": "https://www.anchorterminal.com/tools/prusalink#reviews",
    "slim": "https://www.anchorterminal.com/tools/prusalink.min.md"
  },
  "markdown": "## Overview\n\n**Grade D · 49.4/100 · rank #1036 of 1349 · #4 in CAD, engineering \u0026 fabrication · not agent-ready · confidence medium**\n\n\n## Assessment\n\nAn agent on the same network can read printer status, upload G-code and start, pause or stop a print through a documented OpenAPI surface with one credential per printer. The spec is a 2024 draft, the Pi edition's last release is July 2024 with 102 open issues, and there is no read-only mode, pagination or SDK.\n\n## Facts\n\n| Field | Value |\n| --- | --- |\n| Vendor | Prusa Research a.s. (https://www.prusa3d.com) |\n| Kind | HTTP API |\n| Category | CAD, engineering \u0026 fabrication (https://www.anchorterminal.com/categories/cad) |\n| Auth | OAuth or key · On a Buddy-firmware printer (CORE One, MK4/S, MK3.9, MK3.5, XL, MINI/+) the printer shows a username and password under Settings \u003e Network \u003e PrusaLink, and the OpenAPI spec declares HTTP digest authentication on every operation. On the Raspberry Pi edition for the MK3/S/+ and MK2.5/S, one API key is set or reset in PrusaLink's settings and sent as X-Api-Key; keys are trimmed of whitespace since the unreleased 0.9.0 change. One credential per printer, with no scopes or read-only mode. |\n| Pricing | Free (Free) · The software is free and ships in the printer firmware or as a free Raspberry Pi image and PyPI package. It needs an Original Prusa printer, and the Pi edition a Raspberry Pi Zero 2 W, Zero W, 3, 4 or 5. Prusa Connect, the cloud service PrusaLink can register with, is free for Prusa owners with 1 GB of storage, per the help centre. |\n| x402 | No · No x402, MPP or L402 in the OpenAPI spec, the repository or the help centre (checked 3 November 2026). Nothing is sold through the API. |\n| Licence | The Prusa-Link Python package declares its licence as Freeware in setup.py and ships no licence file. The Prusa-Link-Web interface is GPL-3.0, and its OpenAPI spec names AGPLv3. The firmware editions are part of Prusa's printer firmware. |\n| Packages | pypi: `PrusaLink` |\n| Source | https://github.com/prusa3d/Prusa-Link |\n| Docs | https://github.com/prusa3d/Prusa-Link-Web/blob/master/spec/openapi.yaml |\n| llms.txt | not found |\n| Last release | 2024-07-02 |\n| GitHub stars | 219 (as of 2026-11-03) |\n| Surface listed | The local HTTP API under /api/v1 as described by the OpenAPI spec in prusa3d/Prusa-Link-Web, the prusa3d/Prusa-Link Python edition (clones of both repositories), the PrusaLink and Prusa Connect help articles and guide, and Prusa Research's legal and security pages, read on 3 November 2026. No printer was called |\n| Editions | A firmware edition on Buddy and xBuddy printers (CORE One, MK4/S, MK3.9, MK3.5, XL, MINI/+) and SL1 and SL1S, and a Python edition for a Raspberry Pi attached to an MK3/S/+ or MK2.5/S. The Pi edition's ChangeLog bumps its API version to match the one xBuddy reports |\n| Endpoints | GET /api/version, /api/v1/info, /api/v1/status, /api/v1/job, /api/v1/storage, /api/v1/transfer; DELETE job and transfer by id; PUT job pause, resume and continue; GET, PUT, POST, HEAD and DELETE on /api/v1/files/{storage}/{path}; camera list, snapshot, config and Connect registration; GET and POST /api/v1/update/{env} |\n| Enums | Printer state IDLE, BUSY, PRINTING, PAUSED, FINISHED, STOPPED, ERROR, ATTENTION, READY; job state PRINTING, PAUSED, FINISHED, STOPPED, ERROR; storage LOCAL, SDCARD, USB; print file printer_model MK3, MK3S, MINI |\n| Prusa Connect | PrusaLink can register the printer with connect.prusa3d.com, Prusa's cloud service, which has its own terms and a camera API. Prusa Connect is not graded here |\n| Clients | PrusaSlicer sends files to PrusaLink by DNS service discovery and the API, per the help centre. No official SDK; third-party libraries exist |\n| Legal entity | Prusa Research a.s., Partyzánská 188/7a, 170 00 Prague 7, Czech Republic, Id. No. 06649114, named in the website terms, the privacy policy and the about page |\n| Capabilities | cad.print |\n| Tags | local, official, openapi, api-key, free, python, self-hosted, hardware, eu |\n| JSON | https://www.anchorterminal.com/api/v1/tools/prusalink.json |\n\n## Score breakdown (methodology v0.7, October 2026 research run)\n\nAssessed 2026-11-03 from public evidence against the published checklist (https://www.anchorterminal.com/benchmark/#checklist). Confidence: medium. Performance and Task success pending (no score, not in the total); the total is Σ(score × weight) ÷ 80 over the 7 assessed categories. \"This run\" is each category's share of the 100 points.\n\n| Category | Weight | This run | Score (0–100) | Points |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% | 20 | 55 | 11.0 |\n| Performance | 10% | pending | pending | n/a |\n| Schema \u0026 documentation | 13% | 16.2 | 60 | 9.8 |\n| Agent ergonomics | 13% | 16.2 | 48 | 7.8 |\n| Security \u0026 auth | 14% | 17.5 | 36 | 6.3 |\n| Payments \u0026 pricing | 10% | 12.5 | 60 | 7.5 |\n| Task success | 10% | pending | pending | n/a |\n| Maintenance \u0026 community | 7% | 8.8 | 17 | 1.5 |\n| Transparency \u0026 trust (editorial 44, provenance 83) | 7% | 8.8 | 64 | 5.6 |\n| Negative events | up to −15 | up to −15 | none recorded | 0 |\n| **Total** | | | | **49.4 → D** |\n\n### Why each score\n\n- Reliability 55 (checked 2026-11-03): Read with the local-software lines, as software the owner runs on the printer or a Raspberry Pi. The Pi edition installs from the PrusaLink package on PyPI or a Raspberry Pi OS image, with supported Pi models and printer firmware 3.14.0 stated in the release notes, and the firmware editions ship with the printer; the PyPI page answered a script challenge and was not read (17 of 20). A python-tests.yml workflow and four test modules are in the repository, and a CI fix was committed on 9 October 2026, but no run result was read (15 of 25). 102 open issues on 3 November 2026; the newest 25 run from August 2024 to May 2026, include print failures, parse errors and a Pi that stops after reboot, and show no maintainer reply (8 of 25). The ChangeLog marks the 0.7.1rc1 rename of ro to read_only as a breaking API change and records API version bumps, but there is no stated versioning rule (10 of 15). The Pi edition is 0.8.1 and the spec is 1.0.0-draft, though both have shipped to customers for years (5 of 15). 17 + 15 + 8 + 10 + 5 = 55.\n- Performance: Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes.\n- Schema \u0026 documentation 60 (checked 2026-11-03): OpenAPI 3.0.1 in the Prusa-Link-Web repository covering 19 paths and 33 operations, marked 1.0.0-draft, last changed 18 July 2024, with malformed 204 lines and keys containing spaces (20 of 25). No llms.txt or Markdown docs for agents (0). One-line summaries per operation and no guidance on when to use or avoid one (8 of 20). Enums for printer, job, storage, transfer and file types, required fields on response schemas, and ?0 or ?1 header switches; request bodies are binary or empty (11 of 15). Error responses listed per operation with an Error schema of title and text, and few request examples (9 of 15). /api/v1 paths, GET /api/version, and a dated ChangeLog in the Pi repository (12 of 15). 20 + 0 + 8 + 11 + 9 + 12 = 60.\n- Agent ergonomics 48 (checked 2026-11-03): Read as an API. Responses are small telemetry and file objects, but a status call returns everything with no field selection (15 of 25). File listings are flat with no paging, filter or size control (5 of 20). Documented 401, 404, 409, 408 and 503 responses with a title and text an agent can read, though 409 does not say which state blocked the call (12 of 20). Pause, resume and upload are PUT, Overwrite guards uploads and Force guards folder deletes, but there is no idempotency key and a repeated POST to start a print depends on the printer's state (10 of 20). Few parameters and sensible defaults, no official SDK in any language (6 of 15). 15 + 5 + 12 + 10 + 6 = 48.\n- Security \u0026 auth 36 (checked 2026-11-03): One credential per printer, a digest username and password shown on a Buddy printer's screen or one API key on the Pi edition, resettable but without scopes or expiry; digest keeps the secret out of the request (12 of 30). No read-only mode and no confirmation before a stop, a delete or a firmware update (2 of 20). The API returns the owner's own file names and telemetry, so little untrusted content (10). No audit log or per-call visibility documented (2 of 15). Prusa's security.txt is valid to 1 June 2027 with a policy page that rewards reports and answers within 5 working days; no bug bounty amounts, SOC 2 or ISO 27001, and the policy covers websites rather than printers by name (10 of 20). 12 + 2 + 10 + 2 + 10 = 36.\n- Payments \u0026 pricing 60 (checked 2026-11-03): Read with the self-hosted rule. No payment protocol (0). The software is free with nothing to buy, so 20, 20 and 20 on the last three lines. It needs an Original Prusa printer, and the Pi edition a Raspberry Pi, which are hardware the owner already has.\n- Task success: Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored.\n- Maintenance \u0026 community 17 (checked 2026-11-03): The Pi edition's last release is 0.8.1 of 2 July 2024, more than 180 days ago; commits on 14 and 17 October and 2 and 3 November 2026 bump the version to 0.9.0.dev0 and fix the multi-instance image without a release (5 of 30). No release in the last 90 days (0). Of the newest 25 open issues, those from 2025 and 2026 have 0 to 9 comments and none shows a maintainer reply; the forum and help centre answer owners (5 of 25). No official SDK; PrusaSlicer is a client (0 of 15). CI workflow, ruff and dependabot bumps as recent as 2 November 2026 (7 of 10). 5 + 0 + 5 + 0 + 7 = 17.\n- Transparency \u0026 trust 64 (checked 2026-11-03): Source for the Pi edition and the web interface is public, but setup.py declares Freeware with no licence file, the web interface is GPL-3.0 and the spec names AGPLv3, so the licence of the Python edition is unclear (15 of 30). Local software whose data stays on the printer unless registered with Prusa Connect; Prusa's privacy policy of 1 August 2022 gives retention periods per service and names processors and group companies, but says nothing about PrusaLink itself (15 of 30). The ChangeLog flags one breaking change and the website terms promise 30 days' notice for service changes, with no API deprecation policy (6 of 20). Telemetry goes to Prusa Connect only when the owner registers the printer, which the wizard makes optional, and no separate telemetry disclosure was found (8 of 20). 15 + 15 + 6 + 8 = 44.\n\nFix list, everything this grade says the listing lacks, the biggest gain first (18 items). What it covers is at https://www.anchorterminal.com/fixes/prusalink.md (JSON https://www.anchorterminal.com/fixes/prusalink.json). The whole list for a coding agent comes from `POST https://www.anchorterminal.com/api/v1/fix-list` with `{\"listing\": \"prusalink\", \"plan\": \"read\"}`, free while the beta runs\n\n### What we couldn't check\n\n- unchecked: the PyPI release list for PrusaLink (pypi.org answered the project page with a script challenge, and its JSON endpoint is disallowed by robots.txt). Release dates come from GitHub releases and the ChangeLog\n- unchecked: the result of the python-tests.yml workflow on the default branch, and the Buddy firmware's own PrusaLink implementation (prusa3d/Prusa-Firmware-Buddy was not read), including whether an API key still works beside digest on current firmware\n- unchecked: the Prusa Connect terms and conditions, which the website terms name as governing PrusaLink and Prusa Connect; their URL was not found on the pages read\n- firstReleased is 23 November 2020, the ChangeLog's oldest dated entry (0.1.2). The repository was created on 1 June 2020\n- Judgement call on the licence. setup.py declares Freeware and the repository has no licence file, while Prusa-Link-Web is GPL-3.0 and the spec names AGPLv3, so transparency scores the Python edition as unclear rather than open source\n- Judgement call on the surface. One listing covers the firmware editions and the Pi edition, since both answer the same /api/v1 spec; the Pi edition's ChangeLog says its API version tracks the one xBuddy reports\n- Prusa's website terms forbid automated extraction of website content including scraping, recorded as a fact; the help centre asks for 10 seconds between requests, which was kept\n\n### Sources\n\n- OpenAPI spec: \u003chttps://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml\u003e (seen 2026-11-03)\n- Prusa-Link repository, shallow clone (ChangeLog, setup.py, CI, tests): \u003chttps://github.com/prusa3d/Prusa-Link\u003e (seen 2026-11-03)\n- Prusa-Link-Web repository, shallow clone (LICENSE, spec history): \u003chttps://github.com/prusa3d/Prusa-Link-Web\u003e (seen 2026-11-03)\n- Prusa-Link README: \u003chttps://github.com/prusa3d/Prusa-Link/blob/master/README.md\u003e (seen 2026-11-03)\n- Prusa-Link releases: \u003chttps://api.github.com/repos/prusa3d/Prusa-Link/releases\u003e (seen 2026-11-03)\n- Prusa-Link commits: \u003chttps://api.github.com/repos/prusa3d/Prusa-Link/commits\u003e (seen 2026-11-03)\n- Prusa-Link repository metadata: \u003chttps://api.github.com/repos/prusa3d/Prusa-Link\u003e (seen 2026-11-03)\n- Prusa-Link open issues: \u003chttps://github.com/prusa3d/Prusa-Link/issues\u003e (seen 2026-11-03)\n- Prusa Connect and PrusaLink explained: \u003chttps://help.prusa3d.com/article/prusa-connect-and-prusalink-explained_302608\u003e (seen 2026-11-03)\n- Wi-Fi and Prusa Connect/Link setup guide (PDF of 13 May 2026): \u003chttps://help.prusa3d.com/wp-content/uploads/generated/prusa-connect-prusalink_1636_guide_413293_en_2026-05-13.pdf\u003e (seen 2026-11-03)\n- about us: \u003chttps://www.prusa3d.com/page/about-us_77/\u003e (seen 2026-11-03)\n- website terms: \u003chttps://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226\u003e (seen 2026-11-03)\n- privacy policy: \u003chttps://www.prusa3d.com/page/privacy-policy_231258/\u003e (seen 2026-11-03)\n- security.txt: \u003chttps://www.prusa3d.com/.well-known/security.txt\u003e (seen 2026-11-03)\n- security policy: \u003chttps://www.prusa3d.com/page/security-policy_230500/\u003e (seen 2026-11-03)\n- robots.txt: \u003chttps://help.prusa3d.com/robots.txt\u003e (seen 2026-11-03)\n- RDAP for prusa3d.com: \u003chttps://rdap.verisign.com/com/v1/domain/prusa3d.com\u003e (seen 2026-11-03)\n\n## Score history\n\nEvery move of a score since the listing was graded, newest first, with its cause. A score can't move without an entry here. JSON: https://www.anchorterminal.com/api/v1/tools/prusalink/history.json\n\n- 2026-11-03: graded 49.4 D (methodology 0.7)\n\n## Who's behind it (provenance 83/100, checked 2026-11-03)\n\n| Check | Finding | Points |\n| --- | --- | --- |\n| Legal entity named | Prusa Research a.s. | 20/20 |\n| Domain age | prusa3d.com, registered 2013-10-30 (13 years) | 15/15 |\n| Endpoint on the vendor's domain | no hosted endpoint | n/a |\n| Terms of service | read, states 6 of the 7 things a reader expects, and has 1 clause that costs points | 7.1/10 |\n| Privacy policy | read, states 5 of the 8 things a reader expects | 7.8/10 |\n| Status page | not found | 0/10 |\n| Changelog | published | 10/10 |\n| security.txt | valid | 10/10 |\n| People named | 1 named with their role, none with a public profile | 7/10 |\n| Support route | a support address, help pages, a community | 5/5 |\n\nThe general terms and conditions of use of the Prusa websites apply from 20 April 2026 and name Prusa Research a.s. Article 9.1 forbids manual or automated extraction of website content including scraping, recorded as a fact; the GitHub repositories and the help centre were read, and help.prusa3d.com's robots.txt asks for 10 seconds between requests, which was kept.\n\nThe privacy policy is in effect from 1 August 2022 with retention periods by service and a list of processors and group companies.\n\nwww.prusa3d.com/.well-known/security.txt names security@prusa3d.com, expires 1 June 2027 and links the security policy page.\n\nstatus.prusa3d.com exists for Prusa's online services; it is not recorded for PrusaLink, which runs on the printer.\n\nRDAP gives prusa3d.com a registration date of 30 October 2013.\n\npypi.org answered the PrusaLink project page with a script challenge, so the PyPI release list was not read.\n\n### Terms and privacy, as read\n\nA reading by a fixed set of rules, each answered with the vendor's own sentence. Not legal advice.\n\n**Terms of service** (https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226), read 2026-11-03, gives no date, states 6 of the 7 things a reader expects.\n\n- To know. Restricts automated access (costs points). \"In particular, the user is obliged to refrain from any activities aimed at unauthorised copying, manual or automated extraction of the contents of the Websites including scraping, artificial increase in inquiries and burdening of the accessibility capacity of PRUSA Services\"\n- To know. Says access can be ended without notice or for any reason. \"The Provider reserves the right to restrict the user's access to PRUSA Services without prior notice and without any compensation in the event of a breach of these GTC, generally binding legal regulations or good morals within the meaning of applicable law by the user\"\n- Not found in the text. Gives the date it was last updated.\n- Names the governing law or courts. The law of Czech Republic.\n- States a limit on its liability. Capped at the fees paid in the 12 months before the claim or EUR 500.\n- Says how changes to the terms are announced. Gives 30 days of notice before a change.\n- Also in the text (2026-11-03). Liability in any calendar year is limited to the price paid in the preceding 12 months, up to EUR 500, except for intent, gross negligence or injury. \"Where the Provider's liability under Article 3.3 is not excluded, the Provider's liability for damage caused to the user in any one calendar year is limited to the amount of the price paid by the user for PRUSA Services in the preceding 12 months, subject to a maximum of EUR 500.\"\n- Also in the text (2026-11-03). Materials and files from PRUSA Services are not intended for professional use or as a substitute for certified or regulated products. \"The underlying materials, print or source files and other information available through PRUSA Services are not intended for professional use or as a substitute for certified, accredited or otherwise regulated products.\"\n- Also in the text (2026-11-03). Users may request an export of their stored data in a commonly used format. \"The user has the right to request an export of their stored data in a commonly used format.\"\n\n**Privacy policy** (https://www.prusa3d.com/page/privacy-policy_231258/), read 2026-11-03, gives no date, states 5 of the 8 things a reader expects.\n\n- Not found in the text. Gives the date it was last updated.\n- Not found in the text. Says what personal data is collected.\n- Says how long data is kept. Names a period of 5 years.\n- Not found in the text. Says who else receives the data.\n- Gives a privacy contact. Gives an email address, hidden from our reader by the page.\n- Says where data is transferred or stored. Relies on standard contractual clauses.\n\n## Humans behind the project (researched 2026-11-03 from public pages, not part of the grade)\n\n### Key people\n\n- Josef Průša, Founder\n- Note: Prusa Research's about page names Josef Průša as founder and no other executives. The page links the company's Facebook, Instagram, Twitter and YouTube accounts; no LinkedIn, X or GitHub account for Josef himself is linked from the pages read, so none is listed. PrusaLink's maintainers are seen only as GitHub logins in the repository. Investors were looked for on the about page, which says the company began with no investors and no Kickstarter campaign, and in the website terms and privacy policy, which name Prusa Development a.s. and other group companies; no funding round or outside investor was found and no outside search was made for a founder-run company that says it took none.\n- Prusa Research a.s.: X https://x.com/prusa3d GitHub https://github.com/prusa3d\n\n### Getting support\n\n- Support email: link@prusa3d.cz\n- Help: https://help.prusa3d.com/\n- Help: https://help.prusa3d.com/article/prusa-connect-and-prusalink-explained_302608\n- Community (Prusa forum): https://forum.prusa3d.com/\n- Community (Prusa-Link issues): https://github.com/prusa3d/Prusa-Link/issues\n- Sources: https://www.prusa3d.com/page/about-us_77/, https://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226, https://www.prusa3d.com/page/privacy-policy_231258/, https://www.prusa3d.com/, https://www.prusa3d.com/.well-known/security.txt, https://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml, https://github.com/prusa3d/Prusa-Link\n\n## Live (updated 2026-11-04 15:53 UTC)\n\n- security.txt: valid, expires 2027-06-01T00:00:00.000Z\n- Always current: https://www.anchorterminal.com/api/v1/live/prusalink.json\n\n## Probe metrics\n\nNot measured yet. Our benchmark probes haven't run, so there's no availability, latency or error rate from a run and Performance is pending. Live uptime, where we poll the endpoint, is under Live and doesn't change the score.\n\n## Strengths\n\n- OpenAPI 3.0.1 spec with enums for printer and job states and documented 401, 404 and 409 responses on most operations\n- Free, local and offline; the printer needs no cloud account, and the API answers on the printer's own address\n- Shipped in the firmware of every current Original Prusa printer, with a Raspberry Pi edition for the MK3 and MK2.5\n- Prusa publishes a valid security.txt and a disclosure policy that rewards reports\n- Source of the Pi edition and the web interface on GitHub, with CI and dependabot updates\n\n## Weaknesses\n\n- One credential per printer, a digest password or an API key, with no scopes, read-only mode or confirmation before a stop or delete\n- The Pi edition's last release is 0.8.1 of 2 July 2024, and the spec is marked 1.0.0-draft with malformed YAML lines\n- 102 open issues with no visible maintainer reply in the newest 25, and no official SDK\n- No pagination, filtering or output-size control on file listings, and no idempotency keys\n- The Python package's licence is declared as Freeware with no licence file, while the web interface is GPL-3.0\n\n\n\n## Before you call it (notes for agents)\n\n1. Reach the printer by its local address only; use HTTP digest with the username and password from Settings \u003e Network \u003e PrusaLink on a Buddy printer, or X-Api-Key on the Pi edition\n2. Check GET /api/v1/status before any change and expect 409 when the printer is busy; a stop or delete has no confirmation step\n3. Upload with PUT /api/v1/files/{storage}/{path}, set Print-After-Upload to ?1 to start at once, and send Overwrite ?1 only when replacing a file on purpose\n4. Read GET /api/version first, since the Pi edition and the firmware editions report different API versions and the Pi edition lacks Buddy-only fields\n5. Expect no rate limits or retry guidance; poll status at a modest interval rather than on every turn\n\n## Connect\n\nInstall:\n\n```bash\npip install PrusaLink\n```\n\nFirst request:\n\n```bash\ncurl --digest -u \"$PRUSALINK_USER:$PRUSALINK_PASSWORD\" http://\u003cprinter-ip\u003e/api/v1/status\n```\n\nThrough letme: https://letme.dev/prusalink (letme picks it for cad.print, the top-graded tool for the job). letme answers with the pick and how to call it direct. How it works: https://www.anchorterminal.com/letme/index.md\n\n## Similar tools\n\nRanked by shared capabilities, then score. Same-category tools with no shared capability key are listed last.\n\n| Tool | Grade | Score | Rank | Shared capabilities | x402 | Markdown |\n| --- | --- | --- | --- | --- | --- | --- |\n| Adam | C | 59.4 | 630 | same category (CAD, engineering \u0026 fabrication) | no | https://www.anchorterminal.com/tools/adam-cad.md |\n| Zoo | C | 58.7 | 669 | same category (CAD, engineering \u0026 fabrication) | no | https://www.anchorterminal.com/tools/zoo.md |\n| Onshape | C | 55.7 | 820 | same category (CAD, engineering \u0026 fabrication) | no | https://www.anchorterminal.com/tools/onshape.md |\n| Autodesk Platform Services | E | 44.3 | 1154 | same category (CAD, engineering \u0026 fabrication) | no | https://www.anchorterminal.com/tools/autodesk-platform-services.md |\n| SimScale | E | 41 | 1203 | same category (CAD, engineering \u0026 fabrication) | no | https://www.anchorterminal.com/tools/simscale.md |\n| nTop | E | 40.2 | 1214 | same category (CAD, engineering \u0026 fabrication) | no | https://www.anchorterminal.com/tools/ntop.md |\n\n## Panel reviews (0)\n\nReviewed by the Anchor panel (https://www.anchorterminal.com/reviewers/index.md): .\n\nDesk reviews, written from public documentation, pricing, terms, source and status history on 1 October 2026. No calls made. For a desk review, the outcome says whether the reviewer's questions could be answered from public material: success, partial or failure. How reviews work: https://www.anchorterminal.com/reviews/how-it-works.md\n\n## Notable\n\n- OpenAPI 3.0.1 spec titled PrusaLink Web, version 1.0.0-draft, with 19 paths and 33 operations under /api/v1 for info, status, job, storage, transfer, files, cameras and update, last changed on 18 July 2024 (source: \u003chttps://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml\u003e)\n- Built into CORE One, XL, MK4/S, MK3.9, MK3.5, SL1 and SL1S firmware; the MINI/+ needs its Wi-Fi module, the MK3/S/+ a Raspberry Pi Zero over GPIO or a Pi 3, 4 or 5 over USB, and the MK2.5/S a Pi over USB. xBuddy printers need firmware 6.4.0 or newer (source: \u003chttps://help.prusa3d.com/article/prusa-connect-and-prusalink-explained_302608\u003e)\n- A print is started with POST /api/v1/files/{storage}/{path} and a file uploaded with PUT and the Print-After-Upload and Overwrite headers; jobs are paused, resumed and stopped by id, with 409 when the printer is busy (source: \u003chttps://raw.githubusercontent.com/prusa3d/Prusa-Link-Web/master/spec/openapi.yaml\u003e)\n- The Pi edition's last release is 0.8.1 of 2 July 2024; the ChangeLog has an unreleased 0.9.0 and the repository was committed to on 17 October and 3 November 2026 (source: \u003chttps://github.com/prusa3d/Prusa-Link/releases\u003e)\n- 102 open issues on 3 November 2026, the newest 25 opened between August 2024 and May 2026 with no visible maintainer reply (source: \u003chttps://github.com/prusa3d/Prusa-Link/issues\u003e)\n- Prusa's security.txt names security@prusa3d.com with a policy page that promises a reply within 5 working days and a reward for relevant reports, valid to 1 June 2027 (source: \u003chttps://www.prusa3d.com/.well-known/security.txt\u003e)\n- Prusa's website terms of 20 April 2026 forbid automated extraction of website content including scraping, and name PrusaLink and Prusa Connect as services under separate Prusa Connect terms (source: \u003chttps://www.prusa3d.com/page/general-terms-and-conditions-of-use-of-the-prusa-websites_231226\u003e)\n\n- #4 of 7 in Best CAD, simulation and fabrication APIs for AI agents: https://www.anchorterminal.com/best/cad/index.md\n- All 15 cad comparisons: https://www.anchorterminal.com/compare/cad/index.md\n\n## Verify this listing\n\nFor the vendor. The badge or a plain link to this page verifies the listing, from a page on prusa3d.com or one of its subdomains, or the README at the root of github.com/prusa3d/Prusa-Link. It shows the listing is the vendor's and that the vendor knows it's here, and it never changes a grade, rank or review. The vendor sends the page's address to `POST https://www.anchorterminal.com/api/v1/verify` as `{\"slug\": \"prusalink\", \"url\": \"…\"}`, or calls the `verify_listing` tool at https://www.anchorterminal.com/mcp. We fetch the page once, then again every week; two failed checks in a row and the verification lapses, and a later pass restores it. What we check: https://www.anchorterminal.com/builders/index.md#verify\n\nHTML badge:\n\n```html\n\u003ca href=\"https://www.anchorterminal.com/tools/prusalink\"\u003e\u003cimg src=\"https://www.anchorterminal.com/badges/prusalink.svg\" alt=\"PrusaLink on Anchor Terminal\" height=\"20\"\u003e\u003c/a\u003e\n```\n\nMarkdown badge, for a README:\n\n```markdown\n[![PrusaLink on Anchor Terminal](https://www.anchorterminal.com/badges/prusalink.svg)](https://www.anchorterminal.com/tools/prusalink)\n```\n\nPlain link:\n\n```html\n\u003ca href=\"https://www.anchorterminal.com/tools/prusalink\"\u003ePrusaLink on Anchor Terminal\u003c/a\u003e\n```\n\n## Share this listing\n\nFor the vendor. Sharing assets for social media, two PNGs of 1200 × 630 that say PrusaLink is listed on Anchor Terminal, with the vendor's logo and this page's address and no grade or score.\n\n- Dark: https://www.anchorterminal.com/assets/share/prusalink-dark.png\n- Light: https://www.anchorterminal.com/assets/share/prusalink-light.png\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit Anchor Terminal and link the page or API address you took it from (https://www.anchorterminal.com/terms/#data)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-11-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.7",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "terms": "https://www.anchorterminal.com/terms/#data"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "CAD, engineering \u0026 fabrication",
        "url": "https://www.anchorterminal.com/categories/cad"
      },
      {
        "name": "PrusaLink",
        "url": ""
      }
    ],
    "description": "PrusaLink is Prusa Research's local web interface and HTTP API for Original Prusa 3D printers, built into current models or run on a Raspberry Pi. It reports status, uploads files and starts, pauses and stops prints over the local network.",
    "facts": [
      "rank #1036 of 1349",
      "OAuth or key auth",
      "0 desk reviews"
    ],
    "h1": "PrusaLink",
    "image": "https://www.anchorterminal.com/assets/og/tools-prusalink.png",
    "path": "/tools/prusalink",
    "published": "2026-10-01",
    "section": "tools",
    "title": "PrusaLink review (2026): pricing, alternatives and grade D",
    "toc": null,
    "updated": "2026-11-04",
    "url": "https://www.anchorterminal.com/tools/prusalink"
  },
  "tokens": {
    "markdown": 7400,
    "slim": 1680
  },
  "version": 1
}
