{
  "service": "ratingcalc.aai.dev",
  "stateless": "Nothing is stored, cached, or logged. No claimant identity is ever sent or needed.",
  "schedule": "2005 PDRS. Injuries before 1/1/2005 are governed by the 1997 schedule and are REFUSED.",
  "usage": {
    "quickstart": {
      "curl": "curl -X POST https://ratingcalc.aai.dev/rate -H 'content-type: application/json' -d '{\n  \"doi\": \"2024-10-23\", \"age\": 47, \"awe\": 1100,\n  \"impairments\": [{\"body_part\":\"left forearm\",\"wpi\":2,\"impairment_number\":\"16.05.00.00\",\n                   \"occupation_group\":\"380\",\"pain_add_on\":3}]\n}'",
      "mcp": "POST https://ratingcalc.aai.dev/mcp with a JSON-RPC body:\n  {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}\n  {\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"rate_pd\",\"arguments\":{…}}}"
    },
    "how_to_use_it": [
      "Send ONE request per claimant. This service holds nothing between calls, so a rating is a pure function of the body you post — the same body always returns the same answer.",
      "Do NOT combine impairments yourself. Post every body part separately and let the service apply the Combined Values Chart; adding them overstates the result.",
      "READ THE `notes` ARRAY. It carries every assumption the engine had to make — a defaulted occupational variant, an inferred FEC rank. Those move the answer and are not errors, so nothing else flags them.",
      "A 422 is a REFUSAL, not a failure. It means a figure is missing and the engine will not invent one. Go and find it; do not retry with a placeholder or a zero.",
      "Never send a claimant name, a claim number, or any document text. The service does not need them and does not want them — it exists to hold no client data at all."
    ],
    "worked_example": {
      "request": {
        "doi": "2024-10-23",
        "age": 47,
        "awe": 1100,
        "impairments": [
          {
            "body_part": "left forearm",
            "wpi": 2,
            "impairment_number": "16.05.00.00",
            "occupation_group": "380",
            "pain_add_on": 3
          }
        ]
      },
      "response_shape": {
        "final_pd_percent": 11,
        "weeks": "…",
        "weekly_rate": "…",
        "dollars": "…",
        "impairments": [
          {
            "steps": [
              "pain add-on: 2 + 3 = 5 WPI",
              "WPI 5 x 1.4 = 7",
              "occupation variant H: 7 -> 10",
              "age 47 (47-51): 10 -> 11"
            ]
          }
        ],
        "notes": []
      }
    }
  },
  "json_schema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://ratingcalc.aai.dev/schema/rate",
    "title": "POST /rate",
    "type": "object",
    "required": [
      "doi",
      "impairments"
    ],
    "additionalProperties": false,
    "properties": {
      "doi": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        "description": "Date of injury. Selects the statutory period. Refused before 2005-01-01."
      },
      "dob": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        "description": "Date of birth. PREFER THIS over `age` — the age used for the Section 6 adjustment is computed from it and the date of injury, so the birthday-not-yet-reached case is handled and a hand-computed off-by-one cannot enter. A report's stated age is frequently the age at the EXAM, months or years after the injury."
      },
      "age": {
        "type": "integer",
        "minimum": 0,
        "maximum": 120,
        "description": "Age at the DATE OF INJURY, not today and not at the exam. Only needed when no `dob` is available. If both are given they must agree, or the request is refused. An age DERIVED from `dob` is refused below 12 or above 100 — Section 6 has no floor or ceiling (its bands are \"under 22\" and \"62 and over\"), so a mistyped birth year would otherwise be adjusted like an ordinary age. An age stated here is taken as given."
      },
      "today": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        "description": "Today's date, if you want a date of injury in the FUTURE to be refused. This service holds no clock — the same request must give the same answer next year — so it cannot tell on its own that a date has not happened yet. Send it and a mistyped year (2035 for 2025) is caught; omit it and that date rates normally. Nothing else in the calculation depends on this field."
      },
      "awe": {
        "type": "number",
        "minimum": 0,
        "description": "Average weekly earnings at injury. Omit for a percentage with no dollars."
      },
      "ttd_max": {
        "type": "number",
        "minimum": 0,
        "description": "The temporary-disability maximum weekly rate for the YEAR OF INJURY. Used only for a 100% permanent TOTAL disability rating, where the worker is paid two-thirds of average weekly earnings for life (LC 4659(b)) subject to that cap. Omit it and the two-thirds figure is returned uncapped, and refused outright if it exceeds the lowest modern TTD maximum &mdash; because a PTD figure above every published cap is certainly wrong."
      },
      "impairments": {
        "type": "array",
        "minItems": 1,
        "maxItems": 64,
        "description": "One entry per body part. Do NOT pre-combine — the service combines on the Chart. More than 64 is refused: no real case carries that many, and a request that does is a malformed one.",
        "items": {
          "type": "object",
          "oneOf": [
            {
              "required": [
                "wpi"
              ]
            },
            {
              "required": [
                "value"
              ]
            },
            {
              "required": [
                "gaf"
              ]
            },
            {
              "required": [
                "strict_wpi"
              ]
            }
          ],
          "dependentRequired": {
            "value": [
              "scale"
            ]
          },
          "properties": {
            "body_part": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "wpi": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100,
              "description": "Whole-person impairment % ONLY. A figure the report states on a REGIONAL scale (upper/lower extremity, hand, foot, digit) must NOT go here — send it as value + scale. A 30% upper-extremity figure typed as wpi rates 50% instead of 32%. null/\"\"/true are REFUSED, never read as 0."
            },
            "value": {
              "type": "number",
              "description": "The impairment figure ON ITS STATED SCALE. REQUIRES scale. Do not also send wpi — two figures for one finding is refused."
            },
            "scale": {
              "type": "string",
              "description": "Required whenever value is sent. Omitting it is REFUSED, never assumed whole-person.",
              "enum": [
                "wpi",
                "ue",
                "le",
                "hand",
                "foot",
                "digit:thumb",
                "digit:index",
                "digit:middle",
                "digit:ring",
                "digit:little"
              ]
            },
            "gaf": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "description": "Psych: GAF converted to WPI."
            },
            "impairment_number": {
              "type": "string",
              "description": "e.g. 16.05.00.00"
            },
            "analogizedTo": {
              "type": "string",
              "description": "For a .99 unlisted impairment. Never guessed."
            },
            "occupation_group": {
              "type": "string",
              "description": "PDRS Section 3A group, e.g. \"380\"."
            },
            "occupation_title": {
              "type": "string",
              "description": "Looked up when no group is supplied."
            },
            "variant": {
              "type": "string",
              "pattern": "^[C-J]$",
              "description": "Overrides the Section 4 lookup."
            },
            "fec_rank": {
              "type": "integer",
              "minimum": 1,
              "maximum": 8,
              "description": "2005-2012 injuries. Supply it rather than letting it be inferred."
            },
            "pain_add_on": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3,
              "description": "AMA Ch.18. Capped at 3 per INJURY across all parts."
            },
            "wpi_includes_pain": {
              "type": "boolean"
            },
            "strict_wpi": {
              "type": "integer",
              "description": "Strict AMA figure when an Almaraz/Guzman alternative is also given."
            },
            "almaraz_guzman_wpi": {
              "type": "integer"
            },
            "superseded_wpi": {
              "type": "integer",
              "description": "A figure this one replaces. Recorded, not rated."
            },
            "non_industrial_percent": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100,
              "description": "LC 4663. For \"80% industrial\" pass 20. Passing 80 INVERTS the answer."
            },
            "apportionment_industrial_percent": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100,
              "description": "The same thing stated the other way."
            },
            "causation": {
              "type": "string",
              "enum": [
                "direct",
                "compensable_consequence"
              ]
            },
            "compensable_consequence": {
              "type": "string",
              "enum": [
                "sleep",
                "sexual",
                "psych"
              ],
              "description": "For a 2013+ injury these add no PD (LC 4660.1(c))."
            },
            "type": {
              "type": "string",
              "enum": [
                "sleep",
                "sexual",
                "psych"
              ]
            },
            "violent_act": {
              "type": "boolean",
              "description": "Preserves a psych add-on LC 4660.1(c) would bar."
            },
            "catastrophic": {
              "type": "boolean"
            },
            "region_group": {
              "type": "string",
              "description": "Shared tag for parts in the SAME extremity."
            },
            "extremity_id": {
              "type": "string",
              "description": "Which limb this impairment is on — any label (\"left leg\", \"right arm\"). Two rules turn on it, both from PDRS p. 1-11. (1) Impairments of one extremity are combined with EACH OTHER before being combined with other body parts; the Chart rounds at every step, so the grouping changes the answer — the schedule's own Example C is 76% combined flat and 71% combined by limb. (2) A limb's composite cannot exceed the amputation value of that limb, adjusted for earning capacity, occupation and age — a leg cannot be worth more than losing it. WITHOUT this the cap is reported but NOT applied, because two untagged impairments might be on different limbs and capping them together would under-rate the case."
            },
            "combine_method": {
              "type": "string",
              "enum": [
                "exclude"
              ],
              "description": "PDRS p. 1-11. Set to 'exclude' on an impairment that duplicates another line in the same extremity group, so it is dropped before the group is composited rather than rating the same loss twice. Worth up to 11 points of PD on a single shoulder — the excluded line is named in the rating string, after the word \"excluded\", so the omission is visible to anyone checking the string against the report."
            },
            "analogized_to": {
              "type": "string",
              "description": "Snake-case spelling of analogizedTo, accepted identically by the engine. Both are listed because both work: a JSON caller writing snake_case throughout would otherwise have a valid request rejected by this schema."
            }
          },
          "additionalProperties": false
        }
      },
      "prior_awards": {
        "type": "array",
        "description": "LC 4664(b). Only a prior AWARD counts — not a claim, settlement figure, or rating.",
        "items": {
          "type": "object",
          "properties": {
            "percent": {
              "type": "integer"
            },
            "region_code": {
              "type": "string"
            }
          },
          "required": [
            "percent"
          ]
        }
      },
      "occupation_group": {
        "type": "string",
        "description": "PDRS Section 3A group for the WORKER, e.g. \"380\". Applies to every impairment that does not state its own. An impairment-level group overrides it."
      },
      "occupation_title": {
        "type": "string",
        "description": "The job title, looked up in Section 3A when no group is given. Returns the group, or null with candidates when a title maps to several — the calculator will not pick one."
      },
      "is_ct": {
        "type": "boolean",
        "description": "true for a continuous-trauma claim. The engine then requires the LC 5412 date of injury — when disability and knowledge of work-relatedness CONCURRED, not the end of the exposure period — because that date selects the rating era (FEC ranks before 2013, the 1.4 modifier after)."
      },
      "ptd_presumption": {
        "type": "string",
        "enum": [
          "both_eyes",
          "both_hands",
          "paralysis",
          "brain"
        ],
        "description": "LC 4662(a): 100% as a matter of law."
      },
      "employee_count": {
        "type": "integer",
        "description": "Employees at the time of injury. LC 4658(d)(2) excludes employers with fewer than 50 from the return-to-work adjustment."
      },
      "rtw_offer_made": {
        "type": "boolean",
        "description": "LC 4658(d)(3): regular/modified/alternative work offered within 60 days of P&S for at least 12 months, whether or not the employee accepted. OMIT when unknown — an unstated offer is not \"no offer\", and the two branches differ by 30 points of the award. 2005-2012 injuries only; SB 863 removed this for 2013+."
      },
      "rtw_offer_terminated_early": {
        "type": "boolean",
        "description": "LC 4658(d)(3): the offered work ended before 12 months, reverting to the 15% increase."
      },
      "kite_addition": {
        "type": "boolean",
        "description": "Kite (Athens Administrators v. WCAB): also rate the case by ADDING the per-impairment finals instead of the Combined Values Chart, as a separate scenario. Requires the physician to have explained WHY the disabilities are synergistic — never applied by default, because addition always yields a figure at least as large as the chart."
      },
      "applyRegionalCap": {
        "type": "boolean"
      }
    }
  },
  "required": {
    "doi": "Date of injury, YYYY-MM-DD. Selects the whole statutory period: FEC vs the 1.4 multiplier (LC 4660.1, 2013+), the LC 4658 weeks table, the LC 4453 earnings caps. Refused if absent or before 2005-01-01. For a cumulative trauma this is the LC 5412 date, not the period end.",
    "impairments[].wpi": "Whole person impairment percent for that body part. A missing figure is NOT a zero — null, \"\" and true are all refused, because a WPI that failed to extract once rated as 0% and made the body part vanish from the award with no note."
  },
  "strongly_recommended": {
    "dob": "Date of birth — the preferred way to establish age. Age at the date of injury is computed from it, which removes the off-by-one nobody notices and the exam-age confusion.",
    "age": "Age at DATE OF INJURY (not today). Needed only when no date of birth is available. Refused if neither is present.",
    "impairments[].occupation_group": "PDRS Section 3A group number, e.g. \"380\". With the impairment number this resolves the Section 4 occupational variant. Absent, the variant defaults to F (average) and the rating is flagged VERIFY — on a real case that election spanned 3 PD points.",
    "impairments[].impairment_number": "e.g. \"16.05.00.00\". Resolves the variant and, for a pre-2013 injury, the FEC rank.",
    "awe": "Average weekly earnings at injury. Without it a PD PERCENTAGE is still returned but no dollars. Capped by LC 4453 — for 2014+ injuries the PD rate is the $290 maximum at any AWE above $652.50, so an exact wage often does not change the money."
  },
  "impairment_fields": {
    "body_part": "label only — does not affect arithmetic",
    "wpi": "whole person impairment %",
    "value": "alternative to wpi when the figure is on another scale — use with `scale`",
    "scale": "wpi | ue | le | hand | foot | digit:thumb|index|middle|ring|little — converted to WPI",
    "gaf": "psych: a GAF score 1-100, converted to WPI (PDRS Section 1)",
    "impairment_number": "PDRS impairment number",
    "analogizedTo": "for a .99 (unlisted) impairment: the number it is analogized to. Never guessed.",
    "occupation_group": "PDRS Section 3A group number",
    "occupation_title": "a job title — looked up against 1,763 Section 3A titles when no group is given",
    "variant": "occupational variant C..J — overrides the Section 4 lookup",
    "fec_rank": "FEC rank 1-8, for a 2005-2012 injury. Supply it: inferring the rank from an impairment-number prefix is a guess, and different ranks share prefixes.",
    "pain_add_on": "AMA Ch.18 pain add-on, 0-3 WPI. Capped at 3 PER INJURY across all parts, and dropped with a note on a spine DRE rating, which already encompasses pain.",
    "wpi_includes_pain": "true when the stated WPI already contains the pain add-on — prevents adding it twice",
    "strict_wpi": "the strict AMA figure, when an Almaraz/Guzman alternative is also given",
    "almaraz_guzman_wpi": "the Almaraz/Guzman rebuttal figure — rated alongside the strict one so the difference is visible",
    "superseded_wpi": "a figure this one replaces (an amended report) — recorded, not rated",
    "non_industrial_percent": "LC 4663 apportionment: the NON-industrial percent the physician carves out. Pass 20 for \"80% industrial\". The inversion flips the result.",
    "apportionment_industrial_percent": "the same thing stated the other way — the industrial share",
    "causation": "direct | compensable_consequence",
    "compensable_consequence": "sleep | sexual | psych — for a 2013+ injury these add NO PD as a compensable consequence of a physical injury (LC 4660.1(c))",
    "violent_act": "true — preserves a psych add-on that LC 4660.1(c) would otherwise bar",
    "catastrophic": "true — same exception, catastrophic injury",
    "region_group": "a shared tag on impairments in the SAME extremity, so they are combined at the regional (UE/LE) scale BEFORE per-impairment rating",
    "extremity_id": "which limb (\"left leg\", \"right arm\"). Groups the limb's impairments so they combine with each other first, and applies the amputation ceiling — a limb cannot rate above losing it (PDRS p. 1-11).",
    "combine_method": "'exclude' — drop this line as duplicative of another in the same extremity group, before the group is composited, so one loss is not rated twice. Worth up to 11 PD points on one shoulder; the excluded number is named in the rating string so the omission is visible to whoever checks it against the report.",
    "analogized_to": "snake-case spelling of analogizedTo — both are read",
    "type": "sleep | sexual | psych, when causation is given separately",
    "label": "free text for the report"
  },
  "case_fields": {
    "occupation_group": "PDRS Section 3A group for the WORKER, e.g. \"380\" — applies to every impairment that does not state its own. This is the single most consequential election in the rating: without it the Section 4 variant defaults to F and the result is marked provisional",
    "occupation_title": "the job title, looked up in Section 3A when no group is given. A title that maps to several groups returns null with the candidates rather than a pick",
    "dob": "date of birth, YYYY-MM-DD — the PREFERRED way to establish age. Age at the DATE OF INJURY is derived from it, which removes the birthday off-by-one and the age-at-exam confusion. Supply this rather than `age` whenever the report gives it",
    "today": "today's date, YYYY-MM-DD — INJECTED, never read from a clock, so the same inputs give the same rating next year. The only thing it decides is whether a date of injury is in the FUTURE, which is the shape a mistyped year takes",
    "ttd_max": "the temporary-disability maximum weekly rate for the YEAR OF INJURY. Needed only for a 100% rating: PTD is paid weekly for life (LC 4659(b)) at two-thirds of earnings capped at that year's TTD max. WITHOUT IT a 100% rating returns no weekly figure at all — the caps change yearly and are not tabled here, so the service refuses rather than guessing one",
    "age": "age at date of injury",
    "doi": "date of injury",
    "awe": "average weekly earnings",
    "impairments": "the array above",
    "prior_awards": "LC 4664(b): [{percent, region_code}] — a prior AWARD of PD supports subtraction. A prior claim, injury, settlement figure or rating is NOT an award.",
    "is_ct": "true for a continuous-trauma claim. The date of injury must then be the LC 5412 date (disability + knowledge of work-relatedness concurred), NOT the end of exposure — that date selects the rating era, so the wrong one changes every figure downstream. The engine has carried this safeguard since it was written; until now no form field could reach it.",
    "ptd_presumption": "both_eyes | both_hands | paralysis | brain — LC 4662(a) conclusive presumption of 100% permanent total disability as a matter of law",
    "employee_count": "employees at the time of injury — LC 4658(d)(2) excludes employers under 50 from the ±15% return-to-work adjustment (2005-2012 injuries only)",
    "rtw_offer_made": "true | false — LC 4658(d)(3), a qualifying offer of regular/modified/alternative work within 60 days of P&S. OMIT when unknown: the calculator will not choose between +15% and -15% on silence",
    "rtw_offer_terminated_early": "true — the offered work ended before 12 months, reverting to the 15% increase (LC 4658(d)(3))",
    "kite_addition": "true to ALSO rate the case by addition (Kite) beside the Combined Values Chart figure. The chart still governs unless the report explains the synergy",
    "applyRegionalCap": "true to apply the regional cap"
  },
  "report_fields": {
    "_endpoint": "POST /rate-reports with { doi, dob|age, awe?, occupation_group|occupation_title, reports: [...] }. Case facts stay at the top level — a report that carries its own doi/dob/age/awe is REFUSED, because those are facts about the worker, not findings.",
    "physician": "who wrote the report. Two reports with the same physician and no date cannot be told apart in the comparison, and the result says so",
    "role": "PQME | AME | treating | QME — recorded, never used to rank the reports. Which report governs turns on its adequacy and reasoning, which is not arithmetic",
    "date": "the report date, YYYY-MM-DD (the FORM spells this field `report_date`). It is what distinguishes a supplemental report from the same physician",
    "superseded_by": "name of a later report that replaces this one — recorded, not applied",
    "impairments": "that report's OWN findings, same shape as the impairments array above. They are never merged with another report's: merging invents a combination no physician stated",
    "_returns": "reports: [...] — each report rated on its own findings, carrying its own final_pd_percent, dollars and rating_string, or `refused: true` with the reason. Plus `comparison`.",
    "comparison.comparable": "false when fewer than two reports rated — nothing to compare, and `note` says which",
    "comparison.highest": "the report with the highest rating: { physician, date, final_pd_percent, dollars }",
    "comparison.lowest": "the same, for the lowest",
    "comparison.spread_pd_points": "highest minus lowest, in PD points — the size of the dispute",
    "comparison.spread_dollars": "and in dollars, when earnings were supplied",
    "comparison.all": "every rated report, highest first, for a table",
    "comparison.ambiguous_labels": "true when two or more reports share a physician AND have no date — they cannot be told apart, so neither figure can be traced back to a document",
    "comparison.note": "why the calculator does NOT choose between them: which report governs turns on adequacy, the physician's role, service, and whether apportionment is explained how-and-why (Escobedo) — none of it arithmetic"
  },
  "injury_fields": {
    "_endpoint": "POST /injuries with { dob|age, awe?, occupation_group|occupation_title, injuries: [...] }. Facts about the WORKER stay at the top level; each injury carries only what belongs to it.",
    "_worker_facts": "an injury may NOT carry age, dob, awe, occupation_group, occupation_title, ptd_presumption or prior_awards — those are true of the PERSON and are stated once at the top level. Sending one on an injury is refused rather than silently applied: an LC 4662(a) presumption on a single injury once rated it 100% permanent total while the other injuries awarded separately alongside it. Only doi differs between injuries, which is what makes each a separate award",
    "injury_id": "how this injury is identified — a claim number or a date. Used to label its award",
    "doi": "THIS injury's date of injury. It selects the era, the LC 4658 weeks table and the LC 4453 caps, which is exactly why two injuries cannot share one rating",
    "impairments": "that injury's own findings, same shape as the impairments array above",
    "intertwined": "true only where the evaluator found the disability inextricably intertwined. That is a MEDICAL finding, never an arithmetic election — absent it, the awards stay separate. Stated, the response gains `intertwined_combined`: the same case as ONE combined award, priced from the earliest date of injury, shown beside the separate awards rather than replacing them",
    "_returns": "per_injury: [...] with one rating and one award each, plus total_dollars. The awards are SUMMED, never combined on the chart. `intertwined_combined` appears only when an injury states intertwined:true",
    "per_injury[]": "one entry per injury, labelled with its injury_id and doi, carrying the same shape /rate returns — or `refused: true` with the reason, because one injury refusing must not discard the others",
    "total_dollars": "the awards SUMMED. Never combined on the Combined Values Chart: that would produce a single higher rating, which is what Benson forbids. Covers only the injuries that RATED — see `partial`",
    "partial": "true when one or more injuries were refused. total_dollars then covers only the rated ones and is a PARTIAL award: rated_injuries and total_injuries give the count, and notes names which were left out. Absent when every injury rated, so its presence is the signal — a total with an injury missing was otherwise byte-identical to the same case with that injury never sent",
    "intertwined_combined": "the same case as ONE combined award — final_pd_percent, weeks, dollars, the operands, and difference_dollars against the separate awards. Priced from the EARLIEST date of injury, because one award has one date and that date selects the era and the caps",
    "note": "states the Benson rule being applied, so a figure quoted from this endpoint carries its own justification"
  },
  "lookup_endpoints": {
    "GET /search": "the general lookup. ?q=<text>&kind=<occupation|group|impairment|bodypart>&limit=25. `bodypart` searches impairment DESCRIPTIONS (\"shoulder\", \"cervical\") rather than numbers — the one to use when you have a report and not a schedule. Returns { kind, q, total, truncated, results: [{ value, label, ... }] }. An occupation row carries `ambiguous: true` and `groups_by_industry` when the title maps to several groups — BAKER is 322 in hotel & restaurant and 420 in bakery products, 25% against 30% on one lumbar impairment. Ask the industry rather than submitting `value`: once a GROUP is posted there is no title left to be ambiguous, so the rating comes back neither provisional nor noted",
    "GET /occupations": "job title -> Section 3A group. ?q=<title>&industry=<optional>. Returns { group, matchedTitle, exact } — or group:null with `ambiguous` and `groups_by_industry` when one title maps to several groups, because that election is outcome-material and is the caller's to make",
    "GET /catalog": "every table-backed list at once — occupation groups, titles, impairment numbers and the enums. Use it to OFFER choices rather than ask someone to type a key into a PDRS table. Each impairment row carries `has_variant` (whether Section 4 reaches it by exact, range or wildcard match — false means the occupational variant DEFAULTS to F and the rating comes back provisional), `has_fec_rank`, and `fec_rank_source`: section2 for a row printed in the schedule, prefix for a rank inferred from the number's prefix (the ledger marks those \"(assumed)\"), none where the schedule gives no rank at all — 18.00.00.00 Pain uses the involved body part's rank and refuses on its own. An occupation_groups row counts only the titles that resolve to that group and only that group; a title shared with another group by industry is listed separately in `shared_titles` rather than counted as a member, because presenting it as settled makes the industry election for the reader",
    "POST /sibtf": "LC 4751, the Subsequent Injuries Benefits Trust Fund 35% test: { wpis: [20, 15], industrial_share: 80 } returns { threshold, readings, qualifies_on, note }. The test is on the SUBSEQUENT injury alone and on RAW whole-person impairment — before FEC, occupation and age — so it cannot be read off a /rate response, which returns the adjusted figure. Every reading is returned (combined, added, and each apportioned) rather than one, because whether the test adds or combines, and whether apportionment applies to it, are attorney questions this service does not decide",
    "POST /combine": "the Combined Values Chart on its own: { values: [36, 28] } returns { values, combined, sum, overstatement, note }. `sum` and `overstatement` show what ADDING would have cost — impairments combine, they do not add"
  },
  "returns": {
    "final_pd_percent": "the answer",
    "combined_pd_percent": "before apportionment and prior awards",
    "net_pd_percent": "after apportionment",
    "weeks": "LC 4658 weeks of PD",
    "weekly_rate": "LC 4453 PD weekly rate (capped)",
    "dollars": "the PD award",
    "ptd": "true when the rating is 100% — permanent TOTAL disability. There is no weeks figure and no lump-sum PD award: the worker is paid weekly for life (LC 4659(b)).",
    "ptd_weekly": "The PTD weekly payment: two-thirds of average weekly earnings, capped at the TTD maximum for the year of injury. Present only when earnings were supplied.",
    "apportionment_cost_pd_points": "how many PD points LC 4663 apportionment removed. Present only when it removed some. The flag and the pre-apportionment percentage were both already returned, and a reader had to do the subtraction — on a real file that is four points and $14,500 carried by one sentence of a physician's opinion.",
    "apportionment_cost_dollars": "the same reduction priced, when earnings are supplied. Escobedo requires the physician to explain HOW and WHY, not merely state a percentage; an opinion that does not is struck in full and the rating reverts to the higher figure. This is the amount at stake.",
    "occupation_group_used": "the Section 3A group every variant in this rating was read from. Present whenever a group was used, because a bare group number is taken on trust and then disappears into the variant: one real file rated 481 on one run and 482 on the next — both defensible for an iron worker — and returned 64% against 68%, a $9,280 difference with no warning either time. The accompanying note says whether it was resolved from a listed title or supplied.",
    "life_pension_weekly": "LC 4659 — only when PD reaches 70%",
    "life_pension_attaches": "false when the rating is under 70%, so the absence of life_pension_weekly is a stated finding rather than a missing field. A reader who sees nothing supplies the threshold from memory — an agent rating a 68% case did exactly that, recalled 60%, and promised a lifetime payment stream that does not exist.",
    "impairments[].steps": "every arithmetic step, in the order applied",
    "rating_string": "THE DEU NOTATION — one line per impairment, then the combine, then the money. This is what a rater transcribes onto a form or reads to opposing counsel: \"15.03.02.00 - 20 - [1.4]28 - 380H - 34 - 36%\". Each line has a `kind` (impairment | combine | combine_limb | money) and a `text`",
    "impairments": "one entry per rated body part, each with its own final, variant, ageBand, steps and scale_conversion. `assumed: true` marks an impairment whose rating rests on something the calculator supplied rather than the caller",
    "excluded_impairments": "body parts that were NOT rated, with the reason — currently the LC 4660.1(c) bar on sleep/sexual/psych as a compensable consequence of a physical injury. An impairment that vanishes without this record reads as a calculator that lost it",
    "age": "age at the DATE OF INJURY, as derived — echoed so the Section 6 band can be checked",
    "doi": "the date of injury as parsed, normalised to YYYY-MM-DD",
    "apportioned": "true when any impairment carried apportionment (LC 4663)",
    "net_pd_percent_after_prior_awards": "after the LC 4664(b) subtraction, when prior awards are given",
    "prior_awards": "the prior awards as read, echoed so the subtraction can be checked",
    "pd_by_region": "PD by body region — the input to the LC 4664(c)(1) lifetime regional cap",
    "alternative": "THE ALMARAZ/GUZMAN SCENARIO, present only when almaraz_guzman_wpi was given. The same case rated on the rebuttal figure, with the difference in PD points and dollars. Shown BESIDE the strict rating, never merged — which governs turns on the report's reasoning, not arithmetic",
    "kite_addition": "THE KITE SCENARIO, present only when kite_addition was requested. The same case with the per-impairment finals ADDED rather than combined on the chart, and the difference priced",
    "rtw_adjustment": "LC 4658(d)(2)/(3), for 2005-2012 injuries. Reports the ±15% branch and, when decided, `adjusted_dollars_if_all_remaining` — an UPPER BOUND, because the statute adjusts only the payments remaining from the trigger date",
    "zero_pd": "true when the rating is 0% — a finding about the case, not a missing figure",
    "awe_unreadable": "true when earnings were supplied and could not be read as a number",
    "awe_out_of_range": "true when earnings were readable but not positive",
    "ptd_needs_ttd_max": "true when a 100% rating has earnings but no ttd_max, so no weekly figure could be computed",
    "notes": "ASSUMPTIONS AND WARNINGS. Read these — a defaulted variant or an inferred FEC rank appears here, and an assumption the reader does not see reads as a finding."
  },
  "errors": {
    "400": "malformed request",
    "422": "REFUSED — the request was understood and deliberately not answered. Go and find the missing figure; do not retry with a placeholder."
  }
}