---
title: "Check a period's DMR values against the permit's own limits"
method: POST
path: "/dmr/check"
---

# Check a period's DMR values against the permit's own limits

`POST /dmr/check`

## Request

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

A US NPDES permit's Discharge Monitoring Report for one period, checked before it is filed: each value you send (outfall, parameter, statistic, value, unit) is set beside the permit's own limit for that period, from EPA's national limits file (ICIS-NPDES), with EPA's violation rule's verdict: flagged (EPA records a violation), ok, undecidable (a less-than result against a lower limit: EPA does not flag it, nor does it show compliance), no_data (a NODI code), not_graded (an alert or stayed limit), unreadable. A row we cannot place on one value due is refused by its code (outfall.not_in_permit, parameter.not_limited, statistic.not_limited, unit.not_on_form, period.not_due, row.ambiguous with the candidates), never put on the nearest limit. Every value due this period is in `limits` once with its limit_value_id (the cite into EPA's file); `not_sent` lists those you did not send, which EPA records as missing (D90) when filed blank. `headline` and `tally` are the forms as filed with exactly the values placed. `netdmr: true` adds the NetDMR "Import DMRs" file as text (not yet validated by NetDMR's own import check). The values reach our server to be checked and are not kept: only how many were sent, flagged and refused is counted.

## Request body

- object
  - `permit` string, required: The NPDES permit number, e.g. PA0228061.
  - `period_end` string, required: The reporting period: its month (2026-09) or its last day (2026-09-30). A quarterly form is due on the period ending its quarter.
  - `values` object[], required: The period's values, one a row, as the DMR prints them.
    - `outfall` string: The outfall (permitted feature): 001, 1, 002A ...
    - `parameter` string: EPA's parameter code (get_permit's parameter_code: 00530, WEP6L) or its name (Solids, total suspended; TSS; ammonia).
    - `statistic` string: EPA's statistical base code (MK, DD, WA, IA ...) or get_permit's words (monthly average, daily maximum, weekly average).
    - `value` union: The number as filed: 12, 0.5, or a censored result as a string: "<0.10".
      - number
      - string
    - `qualifier` '<' | '<=' | '>' | '>=' | '=': Optional: the value's qualifier, when the value is a bare number.
    - `unit` string: The value's unit, which must be the form's: mg/L, ug/L, lb/d, MGD, SU, #/100mL ... It separates a concentration from a loading.
    - `location` string: Optional: the monitoring location, EPA's code (1 effluent gross, G raw sewage influent, K percent removal) or its name.
    - `form` string: Optional: the DMR form (limit set) when two forms carry the parameter: its designator (A, Q) or name (001 Monthly).
    - `season` string: Optional: the limit's season number when seasonal limits overlap (1, 2).
    - `nodi` string: A no-data code in place of a value: C no discharge, B below detection, 9 conditional monitoring ...
    - `limit_value_id` string: Optional: the limit's id from an earlier check_dmr or fill_dmr answer, in place of outfall, parameter, statistic and unit.
  - `netdmr` boolean: Also return the NetDMR "Import DMRs" file (CSV text) for the values placed.

## Response `200`

Each value beside its limit with EPA's rule's verdict, every value due, the forms' headline and tally

- object

## Other responses

- `400`: permit.missing, permit.malformed, period.missing, period.malformed, values.missing, values.malformed, values.too_many, body.malformed
- `404`: permit.not_held
- `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)
