{
  "fixes": {
    "slug": "opendocrouter",
    "name": "OpenDocRouter",
    "listing": "https://www.anchorterminal.com/tools/opendocrouter",
    "markdown": "# Fix list: OpenDocRouter\n\nFrom Anchor Terminal's listing at https://www.anchorterminal.com/tools/opendocrouter, the October 2026 research run, assessed 8 October 2026. Grade C, 56.6 out of 100.\n\nThis is everything the published grade says the listing lacks, the biggest possible gain to the total first. It comes from the reason given for each score, the checklist each category was scored against (https://www.anchorterminal.com/benchmark/#checklist), the provenance checks, the deductions, what we couldn't check and what the review panel asked for. A fix counts at the next check, once it's public.\n\nFor a coding agent working on OpenDocRouter: work through the items below in the product, its docs and its public pages. Each category gives the reason for its score, with the points each checklist item earned, and the checklist itself, so the gap is the items that earned less than their points. Change the product, not the wording, and keep a note of what you changed and where it's published.\n\n## 1. Reliability, 43 out of 100, up to 11.4 more on the total\n\nWhy it scored 43: Read with the hosted lines. No status page was found. The site links none, /status returns 404 and llamaindex.statuspage.io lists seven LlamaParse components and none for OpenDocRouter (0). No readable incident history, and the service was announced on 7 October 2026, one day before this check (5). Limits are published with numbers, 300 parse calls and 60 polls a minute and 10 requests running at once per account (15). 429 and 503 carry Retry-After per the docs, each page error is marked as worth retrying or not, and `cache: true` makes a repeated request free. There is no idempotency key, and without the cache a resend is charged again (13 of 15). No SLA found, and the terms allow changes with or without notice (0). The API is version 1 with 1.0.0 SDKs and no beta or preview label (10).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-reliability):\n\nHosted APIs, MCP servers, models and platforms.\n\n- 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own).\n- 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so.\n- 15, rate limits documented with numbers.\n- 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved.\n- 10, an SLA published for any paid tier.\n- 10, the surface agents use is generally available, not beta or preview.\n\nLocal packages, SDKs, frameworks and stdio MCP servers.\n\n- 20, installs from an official package with supported runtimes stated.\n- 25, a public CI and test suite, passing on the default branch.\n- 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered).\n- 15, semver discipline and breaking changes called out in a changelog.\n- 15, version 1.0 or later, or declared stable.\n\nProtocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors.\n\n## 2. Security \u0026 auth, 40 out of 100, up to 10.5 more on the total\n\nWhy it scored 40: Bearer API keys created in the dashboard, and the terms say a key can be revoked. No scopes, expiry or rotation were found, and the dashboard needs a sign-in we didn't have (20 of 30). No read-only or restricted key found. One key can spend credit and read cached results, with spending bounded by the prepaid balance (6 of 20). The API returns untrusted document text and no prompt-injection guidance was found. Document URLs must be public HTTPS on the default port (0 of 15). GET /v1/parse/{id} shows what each request did and cost, and the docs mention a usage log keyed by X-Request-Id. No audit log found (8 of 15). SECURITY.md in the SDK repositories asks for private reports to security@runllama.ai. No security.txt on opendocrouter.ai or llamaindex.ai, and LlamaIndex's trust centre renders only with JavaScript, so no certification is confirmed for this service (6 of 20).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-security):\n\n- 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option.\n- 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions.\n- 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10.\n- 0 to 15, audit logs or per-call visibility for the operator.\n- 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public.\n\nModels are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing.\n\n## 3. Payments \u0026 pricing, 30 out of 100, up to 8.8 more on the total\n\nWhy it scored 30: No x402, MPP or L402 (0). Token prices for every model, an average and a maximum charge per page, the layout price and the 5% top-up fee are public on the models page, the docs and `GET /v1/models` (20). New accounts get $5 of promotional credit. Whether a card is needed at sign-up isn't stated and the dashboard needs a sign-in (10 of 20, our call until that's confirmed). A person signs in through a browser to create a key (0).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-payments):\n\nThe published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/).\n\n- 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which.\n- 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for \"contact sales\" or prices behind a login.\n- 20, a free tier or trial that doesn't need a card.\n- 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API).\n\nPayment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied.\n\nOpen-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol.\n\n## 4. Transparency \u0026 trust, 47 out of 100, up to 4.6 more on the total\n\nMade of editorial 45, provenance 49.\n\nWhy it scored 47: Closed service under the LlamaIndex terms with an OpenDocRouter addendum, SDKs MIT (15). The docs, the OpenAPI document and the addendum agree that nothing is stored without `cache: true`, cached results are encrypted and kept 24 hours, uploads are deleted once read or after an hour, and request records are kept for billing. The terms say LlamaIndex trains no models on user content. No DPA or retention period for request records was found, and the privacy notice dates from March 2024 and doesn't mention the service (22 of 30). No deprecation policy. Recipe and price versions are dated, and the terms allow changes and price changes without notice (3 of 20). The addendum names Anthropic, Google and OpenAI as examples of model providers that receive pages, leaves its infrastructure providers unnamed and gives no data location beyond processing in the United States (5 of 20).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-transparency):\n\n- 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms.\n- 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors).\n- 0 to 20, a deprecation policy or notices with dates.\n- 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted).\n\nThe other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two.\n\nProvenance checks not met in full (half of this category, computed from checked facts):\n\n- Domain age: opendocrouter.ai, registered 2026-09-23 (under a year) (0 of 15)\n- Terms of service: read, states 6 of the 7 things a reader expects, and has 2 clauses that cost points (5.1 of 10)\n- Privacy policy: read, states 6 of the 8 things a reader expects (8.5 of 10)\n- Status page: not found (0 of 10)\n- Changelog: not found (0 of 10)\n- security.txt: not found (0 of 10)\n\n## 5. Maintenance \u0026 community, 65 out of 100, up to 3.1 more on the total\n\nWhy it scored 65: Both SDKs published 1.0.0 on 7 October 2026, the day of the announcement, and the newest model recipe is dated the same day (30). There is one SDK release and no service changelog. The model list shows eight distinct recipe dates between 25 September and 7 October 2026 and a price version of 6 October, which we count as half (10 of 20). No public changelog or community channel found, support is by email, and GitHub issues weren't readable (3 of 15). Current official SDKs in Python and TypeScript (15). The SDK repositories have CI workflows for lint, build and test, release-please and lock files. Run results weren't readable (7 of 10).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-maintenance):\n\n- 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older.\n- 20, at least three releases or dated changelog entries in the last 90 days.\n- 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15.\n- 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models).\n- 10, package health, current dependencies and CI.\n\nModels are read for deprecation notice periods and model churn rather than release counts.\n\n## 6. Agent ergonomics, 84 out of 100, up to 2.6 more on the total\n\nWhy it scored 84: API reading. `pages` selects pages, markdown and layout are opt-in on GET through `expand`, and a poll returns no document text without it (22 of 25). Results over 4 MB come in parts with `next_cursor`, and `pages` and `expand` size the output. There is no endpoint to list past requests (16 of 20). Errors have stable codes, 402 includes `required_usd` and `available_usd`, 429 and 503 include Retry-After and every response has X-Request-Id (19 of 20). No idempotency key. `cache: true` returns stored pages free on a repeat and failed pages can be resent alone, but a sync request without the cache is charged again if resent (12 of 20). Two required fields, and official SDKs in Python and TypeScript (15).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-ergonomics):\n\n- 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries).\n- 20, pagination, filtering and output-size controls.\n- 20, actionable, documented error responses, codes and messages an agent can recover from.\n- 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations.\n- 15, sensible defaults, few required parameters, and official SDKs in at least two languages.\n\nModels are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs.\n\n## 7. Schema \u0026 documentation, 85 out of 100, up to 2.4 more on the total\n\nWhy it scored 85: Public OpenAPI 3.1 document at /v1/openapi.json covering all six operations (25). No llms.txt (404), but the docs page is served as Markdown at /docs.md (10). The parse, get, delete and upload operations say when to use sync or async, when the cache is needed and what is charged. The credits and models operations have no description (16 of 20). `mode` and `mime_type` are enums, `expand` has a pattern and required fields are marked, while `pages` is a free string and `model` isn't enumerated (12 of 15). Examples in curl, Python and TypeScript, a table of 15 request errors and a table of 12 page errors (14 of 15). Models carry dated recipe versions and responses a `price_version`, and the SDKs have changelogs on GitHub, but there is no changelog for the service (8 of 15).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-schema):\n\nAPIs and MCP servers.\n\n- 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool).\n- 10, llms.txt or Markdown docs served for agents.\n- 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference.\n- 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs.\n- 0 to 15, examples and documented error responses.\n- 15, versioning and a public changelog.\n\nModels are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference.\n\n## What we couldn't check\n\nWhat we couldn't read counted as absent. Publishing it on a page a plain HTTP fetch can read (not only in a browser) lets the next check count it.\n\n- unchecked: the dashboard, which needs a sign-in. Key options (scopes, expiry, several keys), whether sign-up needs a card and what the usage log shows\n- unchecked: GitHub stars, open issues and CI run results for the SDK repositories. The GitHub API answered with a rate limit\n- unchecked: certifications and the subprocessor list in LlamaIndex's JavaScript-only trust centre, and whether they cover OpenDocRouter\n- The launch post of 7 October 2026 says top-ups start at $25. The site, docs and terms addendum say $10\n- The site says frontier models are charged at their providers' token prices with no markup. We didn't compare the listed prices with each provider's own\n- ParseBench scores and per-page averages are the vendor's figures, and the launch post calls ParseBench 'our benchmarks'. We didn't reproduce them\n- npm reports no download count yet for @llamaindex/opendocrouter, and the PyPI figure of 127 covers one day\n- No status page or changelog URL is recorded in provenance because none exists for the service. The SDK changelogs are on GitHub\n\n## Weaknesses\n\n- Launched on 7 October 2026. The domain was registered on 23 September 2026 and both SDKs have one release, 1.0.0\n- No status page, SLA or service changelog was found. LlamaIndex's status page lists only LlamaParse components\n- No scoped, expiring or read-only keys in the reviewed documentation, and no idempotency key\n- A request holds the model's maximum charge per page, $0.784 on Claude Opus 5.5, so the $5 starting credit admits six Opus pages a request\n- Without `cache: true` a dropped connection loses the markdown, the request is still charged and a resend is a new request\n\n## What costs an agent a turn today\n\nThe notes we give agents before they call it. Each one is a workaround an agent shouldn't need.\n\n- Call `GET /v1/models` first, which needs no key, and choose a model by `avg_charge_per_page_usd` and its ParseBench scores. Send its `id` as `model`\n- Send `cache: true` on any request you might repeat. Without it the markdown exists only in the POST response and a resend is charged as a new request\n- Raise the SDK timeout above its 60-second default for sync parses. Pages can run for 270 seconds and the SDKs retry a timed-out request twice\n- Check every page's `status` before using its markdown. A 200 can be `partial`, and failed pages can be resent alone with `pages`\n- Treat 402 as final until credit is added. The hold is the model's maximum charge per page times the page count, and `GET /v1/credits` shows `available_usd`\n\n## When it's done\n\nSend what changed and where it's published as a dispute (https://www.anchorterminal.com/builders/#disputes, or `POST https://www.anchorterminal.com/api/v1/contact` with `\"kind\": \"dispute\"`). Disputes are answered in public, and the listing is checked again by the same checklist. Paying for an audit or a listing claim changes nothing here.\n",
    "grade": "C",
    "score": 56.6,
    "assessed": "2026-10-08",
    "run": "October 2026 research run",
    "categories": [
      {
        "key": "reliability",
        "name": "Reliability",
        "score": 43,
        "maxGain": 11.4,
        "reason": "Read with the hosted lines. No status page was found. The site links none, /status returns 404 and llamaindex.statuspage.io lists seven LlamaParse components and none for OpenDocRouter (0). No readable incident history, and the service was announced on 7 October 2026, one day before this check (5). Limits are published with numbers, 300 parse calls and 60 polls a minute and 10 requests running at once per account (15). 429 and 503 carry Retry-After per the docs, each page error is marked as worth retrying or not, and `cache: true` makes a repeated request free. There is no idempotency key, and without the cache a resend is charged again (13 of 15). No SLA found, and the terms allow changes with or without notice (0). The API is version 1 with 1.0.0 SDKs and no beta or preview label (10).",
        "checklist": [
          "Hosted APIs, MCP servers, models and platforms.",
          "- 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own).\n- 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so.\n- 15, rate limits documented with numbers.\n- 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved.\n- 10, an SLA published for any paid tier.\n- 10, the surface agents use is generally available, not beta or preview.",
          "Local packages, SDKs, frameworks and stdio MCP servers.",
          "- 20, installs from an official package with supported runtimes stated.\n- 25, a public CI and test suite, passing on the default branch.\n- 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered).\n- 15, semver discipline and breaking changes called out in a changelog.\n- 15, version 1.0 or later, or declared stable.",
          "Protocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-reliability"
      },
      {
        "key": "security",
        "name": "Security \u0026 auth",
        "score": 40,
        "maxGain": 10.5,
        "reason": "Bearer API keys created in the dashboard, and the terms say a key can be revoked. No scopes, expiry or rotation were found, and the dashboard needs a sign-in we didn't have (20 of 30). No read-only or restricted key found. One key can spend credit and read cached results, with spending bounded by the prepaid balance (6 of 20). The API returns untrusted document text and no prompt-injection guidance was found. Document URLs must be public HTTPS on the default port (0 of 15). GET /v1/parse/{id} shows what each request did and cost, and the docs mention a usage log keyed by X-Request-Id. No audit log found (8 of 15). SECURITY.md in the SDK repositories asks for private reports to security@runllama.ai. No security.txt on opendocrouter.ai or llamaindex.ai, and LlamaIndex's trust centre renders only with JavaScript, so no certification is confirmed for this service (6 of 20).",
        "checklist": [
          "- 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option.\n- 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions.\n- 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10.\n- 0 to 15, audit logs or per-call visibility for the operator.\n- 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public.",
          "Models are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-security"
      },
      {
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "score": 30,
        "maxGain": 8.8,
        "reason": "No x402, MPP or L402 (0). Token prices for every model, an average and a maximum charge per page, the layout price and the 5% top-up fee are public on the models page, the docs and `GET /v1/models` (20). New accounts get $5 of promotional credit. Whether a card is needed at sign-up isn't stated and the dashboard needs a sign-in (10 of 20, our call until that's confirmed). A person signs in through a browser to create a key (0).",
        "checklist": [
          "The published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/).",
          "- 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which.\n- 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for \"contact sales\" or prices behind a login.\n- 20, a free tier or trial that doesn't need a card.\n- 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API).",
          "Payment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied.",
          "Open-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-payments"
      },
      {
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "score": 47,
        "maxGain": 4.6,
        "reason": "Closed service under the LlamaIndex terms with an OpenDocRouter addendum, SDKs MIT (15). The docs, the OpenAPI document and the addendum agree that nothing is stored without `cache: true`, cached results are encrypted and kept 24 hours, uploads are deleted once read or after an hour, and request records are kept for billing. The terms say LlamaIndex trains no models on user content. No DPA or retention period for request records was found, and the privacy notice dates from March 2024 and doesn't mention the service (22 of 30). No deprecation policy. Recipe and price versions are dated, and the terms allow changes and price changes without notice (3 of 20). The addendum names Anthropic, Google and OpenAI as examples of model providers that receive pages, leaves its infrastructure providers unnamed and gives no data location beyond processing in the United States (5 of 20).",
        "blend": "editorial 45, provenance 49",
        "checklist": [
          "- 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms.\n- 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors).\n- 0 to 20, a deprecation policy or notices with dates.\n- 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted).",
          "The other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-transparency"
      },
      {
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "score": 65,
        "maxGain": 3.1,
        "reason": "Both SDKs published 1.0.0 on 7 October 2026, the day of the announcement, and the newest model recipe is dated the same day (30). There is one SDK release and no service changelog. The model list shows eight distinct recipe dates between 25 September and 7 October 2026 and a price version of 6 October, which we count as half (10 of 20). No public changelog or community channel found, support is by email, and GitHub issues weren't readable (3 of 15). Current official SDKs in Python and TypeScript (15). The SDK repositories have CI workflows for lint, build and test, release-please and lock files. Run results weren't readable (7 of 10).",
        "checklist": [
          "- 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older.\n- 20, at least three releases or dated changelog entries in the last 90 days.\n- 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15.\n- 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models).\n- 10, package health, current dependencies and CI.",
          "Models are read for deprecation notice periods and model churn rather than release counts."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-maintenance"
      },
      {
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "score": 84,
        "maxGain": 2.6,
        "reason": "API reading. `pages` selects pages, markdown and layout are opt-in on GET through `expand`, and a poll returns no document text without it (22 of 25). Results over 4 MB come in parts with `next_cursor`, and `pages` and `expand` size the output. There is no endpoint to list past requests (16 of 20). Errors have stable codes, 402 includes `required_usd` and `available_usd`, 429 and 503 include Retry-After and every response has X-Request-Id (19 of 20). No idempotency key. `cache: true` returns stored pages free on a repeat and failed pages can be resent alone, but a sync request without the cache is charged again if resent (12 of 20). Two required fields, and official SDKs in Python and TypeScript (15).",
        "checklist": [
          "- 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries).\n- 20, pagination, filtering and output-size controls.\n- 20, actionable, documented error responses, codes and messages an agent can recover from.\n- 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations.\n- 15, sensible defaults, few required parameters, and official SDKs in at least two languages.",
          "Models are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-ergonomics"
      },
      {
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "score": 85,
        "maxGain": 2.4,
        "reason": "Public OpenAPI 3.1 document at /v1/openapi.json covering all six operations (25). No llms.txt (404), but the docs page is served as Markdown at /docs.md (10). The parse, get, delete and upload operations say when to use sync or async, when the cache is needed and what is charged. The credits and models operations have no description (16 of 20). `mode` and `mime_type` are enums, `expand` has a pattern and required fields are marked, while `pages` is a free string and `model` isn't enumerated (12 of 15). Examples in curl, Python and TypeScript, a table of 15 request errors and a table of 12 page errors (14 of 15). Models carry dated recipe versions and responses a `price_version`, and the SDKs have changelogs on GitHub, but there is no changelog for the service (8 of 15).",
        "checklist": [
          "APIs and MCP servers.",
          "- 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool).\n- 10, llms.txt or Markdown docs served for agents.\n- 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference.\n- 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs.\n- 0 to 15, examples and documented error responses.\n- 15, versioning and a public changelog.",
          "Models are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-schema"
      }
    ],
    "provenance": [
      {
        "label": "Domain age",
        "value": "opendocrouter.ai, registered 2026-09-23 (under a year)",
        "points": 0,
        "max": 15
      },
      {
        "label": "Terms of service",
        "value": "read, states 6 of the 7 things a reader expects, and has 2 clauses that cost points",
        "points": 5.1,
        "max": 10
      },
      {
        "label": "Privacy policy",
        "value": "read, states 6 of the 8 things a reader expects",
        "points": 8.5,
        "max": 10
      },
      {
        "label": "Status page",
        "value": "not found",
        "points": 0,
        "max": 10
      },
      {
        "label": "Changelog",
        "value": "not found",
        "points": 0,
        "max": 10
      },
      {
        "label": "security.txt",
        "value": "not found",
        "points": 0,
        "max": 10
      }
    ],
    "unchecked": [
      "unchecked: the dashboard, which needs a sign-in. Key options (scopes, expiry, several keys), whether sign-up needs a card and what the usage log shows",
      "unchecked: GitHub stars, open issues and CI run results for the SDK repositories. The GitHub API answered with a rate limit",
      "unchecked: certifications and the subprocessor list in LlamaIndex's JavaScript-only trust centre, and whether they cover OpenDocRouter",
      "The launch post of 7 October 2026 says top-ups start at $25. The site, docs and terms addendum say $10",
      "The site says frontier models are charged at their providers' token prices with no markup. We didn't compare the listed prices with each provider's own",
      "ParseBench scores and per-page averages are the vendor's figures, and the launch post calls ParseBench 'our benchmarks'. We didn't reproduce them",
      "npm reports no download count yet for @llamaindex/opendocrouter, and the PyPI figure of 127 covers one day",
      "No status page or changelog URL is recorded in provenance because none exists for the service. The SDK changelogs are on GitHub"
    ],
    "weaknesses": [
      "Launched on 7 October 2026. The domain was registered on 23 September 2026 and both SDKs have one release, 1.0.0",
      "No status page, SLA or service changelog was found. LlamaIndex's status page lists only LlamaParse components",
      "No scoped, expiring or read-only keys in the reviewed documentation, and no idempotency key",
      "A request holds the model's maximum charge per page, $0.784 on Claude Opus 5.5, so the $5 starting credit admits six Opus pages a request",
      "Without `cache: true` a dropped connection loses the markdown, the request is still charged and a resend is a new request"
    ],
    "agentNotes": [
      "Call `GET /v1/models` first, which needs no key, and choose a model by `avg_charge_per_page_usd` and its ParseBench scores. Send its `id` as `model`",
      "Send `cache: true` on any request you might repeat. Without it the markdown exists only in the POST response and a resend is charged as a new request",
      "Raise the SDK timeout above its 60-second default for sync parses. Pages can run for 270 seconds and the SDKs retry a timed-out request twice",
      "Check every page's `status` before using its markdown. A 200 can be `partial`, and failed pages can be resent alone with `pages`",
      "Treat 402 as final until credit is added. The hold is the model's maximum charge per page times the page count, and `GET /v1/credits` shows `available_usd`"
    ],
    "recheck": "https://www.anchorterminal.com/builders/#disputes"
  },
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-08",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  }
}
