{
  "_source": "Derived from routePolicy() in src/index.js (Chakudya API). Not part of the OpenAPI spec on purpose - this describes runtime policy (rate limits, role gates), not shape.",
  "default": {
    "auth": "key",
    "rateLimit": {
      "limit": 100,
      "windowSeconds": 60,
      "scope": "ip"
    }
  },
  "rules": [
    {
      "method": "GET",
      "path": "/",
      "auth": "public",
      "rateLimit": null,
      "note": "Not rate-limited or auth-gated - served before the router's policy gate."
    },
    {
      "method": "GET",
      "path": "/health",
      "auth": "public",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/batch",
      "auth": "key",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Caps how many batches (i.e. total fan-out) one IP can trigger per minute - each sub-request still pays its own cost against its own resource's own rate-limit bucket, so batching cannot bypass per-resource auth or limits."
    },
    {
      "method": "GET",
      "path": "/admin/keys",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only - a per-consumer key cannot manage other keys."
    },
    {
      "method": "POST",
      "path": "/admin/keys",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only."
    },
    {
      "method": "DELETE",
      "path": "/admin/keys/{id}",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only."
    },
    {
      "method": "GET",
      "path": "/developer/keys",
      "auth": "login",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Needs a developer login access token (Supabase Auth), not an API key; verified on every call. The rate limit is per IP."
    },
    {
      "method": "POST",
      "path": "/developer/keys",
      "auth": "login",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Needs a developer login access token (Supabase Auth), not an API key; verified on every call. The rate limit is per IP."
    },
    {
      "method": "DELETE",
      "path": "/developer/keys/{id}",
      "auth": "login",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Needs a developer login access token (Supabase Auth), not an API key; verified on every call. The rate limit is per IP."
    },
    {
      "method": "GET",
      "path": "/foods",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/foods",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/foods/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/foods/lookup",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Can trigger external USDA FDC / Open Food Facts / FatSecret calls."
    },
    {
      "method": "GET",
      "path": "/foods/autocomplete",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Wraps FatSecret's Premier-exclusive foods.autocomplete.v2 - 503 if FatSecret credentials aren't configured."
    },
    {
      "method": "GET",
      "path": "/foods/categories",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Wraps FatSecret's Premier-exclusive food_categories.get.v2 - 503 if FatSecret credentials aren't configured."
    },
    {
      "method": "GET",
      "path": "/foods/search",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Typo-tolerant fuzzy search - a single indexed Postgres RPC call (pg_trgm + levenshtein), no external API cost."
    },
    {
      "method": "GET",
      "path": "/foods/substitutes",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Fans out one ilike query per keyword in the matched substitution group."
    },
    {
      "method": "GET",
      "path": "/foods/compare",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Resolves 2-6 foods per request, each potentially falling back to the external lookup cascade."
    },
    {
      "method": "GET",
      "path": "/foods/by-category",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "One local RPC call, same tier as /foods/search."
    },
    {
      "method": "GET",
      "path": "/foods/local-categories",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "One local query, same tier as /foods/search."
    },
    {
      "method": "GET",
      "path": "/foods/baby-foods",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "One local query, same tier as /foods/search."
    },
    {
      "method": "GET",
      "path": "/foods/convert",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Resolves a food by name (local first, then the external lookup cascade) and does arithmetic on it."
    },
    {
      "method": "GET",
      "path": "/foods/{id}/convert",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Same cost profile as /foods/convert, with the food chosen by id."
    },
    {
      "method": "GET",
      "path": "/foods/{id}/label",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/foods/{id}",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "PUT",
      "path": "/foods/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/foods/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/foods/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/glycaemic-index",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/glycaemic-index",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/glycaemic-index/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/glycaemic-index/{id}",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "PUT",
      "path": "/glycaemic-index/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/glycaemic-index/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/glycaemic-index/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/exchange",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/exchange",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/exchange/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PUT",
      "path": "/exchange/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/exchange/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/exchange/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/renal",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/renal",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/renal/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PUT",
      "path": "/renal/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/renal/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/renal/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/formulas",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/formulas",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/formulas/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PUT",
      "path": "/formulas/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/formulas/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/formulas/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/drug-interactions",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/drug-interactions",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/drug-interactions/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/drug-interactions/search",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Whole-row keyword scan capped by scan_limit, same cost class as the exchange/renal keyword scans /rag/ask runs internally."
    },
    {
      "method": "GET",
      "path": "/drug-interactions/{id}",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "PUT",
      "path": "/drug-interactions/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/drug-interactions/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/drug-interactions/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/bmi-for-age/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/bmi-for-age",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/bmi-for-age/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/hc-velocity/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/hc-velocity",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/hc-velocity/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/length-velocity/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/length-velocity",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/length-velocity/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/weight-velocity/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/weight-velocity",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/weight-velocity/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/muac-for-age/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/muac-for-age",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/muac-for-age/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/muac/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/length-height-for-age/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/length-height-for-age",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/length-height-for-age/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/weight-for-age/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/weight-for-age",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/weight-for-age/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/weight-for-length-height/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/weight-for-length-height",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/weight-for-length-height/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/bmi-for-age-under-5/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/bmi-for-age-under-5",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/bmi-for-age-under-5/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/hc-for-age/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/hc-for-age",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/hc-for-age/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/growth/assess",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Fans out up to seven local reference lookups per request, no external API cost."
    },
    {
      "method": "GET",
      "path": "/fenton-preterm/classify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/fenton-preterm/profile",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/fenton-preterm/growth",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/fenton-preterm/velocity",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/fenton-preterm/chart",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/fenton-preterm/references",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/fenton-preterm/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/fhir/metadata",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Always open. Reports the deployment's access mode (open vs enforce) in the CapabilityStatement."
    },
    {
      "method": "POST",
      "path": "/fhir/Observation/$evaluate-growth",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Observation.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Observation/$screen",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Observation.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Observation/$assess-nutrition",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Observation.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Condition/$diagnose",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Condition.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/CarePlan/$intervene",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/CarePlan.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/CarePlan/$monitor",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/CarePlan.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Goal/$evaluate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Goal.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Bundle/$ncp-document",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Bundle.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Bundle/$care-context",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Bundle.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/$validate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Resource.read is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/ConceptMap/$translate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Terminology translation - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/ConceptMap/{id}",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/AuditEvent",
      "auth": "admin",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Always needs a credential in every access mode: admin role (or root key), or an explicit system/AuditEvent.read scope. A wildcard system/* scope never covers AuditEvent. Rate-limited per IP."
    },
    {
      "method": "GET",
      "path": "/fhir/AuditEvent/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Always needs a credential in every access mode: admin role (or root key), or an explicit system/AuditEvent.read scope. A wildcard system/* scope never covers AuditEvent. Rate-limited per IP."
    },
    {
      "method": "POST",
      "path": "/fhir/Bundle/$validate-document",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Bundle.read is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/Bundle/$nutrition-assessment",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/Bundle.write is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "POST",
      "path": "/fhir/QuestionnaireResponse/$validate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "FHIR facade. Rate limit is the public tier, but in enforce mode (FHIR_AUTH_MODE=enforce, the hosted default) a Bearer credential with scope system/QuestionnaireResponse.read is required (401/403 otherwise); in open mode it is public."
    },
    {
      "method": "GET",
      "path": "/fhir/Questionnaire",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/Questionnaire/{id}",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/CodeSystem/ncp-diagnosis",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/CodeSystem/{name}",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/OperationDefinition/{id}",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/fhir/StructureDefinition/{name}",
      "auth": "public",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Conformance/terminology read - always open, even in enforce mode."
    },
    {
      "method": "GET",
      "path": "/packaged",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/packaged/pending",
      "auth": "admin",
      "requiredRole": "reviewer",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Reviewer-role keys can reach this - it's the whole point of the reviewer role."
    },
    {
      "method": "POST",
      "path": "/packaged/submit",
      "auth": "key",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/packaged/scan",
      "auth": "key",
      "rateLimit": {
        "limit": 5,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Costs a Groq vision call per request."
    },
    {
      "method": "POST",
      "path": "/packaged/{id}/approve",
      "auth": "admin",
      "requiredRole": "reviewer",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/packaged/{id}/reject",
      "auth": "admin",
      "requiredRole": "reviewer",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PUT",
      "path": "/packaged/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "PATCH",
      "path": "/packaged/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "DELETE",
      "path": "/packaged/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/favorites",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "No user-account system - user_id is a client-supplied identifier, same model as memory's session_id."
    },
    {
      "method": "POST",
      "path": "/favorites",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Idempotent - favoriting an already-favorited item returns the existing row."
    },
    {
      "method": "DELETE",
      "path": "/favorites",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/history",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Recently viewed, most recent first."
    },
    {
      "method": "POST",
      "path": "/history",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Opt-in - nothing is tracked automatically. Upserts viewed_at, no duplicate rows per resource."
    },
    {
      "method": "GET",
      "path": "/log",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/log",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/log/{id}",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "DELETE",
      "path": "/log/{id}",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Requires the same user_id the entry was logged under."
    },
    {
      "method": "GET",
      "path": "/log/summary",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/recipes/calculate",
      "auth": "key",
      "rateLimit": {
        "limit": 15,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "No persistence, but fans out a DB lookup (and possibly an external cascade call) per ingredient."
    },
    {
      "method": "POST",
      "path": "/meals/analyze",
      "auth": "key",
      "rateLimit": {
        "limit": 15,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Same cost class as /recipes/calculate - shares its ingredient resolution."
    },
    {
      "method": "POST",
      "path": "/ingredients/parse",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Costs a Groq call per request."
    },
    {
      "method": "GET",
      "path": "/dri/life-stages",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "GET",
      "path": "/dri",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/dri/compare",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Pure in-memory computation, no DB or LLM call, so it keeps the generous plain-read allowance even though it's a POST."
    },
    {
      "method": "POST",
      "path": "/rag/retrieve",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Also has a separate KV response cache: 10 min TTL, keyed on context + top_k + normalized query."
    },
    {
      "method": "DELETE",
      "path": "/rag/source",
      "auth": "admin",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Bulk-removes every chunk matching a citation string - needed before re-ingesting a document whose chunks were extracted badly, since /rag/ingest only ever inserts."
    },
    {
      "method": "POST",
      "path": "/rag/ingest",
      "auth": "admin",
      "rateLimit": {
        "limit": 300,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "POST",
      "path": "/rag/ask",
      "auth": "key",
      "rateLimit": {
        "limit": 15,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Most expensive route in the API - intent detection + fan-out search + rerank + LLM answer. Whole answers cached 5 min (skipped when session_id is passed)."
    },
    {
      "method": "POST",
      "path": "/rag/upload",
      "auth": "admin",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Stores the file and queues Cohere embedding work, so capped tightly. Max 25 MB; pdf, docx, txt, md, csv, html."
    },
    {
      "method": "POST",
      "path": "/rag/enqueue",
      "auth": "admin",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Queues an already-uploaded file, or retries a failed job via job_id."
    },
    {
      "method": "GET",
      "path": "/rag/jobs",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Ingestion job status."
    },
    {
      "method": "GET",
      "path": "/rag/jobs/{id}",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Ingestion job status."
    },
    {
      "method": "POST",
      "path": "/rag/webhook",
      "auth": "secret",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Authenticated inside the handler by the x-webhook-secret header (shared secret), not the admin key."
    },
    {
      "method": "POST",
      "path": "/memory/write",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      }
    },
    {
      "method": "POST",
      "path": "/memory/recall",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Preferred over the deprecated GET form. Separate KV response cache: 2 min TTL, keyed on session_id + top_k + normalized query."
    },
    {
      "method": "GET",
      "path": "/memory/recall",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Deprecated - puts session_id and query text in the URL (access logs, browser history). Prefer POST."
    },
    {
      "method": "POST",
      "path": "/memory/consolidate",
      "auth": "admin",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Also runs automatically every hour via a cron trigger, bypassing HTTP auth entirely."
    },
    {
      "method": "GET",
      "path": "/admin/overview",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only - read-only snapshot for the admin monitor."
    },
    {
      "method": "GET",
      "path": "/admin/activity",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only - recent admin actions for the admin monitor."
    },
    {
      "method": "GET",
      "path": "/admin/monitoring",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only - failed calls and slow endpoints for the admin monitor."
    },
    {
      "method": "GET",
      "path": "/admin/usage",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only - calls per endpoint for the admin monitor."
    },
    {
      "method": "GET",
      "path": "/admin/health-history",
      "auth": "admin",
      "requiredRole": "root",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "admin"
      },
      "note": "Root ADMIN_API_KEY only - uptime and outage history from the scheduled health probe."
    },
    {
      "method": "POST",
      "path": "/energy/requirements",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Pure calculation from the Krause ch. 2 equations. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/energy/factors",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Factor registries and reference tables behind the energy engine."
    },
    {
      "method": "POST",
      "path": "/energy/food-energy",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Atwater factors and alcohol drink energy. Pure calculation, nothing is stored."
    },
    {
      "method": "GET",
      "path": "/activity-energy",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Activity energy table (kcal per hour by body weight) read from the database."
    },
    {
      "method": "POST",
      "path": "/activity-energy/calculate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reads one reference table and calculates. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/activity-energy/bulk",
      "auth": "admin",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "admin"
      }
    },
    {
      "method": "GET",
      "path": "/measures",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Units, printed tables and scoop sizes. Pure computation, no database."
    },
    {
      "method": "GET",
      "path": "/measures/convert",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Unit to unit conversion, no food. Pure computation, no database."
    },
    {
      "method": "GET",
      "path": "/pregnancy/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static chapter tables, no database."
    },
    {
      "method": "POST",
      "path": "/pregnancy/gestational-age",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/pregnancy/weight-gain",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/pregnancy/plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/pregnancy/assess",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/renal-nutrition/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static guideline tables, no database."
    },
    {
      "method": "GET",
      "path": "/renal-nutrition/emergency-diet",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static guideline tables, no database."
    },
    {
      "method": "POST",
      "path": "/renal-nutrition/stage",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/renal-nutrition/requirements",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/renal-nutrition/labs",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/renal-nutrition/adequacy",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/renal-nutrition/plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/renal-nutrition/food-plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Also reads exchange_lists and renal_foods (read only). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/diabetes/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/diabetes/status",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/glucose-targets",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/carb-plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/carb-count",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/exchange-plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Also reads exchange_lists (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/glycemic-load",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Also reads glycaemic_index_data (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/insulin",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/hypoglycemia",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/exercise",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/diabetes/plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/weight-management/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static chapter tables, no database."
    },
    {
      "method": "GET",
      "path": "/weight-management/bariatric",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static chapter tables, no database."
    },
    {
      "method": "POST",
      "path": "/weight-management/assess",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. A child's BMI percentile reads an existing reference table (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/weight-management/loss-plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Uses the energy engine. An activity_log reads the activity table (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/weight-management/gain-plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Uses the energy engine. An activity_log reads the activity table (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/weight-management/progress",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/weight-management/diet-pattern",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/sports/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/sports/energy",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/sports/macros",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/sports/fuel-timing",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/sports/hydration",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/sports/body-composition",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/sports/supplement-dose",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/sports/plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. An activity_log reads the activity table (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/energy",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/protein",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/fluid",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/preterm",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/growth-velocity",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/catch-up",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. catch-up (and plan with catch_up:true) also reads one who_weight_for_length_height row (read only). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/enteral-feeds",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/paediatric/plan",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. catch-up (and plan with catch_up:true) also reads one who_weight_for_length_height row (read only). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/paediatric/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/critical-care/protein-by-stress",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/critical-care/npe-nitrogen-ratio",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/critical-care/nitrogen-balance",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/critical-care/carbohydrate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/critical-care/fat",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/critical-care/propofol-fat",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/critical-care/cho-fat-ratio",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/critical-care/electrolytes",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/critical-care/potassium-deficit",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/critical-care/fluid",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body and static tables. No database access. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/critical-care/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/research/harmonise",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Standardises the request body. Reads ncp_diagnosis_terms (read only) only when diagnoses are sent. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/research/convert",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/research/variables",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "GET",
      "path": "/research/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/longitudinal/analyse",
      "auth": "key",
      "rateLimit": {
        "limit": 60,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Analysis of the request body. Reads the WHO growth reference tables (read only, a few batched queries per request). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/longitudinal/cohort",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Analysis of the request body. Reads the WHO growth reference tables (read only, a few batched queries per request). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/longitudinal/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/malnutrition/analyse",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Analysis of the request body. Reads the WHO growth reference tables (read only, a few batched queries per request). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/malnutrition/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/export/dataset",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Builds the file from the request body. Reads ncp_diagnosis_terms (read only) only when diagnoses are sent. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/export/verify",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/export/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/data-quality/audit",
      "auth": "key",
      "rateLimit": {
        "limit": 20,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Analysis of the request body. Reads the WHO growth reference tables (read only, a few batched queries per request). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/data-quality/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/epidemiology/analyse",
      "auth": "key",
      "rateLimit": {
        "limit": 30,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. No database access. Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/epidemiology/counts",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. No database access. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/epidemiology/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/micronutrients/assess",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body against static DRI tables. No database access. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/micronutrients/requirements",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static DRI tables, no database."
    },
    {
      "method": "GET",
      "path": "/micronutrients/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static DRI tables, no database."
    },
    {
      "method": "POST",
      "path": "/enteral-nutrition/calculate",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body. Reads enteral_formulas (read only) when formula_id or formula_name is sent. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/enteral-nutrition/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    },
    {
      "method": "POST",
      "path": "/burns/fluid-resuscitation",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/energy",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/protein",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/nitrogen-balance",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/micronutrients",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/glycemic-targets",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/maintenance-fluid",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/indirect-calorimetry",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/pediatric-equations",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/burns/pharmacology",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/burns/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "POST",
      "path": "/refeeding/risk-adult",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/refeeding/risk-pediatric",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/refeeding/severity",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/refeeding/initiation",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/refeeding/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "POST",
      "path": "/stress-factors/harris-benedict",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/stress-factors/fever",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/stress-factors/conditions",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "GET",
      "path": "/stress-factors/adjustments",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "GET",
      "path": "/stress-factors/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "POST",
      "path": "/carb-counting/carbohydrate-content",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "POST",
      "path": "/carb-counting/insulin-dose",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Calculation from the request body plus reference rows read from clinical_reference_values (read only, cached in the Worker). Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/carb-counting/foods",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "GET",
      "path": "/carb-counting/handy-measures",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "GET",
      "path": "/carb-counting/insulin-types",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "GET",
      "path": "/carb-counting/dose-adjustment",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "GET",
      "path": "/carb-counting/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Reference rows read from clinical_reference_values (read only, cached in the Worker)."
    },
    {
      "method": "POST",
      "path": "/dietary-assessment",
      "auth": "key",
      "rateLimit": {
        "limit": 10,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Resolves up to 40 ingredients (one food lookup each) plus up to 3 ranking reads, so it shares the recipes and meals tier. Nothing is stored."
    },
    {
      "method": "GET",
      "path": "/dietary-assessment/reference",
      "auth": "key",
      "rateLimit": {
        "limit": 100,
        "windowSeconds": 60,
        "scope": "ip"
      },
      "note": "Static reference tables, no database."
    }
  ]
}
