---
title: "Check a table of measured values against the cited limits held for one place, in one call"
method: POST
path: "/check"
---

# Check a table of measured values against the cited limits held for one place, in one call

`POST /check`

## Request

- Base URL: `https://passage-data.com/api/v1`
- URL: `https://passage-data.com/api/v1/check`
- Auth: one of:
  - none
  - HTTP bearer
  - API key in header `x-api-key`

A lab table of up to 200 rows (parameter, value, unit), each answered by check_value itself: its verdicts (over, under, within, not_comparable with a `why`), `counts` and `says`, or its own coded refusal (an unknown parameter, a value below detection such as <0.005, an ambiguous unit). Each held limit is sent once, in `limits`, and each verdict names it by index (`limit`): joined, they are check_value's row with its `cite`; `compared` keeps the value in the row's unit and whether that conversion is exact. `searched.parameters` says how each parameter was matched. `summary` counts the rows over a limit, under a floor (and over none), within every limit compared, with limits none of which compares, and refused by code. `max_rows` pages each row's verdicts (over first); check_value with `offset` gives the rest. Use it instead of one call a row: the door allows 30 calls in 10 seconds.

## Request body

- object
  - `place` string, required: ISO 3166 code: US, US-OH, CA, CA-QC, DE, FR, IT, EU. One place for the whole table; it also searches every place above it.
  - `medium` 'water_discharge' | 'surface_water' | 'groundwater' | 'drinking_water' | 'soil' | 'ambient_air' | 'air_emission' | 'sediment' | 'leachate'
  - `statistic` string: daily_max, monthly_avg, instant, composite, ...
  - `max_rows` integer: Verdicts returned for each row; its counts cover all.
  - `rows` object[], required: The table's rows, in order; the answer keeps the order.
    - `parameter` string, required: The substance or measure as a regulation names it (copper, ammonia, pH) or its CAS number.
    - `value` union, required: The measured value as the table prints it (0.15, "0,15"). A result below detection ("<0.005") is refused for that row, never compared.
      - number
      - string
    - `unit` string, required: mg/L, µg/L (or ug/L), ng/L, mg/kg, µg/m³, pH ...

## Response `200`

One result a row, in the rows' order, beside the limits they name and a summary; or the call refused once (place.not_held)

- CheckValues
  - `query` object
  - `searched` object
    - `places` string[]
    - `parameters` object: Each parameter as typed: how it was matched (parameter_keys, names_matched, match).
  - `summary` object
    - `rows` integer
    - `over` integer
    - `under` integer
    - `within` integer
    - `not_comparable` integer
    - `refused` integer
    - `refused_by` object
    - `says` string
  - `reads_as` string
  - `packed_as` string
  - `sources_searched` object[]: When a row is rows.none_held: the instruments searched for this place and medium, once.
  - `limits` Row[]
    - `parameter` string
    - `parameter_key` string
    - `value` string
    - `value_num` number, nullable
    - `range` unknown
    - `unit` string, nullable
    - `statistic` string, nullable
    - `direction` string, nullable
    - `kind` string
    - `medium` string
    - `place` string[]
    - `conditions` string[]
    - `cite` Cite
      - `instrument` string
      - `title` string
      - `issuer` string, nullable
      - `edition` string, nullable
      - `section` string, nullable
      - `page` union
        - integer
        - string
      - `quote` string, nullable
      - `source_url` string, nullable
      - `source_sha256` string, nullable
      - `source_status` object: What the daily edition watch last saw at the source: status unchanged, changed (with changed_on and says: the rows are as read from the edition named, not yet re-read) or not verified; checked is the day.
        - `checked` string
        - `status` 'unchanged' | 'changed' | 'not verified'
        - `changed_on` string
        - `says` string
      - `note` string: What the register prints beside the value (e.g. a later or earlier value and its date).
      - `table` string
      - `column` string: The register column the value sits in (e.g. mcl, mclg).
  - `results` object[]
    - `index` integer
    - `outcome` 'over' | 'under' | 'within' | 'not_comparable' | 'refused'
    - `query` object
    - `value` object
    - `counts` object
    - `not_comparable_by` object
    - `says` string
    - `total` integer
    - `returned` integer
    - `next_offset` integer, nullable
    - `verdicts` object[]
      - `limit` integer
      - `verdict` 'over' | 'under' | 'within' | 'not_comparable'
      - `why` object
      - `compared` object
        - `value_in_row_unit` string
        - `exact` boolean
    - `refused` object
  - `refused` object

## Other responses

- `400`: place.missing, rows.missing, rows.malformed, rows.too_many (over 200), body.malformed
- `413`: body.too_large

---

[API](https://skmtc.dev/passage-data/apis/passage-data-cited-environmental-limits.md) · [All operations](https://skmtc.dev/passage-data/apis/passage-data-cited-environmental-limits/llms.txt) · [OpenAPI document](https://skmtc.dev/passage-data/apis/passage-data-cited-environmental-limits/revisions/ba066708bf53?raw)
