# R.E.N.A.L. nephrometry

R.E.N.A.L. nephrometry

Status: LIVE
Price: $0.005 USDC
`GET /api/calc/renal_nephrometry`
HTML: https://magentlab.com/docs/renal-nephrometry
Markdown: https://magentlab.com/docs/renal-nephrometry.md

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

## What it computes

Sum the Kutikov 2009 R.E.N.A.L. nephrometry score for a renal mass from four caller-assigned published item points (radius, exophytic/endophytic, nearness, location) and return the integer total (4–12) plus anterior and hilar descriptors. Does not return complexity bands.

## When to use

When an agent has already assigned Kutikov 2009 radius, exophytic/endophytic properties, nearness to collecting system or sinus, anterior/posterior descriptor, polar-line location, and hilar abutment for a renal mass and needs the published integer sum, not a nephrectomy order, CT read, PADUA, or STONE nephrolithometry.

## When not to use

- Not a medical device. magent does not measure diameter, exophytic fraction, nearness, polar lines, or hilar abutment. Radius, exophytic, nearness, anterior, location, and hilar are caller-assigned.
- Not a nephrectomy order. The score is not a command to operate, choose partial versus radical nephrectomy, or select a surgical approach.
- Not PADUA and not Okhunov 2013 STONE nephrolithometry. This tool is Kutikov 2009 R.E.N.A.L. nephrometry for renal masses.
- Kutikov 2009 Table 1 scores R, E, N, and L (1–3 each). Anterior (a/p/x) and hilar suffix h are descriptors, not points. magent returns score and max_score only; it does not return low/moderate/high complexity bands.

## Formula

```
RENAL = radius (le_4 1, gt_4_lt_7 2, ge_7 3) + exophytic (ge_50 1, lt_50 2, entirely_endophytic 3) + nearness (ge_7 1, gt_4_lt_7 2, le_4 3) + location (entirely_polar 1, crosses_polar 2, gt_50_midline_or_between 3); anterior a|p|x 0 points; hilar suffix h boolean 0 points; Kutikov 2009 R.E.N.A.L. Nephrometry; sum 4-12; no published complexity bands
```

## Citation

[The R.E.N.A.L. Nephrometry Score: A Comprehensive Standardized System for Quantitating Renal Tumor Size, Location and Depth](https://doi.org/10.1016/j.juro.2009.05.035)
Kutikov A, Uzzo RG
J Urol. 2009;182(3):844-853
DOI: [10.1016/j.juro.2009.05.035](https://doi.org/10.1016/j.juro.2009.05.035)

## Worked example

### All minimum grades

Given: `anterior=a, exophytic=ge_50, hilar=false, location=entirely_polar, nearness=ge_7, radius=le_4`

1. le_4 1 + ge_50 1 + ge_7 1 + entirely_polar 1; anterior a; hilar false
2. Score = 4 (max 12); renal_string 4a. No complexity band. Not a nephrectomy order


### All maximum grades

Given: `anterior=x, exophytic=entirely_endophytic, hilar=true, location=gt_50_midline_or_between, nearness=le_4, radius=ge_7`

1. ge_7 3 + entirely_endophytic 3 + le_4 3 + gt_50_midline_or_between 3; anterior x; hilar true
2. Score = 12 (max 12); renal_string 12xh. No complexity band. Not a nephrectomy order


## Also searched as

- RENAL score
- R.E.N.A.L. nephrometry
- Kutikov nephrometry
- renal tumor nephrometry
- Kutikov 2009
- RENAL nephrometry score
- renal mass score
- nephrometry score

## Parameters

- `radius` (string, required): Caller-assigned maximal diameter in cm (Kutikov 2009 R, radius). le_4 (≤4 cm) scores 1; gt_4_lt_7 (>4 but <7 cm) scores 2; ge_7 (≥7 cm) scores 3. magent does not measure diameter or read CT.
- `exophytic` (string, required): Caller-assigned exophytic/endophytic properties (Kutikov 2009 E). ge_50 (≥50% exophytic) scores 1; lt_50 (<50% exophytic) scores 2; entirely_endophytic (completely endophytic) scores 3. magent does not read CT.
- `nearness` (string, required): Caller-assigned nearness of the deepest portion of the mass to the collecting system or sinus in mm (Kutikov 2009 N). ge_7 (≥7 mm) scores 1; gt_4_lt_7 (>4 but <7 mm) scores 2; le_4 (≤4 mm) scores 3. magent does not measure nearness or read CT.
- `anterior` (string, required): Caller-assigned anterior/posterior descriptor (Kutikov 2009 A). a (anterior), p (posterior), or x (indeterminate). 0 points; echoed as anterior. magent does not read CT.
- `location` (string, required): Caller-assigned location relative to polar lines (Kutikov 2009 L). entirely_polar (entirely above the upper polar line or entirely below the lower polar line) scores 1; crosses_polar (mass crosses a polar line) scores 2; gt_50_midline_or_between (>50% of the mass is across a polar line, or the mass crosses the axial renal midline, or the mass is entirely between the polar lines) scores 3. magent does not read CT.
- `hilar` (boolean, required): Caller-assigned hilar suffix (Kutikov 2009). true means the mass abuts the main renal artery or vein (suffix h). Boolean, not points. magent does not read CT.

## 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/renal_nephrometry`
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": [
    {
      "anterior": "a",
      "exophytic": "ge_50",
      "hilar": "false",
      "location": "entirely_polar",
      "nearness": "ge_7",
      "radius": "le_4"
    },
    {
      "anterior": "a",
      "exophytic": "ge_50",
      "hilar": "false",
      "location": "entirely_polar",
      "nearness": "ge_7",
      "radius": "le_4"
    }
  ]
}
```

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

Example 200:

```json
{
  "count": 2,
  "path": "/api/calc/renal_nephrometry",
  "items": [
    {
      "location": "entirely_polar",
      "r": 1,
      "l": 1,
      "n": 1,
      "components": [
        {
          "value": "le_4",
          "factor": "radius",
          "points": 1,
          "present": true
        },
        {
          "value": "ge_50",
          "factor": "exophytic",
          "points": 1,
          "present": true
        },
        {
          "value": "ge_7",
          "factor": "nearness",
          "points": 1,
          "present": true
        },
        {
          "value": "entirely_polar",
          "factor": "location",
          "points": 1,
          "present": true
        }
      ],
      "e": 1,
      "radius": "le_4",
      "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": "Kutikov A, Uzzo RG",
        "doi": "10.1016/j.juro.2009.05.035",
        "id": "kutikov-2009",
        "pmid": "19616235",
        "source": "J Urol. 2009;182(3):844-853",
        "title": "The R.E.N.A.L. Nephrometry Score: A Comprehensive Standardized System for Quantitating Renal Tumor Size, Location and Depth"
      },
      "formula": "renal_nephrometry",
      "formula_expression": "RENAL = radius (le_4 1, gt_4_lt_7 2, ge_7 3) + exophytic (ge_50 1, lt_50 2, entirely_endophytic 3) + nearness (ge_7 1, gt_4_lt_7 2, le_4 3) + location (entirely_polar 1, crosses_polar 2, gt_50_midline_or_between 3); anterior a|p|x 0 points; hilar suffix h boolean 0 points; Kutikov 2009 R.E.N.A.L. Nephrometry; sum 4-12; no published complexity bands",
      "max_score": 12,
      "score": 4,
      "anterior": "a",
      "exophytic": "ge_50",
      "hilar": false,
      "nearness": "ge_7",
      "renal_string": "4a"
    },
    {
      "location": "entirely_polar",
      "r": 1,
      "l": 1,
      "n": 1,
      "components": [
        {
          "value": "le_4",
          "factor": "radius",
          "points": 1,
          "present": true
        },
        {
          "value": "ge_50",
          "factor": "exophytic",
          "points": 1,
          "present": true
        },
        {
          "value": "ge_7",
          "factor": "nearness",
          "points": 1,
          "present": true
        },
        {
          "value": "entirely_polar",
          "factor": "location",
          "points": 1,
          "present": true
        }
      ],
      "e": 1,
      "radius": "le_4",
      "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": "Kutikov A, Uzzo RG",
        "doi": "10.1016/j.juro.2009.05.035",
        "id": "kutikov-2009",
        "pmid": "19616235",
        "source": "J Urol. 2009;182(3):844-853",
        "title": "The R.E.N.A.L. Nephrometry Score: A Comprehensive Standardized System for Quantitating Renal Tumor Size, Location and Depth"
      },
      "formula": "renal_nephrometry",
      "formula_expression": "RENAL = radius (le_4 1, gt_4_lt_7 2, ge_7 3) + exophytic (ge_50 1, lt_50 2, entirely_endophytic 3) + nearness (ge_7 1, gt_4_lt_7 2, le_4 3) + location (entirely_polar 1, crosses_polar 2, gt_50_midline_or_between 3); anterior a|p|x 0 points; hilar suffix h boolean 0 points; Kutikov 2009 R.E.N.A.L. Nephrometry; sum 4-12; no published complexity bands",
      "max_score": 12,
      "score": 4,
      "anterior": "a",
      "exophytic": "ge_50",
      "hilar": false,
      "nearness": "ge_7",
      "renal_string": "4a"
    }
  ]
}
```

## Response fields

- `formula` (string): renal_nephrometry
- `formula_expression` (string): Exact expression used
- `score` (integer): Kutikov 2009 R.E.N.A.L. nephrometry integer sum 4-12 (R+E+N+L). Anterior and hilar are not added. Not a nephrectomy order. No published complexity band.
- `max_score` (integer): 12
- `r` (integer): Radius points 1-3 (Kutikov 2009 R)
- `e` (integer): Exophytic/endophytic points 1-3 (Kutikov 2009 E)
- `n` (integer): Nearness points 1-3 (Kutikov 2009 N)
- `l` (integer): Location points 1-3 (Kutikov 2009 L)
- `radius` (string): Caller-assigned radius used (le_4, gt_4_lt_7, or ge_7)
- `exophytic` (string): Caller-assigned exophytic used (ge_50, lt_50, or entirely_endophytic)
- `nearness` (string): Caller-assigned nearness used (ge_7, gt_4_lt_7, or le_4)
- `anterior` (string): Caller-assigned anterior descriptor used (a, p, or x). 0 points.
- `location` (string): Caller-assigned location used (entirely_polar, crosses_polar, or gt_50_midline_or_between)
- `hilar` (boolean): true when the mass abuts the main renal artery or vein (suffix h). Not scored.
- `renal_string` (string): Kutikov 2009 notation: {score}{anterior} plus h if hilar (for example 4a or 12xh)
- `components` (array): Per-item Kutikov 2009 R, E, N, L points
- `citation` (object): Kutikov and Uzzo J Urol 2009 citation
- `disclaimer` (string): Not-a-device notice

## Example JSON

Frozen fixture. Not a live lookup.

```json
{
  "location": "entirely_polar",
  "r": 1,
  "l": 1,
  "n": 1,
  "components": [
    {
      "value": "le_4",
      "factor": "radius",
      "points": 1,
      "present": true
    },
    {
      "value": "ge_50",
      "factor": "exophytic",
      "points": 1,
      "present": true
    },
    {
      "value": "ge_7",
      "factor": "nearness",
      "points": 1,
      "present": true
    },
    {
      "value": "entirely_polar",
      "factor": "location",
      "points": 1,
      "present": true
    }
  ],
  "e": 1,
  "radius": "le_4",
  "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": "Kutikov A, Uzzo RG",
    "doi": "10.1016/j.juro.2009.05.035",
    "id": "kutikov-2009",
    "pmid": "19616235",
    "source": "J Urol. 2009;182(3):844-853",
    "title": "The R.E.N.A.L. Nephrometry Score: A Comprehensive Standardized System for Quantitating Renal Tumor Size, Location and Depth"
  },
  "formula": "renal_nephrometry",
  "formula_expression": "RENAL = radius (le_4 1, gt_4_lt_7 2, ge_7 3) + exophytic (ge_50 1, lt_50 2, entirely_endophytic 3) + nearness (ge_7 1, gt_4_lt_7 2, le_4 3) + location (entirely_polar 1, crosses_polar 2, gt_50_midline_or_between 3); anterior a|p|x 0 points; hilar suffix h boolean 0 points; Kutikov 2009 R.E.N.A.L. Nephrometry; sum 4-12; no published complexity bands",
  "max_score": 12,
  "score": 4,
  "anterior": "a",
  "exophytic": "ge_50",
  "hilar": false,
  "nearness": "ge_7",
  "renal_string": "4a"
}
```

## Errors

- HTTP 400 `invalid_renal_nephrometry`: radius must be le_4, gt_4_lt_7, or ge_7; exophytic must be ge_50, lt_50, or entirely_endophytic; nearness must be ge_7, gt_4_lt_7, or le_4; anterior must be a, p, or x; location must be entirely_polar, crosses_polar, or gt_50_midline_or_between (Kutikov 2009 R.E.N.A.L.). 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_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

- [STONE nephrolithometry](https://magentlab.com/docs/stone-nephrolithometry) — Sum the Okhunov 2013 STONE nephrolithometry score for kidney calculi (PCNL) from five caller-assigned published item points and return the integer total (5–13). Does not return stone-free-rate bands.

## 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.
