# REVEAL 2.0 PAH risk score

REVEAL 2.0

Status: LIVE
Price: $0.005 USDC
`GET /api/calc/reveal_pah`
HTML: https://magentlab.com/docs/reveal-pah
Markdown: https://magentlab.com/docs/reveal-pah.md

Not a medical device. Not a diagnosis, dose, or listing recommendation.

## What it computes

Sum Benza 2019 REVEAL 2.0 points from etiology, demographics, renal insufficiency, WHO functional class, 6-month hospitalization, vitals, 6MWD, BNP or NT-proBNP, echo, DLCO, and hemodynamics, and return the published low / intermediate / high 12-month mortality category.

## When to use

When an agent needs the published REVEAL 2.0 point total and three-category 12-month mortality band and must not invent a PAH diagnosis, a dose, REVEAL 1.0 cutoffs, or REVEAL Lite 2.

## When not to use

- Not a medical device. Not a PAH diagnosis, transplant listing, or a medication dose.
- Caller-assigned inputs. magent does not walk the patient, assay BNP, interpret the echocardiogram, measure DLCO, or catheterize.
- REVEAL 2.0 only (Benza 2019). Not the 2012 REVEAL 1.0 calculator and not REVEAL Lite 2.

## Formula

```
REVEAL 2.0 = 6 + etiology + male_gt_60 + renal_insufficiency + who_fc + hospitalization_6mo + sbp_lt_110 + hr_gt_96 + six_minute_walk + bnp_or_nt_probnp + pericardial_effusion + dlco_lt_40 + mrap_gt_20 + pvr_lt_5; etiology ctd +1, poph +3, heritable +2, other 0; male and age >60 +2; eGFR <60 or renal insufficiency +1; WHO FC I -1, II 0, III +1, IV +2; all-cause hospitalization in prior 6 months +1; SBP <110 mmHg +1; HR >96 bpm +1; 6MWD >=440 m -2, 320-<440 m -1, 165-<320 m 0, <165 m +1; BNP <50 or NT-proBNP <300 -2, BNP 50-<200 or NT-proBNP 300-<1100 0, BNP 200-<800 +1, BNP >=800 or NT-proBNP >=1100 +2; pericardial effusion +1; DLCO <40% predicted +1; mRAP >20 mmHg +1; PVR <5 WU -1; low 0-6, intermediate 7-8, high >=9 (12-month mortality); max 23
```

## Citation

[Predicting Survival in Patients With Pulmonary Arterial Hypertension: The REVEAL Risk Score Calculator 2.0 and Comparison With ESC/ERS-Based Risk Assessment Strategies](https://doi.org/10.1016/j.chest.2018.11.030)
Benza RL, Gomberg-Maitland M, Elliott CG, et al.
Chest. 2019;156(2):323-337
DOI: [10.1016/j.chest.2018.11.030](https://doi.org/10.1016/j.chest.2018.11.030)

## Worked example

### Lowest-risk published combination

Given: `age=40, bnp_pg_ml=40, dlco_lt_40=false, etiology=other, hospitalization_6mo=false, hr_gt_96=false, male=false, mrap_gt_20=false, pericardial_effusion=false, pvr_lt_5=true, renal_insufficiency=false, sbp_lt_110=false, six_minute_walk_m=480, who_fc=1`

1. start = 6
2. WHO FC I = -1
3. 6MWD >=440 m = -2
4. BNP <50 pg/mL = -2
5. PVR <5 WU = -1
6. score = 0
7. low (0-6)


### WHO FC III otherwise neutral

Given: `age=40, bnp_pg_ml=100, dlco_lt_40=false, etiology=other, hospitalization_6mo=false, hr_gt_96=false, male=false, mrap_gt_20=false, pericardial_effusion=false, pvr_lt_5=false, renal_insufficiency=false, sbp_lt_110=false, six_minute_walk_m=200, who_fc=3`

1. start = 6
2. WHO FC III = +1
3. score = 7
4. intermediate (7-8)


## Also searched as

- REVEAL 2.0
- REVEAL risk score
- pulmonary arterial hypertension risk
- Benza 2019
- PAH 12-month mortality
- WHO functional class PAH
- REVEAL registry 2.0

## Parameters

- `who_fc` (integer, required): WHO / NYHA functional class 1, 2, 3, or 4 (Benza 2019). FC I -1; II 0; III +1; IV +2. Caller-assigned; magent does not interview the patient.
- `etiology` (string, required): PAH subgroup (Benza 2019). other (including idiopathic) 0; ctd +1; poph +3; heritable +2. Mutually exclusive. Caller-assigned.
- `age` (integer, required): Age in years (18-120). Male and age >60 scores +2 (Benza 2019).
- `male` (boolean, required): Male sex as assigned by the caller. true or false. Scores +2 only when age >60.
- `renal_insufficiency` (boolean, required): eGFR <60 mL/min/1.73 m2 or renal insufficiency by clinical judgment when eGFR is unavailable (Benza 2019). true or false. +1 if true. magent does not compute eGFR.
- `hospitalization_6mo` (boolean, required): All-cause hospitalization in the prior 6 months (Benza 2019). true or false. +1 if true.
- `sbp_lt_110` (boolean, required): Systolic blood pressure <110 mmHg as assigned by the caller (Benza 2019). true or false. +1 if true. magent does not measure blood pressure.
- `hr_gt_96` (boolean, required): Heart rate >96 bpm as assigned by the caller (Benza 2019 REVEAL 2.0, not the 1.0 >92 cutoff). true or false. +1 if true.
- `six_minute_walk_m` (number, required): Six-minute walk distance in meters 0-1000 (Benza 2019). >=440 -2; 320-<440 -1; 165-<320 0; <165 +1. Caller-assigned; magent does not time the walk.
- `bnp_pg_ml` (number, required): BNP in pg/mL 0-35000 (Benza 2019). <50 -2; 50-<200 0; 200-<800 +1; >=800 +2. Omit only when sending nt_probnp_pg_ml instead. magent does not assay BNP.
- `nt_probnp_pg_ml` (number, optional): NT-proBNP in pg/mL 0-35000 when BNP is not sent (Benza 2019). <300 -2; 300-<1100 0; >=1100 +2. BNP is used when both are sent.
- `pericardial_effusion` (boolean, required): Pericardial effusion on echocardiography as assigned by the caller (Benza 2019). true or false. +1 if true. magent does not read the echocardiogram.
- `dlco_lt_40` (boolean, required): DLCO <40% predicted as assigned by the caller (Benza 2019 REVEAL 2.0, not the 1.0 <=32 / >=80 bands). true or false. +1 if true.
- `mrap_gt_20` (boolean, required): Mean right atrial pressure >20 mmHg within 1 year as assigned by the caller (Benza 2019). true or false. +1 if true. magent does not catheterize.
- `pvr_lt_5` (boolean, required): Pulmonary vascular resistance <5 Wood units as assigned by the caller (Benza 2019 REVEAL 2.0, not the 1.0 >32 WU band). true or false. -1 if true.

## Bulk (POST)

POST the same path with a JSON items array. The first item is the GET unit; each additional item is $0.002. Invalid items return HTTP 400 before settlement.

Method: `POST /api/calc/reveal_pah`
Max items: 25
Price: unit_amount + extra_item_amount * (n - 1) (unit 5000 atomic, extra 2000 atomic)
Status: PREVIEW

- 1 to 25 items. Each item uses the same keys as the GET query parameters.
- POST of 1 item costs the same as GET. Lists longer than 25: chunk into multiple POSTs. Extra items still execute; do not pad dummy rows.
- The first invalid item fails the whole request (index in the 400 JSON). You are not charged.
- HTTP 200 is {count, path, items}. Each items[i] is the GET 200 body for that row.
- Catalog misses (empty matches, found=false) stay paid 200s inside that slot.
- x402 resource URL is this path plus n and body_sha256. Browsers that prefer text/html get the same paywall as GET; Pay retries POST with the same items.

Example request:

```json
{
  "items": [
    {
      "age": "40",
      "bnp_pg_ml": "40",
      "dlco_lt_40": "false",
      "etiology": "other",
      "hospitalization_6mo": "false",
      "hr_gt_96": "false",
      "male": "false",
      "mrap_gt_20": "false",
      "pericardial_effusion": "false",
      "pvr_lt_5": "true",
      "renal_insufficiency": "false",
      "sbp_lt_110": "false",
      "six_minute_walk_m": "480",
      "who_fc": "1"
    },
    {
      "age": "40",
      "bnp_pg_ml": "40",
      "dlco_lt_40": "false",
      "etiology": "other",
      "hospitalization_6mo": "false",
      "hr_gt_96": "false",
      "male": "false",
      "mrap_gt_20": "false",
      "pericardial_effusion": "false",
      "pvr_lt_5": "true",
      "renal_insufficiency": "false",
      "sbp_lt_110": "false",
      "six_minute_walk_m": "480",
      "who_fc": "1"
    }
  ]
}
```

Human paywall (two-item fixture): https://api.magentlab.com/paywall/bulk/reveal-pah

Example 200:

```json
{
  "count": 2,
  "path": "/api/calc/reveal_pah",
  "items": [
    {
      "components": [
        {
          "factor": "reveal_2_0_start",
          "points": 6,
          "present": true
        },
        {
          "value": "other",
          "factor": "etiology",
          "points": 0,
          "present": false
        },
        {
          "value": 40,
          "factor": "male_gt_60",
          "points": 0,
          "present": false
        },
        {
          "factor": "renal_insufficiency",
          "points": 0,
          "present": false
        },
        {
          "value": 1,
          "factor": "who_fc",
          "points": -1,
          "present": true
        },
        {
          "factor": "hospitalization_6mo",
          "points": 0,
          "present": false
        },
        {
          "factor": "sbp_lt_110",
          "points": 0,
          "present": false
        },
        {
          "factor": "hr_gt_96",
          "points": 0,
          "present": false
        },
        {
          "value": 480.0,
          "factor": "six_minute_walk",
          "points": -2,
          "present": true
        },
        {
          "value": 40.0,
          "factor": "bnp_or_nt_probnp",
          "points": -2,
          "present": true
        },
        {
          "factor": "pericardial_effusion",
          "points": 0,
          "present": false
        },
        {
          "factor": "dlco_lt_40",
          "points": 0,
          "present": false
        },
        {
          "factor": "mrap_gt_20",
          "points": 0,
          "present": false
        },
        {
          "factor": "pvr_lt_5",
          "points": -1,
          "present": true
        }
      ],
      "disclaimer": "Not a medical device. Deterministic published-formula or published-code output for autonomous agents. A licensed clinician remains responsible for patient care and billing submissions.",
      "citation": {
        "authors": "Benza RL, Gomberg-Maitland M, Elliott CG, et al.",
        "doi": "10.1016/j.chest.2018.11.030",
        "id": "benza-2019",
        "pmid": "30772387",
        "source": "Chest. 2019;156(2):323-337",
        "title": "Predicting Survival in Patients With Pulmonary Arterial Hypertension: The REVEAL Risk Score Calculator 2.0 and Comparison With ESC/ERS-Based Risk Assessment Strategies"
      },
      "formula": "reveal_pah",
      "formula_expression": "REVEAL 2.0 = 6 + etiology + male_gt_60 + renal_insufficiency + who_fc + hospitalization_6mo + sbp_lt_110 + hr_gt_96 + six_minute_walk + bnp_or_nt_probnp + pericardial_effusion + dlco_lt_40 + mrap_gt_20 + pvr_lt_5; etiology ctd +1, poph +3, heritable +2, other 0; male and age >60 +2; eGFR <60 or renal insufficiency +1; WHO FC I -1, II 0, III +1, IV +2; all-cause hospitalization in prior 6 months +1; SBP <110 mmHg +1; HR >96 bpm +1; 6MWD >=440 m -2, 320-<440 m -1, 165-<320 m 0, <165 m +1; BNP <50 or NT-proBNP <300 -2, BNP 50-<200 or NT-proBNP 300-<1100 0, BNP 200-<800 +1, BNP >=800 or NT-proBNP >=1100 +2; pericardial effusion +1; DLCO <40% predicted +1; mRAP >20 mmHg +1; PVR <5 WU -1; low 0-6, intermediate 7-8, high >=9 (12-month mortality); max 23",
      "max_score": 23,
      "score": 0,
      "age_years": 40,
      "risk": "low",
      "six_minute_walk_m": 480.0,
      "male": false,
      "renal_insufficiency": false,
      "etiology": "other",
      "dlco_lt_40": false,
      "hospitalization_6mo": false,
      "hr_gt_96": false,
      "mrap_gt_20": false,
      "pericardial_effusion": false,
      "pvr_lt_5": true,
      "sbp_lt_110": false,
      "who_fc": 1,
      "bnp_pg_ml": 40.0
    },
    {
      "components": [
        {
          "factor": "reveal_2_0_start",
          "points": 6,
          "present": true
        },
        {
          "value": "other",
          "factor": "etiology",
          "points": 0,
          "present": false
        },
        {
          "value": 40,
          "factor": "male_gt_60",
          "points": 0,
          "present": false
        },
        {
          "factor": "renal_insufficiency",
          "points": 0,
          "present": false
        },
        {
          "value": 1,
          "factor": "who_fc",
          "points": -1,
          "present": true
        },
        {
          "factor": "hospitalization_6mo",
          "points": 0,
          "present": false
        },
        {
          "factor": "sbp_lt_110",
          "points": 0,
          "present": false
        },
        {
          "factor": "hr_gt_96",
          "points": 0,
          "present": false
        },
        {
          "value": 480.0,
          "factor": "six_minute_walk",
          "points": -2,
          "present": true
        },
        {
          "value": 40.0,
          "factor": "bnp_or_nt_probnp",
          "points": -2,
          "present": true
        },
        {
          "factor": "pericardial_effusion",
          "points": 0,
          "present": false
        },
        {
          "factor": "dlco_lt_40",
          "points": 0,
          "present": false
        },
        {
          "factor": "mrap_gt_20",
          "points": 0,
          "present": false
        },
        {
          "factor": "pvr_lt_5",
          "points": -1,
          "present": true
        }
      ],
      "disclaimer": "Not a medical device. Deterministic published-formula or published-code output for autonomous agents. A licensed clinician remains responsible for patient care and billing submissions.",
      "citation": {
        "authors": "Benza RL, Gomberg-Maitland M, Elliott CG, et al.",
        "doi": "10.1016/j.chest.2018.11.030",
        "id": "benza-2019",
        "pmid": "30772387",
        "source": "Chest. 2019;156(2):323-337",
        "title": "Predicting Survival in Patients With Pulmonary Arterial Hypertension: The REVEAL Risk Score Calculator 2.0 and Comparison With ESC/ERS-Based Risk Assessment Strategies"
      },
      "formula": "reveal_pah",
      "formula_expression": "REVEAL 2.0 = 6 + etiology + male_gt_60 + renal_insufficiency + who_fc + hospitalization_6mo + sbp_lt_110 + hr_gt_96 + six_minute_walk + bnp_or_nt_probnp + pericardial_effusion + dlco_lt_40 + mrap_gt_20 + pvr_lt_5; etiology ctd +1, poph +3, heritable +2, other 0; male and age >60 +2; eGFR <60 or renal insufficiency +1; WHO FC I -1, II 0, III +1, IV +2; all-cause hospitalization in prior 6 months +1; SBP <110 mmHg +1; HR >96 bpm +1; 6MWD >=440 m -2, 320-<440 m -1, 165-<320 m 0, <165 m +1; BNP <50 or NT-proBNP <300 -2, BNP 50-<200 or NT-proBNP 300-<1100 0, BNP 200-<800 +1, BNP >=800 or NT-proBNP >=1100 +2; pericardial effusion +1; DLCO <40% predicted +1; mRAP >20 mmHg +1; PVR <5 WU -1; low 0-6, intermediate 7-8, high >=9 (12-month mortality); max 23",
      "max_score": 23,
      "score": 0,
      "age_years": 40,
      "risk": "low",
      "six_minute_walk_m": 480.0,
      "male": false,
      "renal_insufficiency": false,
      "etiology": "other",
      "dlco_lt_40": false,
      "hospitalization_6mo": false,
      "hr_gt_96": false,
      "mrap_gt_20": false,
      "pericardial_effusion": false,
      "pvr_lt_5": true,
      "sbp_lt_110": false,
      "who_fc": 1,
      "bnp_pg_ml": 40.0
    }
  ]
}
```

## Response fields

- `formula` (string): reveal_pah
- `formula_expression` (string): Exact Benza 2019 expression
- `score` (integer): REVEAL 2.0 points 0-23 including the start of 6
- `max_score` (integer): 23
- `risk` (string): Benza 2019 three-category 12-month mortality: low (0-6), intermediate (7-8), high (>=9). Not a diagnosis or dose.
- `who_fc` (integer): WHO functional class 1-4 used
- `etiology` (string): other, ctd, poph, or heritable
- `age_years` (integer): Age used for male >60
- `male` (boolean): Male flag used
- `renal_insufficiency` (boolean): Renal insufficiency flag used
- `hospitalization_6mo` (boolean): 6-month hospitalization flag used
- `sbp_lt_110` (boolean): SBP <110 flag used
- `hr_gt_96` (boolean): HR >96 flag used
- `six_minute_walk_m` (number): Walk distance in meters used
- `bnp_pg_ml` (number): BNP pg/mL when that peptide was used
- `nt_probnp_pg_ml` (number): NT-proBNP pg/mL when that peptide was used
- `pericardial_effusion` (boolean): Pericardial effusion flag used
- `dlco_lt_40` (boolean): DLCO <40% predicted flag used
- `mrap_gt_20` (boolean): mRAP >20 mmHg flag used
- `pvr_lt_5` (boolean): PVR <5 WU flag used
- `components` (array): Per-factor points including the start of 6
- `citation` (object): Benza et al. Chest 2019 citation
- `disclaimer` (string): Not-a-device notice

## Example JSON

Frozen fixture. Not a live lookup.

```json
{
  "components": [
    {
      "factor": "reveal_2_0_start",
      "points": 6,
      "present": true
    },
    {
      "value": "other",
      "factor": "etiology",
      "points": 0,
      "present": false
    },
    {
      "value": 40,
      "factor": "male_gt_60",
      "points": 0,
      "present": false
    },
    {
      "factor": "renal_insufficiency",
      "points": 0,
      "present": false
    },
    {
      "value": 1,
      "factor": "who_fc",
      "points": -1,
      "present": true
    },
    {
      "factor": "hospitalization_6mo",
      "points": 0,
      "present": false
    },
    {
      "factor": "sbp_lt_110",
      "points": 0,
      "present": false
    },
    {
      "factor": "hr_gt_96",
      "points": 0,
      "present": false
    },
    {
      "value": 480.0,
      "factor": "six_minute_walk",
      "points": -2,
      "present": true
    },
    {
      "value": 40.0,
      "factor": "bnp_or_nt_probnp",
      "points": -2,
      "present": true
    },
    {
      "factor": "pericardial_effusion",
      "points": 0,
      "present": false
    },
    {
      "factor": "dlco_lt_40",
      "points": 0,
      "present": false
    },
    {
      "factor": "mrap_gt_20",
      "points": 0,
      "present": false
    },
    {
      "factor": "pvr_lt_5",
      "points": -1,
      "present": true
    }
  ],
  "disclaimer": "Not a medical device. Deterministic published-formula or published-code output for autonomous agents. A licensed clinician remains responsible for patient care and billing submissions.",
  "citation": {
    "authors": "Benza RL, Gomberg-Maitland M, Elliott CG, et al.",
    "doi": "10.1016/j.chest.2018.11.030",
    "id": "benza-2019",
    "pmid": "30772387",
    "source": "Chest. 2019;156(2):323-337",
    "title": "Predicting Survival in Patients With Pulmonary Arterial Hypertension: The REVEAL Risk Score Calculator 2.0 and Comparison With ESC/ERS-Based Risk Assessment Strategies"
  },
  "formula": "reveal_pah",
  "formula_expression": "REVEAL 2.0 = 6 + etiology + male_gt_60 + renal_insufficiency + who_fc + hospitalization_6mo + sbp_lt_110 + hr_gt_96 + six_minute_walk + bnp_or_nt_probnp + pericardial_effusion + dlco_lt_40 + mrap_gt_20 + pvr_lt_5; etiology ctd +1, poph +3, heritable +2, other 0; male and age >60 +2; eGFR <60 or renal insufficiency +1; WHO FC I -1, II 0, III +1, IV +2; all-cause hospitalization in prior 6 months +1; SBP <110 mmHg +1; HR >96 bpm +1; 6MWD >=440 m -2, 320-<440 m -1, 165-<320 m 0, <165 m +1; BNP <50 or NT-proBNP <300 -2, BNP 50-<200 or NT-proBNP 300-<1100 0, BNP 200-<800 +1, BNP >=800 or NT-proBNP >=1100 +2; pericardial effusion +1; DLCO <40% predicted +1; mRAP >20 mmHg +1; PVR <5 WU -1; low 0-6, intermediate 7-8, high >=9 (12-month mortality); max 23",
  "max_score": 23,
  "score": 0,
  "age_years": 40,
  "risk": "low",
  "six_minute_walk_m": 480.0,
  "male": false,
  "renal_insufficiency": false,
  "etiology": "other",
  "dlco_lt_40": false,
  "hospitalization_6mo": false,
  "hr_gt_96": false,
  "mrap_gt_20": false,
  "pericardial_effusion": false,
  "pvr_lt_5": true,
  "sbp_lt_110": false,
  "who_fc": 1,
  "bnp_pg_ml": 40.0
}
```

## Errors

- HTTP 400 `invalid_who_fc`: who_fc must be 1, 2, 3, or 4 (Benza 2019 REVEAL 2.0 WHO functional class). Returned before settlement; you are not charged.
- HTTP 400 `invalid_flag`: boolean clinical flags must be true or false Returned before settlement; you are not charged.
- HTTP 400 `invalid_age`: age must be an integer from 18 to 120 Returned before settlement; you are not charged.
- HTTP 400 `invalid_6mwd`: Predicted 6MWD needs sex, age 40-80, height, and weight as used in Enright 1998; optional walked_m is a non-negative distance in meters. Returned before settlement; you are not charged.
- HTTP 400 `invalid_bnp_pg_ml`: bnp_pg_ml must be a number from 0 to 35000 (Reed 2010 ROSE). Returned before settlement; you are not charged.
- HTTP 400 `invalid_items`: POST body must be a JSON object with only an items array Returned before settlement; you are not charged.
- HTTP 400 `invalid_item_count`: items must be an array of 1 to 25 objects Returned before settlement; you are not charged.
- HTTP 400 `invalid_item`: each items entry must be a JSON object Returned before settlement; you are not charged.

Shared HTTP 402 and 503: https://magentlab.com/docs/payments

## Related tools

- [Predicted 6MWD](https://magentlab.com/docs/6mwd) — Compute Enright 1998 predicted six-minute walk distance and lower limit of normal from sex, age, height, and weight using the Table 3 height/weight equations.
- [NIVO](https://magentlab.com/docs/nivo) — Sum Hartley 2021 NIVO points from chest radiograph consolidation, GCS ≤14, atrial fibrillation, pH <7.25, time to acidaemia >12 h, and eMRCD, and return the validation Table 4 grouped in-hospital mortality band.

## Payment

Unpaid requests return HTTP 402 even if query parameters or POST items are missing or invalid, so CDP and agents can index the path. After a PAYMENT-SIGNATURE, invalid params return HTTP 400 JSON before settlement. magent does not charge. Fix the params, then request a new 402 quote for that complete URL. Catalog misses (empty matches, found=false) are valid paid 200s.

- GET the tool with Accept: application/json (do not send Accept: text/html unless you want the human paywall).
- HTTP 402 means you have not paid. Decode the base64 PAYMENT-REQUIRED header. HTTP 503 is not a new quote.
- Sign accepts[0] (exact, EIP-3009) with validBefore = now + maxTimeoutSeconds (600 seconds), or accepts[1] (batch-settlement deposit/voucher) on product GET. Ping and POST {items} stay exact. Magent retries transient facilitator 429/5xx before answering.
- Retry the same URL with PAYMENT-SIGNATURE (base64 JSON of accepted and payload). Magent attaches canonical extensions.bazaar on CDP verify/settle; echoing 402 bazaar is optional.
- Success is HTTP 200 JSON plus PAYMENT-RESPONSE. exact settles before the tool. batch-settlement verifies (and deposit-settles) before the tool and commits the charge after HTTP 2xx. HTTP 503: retry the same PAYMENT-SIGNATURE. Mint a new exact nonce only after a new HTTP 402.

- offered `exact` on eip155:8453: Fixed-price USDC on Base. The buyer authorizes the advertised amount (EIP-3009). magent settles before the tool runs (paymentFlow upfront). extra.assetTransferMethod=eip3009 extra.paymentFlow=upfront.
- offered `batch-settlement` on eip155:8453: Payment-channel vouchers claimed later in batches. Exact stays accepts[0]. Same-path POST {items} is still exact. extra.assetTransferMethod=eip3009 extra.paymentFlow=authorization.

- not offered `upto`: Not offered. Usage-based: buyer authorizes a ceiling, seller settles the actual amount after work. Reserved for a future metered tool. Not for current calculators or code search.

Same-path POST {items} is still scheme exact: one EIP-3009 authorization for GET unit plus $0.002 per extra item. That is not x402 batch-settlement (payment channels / vouchers).

Shared HTTP 402 and 503 table: https://magentlab.com/docs/payments

Stdio MCP (one process per host): https://magentlab.com/docs/mcp

## Guarantees

- HTTP 402 is unpaid, including a missing query. After PAYMENT-SIGNATURE, invalid parameters return HTTP 400 before settlement. You are not charged. HTTP 402 never includes the tool JSON.
- exact: settlement finishes before the tool (paymentFlow upfront). batch-settlement: verify/deposit before the tool; chargedCumulativeAmount commits after HTTP 2xx. Uncertain or failed settlement fails closed (HTTP 503). Retry the same PAYMENT-SIGNATURE.
- HTTP 402 is unpaid only. Do not sign a second authorization because of a 503.
- Execution is timeout-bounded and concurrency-capped.
- Calculator inputs are stored encrypted for allowlisted operators (Magent Console). They are not in public logs, SSH lookups, catalog, or rollups. Request logs store path without query.
