{
  "data": {
    "a": {
      "slug": "medplum",
      "name": "Medplum",
      "vendor": "Orangebot, Inc. (dba Medplum)",
      "vendorUrl": "https://www.medplum.com",
      "kind": "http-api",
      "category": "health-data",
      "summary": "Open-source FHIR R4 server and healthcare developer platform from Orangebot, Inc. (dba Medplum). Agents reach patient records through the hosted FHIR REST API at api.medplum.com, a remote MCP server or a self-hosted copy.",
      "url": "https://www.anchorterminal.com/tools/medplum",
      "markdownUrl": "https://www.anchorterminal.com/tools/medplum.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/medplum.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/medplum.json",
      "repo": "https://github.com/medplum/medplum",
      "license": "Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service",
      "transports": [
        "http",
        "streamable-http",
        "sse"
      ],
      "remoteUrl": "https://api.medplum.com/mcp/stream",
      "packages": [
        {
          "registry": "npm",
          "name": "@medplum/core"
        }
      ],
      "auth": "oauth",
      "authNotes": "OAuth 2.0 and OpenID Connect. Machine clients use the client credentials grant with a ClientApplication ID and secret created on the Project Admin page, and a POST to https://api.medplum.com/oauth2/token. SMART scopes and AccessPolicy resources limit what each user, bot or client can read or write, including read-only policies. The MCP server uses OAuth with a browser login on first connect. Client assertion, token exchange, on-behalf-of and mTLS are also documented.",
      "pricing": "freemium",
      "pricingNotes": "Hosted plans on medplum.com/pricing (checked 2026-10-14). Free for prototyping, Production $2,000 a month, Premium $6,000 a month, Enterprise by contact. The paid plans include a standard BAA and MSA. Self-hosting the Apache 2.0 server is free. Whether the free plan asks for a card was not established.",
      "priceSummary": "$2000 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs, the pricing page or the repository (checked 2026-10-14).",
        "endpoints": []
      },
      "toolCount": 3,
      "popularity": {
        "githubStars": 2738,
        "npmWeekly": 269965,
        "pypiWeekly": null,
        "asOf": "2026-10-14"
      },
      "docsUrl": "https://www.medplum.com/docs",
      "llmsTxt": "https://www.medplum.com/llms.txt",
      "registryName": "com.medplum/mcp",
      "capabilities": [
        "health.fhir",
        "health.records"
      ],
      "tags": [
        "hosted",
        "open-source",
        "self-hosted",
        "fhir",
        "mcp",
        "oauth",
        "smart-on-fhir",
        "hipaa",
        "soc2",
        "typescript",
        "llms-txt",
        "status-page"
      ],
      "lastRelease": "2026-10-08",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 68.7,
        "grade": "B",
        "agentReady": false,
        "rank": 216,
        "ranked": true,
        "rankOf": 1076,
        "categoryRank": 1,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 73,
          "maintenance": 93,
          "payments": 25,
          "reliability": 75,
          "schema": 82,
          "security": 74,
          "transparency": 72
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-14"
        },
        "negative": -2,
        "negativeNotes": [
          "2026-07-24: GHSA-m44r-7c5h-m6mj, high severity. The external auth callback accepted redirect URIs that only had to start with a registered one, which could leak authorisation codes cross-origin. Patched in @medplum/core 5.1.6 and disclosed on GitHub (https://github.com/medplum/medplum/security/advisories/GHSA-m44r-7c5h-m6mj). With GHSA-ch8p-j6cm-r7w5 (2 June 2026, client secret exposure in self-hosted dynamic registration), both fixed and disclosed in public, so the deduction is small (-2)."
        ],
        "verdict": "Graded on the hosted FHIR API at api.medplum.com. Rate limits, a `RateLimit` header and a 99.99 per cent SLA are published, AccessPolicy resources allow read-only clients, and an official MCP server sits in the registry. Its main tool can delete records with no annotation, the status page could not be read, and the privacy policy dates from 2022.",
        "bestFor": "An agent working inside a digital health company's own FHIR store, reading and writing patients, observations and appointments under a BAA.",
        "strengths": [
          "Apache 2.0 server with releases about weekly, v5.2.3 on 8 October 2026, and a written version policy",
          "Rate limits published per tier, with a `RateLimit` header giving remaining units and seconds to reset",
          "AccessPolicy resources and SMART scopes allow read-only, per-resource or per-element clients",
          "Official MCP server at api.medplum.com/mcp/stream, listed in the MCP registry as com.medplum/mcp, with OAuth",
          "99.99 per cent monthly SLA with service credits stated for the production hosted platform"
        ],
        "weaknesses": [
          "The MCP `fhir-request` tool can delete or overwrite any resource the token allows, with no readOnlyHint or destructiveHint",
          "The privacy policy was last updated on 5 April 2022 and the terms on 11 April 2023",
          "No sub-processor list or retention periods were found",
          "Two high-severity auth advisories were published and patched in 2026",
          "Official SDK in TypeScript only"
        ],
        "agentNotes": [
          "Use a ClientApplication with an AccessPolicy limited to the resources the task needs, and set `readonly` where no writes are needed",
          "Read the `RateLimit` header and wait for the reset time after a 429. Writes cost 100 quota points, searches 20 and reads 1",
          "Create patients with conditional create (`If-None-Exist`) or upsert on an identifier so a retry doesn't make a duplicate",
          "Pass paths to `fhir-request` relative to the FHIR R4 base, with no leading slash or `/fhir/R4` prefix",
          "Use `Prefer: respond-async` for large bundles. Operations inside the background job don't count against the quota"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 68.7
          }
        ],
        "editorialScores": {
          "ergonomics": 73,
          "maintenance": 93,
          "payments": 25,
          "reliability": 75,
          "schema": 82,
          "security": 74,
          "transparency": 65
        },
        "provenanceScore": 78
      },
      "connect": {
        "install": "npm install @medplum/core",
        "http": "curl -X POST https://api.medplum.com/oauth2/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials\u0026client_id=$MY_CLIENT_ID\u0026client_secret=$MY_CLIENT_SECRET\""
      },
      "letme": {
        "capability": "https://letme.dev/health.fhir",
        "tool": "https://letme.dev/medplum"
      },
      "area": "domain-data",
      "unitPrices": [
        {
          "item": "Production plan",
          "unit": "month",
          "usd": 2000,
          "note": "Hosted, BAA included, Growth usage tier"
        },
        {
          "item": "Premium plan",
          "unit": "month",
          "usd": 6000,
          "note": "Hosted, adds lab, medication and HL7 integrations"
        }
      ],
      "provenance": {
        "legalEntity": "Orangebot, Inc.",
        "domain": "medplum.com",
        "domainRegistered": "",
        "endpointOnVendorDomain": true,
        "terms": "https://www.medplum.com/terms",
        "privacy": "https://www.medplum.com/privacy",
        "statusPage": "https://status.medplum.com",
        "changelog": "https://github.com/medplum/medplum/releases",
        "securityTxt": "valid",
        "checked": "2026-10-14",
        "notes": [
          "The pricing and security pages name Orangebot, Inc (dba Medplum).",
          "www.medplum.com/.well-known/security.txt lists security@medplum.com, a PGP key and expires 2027-02-28.",
          "robots.txt on api.medplum.com and status.medplum.com disallows every path for all agents, so the status history and the live OpenAPI document were not read.",
          "The terms of service were last updated 2023-04-11 and the privacy policy 2022-04-05.",
          "The domain registration date was not established."
        ],
        "score": 78
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/medplum.json",
      "live": {
        "slug": "medplum",
        "probe": {
          "target": "https://api.medplum.com/mcp/stream",
          "method": "get",
          "lastAt": "2026-10-14T09:41:57.409301454Z",
          "lastOk": true,
          "lastStatus": 401,
          "lastMs": 255,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 256,
          "p95ms24h": 389,
          "samples24h": 17,
          "samples30d": 17,
          "days": [
            {
              "date": "2026-10-14",
              "probes": 17,
              "ok": 17
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.medplum.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-14T08:53:23.189127499Z"
        },
        "updatedAt": "2026-10-14T09:41:57.409301454Z"
      }
    },
    "answer": "Medplum scores 68.7 (B) on agent readiness against Terra API's 65.9 (B), and leads in 5 of 7 scored categories. Terra API leads on schema \u0026 documentation and agent ergonomics.",
    "b": {
      "slug": "terra",
      "name": "Terra API",
      "vendor": "Terra Enabling Developers Inc.",
      "vendorUrl": "https://tryterra.co",
      "kind": "http-api",
      "category": "health-data",
      "summary": "Terra's Unified API collects activity, sleep, body and nutrition data from 500+ wearables and health apps, normalises it into one schema and sends it by webhook or REST. An MCP server, Terra AI, lets agents read a connected user's data.",
      "url": "https://www.anchorterminal.com/tools/terra",
      "markdownUrl": "https://www.anchorterminal.com/tools/terra.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/terra.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/terra.json",
      "repo": "https://github.com/tryterra/openapi",
      "license": "Proprietary service under Terra's terms of service. The OpenAPI specs repository is Apache 2.0",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e",
      "packages": [
        {
          "registry": "pypi",
          "name": "terra-python"
        },
        {
          "registry": "npm",
          "name": "terra-api"
        },
        {
          "registry": "npm",
          "name": "@tryterra/cli"
        }
      ],
      "auth": "mixed",
      "authNotes": "A self-serve dashboard account gives a dev-id and one x-api-key per environment, sent as headers to the Unified API and to Terra AI. The key has no scopes and can be rotated. The admin API and admin MCP server take personal access tokens with 26 scopes, lifetimes of 7 to 90 days and optional environment limits. The admin MCP server signs in by OAuth, and risky changes need approval in the dashboard. End users connect each wearable through Terra's widget, and Terra holds the provider tokens.",
      "pricing": "usage",
      "pricingNotes": "Quick Start from $499 a month includes 100,000 credits, then $0.005 a credit to 1,000,000 and $0.003 above. Sign-up asks for a plan and billing details, with a 30-day money-back guarantee and no free tier found. Testing and staging environments allow 50 users each. Enterprise is custom (checked 2026-10-14).",
      "priceSummary": "$499 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs, the OpenAPI specs or the pricing page (checked 2026-10-14).",
        "endpoints": []
      },
      "toolCount": 6,
      "popularity": {
        "githubStars": null,
        "npmWeekly": 13061,
        "pypiWeekly": 10636,
        "asOf": "2026-10-14"
      },
      "docsUrl": "https://docs.tryterra.co",
      "llmsTxt": "https://docs.tryterra.co/llms.txt",
      "openapi": "https://raw.githubusercontent.com/tryterra/openapi/master/dist/core/v2-bundled.yaml",
      "capabilities": [
        "health.wearables",
        "health.consent",
        "health.fhir"
      ],
      "tags": [
        "hosted",
        "wearables",
        "health-data",
        "mcp",
        "api-key",
        "openapi",
        "llms-txt",
        "webhooks",
        "status-page",
        "python",
        "typescript",
        "soc2",
        "hipaa"
      ],
      "lastRelease": "2026-10-13",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 65.9,
        "grade": "B",
        "agentReady": false,
        "rank": 327,
        "ranked": true,
        "rankOf": 1076,
        "categoryRank": 2,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 78,
          "maintenance": 75,
          "payments": 20,
          "reliability": 67,
          "schema": 89,
          "security": 65,
          "transparency": 56
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-14"
        },
        "negative": 0,
        "verdict": "Graded on the Unified API and the Terra AI MCP server. A public OpenAPI 3.1 spec, llms.txt, per-user rate limits with Retry-After, and scoped admin tokens with approvals. Access starts at $499 a month with billing details at sign-up, the data API key has no scopes, and API key requests failed for 2 hours 38 minutes on 7 August 2026.",
        "bestFor": "A fitness, wellness, insurance or research product whose users connect consumer wearables and apps, and an agent that needs to read one user's sleep, activity or body data through MCP.",
        "strengths": [
          "Public OpenAPI 3.1 specs on GitHub under Apache 2.0, republished almost daily (spec version 2026.10.08.1 for the Unified API)",
          "Rate limits documented per user, with a Retry-After header and an X-Terra-RateLimit-Rule header naming the rule that fired",
          "Terra AI MCP server has six read tools that take explicit fields or select lists, so an agent fetches only the columns it needs",
          "Admin tokens carry 26 scopes, expire within 90 days, can be limited to environments, and risky changes need approval in the dashboard",
          "Credit prices are public, $0.005 a credit from 100,001 to 1,000,000 and $0.003 above, with 200 credits per active user a month"
        ],
        "weaknesses": [
          "No free tier. Sign-up asks for a plan and billing details, and Quick Start starts at $499 a month with a 30-day money-back guarantee",
          "The Unified API key is one environment-wide x-api-key with no scopes, and Terra AI takes the same key",
          "status.tryterra.co shows REST requests failing with authorisation errors for 2 hours 38 minutes on 7 August 2026",
          "No SLA is published outside Enterprise contracts, and no idempotency keys were found for write endpoints",
          "The privacy policy, effective 20 April 2023, excludes end-user wearable data, and no public sub-processor list was found"
        ],
        "agentNotes": [
          "Send dev-id and x-api-key headers on every Unified API and Terra AI call. A missing header returns 401 problem+json",
          "Keep each request window to 1,825 days or less and under 6,000 requested days per user an hour. On 429 with rule r2, wait Retry-After seconds",
          "Pass either fields or select to Terra AI tools, never both and never neither, or the call fails with a validation error",
          "Expect data by webhook after a user connects through the widget session. REST reads are for backfills and on-demand queries",
          "Use the Read only access level for the admin MCP server unless a change is needed. The MCP level can read API keys"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 65.9
          }
        ],
        "editorialScores": {
          "ergonomics": 78,
          "maintenance": 75,
          "payments": 20,
          "reliability": 67,
          "schema": 89,
          "security": 65,
          "transparency": 42
        },
        "provenanceScore": 69
      },
      "connect": {
        "claudeCode": "claude mcp add --transport http terra-ai https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e --header \"dev-id: \u003cYOUR_DEV_ID\u003e\" --header \"x-api-key: \u003cYOUR_API_KEY\u003e\"",
        "config": {
          "mcpServers": {
            "terra-ai": {
              "headers": {
                "dev-id": "YOUR_DEV_ID",
                "x-api-key": "YOUR_API_KEY"
              },
              "url": "https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/health.wearables",
        "tool": "https://letme.dev/terra"
      },
      "area": "domain-data",
      "unitPrices": [
        {
          "item": "Quick Start plan, 100,000 credits included",
          "unit": "month",
          "usd": 499,
          "note": "From price on tryterra.co/pricing, 2026-10-14"
        },
        {
          "item": "Credit beyond the monthly allowance (100,001 to 1,000,000)",
          "unit": "credit",
          "usd": 0.005,
          "note": "$0.003 above 1,000,000 credits. An active user costs 200 credits a month"
        }
      ],
      "provenance": {
        "legalEntity": "Terra Enabling Developers Inc.",
        "domain": "tryterra.co",
        "domainRegistered": "",
        "endpointOnVendorDomain": true,
        "terms": "https://tryterra.co/terms-of-service",
        "privacy": "https://tryterra.co/privacy",
        "statusPage": "https://status.tryterra.co",
        "changelog": "https://docs.tryterra.co/changelog/2026/readme",
        "securityTxt": "none",
        "checked": "2026-10-14",
        "notes": [
          "The terms of service, last updated 1 May 2026, are between the customer and Terra Enabling Developers Inc., a Delaware corporation. The privacy policy names a UK subsidiary, Terra Enabling Developers Ltd.",
          "The privacy policy (effective 20 April 2023) says it doesn't cover data collected from wearables about end users, and that processing takes place mainly in the United Kingdom.",
          "tryterra.co/.well-known/security.txt returns 404.",
          "RDAP for tryterra.co returned no registration date.",
          "API and MCP endpoints answer at access.tryterra.co, a tryterra.co subdomain."
        ],
        "score": 69
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/terra.json",
      "live": {
        "slug": "terra",
        "probe": {
          "target": "https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e",
          "method": "get",
          "lastAt": "2026-10-14T09:42:10.210334836Z",
          "lastOk": true,
          "lastStatus": 401,
          "lastMs": 45,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 47,
          "p95ms24h": 126,
          "samples24h": 17,
          "samples30d": 17,
          "days": [
            {
              "date": "2026-10-14",
              "probes": 17,
              "ok": 17
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.tryterra.co",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-14T08:54:00.980823971Z"
        },
        "updatedAt": "2026-10-14T09:42:10.210334836Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Orangebot, Inc. (dba Medplum)",
        "b": "Terra Enabling Developers Inc.",
        "name": "Vendor"
      },
      {
        "a": "https://api.medplum.com/mcp/stream",
        "b": "https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP, Streamable HTTP, SSE (legacy)",
        "b": "HTTP, Streamable HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth",
        "b": "OAuth or key",
        "name": "Auth"
      },
      {
        "a": "Freemium",
        "b": "Pay per use",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service",
        "b": "Proprietary service under Terra's terms of service. The OpenAPI specs repository is Apache 2.0",
        "name": "Licence"
      },
      {
        "a": "3",
        "b": "6",
        "name": "Tools exposed"
      },
      {
        "a": "yes",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "com.medplum/mcp",
        "b": "not listed",
        "name": "MCP registry"
      },
      {
        "a": "2026-10-08",
        "b": "2026-10-13",
        "name": "Last release"
      },
      {
        "a": "2023-04-11",
        "b": "2026-05-01",
        "name": "Terms last updated"
      },
      {
        "a": "2022-04-05",
        "b": "2023-04-20",
        "name": "Privacy policy last updated"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Customer content may train models"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Terms restrict automated access"
      },
      {
        "a": "not found in the text",
        "b": "yes",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "2.7k stars, 270k npm/wk",
        "b": "13k npm/wk, 11k PyPI/wk",
        "name": "Popularity"
      }
    ],
    "faq": [
      {
        "answer": "Medplum scores 68.7 (B) on agent readiness against Terra API's 65.9 (B), and leads in 5 of 7 scored categories. Terra API leads on schema \u0026 documentation and agent ergonomics.",
        "question": "Which is better for AI agents, Medplum or Terra API?"
      },
      {
        "answer": "Medplum uses an OAuth sign-in. Terra API takes an API key or an OAuth sign-in.",
        "question": "Do Medplum and Terra API need an API key?"
      },
      {
        "answer": "Yes. Medplum has a hosted endpoint at https://api.medplum.com/mcp/stream and Terra API at https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e.",
        "question": "Can an agent call Medplum and Terra API without installing anything?"
      },
      {
        "answer": "Medplum is open source (Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service). No open-source release is listed for Terra API.",
        "question": "Are Medplum and Terra API open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Reliability, 75 against 67",
          "Security \u0026 auth, 74 against 65",
          "Payments \u0026 pricing, 25 against 20",
          "Maintenance \u0026 community, 93 against 75",
          "Transparency \u0026 trust, 72 against 56"
        ],
        "also": [
          "Open source"
        ],
        "goodFor": "An agent working inside a digital health company's own FHIR store, reading and writing patients, observations and appointments under a BAA.",
        "slug": "medplum",
        "watchFor": "The MCP `fhir-request` tool can delete or overwrite any resource the token allows, with no readOnlyHint or destructiveHint"
      },
      {
        "aheadOn": [
          "Schema \u0026 documentation, 89 against 82",
          "Agent ergonomics, 78 against 73"
        ],
        "also": null,
        "goodFor": "A fitness, wellness, insurance or research product whose users connect consumer wearables and apps, and an agent that needs to read one user's sleep, activity or body data through MCP.",
        "slug": "terra",
        "watchFor": "No free tier. Sign-up asks for a plan and billing details, and Quick Start starts at $499 a month with a 30-day money-back guarantee"
      }
    ],
    "job": {
      "capability": "health.fhir",
      "name": "FHIR servers"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/1uphealth-vs-terra.json",
        "title": "1upHealth vs Terra API",
        "url": "https://www.anchorterminal.com/compare/1uphealth-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/aidbox-vs-medplum.json",
        "title": "Aidbox vs Medplum",
        "url": "https://www.anchorterminal.com/compare/aidbox-vs-medplum"
      },
      {
        "json": "https://www.anchorterminal.com/compare/aidbox-vs-terra.json",
        "title": "Aidbox vs Terra API",
        "url": "https://www.anchorterminal.com/compare/aidbox-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/health-gorilla-vs-terra.json",
        "title": "Health Gorilla vs Terra API",
        "url": "https://www.anchorterminal.com/compare/health-gorilla-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medplum-vs-metriport.json",
        "title": "Medplum vs Metriport Medical API",
        "url": "https://www.anchorterminal.com/compare/medplum-vs-metriport"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medplum-vs-particle-health.json",
        "title": "Medplum vs Particle Health",
        "url": "https://www.anchorterminal.com/compare/medplum-vs-particle-health"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medplum-vs-redox.json",
        "title": "Medplum vs Redox",
        "url": "https://www.anchorterminal.com/compare/medplum-vs-redox"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medplum-vs-rook.json",
        "title": "Medplum vs ROOK",
        "url": "https://www.anchorterminal.com/compare/medplum-vs-rook"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medplum-vs-zus-health.json",
        "title": "Medplum vs Zus Health",
        "url": "https://www.anchorterminal.com/compare/medplum-vs-zus-health"
      },
      {
        "json": "https://www.anchorterminal.com/compare/metriport-vs-terra.json",
        "title": "Metriport Medical API vs Terra API",
        "url": "https://www.anchorterminal.com/compare/metriport-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/particle-health-vs-terra.json",
        "title": "Particle Health vs Terra API",
        "url": "https://www.anchorterminal.com/compare/particle-health-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/redox-vs-terra.json",
        "title": "Redox vs Terra API",
        "url": "https://www.anchorterminal.com/compare/redox-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/1uphealth-vs-medplum.json",
        "title": "1upHealth vs Medplum",
        "url": "https://www.anchorterminal.com/compare/1uphealth-vs-medplum"
      },
      {
        "json": "https://www.anchorterminal.com/compare/health-gorilla-vs-medplum.json",
        "title": "Health Gorilla vs Medplum",
        "url": "https://www.anchorterminal.com/compare/health-gorilla-vs-medplum"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medblocks-vs-medplum.json",
        "title": "Medblocks vs Medplum",
        "url": "https://www.anchorterminal.com/compare/medblocks-vs-medplum"
      },
      {
        "json": "https://www.anchorterminal.com/compare/medblocks-vs-terra.json",
        "title": "Medblocks vs Terra API",
        "url": "https://www.anchorterminal.com/compare/medblocks-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/terra-vs-zus-health.json",
        "title": "Terra API vs Zus Health",
        "url": "https://www.anchorterminal.com/compare/terra-vs-zus-health"
      },
      {
        "json": "https://www.anchorterminal.com/compare/rook-vs-terra.json",
        "title": "ROOK vs Terra API",
        "url": "https://www.anchorterminal.com/compare/rook-vs-terra"
      },
      {
        "json": "https://www.anchorterminal.com/compare/terra-vs-validic.json",
        "title": "Terra API vs Validic Inform",
        "url": "https://www.anchorterminal.com/compare/terra-vs-validic"
      }
    ],
    "scores": [
      {
        "by": 8,
        "edge": "medplum",
        "key": "reliability",
        "medplum": 75,
        "name": "Reliability",
        "terra": 67,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 7,
        "edge": "terra",
        "key": "schema",
        "medplum": 82,
        "name": "Schema \u0026 documentation",
        "terra": 89,
        "weight": 13
      },
      {
        "by": 5,
        "edge": "terra",
        "key": "ergonomics",
        "medplum": 73,
        "name": "Agent ergonomics",
        "terra": 78,
        "weight": 13
      },
      {
        "by": 9,
        "edge": "medplum",
        "key": "security",
        "medplum": 74,
        "name": "Security \u0026 auth",
        "terra": 65,
        "weight": 14
      },
      {
        "by": 5,
        "edge": "medplum",
        "key": "payments",
        "medplum": 25,
        "name": "Payments \u0026 pricing",
        "terra": 20,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 18,
        "edge": "medplum",
        "key": "maintenance",
        "medplum": 93,
        "name": "Maintenance \u0026 community",
        "terra": 75,
        "weight": 7
      },
      {
        "by": 16,
        "edge": "medplum",
        "key": "transparency",
        "medplum": 72,
        "name": "Transparency \u0026 trust",
        "terra": 56,
        "weight": 7
      }
    ],
    "summary": "Medplum scores 68.7 (B) on agent readiness against Terra API's 65.9 (B), and leads in 5 of 7 scored categories. Terra API leads on schema \u0026 documentation and agent ergonomics. Both do fhir servers.",
    "verdicts": {
      "medplum": "Graded on the hosted FHIR API at api.medplum.com. Rate limits, a `RateLimit` header and a 99.99 per cent SLA are published, AccessPolicy resources allow read-only clients, and an official MCP server sits in the registry. Its main tool can delete records with no annotation, the status page could not be read, and the privacy policy dates from 2022.",
      "terra": "Graded on the Unified API and the Terra AI MCP server. A public OpenAPI 3.1 spec, llms.txt, per-user rate limits with Retry-After, and scoped admin tokens with approvals. Access starts at $499 a month with billing details at sign-up, the data API key has no scopes, and API key requests failed for 2 hours 38 minutes on 7 August 2026."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/medplum-vs-terra",
    "json": "https://www.anchorterminal.com/compare/medplum-vs-terra.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/medplum-vs-terra.md",
    "slim": "https://www.anchorterminal.com/compare/medplum-vs-terra.min.md"
  },
  "markdown": "Medplum scores 68.7 (B) on agent readiness against Terra API's 65.9 (B), and leads in 5 of 7 scored categories. Terra API leads on schema \u0026 documentation and agent ergonomics. Both do fhir servers.\n\n- Medplum: grade B, 68.7/100, rank #216 of 1076. Markdown https://www.anchorterminal.com/tools/medplum.md · JSON https://www.anchorterminal.com/api/v1/tools/medplum.json\n- Terra API: grade B, 65.9/100, rank #327 of 1076. Markdown https://www.anchorterminal.com/tools/terra.md · JSON https://www.anchorterminal.com/api/v1/tools/terra.json\n- Best health record and wellness data APIs for AI agents: https://www.anchorterminal.com/best/health-data/index.md\n- All 63 health comparisons: https://www.anchorterminal.com/compare/health-data/index.md\n\n## Which one, for what\n\n### Medplum (B)\n\nGood for: An agent working inside a digital health company's own FHIR store, reading and writing patients, observations and appointments under a BAA.\n\nAhead on:\n- Reliability, 75 against 67\n- Security \u0026 auth, 74 against 65\n- Payments \u0026 pricing, 25 against 20\n- Maintenance \u0026 community, 93 against 75\n- Transparency \u0026 trust, 72 against 56\n\nAlso in its favour:\n- Open source\n\nWatch for: The MCP `fhir-request` tool can delete or overwrite any resource the token allows, with no readOnlyHint or destructiveHint\n\n### Terra API (B)\n\nGood for: A fitness, wellness, insurance or research product whose users connect consumer wearables and apps, and an agent that needs to read one user's sleep, activity or body data through MCP.\n\nAhead on:\n- Schema \u0026 documentation, 89 against 82\n- Agent ergonomics, 78 against 73\n\nWatch for: No free tier. Sign-up asks for a plan and billing details, and Quick Start starts at $499 a month with a 30-day money-back guarantee\n\n\n## Score by category\n\n| Category | Weight | Medplum | Terra API | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 75 | 67 | Medplum +8 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 82 | 89 | Terra API +7 |\n| Agent ergonomics | 13% (16.2 this run) | 73 | 78 | Terra API +5 |\n| Security \u0026 auth | 14% (17.5 this run) | 74 | 65 | Medplum +9 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 25 | 20 | Medplum +5 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 93 | 75 | Medplum +18 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 72 | 56 | Medplum +16 |\n| Negative events | ≤15 | -2 | 0 | |\n| **Total** | | **68.7 · B** | **65.9 · B** | |\n\n## Facts side by side\n\n| Fact | Medplum | Terra API |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Orangebot, Inc. (dba Medplum) | Terra Enabling Developers Inc. |\n| Hosted endpoint | `https://api.medplum.com/mcp/stream` | `https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e` |\n| Transports | HTTP, Streamable HTTP, SSE (legacy) | HTTP, Streamable HTTP |\n| Auth | OAuth | OAuth or key |\n| Pricing | Freemium | Pay per use |\n| x402 | no | no |\n| Licence | Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service | Proprietary service under Terra's terms of service. The OpenAPI specs repository is Apache 2.0 |\n| Tools exposed | 3 | 6 |\n| Read-only variant documented | yes | no |\n| llms.txt | yes | yes |\n| MCP registry | `com.medplum/mcp` | not listed |\n| Last release | 2026-10-08 | 2026-10-13 |\n| Terms last updated | 2023-04-11 | 2026-05-01 |\n| Privacy policy last updated | 2022-04-05 | 2023-04-20 |\n| Customer content may train models | not found in the text | not found in the text |\n| Terms restrict automated access | not found in the text | not found in the text |\n| Terms restrict benchmarking | not found in the text | yes |\n| Terms or service can change without notice | yes | yes |\n| Arbitration or class-action waiver | yes | yes |\n| Popularity | 2.7k stars, 270k npm/wk | 13k npm/wk, 11k PyPI/wk |\n\n## Verdicts\n\n**Medplum.** Graded on the hosted FHIR API at api.medplum.com. Rate limits, a `RateLimit` header and a 99.99 per cent SLA are published, AccessPolicy resources allow read-only clients, and an official MCP server sits in the registry. Its main tool can delete records with no annotation, the status page could not be read, and the privacy policy dates from 2022.\n\n**Terra API.** Graded on the Unified API and the Terra AI MCP server. A public OpenAPI 3.1 spec, llms.txt, per-user rate limits with Retry-After, and scoped admin tokens with approvals. Access starts at $499 a month with billing details at sign-up, the data API key has no scopes, and API key requests failed for 2 hours 38 minutes on 7 August 2026.\n\n## Before you call either\n\n### Medplum\n\n1. Use a ClientApplication with an AccessPolicy limited to the resources the task needs, and set `readonly` where no writes are needed\n2. Read the `RateLimit` header and wait for the reset time after a 429. Writes cost 100 quota points, searches 20 and reads 1\n3. Create patients with conditional create (`If-None-Exist`) or upsert on an identifier so a retry doesn't make a duplicate\n4. Pass paths to `fhir-request` relative to the FHIR R4 base, with no leading slash or `/fhir/R4` prefix\n5. Use `Prefer: respond-async` for large bundles. Operations inside the background job don't count against the quota\n\n### Terra API\n\n1. Send dev-id and x-api-key headers on every Unified API and Terra AI call. A missing header returns 401 problem+json\n2. Keep each request window to 1,825 days or less and under 6,000 requested days per user an hour. On 429 with rule r2, wait Retry-After seconds\n3. Pass either fields or select to Terra AI tools, never both and never neither, or the call fails with a validation error\n4. Expect data by webhook after a user connects through the widget session. REST reads are for backfills and on-demand queries\n5. Use the Read only access level for the admin MCP server unless a change is needed. The MCP level can read API keys\n\n## Questions\n\n### Which is better for AI agents, Medplum or Terra API?\n\nMedplum scores 68.7 (B) on agent readiness against Terra API's 65.9 (B), and leads in 5 of 7 scored categories. Terra API leads on schema \u0026 documentation and agent ergonomics.\n\n### Do Medplum and Terra API need an API key?\n\nMedplum uses an OAuth sign-in. Terra API takes an API key or an OAuth sign-in.\n\n### Can an agent call Medplum and Terra API without installing anything?\n\nYes. Medplum has a hosted endpoint at https://api.medplum.com/mcp/stream and Terra API at https://access.tryterra.co/api/v2/mcp/\u003cuser_id\u003e.\n\n### Are Medplum and Terra API open source?\n\nMedplum is open source (Apache 2.0 for the server, SDKs and apps in medplum/medplum. The hosted service at api.medplum.com runs under Medplum's terms of service). No open-source release is listed for Terra API.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/medplum-vs-terra.json, and with the fewest tokens: https://www.anchorterminal.com/compare/medplum-vs-terra.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"medplum\", \"b\": \"terra\"}`. From a terminal: `anchor compare medplum terra`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/medplum.json and https://www.anchorterminal.com/api/v1/tools/terra.json\n\n## Other comparisons with Medplum or Terra API\n\n- [1upHealth vs Terra API](https://www.anchorterminal.com/compare/1uphealth-vs-terra.md)\n- [Aidbox vs Medplum](https://www.anchorterminal.com/compare/aidbox-vs-medplum.md)\n- [Aidbox vs Terra API](https://www.anchorterminal.com/compare/aidbox-vs-terra.md)\n- [Health Gorilla vs Terra API](https://www.anchorterminal.com/compare/health-gorilla-vs-terra.md)\n- [Medplum vs Metriport Medical API](https://www.anchorterminal.com/compare/medplum-vs-metriport.md)\n- [Medplum vs Particle Health](https://www.anchorterminal.com/compare/medplum-vs-particle-health.md)\n- [Medplum vs Redox](https://www.anchorterminal.com/compare/medplum-vs-redox.md)\n- [Medplum vs ROOK](https://www.anchorterminal.com/compare/medplum-vs-rook.md)\n- [Medplum vs Zus Health](https://www.anchorterminal.com/compare/medplum-vs-zus-health.md)\n- [Metriport Medical API vs Terra API](https://www.anchorterminal.com/compare/metriport-vs-terra.md)\n- [Particle Health vs Terra API](https://www.anchorterminal.com/compare/particle-health-vs-terra.md)\n- [Redox vs Terra API](https://www.anchorterminal.com/compare/redox-vs-terra.md)\n- [1upHealth vs Medplum](https://www.anchorterminal.com/compare/1uphealth-vs-medplum.md)\n- [Health Gorilla vs Medplum](https://www.anchorterminal.com/compare/health-gorilla-vs-medplum.md)\n- [Medblocks vs Medplum](https://www.anchorterminal.com/compare/medblocks-vs-medplum.md)\n- [Medblocks vs Terra API](https://www.anchorterminal.com/compare/medblocks-vs-terra.md)\n- [Terra API vs Zus Health](https://www.anchorterminal.com/compare/terra-vs-zus-health.md)\n- [ROOK vs Terra API](https://www.anchorterminal.com/compare/rook-vs-terra.md)\n- [Terra API vs Validic Inform](https://www.anchorterminal.com/compare/terra-vs-validic.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-14",
    "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"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "Medplum vs Terra API",
        "url": ""
      }
    ],
    "description": "Medplum scores 68.7 (B) to Terra's 65.9 (B) for fhir servers. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Medplum B 68.7",
      "Terra API B 65.9",
      "scores"
    ],
    "h1": "Medplum vs Terra API",
    "image": "https://www.anchorterminal.com/assets/og/compare-medplum-vs-terra.png",
    "path": "/compare/medplum-vs-terra",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Medplum vs Terra for AI agents in 2026: scores and prices",
    "toc": null,
    "updated": "2026-10-14",
    "url": "https://www.anchorterminal.com/compare/medplum-vs-terra"
  },
  "tokens": {
    "markdown": 2450,
    "slim": 730
  },
  "version": 1
}
