Reference
API reference
Every payload below is computed by the real determination engine against the live permit dataset, not hand-typed JSON. Machine-readable spec at /api/openapi.
Base URL
https://basinwise.vercel.app/api/v1
Auth
Every endpoint is free at the anonymous rate and needs no key to try. Send `Authorization: Bearer bw_live_...` (or `x-api-key`) to lift the throttle to your plan's quota. A `bw_test_...` key runs the real engine against the real permit dataset, is throttled, and never bills. `bw_test_sandbox` is a public sandbox key that works with no signup, so an agent can make a real authenticated call on first contact. No endpoint on this API is paywalled: what a paid plan buys is the generated plan document and the retained inspection record in the app, plus a higher throttle.
Format
JSON. Success is `{ data, request_id, disclaimer }` plus an `attribution` string on free and anonymous responses; errors are `{ error: { code, message, details? }, request_id }`. An unknown field is rejected rather than ignored, and the error carries `details.known_keys` listing the fields the endpoint does read. An unrecognised VALUE is rejected the same way: a boolean field takes a JSON true or false, or one of the text forms true/false/1/0/yes/no/y/n a query string can carry, and anything else returns invalid_request naming the field rather than being coerced to false. Omit a boolean you do not know instead of guessing it. Every /api/v1 endpoint response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; the static discovery documents (the /api/v1 index and /api/openapi) are edge-cached rather than metered and carry none, and on the MCP transport they ride on tools/call, the only method that consumes budget, rather than on initialize, ping or tools/list. A metered caller (a live key on a paid plan) also gets X-Quota-Limit, X-Quota-Used and X-Quota-Remaining for the monthly allowance. All of these are listed in Access-Control-Expose-Headers, so a browser-based agent can read them. A 429 carries the backoff in `error.details`: retry_after_seconds, limit, window_seconds and upgrade_url, mirrored by the Retry-After header.
Determinism
Every response is a projection of a cited permit plus deterministic arithmetic. There is no model in the request path, so the same site always returns the same determination. Every requirement carries the permit section it came from (`citation.sourceCitation`, e.g. "2022 CGP Part 4.1.2") and a `confidence` of "verified" or "unverified"; render "unverified" as Unverified, never as fact. Where we have not read a jurisdiction's permit we return no requirements and say so in `notices`, rather than substituting another permit's numbers. Every determination is stamped with the `datasetVersion` it was computed against, so a saved answer stays defensible after the dataset moves.
Honesty semantics
An empty requirementsarray means we have not read that jurisdiction's permit. It does NOT mean nothing is required. Where a state runs its own programme and we have not verified its permit, we return no requirements and a note naming the agency, rather than substituting the federal permit's numbers.
Two things are outside what this product can do, and both are on every determination in `notices`. We do not perform the physical site inspections the permit requires: a qualified person has to walk the site, and we generate the plan and keep the record. And where a state requires a credentialed preparer, a document generated from this data is a DRAFT for that person to review, amend and sign, not a compliant filed plan. Surface both verbatim; do not summarise them away.
Success envelope
Every success is { data, request_id, disclaimer }, plus an attribution string on free and anonymous responses (paid responses omit it). This body is a real determination for a real site, computed by the same engine the route calls, from curl -X POST https://basinwise.vercel.app/api/v1/determine \.
200 response
{
"data": {
"coverage": "required",
"coverageReason": "The project disturbs 6.5 acres, at or above the 1 acre threshold, so it needs permit coverage.",
"permit": {
"id": "federal-cgp",
"name": "2022 Construction General Permit",
"permitNumber": null,
"version": "2022 CGP (as modified 2025)",
"authority": "U.S. Environmental Protection Agency",
"agencyName": "U.S. Environmental Protection Agency",
"agencyUrl": "https://www.epa.gov/npdes/stormwater-discharges-construction-activities",
"permitUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"effectiveDate": "2022-02-17",
"expiryDate": "2027-02-16",
"confidence": "verified"
},
"jurisdiction": {
"code": "MA",
"name": "Massachusetts",
"npdesAuthorized": false,
"agencyName": "U.S. Environmental Protection Agency (EPA Region 1)",
"agencyUrl": "https://www.epa.gov/npdes/2022-construction-general-permit-cgp",
"credential": {
"required": null,
"name": "Registered professional engineer",
"sourceUrl": "https://www.mass.gov/doc/stormwater-report-checklist/download",
"confidence": "unverified"
},
"confidence": "verified",
"note": "EPA is the permitting authority. Coverage is under EPA's 2022 CGP, permit area MAR100000. MassDEP administers separate state wetlands and water quality requirements that were not verified here; confirm state and municipal requirements alongside the federal permit. The 2022 CGP as modified became effective April 8, 2025 and expires February 16, 2027; confirm the successor permit near that date. Credential: the 2022 CGP imposes no SWPPP preparer credential. It does require inspections by a 'qualified person' (Part 4.1), which is an inspection credential, not a preparation credential."
},
"eligibilityScreens": [
{
"id": "esa",
"label": "Endangered species screening",
"status": "action_required",
"detail": "You must document that you meet one of the endangered species protection criteria before coverage begins. This is a screening you complete, not one we can complete for you.",
"citation": {
"sourceCitation": "Part 1.1.5 (criteria labels corroborated at Part 9.2.1, Seneca Nation)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You can demonstrate you meet one of the criteria in the Endangered Species Protection section of the Notice of Intent (NOI) that you submit for coverage under this permit, per Part 1.4, with respect to the protection of Federally listed",
"confidence": "verified"
}
},
{
"id": "historic",
"label": "Historic properties screening",
"status": "action_required",
"detail": "You must complete the historic properties screening process and keep the documentation with your plan.",
"citation": {
"sourceCitation": "Part 1.1.6 (documentation duty at Part 7.2.9b)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You have completed the screening process in Appendix E relating to the protection of historic properties; and",
"confidence": "verified"
}
},
{
"id": "receiving-water",
"label": "Receiving water sensitivity",
"status": "unknown",
"detail": "You have not confirmed whether the site discharges to a sediment or nutrient impaired water or a Tier 2, 2.5 or 3 water. This changes your inspection frequency, so confirm it before relying on the answer above.",
"citation": {
"sourceCitation": "Part 3.2",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "For any portion of the site that discharges to a sediment or nutrient-impaired water or to a water that is identified by your State, Tribe, or EPA as Tier 2, Tier 2.5, or Tier 3 for antidegradation purposes, 57 you must comply with the",
"confidence": "verified"
}
},
{
"id": "prohibited",
"label": "Prohibited discharges",
"status": "action_required",
"detail": "Certain discharges are prohibited outright, including concrete washout wastewater unless managed by an approved control. Review the prohibited discharge list against your site activities.",
"citation": {
"sourceCitation": "Parts 1.3.1 - 1.3.5",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Wastewater from washout of concrete, unless managed by an appropriate control as described in Part 2.3.4; 1.3.2 Wastewater from washout and/or cleanout of stucco, paint, form release oils, curing compounds, and other construction",
"confidence": "verified"
}
}
],
"requirements": [
{
"id": "inspection.frequency.option1",
"kind": "inspection",
"label": "Inspection frequency, option 1",
"detail": "At least once every seven (7) calendar days",
"value": 7,
"citation": {
"sourceCitation": "Part 4.2.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "At least once every seven (7) calendar days; or",
"confidence": "verified"
},
"because": "You have not confirmed whether the site discharges to an impaired or high quality water. If it does, the increased frequency applies instead and this answer changes."
},
{
"id": "inspection.frequency.option2",
"kind": "inspection",
"label": "Inspection frequency, option 2",
"detail": "Once every 14 calendar days AND within 24 hours of a storm event producing 0.25 inches or more of rain in a 24-hour period, or of a discharge caused by snowmelt from a storm event producing 3.25 inches or more of snow in a 24-hour period.",
"value": 14,
"citation": {
"sourceCitation": "Part 4.2.2 (with Parts 4.2.2a and 4.2.2b)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Once every 14 calendar days and within 24 hours 67 of the occurrence of: A storm event that produces 0.25 inches or more of rain within a 24-hour period. If a storm event produces 0.25 inches or more of rain within a 24-hour period",
"confidence": "verified"
},
"because": "You have not confirmed whether the site discharges to an impaired or high quality water. If it does, the increased frequency applies instead and this answer changes."
},
{
"id": "inspection.report.deadline",
"kind": "recordkeeping",
"label": "Inspection report deadline",
"detail": "Complete the inspection report within 24 hours of completing the site inspection.",
"value": 24,
"citation": {
"sourceCitation": "Part 4.7.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must complete an inspection report within 24 hours of completing any site inspection.",
"confidence": "verified"
}
},
{
"id": "inspection.qualifiedPerson",
"kind": "inspection",
"label": "Who may inspect",
"detail": "The person inspecting the site may be a member of your staff or a third party you hire. You are responsible for ensuring that any person conducting inspections is a \"qualified person\", meaning someone who has completed the training required by Part 6.3.",
"value": null,
"citation": {
"sourceCitation": "Part 4.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You are responsible for ensuring that any person conducting inspections pursuant to this Part is a “qualified person.” A qualified person is someone who has completed the training required by Part 6.3.",
"confidence": "verified"
},
"because": "This is why Basinwise cannot perform your inspections. The permit requires a trained person physically on the site."
},
{
"id": "stabilization.initiate",
"kind": "stabilization",
"label": "Initiate stabilisation",
"detail": "\"Immediately\" means as soon as practicable, but no later than the end of the next business day, following the day when the construction activities have temporarily or permanently ceased.",
"value": null,
"citation": {
"sourceCitation": "Part 2.2.14a, Table 2 (definition at footnote 39)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "In the context of this provision, “immediately” means as soon as practicable, but no later than the end of the next business day, following the day when the construction activities have temporarily or permanently ceased.",
"confidence": "verified"
},
"because": "This applies at both land disturbance amounts."
},
{
"id": "stabilization.complete",
"kind": "stabilization",
"label": "Complete stabilisation",
"detail": "Complete the installation of stabilization measures as soon as practicable, but no later than seven (7) calendar days after stabilization has been initiated.",
"value": 7,
"citation": {
"sourceCitation": "Part 2.2.14a, Table 2 row ii",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Complete the installation of stabilization measures as soon as practicable, but no later than seven (7) calendar days after stabilization has been initiated.",
"confidence": "verified"
},
"because": "You have not told us how much land will be open at any one time, so we have assumed the whole 6.5 acres are, which takes the 7 day deadline. The permit measures this on land disturbed at any one time, not the project total: if you phase the work so no more than five acres are open at once, stabilising finished ground before opening more, the deadline is 14 days instead. Tell us your concurrent acreage to get the answer that applies to your site."
},
{
"id": "filing.swpppBeforeNoi",
"kind": "filing",
"label": "Plan before Notice of Intent",
"detail": "Develop the plan before submitting your Notice of Intent for coverage.",
"value": null,
"citation": {
"sourceCitation": "Part 1.4.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must develop a SWPPP consistent with Part 7 before submitting your NOI for coverage under this permit.",
"confidence": "verified"
}
},
{
"id": "filing.noi",
"kind": "filing",
"label": "Notice of Intent deadline",
"detail": "At least 14 calendar days before commencing construction activities",
"value": 14,
"citation": {
"sourceCitation": "Part 1.4 (deadline value from Part 1.4.3, Table 1)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "must submit to EPA a complete and accurate NOI in accordance with the deadlines in Table 1 prior to commencement of construction activities",
"confidence": "verified"
},
"because": "This is the deadline for a new site. A transfer to a new operator or an emergency related project has a different deadline."
},
{
"id": "filing.not",
"kind": "filing",
"label": "Notice of Termination deadline",
"detail": "Submit the Notice of Termination within 30 calendar days of meeting a termination condition.",
"value": 30,
"citation": {
"sourceCitation": "Part 8.4",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must submit an NOT within 30 calendar days after any one of the conditions in Part 8.2 occurs.",
"confidence": "verified"
}
},
{
"id": "corrective.minor",
"kind": "corrective_action",
"label": "Corrective action, minor fix",
"detail": "By the close of the next business day after discovering the condition.",
"value": null,
"citation": {
"sourceCitation": "Part 5.2.1b",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "When the problem does not require a new or replacement control or significant repair, the corrective action must be completed by the close of the next business day; or",
"confidence": "verified"
}
},
{
"id": "corrective.major",
"kind": "corrective_action",
"label": "Corrective action, major fix",
"detail": "Within 7 calendar days of discovery.",
"value": 7,
"citation": {
"sourceCitation": "Part 5.2.1c",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "When the problem requires a new or replacement control or significant repair, install the new or modified control and make it operational, or complete the repair, by no later than seven (7) calendar days from the time of discovery.",
"confidence": "verified"
}
},
{
"id": "corrective.documentation",
"kind": "recordkeeping",
"label": "Corrective action log entries",
"detail": "Record the condition within 24 hours of identifying it, and record completion within 24 hours of completing the work.",
"value": null,
"citation": {
"sourceCitation": "Part 5.4.1a",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Within 24 hours of identifying the corrective action condition, document the specific condition and the date and time it was identified.",
"confidence": "verified"
}
},
{
"id": "retention.inspection",
"kind": "recordkeeping",
"label": "Record retention",
"detail": "Retain inspection reports and the corrective action log for at least 3 years from the date permit coverage expires or is terminated.",
"value": 3,
"citation": {
"sourceCitation": "Part 4.7.4",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must retain all inspection reports completed for this Part for at least three (3) years from the date that your permit coverage expires or is terminated.",
"confidence": "verified"
},
"because": "The clock runs from permit expiry or termination, not from when the record was written, so on a multi year project every record stays live for the whole project plus three years."
},
{
"id": "buffer.trigger",
"kind": "buffer",
"label": "Natural buffer",
"detail": "Provide and maintain a natural buffer or equivalent erosion and sediment controls where a surface water lies within 50 feet of the disturbance.",
"value": 50,
"citation": {
"sourceCitation": "Part 2.2.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Provide and maintain natural buffers and/or equivalent erosion and sediment controls for discharges to any receiving waters that is located within 50 feet of the site’s earth disturbances.",
"confidence": "verified"
}
}
],
"derivation": [
{
"step": "Coverage threshold",
"result": "The project disturbs 6.5 acres, at or above the 1 acre threshold, so it needs permit coverage.",
"citation": {
"sourceCitation": "Part 1.1.2",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Will disturb one or more acres of land, or will disturb less than one acre of land but are part of a common plan of development or sale (as defined in Appendix A) that will ultimately disturb one or more acres of land",
"confidence": "verified"
}
},
{
"step": "Permitting authority",
"result": "EPA. MA is not an NPDES authorized state, so EPA's Construction General Permit governs directly."
},
{
"step": "Preparer credential",
"result": "Massachusetts gates plan preparation conditionally. The gate is triggered by plan scope rather than acreage: Attaches to the Wetlands Protection Act pathway. Confirm which case applies to your plan before relying on a generated document.",
"citation": {
"sourceCitation": "MassDEP Stormwater Report Checklist",
"sourceUrl": "https://www.mass.gov/doc/stormwater-report-checklist/download",
"confidence": "unverified"
}
}
],
"notices": [
"Massachusetts gates plan preparation conditionally. The gate is triggered by plan scope rather than acreage: Attaches to the Wetlands Protection Act pathway. Confirm which case applies to your plan before relying on a generated document.",
"Basinwise does not perform the physical site inspections the permit requires. Those must be carried out on site by a qualified person.",
"The source extraction contains the permit body (Parts 1-9) only. Appendices A (Definitions), B (Eligible Permit Areas), C (Small Construction Waivers), D (ESA Eligibility Procedures), E (Historic Property Screening), F (Buffer Requirements), G (Standard Permit Conditions), H (NOI Form), I (NOT Form), J (Chemical Treatment Request) and K (Turbidity Report Form) were NOT present in the extracted text. Every fact whose operative text lives only in an appendix is marked confidence \"unverified\" with a note naming the appendix to confirm."
],
"confidence": "verified",
"datasetVersion": "2026-07-19",
"input": {
"state": "MA",
"activity": "construction",
"disturbedAcres": 6.5,
"maxDisturbedAcresAtOneTime": null,
"partOfLargerPlan": false,
"sectorCode": null,
"startDate": null,
"endDate": null,
"onTribalLand": false,
"federalFacility": false,
"dischargesToImpairedWater": null,
"dischargesToTier2Water": null,
"aridClimate": false
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}The citation shape
How to read a permit section and its confidence
Every requirement, eligibility screen and derivation step carries the permit section it came from, in this shape. There is no "probably" middle tier: a value was either read in the source document or it was not, and an unverified value must render as Unverified, never as fact.
| key | type | meaning |
|---|---|---|
| sourceCitation | string | The permit section the value was read from, e.g. "2022 CGP Part 4.1.2". "Not verified" where we hold no citation. |
| sourceUrl | string | The official source document the section lives in. Government domains only. |
| quote | string (optional) | A short verbatim quote from the permit, proving the clause was actually read. |
| confidence | "verified" | "unverified" | "verified" means an agent or a human read that clause in the source document and recorded the section. Anything else is "unverified" and must render as Unverified, never as fact. There is deliberately no middle value meaning "probably". |
Errors
Structured, never silent
Every non-2xx response is JSON in the { error: { code, message }, request_id } envelope. The code is stable; build on it, not on the message text.
| code | status | meaning |
|---|---|---|
| invalid_request | 400 | A required parameter is missing or malformed, an unknown field was sent, or a jurisdiction code we hold no row for was used. The message names the parameter, and details carries known_keys (the fields this endpoint reads) or known_states (the codes we cover), so a caller can correct itself without reading a page. |
| invalid_json | 400 | The POST body is not valid JSON. Reported separately from invalid_request so a caller with a broken serialiser is not told its field names are wrong. |
| unauthorized | 401 | The key you sent is not valid or has been revoked. Only ever returned when you supply a key: a keyless call is allowed at the anonymous rate, never rejected as unauthorized. |
| not_found | 404 | There is no endpoint at the path you called. details.endpoints lists the ones that exist. NOTE: this is about PATHS only. A jurisdiction we have not verified is never a 404: it returns 200 with confidence "unverified" and the agency to confirm with, because a gap in our coverage is ours to report rather than a claim that your state does not exist. |
| method_not_allowed | 405 | The path exists but does not serve this HTTP method, e.g. GET on /api/v1/determine, which is POST-only. The Allow response header and details.allow both name the methods it does serve. Reported in the same JSON envelope as every other error rather than as the zero-byte 405 a framework returns by default, so a JSON client gets a parseable body instead of a parse failure. |
| payload_too_large | 413 | The POST body exceeds the byte ceiling. The message names the exact limit. |
| rate_limited | 429 | You exceeded the anonymous rate, the sandbox or test-key throttle, your plan's per-minute burst, or your plan's monthly allowance. Retry-After tells you how long to wait. |
| internal | 500 | An unexpected server error. Safe to retry; quote the request_id if it persists. |
400 invalid_request, an unknown field, with the fields we do read
{
"error": {
"code": "invalid_request",
"message": "Unknown field: state_code. See details.known_keys for the fields this endpoint reads.",
"details": {
"unknown_keys": [
"state_code"
],
"known_keys": [
"state",
"activity",
"acres",
"disturbedAcres",
"maxDisturbedAcresAtOneTime",
"partOfLargerPlan",
"sectorCode",
"startDate",
"endDate",
"onTribalLand",
"federalFacility",
"dischargesToImpairedWater",
"dischargesToTier2Water",
"aridClimate"
]
}
},
"request_id": "req_2f9c41a7b0e84d15"
}200, a jurisdiction we hold but have not verified. Not a 404
{
"data": {
"code": "AZ",
"name": "Arizona",
"npdesAuthorized": true,
"governingPermitId": "az-cgp",
"permitNumber": null,
"permitName": null,
"agencyName": "Arizona Department of Environmental Quality (ADEQ)",
"agencyUrl": null,
"permitUrl": null,
"confidence": "unverified",
"sourceUrl": null,
"note": "Not verified. azdeq.gov and all of its alternate document hosts, plus the Secretary of State rules host, refused automated retrieval (HTTP 403). No permit number, permit name or preparer credential is asserted because none was read from an official source. This state is NPDES-authorized per EPA and runs its own construction general permit. Confirm the governing permit and any preparer credential with the state permitting authority before relying on any determination.",
"credential": {
"gate": "open",
"summary": "No preparer credential was found for Arizona. On what we have verified, a generated plan can be adopted by the operator without a credentialed signature. Local ordinances can still be stricter than state law.",
"routes": [],
"stateCourseRequired": false,
"sourceCitation": null,
"sourceUrl": null,
"confidence": "verified"
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}Both blocks are the ones to build against. An unknown field is refused rather than ignored, and details.known_keys lists the fields the endpoint does read, so a caller can correct itself without finding a human; an unknown jurisdiction code comes back with details.known_states. A jurisdiction we hold but have not verified is never a 404: it is a 200 carrying confidence: "unverified" and the agency to confirm with, because a gap in our coverage is ours to report. not_found is reserved for a path that does not exist under /api/v1, and its details.endpoints lists the paths that do.
Rate limits & quota
By key type
Every endpoint works with no key at the anonymous rate. Send the public sandbox key, or your own free test key, to lift the throttle; both run the real engine and never bill. A live key raises you to your plan's quota.
| Tier | Burst | Volume |
|---|---|---|
| Anonymous (no key) | 4/min | 20/day per IP. Enough to run a call out of these docs, not enough to build on. |
| Public sandbox key (bw_test_sandbox, no signup) | 10/min | 200/day per IP against the real engine. Never bills. Shared by everyone, so it is bucketed by IP. |
| Your own test key (free on every plan) | 10/min | 200/day against the real engine, in a bucket nobody else shares. Never bills. |
| Pro (live key) | 60/min | 1,000 calls/mo. A hard ceiling, not a meter: past it the API returns rate_limited rather than billing you. |
| Scale (live key) | 300/min | 10,000 calls/mo. A hard ceiling, not a meter: past it the API returns rate_limited rather than billing you. |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so an agent can back off before a 429. Full plans at /pricing or the machine-readable /api/v1/pricing.
Endpoints
Every route
/api/v1/determine
Key optionalDetermine which NPDES stormwater permit governs a site and what it requires. Returns the coverage verdict (required, not_required or verify), the governing permit with the version the answer was computed against, the jurisdiction and its permitting authority, that permit's eligibility screens, the requirements that attach to THIS site (each with the permit section it came from and a `because` explaining why it applies here rather than in general), the step-by-step derivation, and a `notices` array you must surface verbatim. Deterministic: no model in the request path, so identical input always returns an identical determination. Requirements are returned ONLY where we hold the governing permit's rules; where we have identified a state permit but not read it, the requirement list is empty and a notice says so rather than substituting the federal permit's numbers. Supports an `Idempotency-Key` header for keyed callers.
Can return: unauthorized (401), internal (500), invalid_json (400), payload_too_large (413), invalid_request (400), rate_limited (429). Accepts an Idempotency-Key request header: a keyed caller replaying the same key gets the original result back rather than a second billable call.
| Param | In | Required | Description |
|---|---|---|---|
| state | body | yes | Two-letter state, territory or DC code, e.g. "CA". A code we hold no row for returns invalid_request with details.known_states. |
| activity | body | yes | Either "construction" or "industrial". Required, because the two are governed by different permits and we will not assume one. Industrial returns coverage "verify": EPA's Multi-Sector General Permit expired on 28 February 2026 and new operators cannot currently obtain coverage. |
| disturbedAcres | body | yes | TOTAL acres the project will disturb over its life. `acres` is accepted as an alias. Decides whether coverage is triggered at all, so there is no default. |
| maxDisturbedAcresAtOneTime | body | no | Greatest acreage disturbed AT ANY ONE TIME. A different quantity from the total, and the one the stabilisation deadline turns on: 2022 CGP Table 2 measures it on land open at once, so a project over five acres in total keeps the longer 14-day deadline if it phases the work. Omit it if you do not know, and the determination assumes an unphased site and says so rather than asserting phasing it was not told about. Rejected if it exceeds the total. |
| partOfLargerPlan | body | no | Whether the project is part of a larger common plan of development or sale. Defaults to false. Pass it explicitly: a half-acre lot inside a 40-acre subdivision IS covered, and this is the single most commonly missed trigger in the permit. |
| dischargesToImpairedWater | body | no | Discharges to a sediment or nutrient impaired water. Omit it and the answer stays honestly unknown: it is never assumed false, because it changes the inspection frequency and the stabilisation deadline. |
| dischargesToTier2Water | body | no | Discharges to a Tier 2, 2.5 or 3 water. Same tri-state handling as dischargesToImpairedWater. |
| aridClimate | body | no | Arid, semi-arid or drought-stricken area, which may allow a reduced inspection frequency during the seasonally dry period. |
| onTribalLand | body | no | EPA retains NPDES authority in Indian country even inside a state that runs its own programme, so this can change which permit governs. |
| federalFacility | body | no | EPA's permit covers federal facilities in some delegated states. |
| sectorCode | body | no | MSGP industrial sector code. Industrial sites only. |
| startDate | body | no | ISO yyyy-mm-dd. Recorded on the determination; it does not change the verdict today. |
| endDate | body | no | ISO yyyy-mm-dd. Recorded on the determination; it does not change the verdict today. |
request
curl -X POST https://basinwise.vercel.app/api/v1/determine \
-H "Content-Type: application/json" \
-H "Idempotency-Key: determine-demo-1" \
-d '{"state":"MA","activity":"construction","disturbedAcres":6.5,"partOfLargerPlan":false}'response 200
{
"data": {
"coverage": "required",
"coverageReason": "The project disturbs 6.5 acres, at or above the 1 acre threshold, so it needs permit coverage.",
"permit": {
"id": "federal-cgp",
"name": "2022 Construction General Permit",
"permitNumber": null,
"version": "2022 CGP (as modified 2025)",
"authority": "U.S. Environmental Protection Agency",
"agencyName": "U.S. Environmental Protection Agency",
"agencyUrl": "https://www.epa.gov/npdes/stormwater-discharges-construction-activities",
"permitUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"effectiveDate": "2022-02-17",
"expiryDate": "2027-02-16",
"confidence": "verified"
},
"jurisdiction": {
"code": "MA",
"name": "Massachusetts",
"npdesAuthorized": false,
"agencyName": "U.S. Environmental Protection Agency (EPA Region 1)",
"agencyUrl": "https://www.epa.gov/npdes/2022-construction-general-permit-cgp",
"credential": {
"required": null,
"name": "Registered professional engineer",
"sourceUrl": "https://www.mass.gov/doc/stormwater-report-checklist/download",
"confidence": "unverified"
},
"confidence": "verified",
"note": "EPA is the permitting authority. Coverage is under EPA's 2022 CGP, permit area MAR100000. MassDEP administers separate state wetlands and water quality requirements that were not verified here; confirm state and municipal requirements alongside the federal permit. The 2022 CGP as modified became effective April 8, 2025 and expires February 16, 2027; confirm the successor permit near that date. Credential: the 2022 CGP imposes no SWPPP preparer credential. It does require inspections by a 'qualified person' (Part 4.1), which is an inspection credential, not a preparation credential."
},
"eligibilityScreens": [
{
"id": "esa",
"label": "Endangered species screening",
"status": "action_required",
"detail": "You must document that you meet one of the endangered species protection criteria before coverage begins. This is a screening you complete, not one we can complete for you.",
"citation": {
"sourceCitation": "Part 1.1.5 (criteria labels corroborated at Part 9.2.1, Seneca Nation)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You can demonstrate you meet one of the criteria in the Endangered Species Protection section of the Notice of Intent (NOI) that you submit for coverage under this permit, per Part 1.4, with respect to the protection of Federally listed",
"confidence": "verified"
}
},
{
"id": "historic",
"label": "Historic properties screening",
"status": "action_required",
"detail": "You must complete the historic properties screening process and keep the documentation with your plan.",
"citation": {
"sourceCitation": "Part 1.1.6 (documentation duty at Part 7.2.9b)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You have completed the screening process in Appendix E relating to the protection of historic properties; and",
"confidence": "verified"
}
},
{
"id": "receiving-water",
"label": "Receiving water sensitivity",
"status": "unknown",
"detail": "You have not confirmed whether the site discharges to a sediment or nutrient impaired water or a Tier 2, 2.5 or 3 water. This changes your inspection frequency, so confirm it before relying on the answer above.",
"citation": {
"sourceCitation": "Part 3.2",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "For any portion of the site that discharges to a sediment or nutrient-impaired water or to a water that is identified by your State, Tribe, or EPA as Tier 2, Tier 2.5, or Tier 3 for antidegradation purposes, 57 you must comply with the",
"confidence": "verified"
}
},
{
"id": "prohibited",
"label": "Prohibited discharges",
"status": "action_required",
"detail": "Certain discharges are prohibited outright, including concrete washout wastewater unless managed by an approved control. Review the prohibited discharge list against your site activities.",
"citation": {
"sourceCitation": "Parts 1.3.1 - 1.3.5",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Wastewater from washout of concrete, unless managed by an appropriate control as described in Part 2.3.4; 1.3.2 Wastewater from washout and/or cleanout of stucco, paint, form release oils, curing compounds, and other construction",
"confidence": "verified"
}
}
],
"requirements": [
{
"id": "inspection.frequency.option1",
"kind": "inspection",
"label": "Inspection frequency, option 1",
"detail": "At least once every seven (7) calendar days",
"value": 7,
"citation": {
"sourceCitation": "Part 4.2.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "At least once every seven (7) calendar days; or",
"confidence": "verified"
},
"because": "You have not confirmed whether the site discharges to an impaired or high quality water. If it does, the increased frequency applies instead and this answer changes."
},
{
"id": "inspection.frequency.option2",
"kind": "inspection",
"label": "Inspection frequency, option 2",
"detail": "Once every 14 calendar days AND within 24 hours of a storm event producing 0.25 inches or more of rain in a 24-hour period, or of a discharge caused by snowmelt from a storm event producing 3.25 inches or more of snow in a 24-hour period.",
"value": 14,
"citation": {
"sourceCitation": "Part 4.2.2 (with Parts 4.2.2a and 4.2.2b)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Once every 14 calendar days and within 24 hours 67 of the occurrence of: A storm event that produces 0.25 inches or more of rain within a 24-hour period. If a storm event produces 0.25 inches or more of rain within a 24-hour period",
"confidence": "verified"
},
"because": "You have not confirmed whether the site discharges to an impaired or high quality water. If it does, the increased frequency applies instead and this answer changes."
},
{
"id": "inspection.report.deadline",
"kind": "recordkeeping",
"label": "Inspection report deadline",
"detail": "Complete the inspection report within 24 hours of completing the site inspection.",
"value": 24,
"citation": {
"sourceCitation": "Part 4.7.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must complete an inspection report within 24 hours of completing any site inspection.",
"confidence": "verified"
}
},
{
"id": "inspection.qualifiedPerson",
"kind": "inspection",
"label": "Who may inspect",
"detail": "The person inspecting the site may be a member of your staff or a third party you hire. You are responsible for ensuring that any person conducting inspections is a \"qualified person\", meaning someone who has completed the training required by Part 6.3.",
"value": null,
"citation": {
"sourceCitation": "Part 4.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You are responsible for ensuring that any person conducting inspections pursuant to this Part is a “qualified person.” A qualified person is someone who has completed the training required by Part 6.3.",
"confidence": "verified"
},
"because": "This is why Basinwise cannot perform your inspections. The permit requires a trained person physically on the site."
},
{
"id": "stabilization.initiate",
"kind": "stabilization",
"label": "Initiate stabilisation",
"detail": "\"Immediately\" means as soon as practicable, but no later than the end of the next business day, following the day when the construction activities have temporarily or permanently ceased.",
"value": null,
"citation": {
"sourceCitation": "Part 2.2.14a, Table 2 (definition at footnote 39)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "In the context of this provision, “immediately” means as soon as practicable, but no later than the end of the next business day, following the day when the construction activities have temporarily or permanently ceased.",
"confidence": "verified"
},
"because": "This applies at both land disturbance amounts."
},
{
"id": "stabilization.complete",
"kind": "stabilization",
"label": "Complete stabilisation",
"detail": "Complete the installation of stabilization measures as soon as practicable, but no later than seven (7) calendar days after stabilization has been initiated.",
"value": 7,
"citation": {
"sourceCitation": "Part 2.2.14a, Table 2 row ii",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Complete the installation of stabilization measures as soon as practicable, but no later than seven (7) calendar days after stabilization has been initiated.",
"confidence": "verified"
},
"because": "You have not told us how much land will be open at any one time, so we have assumed the whole 6.5 acres are, which takes the 7 day deadline. The permit measures this on land disturbed at any one time, not the project total: if you phase the work so no more than five acres are open at once, stabilising finished ground before opening more, the deadline is 14 days instead. Tell us your concurrent acreage to get the answer that applies to your site."
},
{
"id": "filing.swpppBeforeNoi",
"kind": "filing",
"label": "Plan before Notice of Intent",
"detail": "Develop the plan before submitting your Notice of Intent for coverage.",
"value": null,
"citation": {
"sourceCitation": "Part 1.4.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must develop a SWPPP consistent with Part 7 before submitting your NOI for coverage under this permit.",
"confidence": "verified"
}
},
{
"id": "filing.noi",
"kind": "filing",
"label": "Notice of Intent deadline",
"detail": "At least 14 calendar days before commencing construction activities",
"value": 14,
"citation": {
"sourceCitation": "Part 1.4 (deadline value from Part 1.4.3, Table 1)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "must submit to EPA a complete and accurate NOI in accordance with the deadlines in Table 1 prior to commencement of construction activities",
"confidence": "verified"
},
"because": "This is the deadline for a new site. A transfer to a new operator or an emergency related project has a different deadline."
},
{
"id": "filing.not",
"kind": "filing",
"label": "Notice of Termination deadline",
"detail": "Submit the Notice of Termination within 30 calendar days of meeting a termination condition.",
"value": 30,
"citation": {
"sourceCitation": "Part 8.4",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must submit an NOT within 30 calendar days after any one of the conditions in Part 8.2 occurs.",
"confidence": "verified"
}
},
{
"id": "corrective.minor",
"kind": "corrective_action",
"label": "Corrective action, minor fix",
"detail": "By the close of the next business day after discovering the condition.",
"value": null,
"citation": {
"sourceCitation": "Part 5.2.1b",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "When the problem does not require a new or replacement control or significant repair, the corrective action must be completed by the close of the next business day; or",
"confidence": "verified"
}
},
{
"id": "corrective.major",
"kind": "corrective_action",
"label": "Corrective action, major fix",
"detail": "Within 7 calendar days of discovery.",
"value": 7,
"citation": {
"sourceCitation": "Part 5.2.1c",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "When the problem requires a new or replacement control or significant repair, install the new or modified control and make it operational, or complete the repair, by no later than seven (7) calendar days from the time of discovery.",
"confidence": "verified"
}
},
{
"id": "corrective.documentation",
"kind": "recordkeeping",
"label": "Corrective action log entries",
"detail": "Record the condition within 24 hours of identifying it, and record completion within 24 hours of completing the work.",
"value": null,
"citation": {
"sourceCitation": "Part 5.4.1a",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Within 24 hours of identifying the corrective action condition, document the specific condition and the date and time it was identified.",
"confidence": "verified"
}
},
{
"id": "retention.inspection",
"kind": "recordkeeping",
"label": "Record retention",
"detail": "Retain inspection reports and the corrective action log for at least 3 years from the date permit coverage expires or is terminated.",
"value": 3,
"citation": {
"sourceCitation": "Part 4.7.4",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must retain all inspection reports completed for this Part for at least three (3) years from the date that your permit coverage expires or is terminated.",
"confidence": "verified"
},
"because": "The clock runs from permit expiry or termination, not from when the record was written, so on a multi year project every record stays live for the whole project plus three years."
},
{
"id": "buffer.trigger",
"kind": "buffer",
"label": "Natural buffer",
"detail": "Provide and maintain a natural buffer or equivalent erosion and sediment controls where a surface water lies within 50 feet of the disturbance.",
"value": 50,
"citation": {
"sourceCitation": "Part 2.2.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Provide and maintain natural buffers and/or equivalent erosion and sediment controls for discharges to any receiving waters that is located within 50 feet of the site’s earth disturbances.",
"confidence": "verified"
}
}
],
"derivation": [
{
"step": "Coverage threshold",
"result": "The project disturbs 6.5 acres, at or above the 1 acre threshold, so it needs permit coverage.",
"citation": {
"sourceCitation": "Part 1.1.2",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Will disturb one or more acres of land, or will disturb less than one acre of land but are part of a common plan of development or sale (as defined in Appendix A) that will ultimately disturb one or more acres of land",
"confidence": "verified"
}
},
{
"step": "Permitting authority",
"result": "EPA. MA is not an NPDES authorized state, so EPA's Construction General Permit governs directly."
},
{
"step": "Preparer credential",
"result": "Massachusetts gates plan preparation conditionally. The gate is triggered by plan scope rather than acreage: Attaches to the Wetlands Protection Act pathway. Confirm which case applies to your plan before relying on a generated document.",
"citation": {
"sourceCitation": "MassDEP Stormwater Report Checklist",
"sourceUrl": "https://www.mass.gov/doc/stormwater-report-checklist/download",
"confidence": "unverified"
}
}
],
"notices": [
"Massachusetts gates plan preparation conditionally. The gate is triggered by plan scope rather than acreage: Attaches to the Wetlands Protection Act pathway. Confirm which case applies to your plan before relying on a generated document.",
"Basinwise does not perform the physical site inspections the permit requires. Those must be carried out on site by a qualified person.",
"The source extraction contains the permit body (Parts 1-9) only. Appendices A (Definitions), B (Eligible Permit Areas), C (Small Construction Waivers), D (ESA Eligibility Procedures), E (Historic Property Screening), F (Buffer Requirements), G (Standard Permit Conditions), H (NOI Form), I (NOT Form), J (Chemical Treatment Request) and K (Turbidity Report Form) were NOT present in the extracted text. Every fact whose operative text lives only in an appendix is marked confidence \"unverified\" with a note naming the appendix to confirm."
],
"confidence": "verified",
"datasetVersion": "2026-07-19",
"input": {
"state": "MA",
"activity": "construction",
"disturbedAcres": 6.5,
"maxDisturbedAcresAtOneTime": null,
"partOfLargerPlan": false,
"sectorCode": null,
"startDate": null,
"endDate": null,
"onTribalLand": false,
"federalFacility": false,
"dischargesToImpairedWater": null,
"dischargesToTier2Water": null,
"aridClimate": false
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}/api/v1/requirements
Key optionalThe requirements for a site, as a GET so an agent can ask with a URL and nothing else. Same engine and same parser as POST /api/v1/determine, projected down to inspection frequency, stabilisation deadlines, filing deadlines, corrective-action windows, recordkeeping and buffers, each carrying its permit citation. The coverage verdict, the eligibility screens and the notices come with it: a requirement list detached from whether coverage is triggered at all, and from which jurisdictions we have not verified, is a half-answer. An empty requirements array with a notice is the honest response for a state whose permit we have not read.
Can return: unauthorized (401), internal (500), invalid_request (400), rate_limited (429).
| Param | In | Required | Description |
|---|---|---|---|
| state | query | yes | Two-letter state, territory or DC code, e.g. "CA". A code we hold no row for returns invalid_request with details.known_states. |
| activity | query | yes | Either "construction" or "industrial". Required, because the two are governed by different permits and we will not assume one. Industrial returns coverage "verify": EPA's Multi-Sector General Permit expired on 28 February 2026 and new operators cannot currently obtain coverage. |
| acres | query | yes | TOTAL acres the project will disturb over its life. Decides whether coverage is triggered at all, so there is no default. |
| maxDisturbedAcresAtOneTime | query | no | Greatest acreage disturbed AT ANY ONE TIME. A different quantity from the total, and the one the stabilisation deadline turns on: 2022 CGP Table 2 measures it on land open at once, so a project over five acres in total keeps the longer 14-day deadline if it phases the work. Omit it if you do not know, and the determination assumes an unphased site and says so rather than asserting phasing it was not told about. Rejected if it exceeds the total. |
| partOfLargerPlan | query | no | Whether the project is part of a larger common plan of development or sale. Defaults to false. Pass it explicitly: a half-acre lot inside a 40-acre subdivision IS covered, and this is the single most commonly missed trigger in the permit. |
| dischargesToImpairedWater | query | no | Discharges to a sediment or nutrient impaired water. Omit it and the answer stays honestly unknown: it is never assumed false, because it changes the inspection frequency and the stabilisation deadline. |
| dischargesToTier2Water | query | no | Discharges to a Tier 2, 2.5 or 3 water. Same tri-state handling as dischargesToImpairedWater. |
| aridClimate | query | no | Arid, semi-arid or drought-stricken area, which may allow a reduced inspection frequency during the seasonally dry period. |
| onTribalLand | query | no | EPA retains NPDES authority in Indian country even inside a state that runs its own programme, so this can change which permit governs. |
| federalFacility | query | no | EPA's permit covers federal facilities in some delegated states. |
| sectorCode | query | no | MSGP industrial sector code. Industrial sites only. |
| startDate | query | no | ISO yyyy-mm-dd. Recorded on the determination; it does not change the verdict today. |
| endDate | query | no | ISO yyyy-mm-dd. Recorded on the determination; it does not change the verdict today. |
request
curl "https://basinwise.vercel.app/api/v1/requirements?state=MA&activity=construction&acres=6.5"
response 200
{
"data": {
"site": {
"state": "MA",
"activity": "construction",
"disturbedAcres": 6.5,
"maxDisturbedAcresAtOneTime": null,
"partOfLargerPlan": false,
"sectorCode": null,
"startDate": null,
"endDate": null,
"onTribalLand": false,
"federalFacility": false,
"dischargesToImpairedWater": null,
"dischargesToTier2Water": null,
"aridClimate": false
},
"coverage": "required",
"coverageReason": "The project disturbs 6.5 acres, at or above the 1 acre threshold, so it needs permit coverage.",
"permit": {
"id": "federal-cgp",
"name": "2022 Construction General Permit",
"permitNumber": null,
"version": "2022 CGP (as modified 2025)",
"authority": "U.S. Environmental Protection Agency",
"agencyName": "U.S. Environmental Protection Agency",
"agencyUrl": "https://www.epa.gov/npdes/stormwater-discharges-construction-activities",
"permitUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"effectiveDate": "2022-02-17",
"expiryDate": "2027-02-16",
"confidence": "verified"
},
"requirements": [
{
"id": "inspection.frequency.option1",
"kind": "inspection",
"label": "Inspection frequency, option 1",
"detail": "At least once every seven (7) calendar days",
"value": 7,
"citation": {
"sourceCitation": "Part 4.2.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "At least once every seven (7) calendar days; or",
"confidence": "verified"
},
"because": "You have not confirmed whether the site discharges to an impaired or high quality water. If it does, the increased frequency applies instead and this answer changes."
},
{
"id": "inspection.frequency.option2",
"kind": "inspection",
"label": "Inspection frequency, option 2",
"detail": "Once every 14 calendar days AND within 24 hours of a storm event producing 0.25 inches or more of rain in a 24-hour period, or of a discharge caused by snowmelt from a storm event producing 3.25 inches or more of snow in a 24-hour period.",
"value": 14,
"citation": {
"sourceCitation": "Part 4.2.2 (with Parts 4.2.2a and 4.2.2b)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Once every 14 calendar days and within 24 hours 67 of the occurrence of: A storm event that produces 0.25 inches or more of rain within a 24-hour period. If a storm event produces 0.25 inches or more of rain within a 24-hour period",
"confidence": "verified"
},
"because": "You have not confirmed whether the site discharges to an impaired or high quality water. If it does, the increased frequency applies instead and this answer changes."
},
{
"id": "inspection.report.deadline",
"kind": "recordkeeping",
"label": "Inspection report deadline",
"detail": "Complete the inspection report within 24 hours of completing the site inspection.",
"value": 24,
"citation": {
"sourceCitation": "Part 4.7.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must complete an inspection report within 24 hours of completing any site inspection.",
"confidence": "verified"
}
},
{
"id": "inspection.qualifiedPerson",
"kind": "inspection",
"label": "Who may inspect",
"detail": "The person inspecting the site may be a member of your staff or a third party you hire. You are responsible for ensuring that any person conducting inspections is a \"qualified person\", meaning someone who has completed the training required by Part 6.3.",
"value": null,
"citation": {
"sourceCitation": "Part 4.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You are responsible for ensuring that any person conducting inspections pursuant to this Part is a “qualified person.” A qualified person is someone who has completed the training required by Part 6.3.",
"confidence": "verified"
},
"because": "This is why Basinwise cannot perform your inspections. The permit requires a trained person physically on the site."
},
{
"id": "stabilization.initiate",
"kind": "stabilization",
"label": "Initiate stabilisation",
"detail": "\"Immediately\" means as soon as practicable, but no later than the end of the next business day, following the day when the construction activities have temporarily or permanently ceased.",
"value": null,
"citation": {
"sourceCitation": "Part 2.2.14a, Table 2 (definition at footnote 39)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "In the context of this provision, “immediately” means as soon as practicable, but no later than the end of the next business day, following the day when the construction activities have temporarily or permanently ceased.",
"confidence": "verified"
},
"because": "This applies at both land disturbance amounts."
},
{
"id": "stabilization.complete",
"kind": "stabilization",
"label": "Complete stabilisation",
"detail": "Complete the installation of stabilization measures as soon as practicable, but no later than seven (7) calendar days after stabilization has been initiated.",
"value": 7,
"citation": {
"sourceCitation": "Part 2.2.14a, Table 2 row ii",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Complete the installation of stabilization measures as soon as practicable, but no later than seven (7) calendar days after stabilization has been initiated.",
"confidence": "verified"
},
"because": "You have not told us how much land will be open at any one time, so we have assumed the whole 6.5 acres are, which takes the 7 day deadline. The permit measures this on land disturbed at any one time, not the project total: if you phase the work so no more than five acres are open at once, stabilising finished ground before opening more, the deadline is 14 days instead. Tell us your concurrent acreage to get the answer that applies to your site."
},
{
"id": "filing.swpppBeforeNoi",
"kind": "filing",
"label": "Plan before Notice of Intent",
"detail": "Develop the plan before submitting your Notice of Intent for coverage.",
"value": null,
"citation": {
"sourceCitation": "Part 1.4.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must develop a SWPPP consistent with Part 7 before submitting your NOI for coverage under this permit.",
"confidence": "verified"
}
},
{
"id": "filing.noi",
"kind": "filing",
"label": "Notice of Intent deadline",
"detail": "At least 14 calendar days before commencing construction activities",
"value": 14,
"citation": {
"sourceCitation": "Part 1.4 (deadline value from Part 1.4.3, Table 1)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "must submit to EPA a complete and accurate NOI in accordance with the deadlines in Table 1 prior to commencement of construction activities",
"confidence": "verified"
},
"because": "This is the deadline for a new site. A transfer to a new operator or an emergency related project has a different deadline."
},
{
"id": "filing.not",
"kind": "filing",
"label": "Notice of Termination deadline",
"detail": "Submit the Notice of Termination within 30 calendar days of meeting a termination condition.",
"value": 30,
"citation": {
"sourceCitation": "Part 8.4",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must submit an NOT within 30 calendar days after any one of the conditions in Part 8.2 occurs.",
"confidence": "verified"
}
},
{
"id": "corrective.minor",
"kind": "corrective_action",
"label": "Corrective action, minor fix",
"detail": "By the close of the next business day after discovering the condition.",
"value": null,
"citation": {
"sourceCitation": "Part 5.2.1b",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "When the problem does not require a new or replacement control or significant repair, the corrective action must be completed by the close of the next business day; or",
"confidence": "verified"
}
},
{
"id": "corrective.major",
"kind": "corrective_action",
"label": "Corrective action, major fix",
"detail": "Within 7 calendar days of discovery.",
"value": 7,
"citation": {
"sourceCitation": "Part 5.2.1c",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "When the problem requires a new or replacement control or significant repair, install the new or modified control and make it operational, or complete the repair, by no later than seven (7) calendar days from the time of discovery.",
"confidence": "verified"
}
},
{
"id": "corrective.documentation",
"kind": "recordkeeping",
"label": "Corrective action log entries",
"detail": "Record the condition within 24 hours of identifying it, and record completion within 24 hours of completing the work.",
"value": null,
"citation": {
"sourceCitation": "Part 5.4.1a",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Within 24 hours of identifying the corrective action condition, document the specific condition and the date and time it was identified.",
"confidence": "verified"
}
},
{
"id": "retention.inspection",
"kind": "recordkeeping",
"label": "Record retention",
"detail": "Retain inspection reports and the corrective action log for at least 3 years from the date permit coverage expires or is terminated.",
"value": 3,
"citation": {
"sourceCitation": "Part 4.7.4",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You must retain all inspection reports completed for this Part for at least three (3) years from the date that your permit coverage expires or is terminated.",
"confidence": "verified"
},
"because": "The clock runs from permit expiry or termination, not from when the record was written, so on a multi year project every record stays live for the whole project plus three years."
},
{
"id": "buffer.trigger",
"kind": "buffer",
"label": "Natural buffer",
"detail": "Provide and maintain a natural buffer or equivalent erosion and sediment controls where a surface water lies within 50 feet of the disturbance.",
"value": 50,
"citation": {
"sourceCitation": "Part 2.2.1",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Provide and maintain natural buffers and/or equivalent erosion and sediment controls for discharges to any receiving waters that is located within 50 feet of the site’s earth disturbances.",
"confidence": "verified"
}
}
],
"requirementCount": 14,
"eligibilityScreens": [
{
"id": "esa",
"label": "Endangered species screening",
"status": "action_required",
"detail": "You must document that you meet one of the endangered species protection criteria before coverage begins. This is a screening you complete, not one we can complete for you.",
"citation": {
"sourceCitation": "Part 1.1.5 (criteria labels corroborated at Part 9.2.1, Seneca Nation)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You can demonstrate you meet one of the criteria in the Endangered Species Protection section of the Notice of Intent (NOI) that you submit for coverage under this permit, per Part 1.4, with respect to the protection of Federally listed",
"confidence": "verified"
}
},
{
"id": "historic",
"label": "Historic properties screening",
"status": "action_required",
"detail": "You must complete the historic properties screening process and keep the documentation with your plan.",
"citation": {
"sourceCitation": "Part 1.1.6 (documentation duty at Part 7.2.9b)",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "You have completed the screening process in Appendix E relating to the protection of historic properties; and",
"confidence": "verified"
}
},
{
"id": "receiving-water",
"label": "Receiving water sensitivity",
"status": "unknown",
"detail": "You have not confirmed whether the site discharges to a sediment or nutrient impaired water or a Tier 2, 2.5 or 3 water. This changes your inspection frequency, so confirm it before relying on the answer above.",
"citation": {
"sourceCitation": "Part 3.2",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "For any portion of the site that discharges to a sediment or nutrient-impaired water or to a water that is identified by your State, Tribe, or EPA as Tier 2, Tier 2.5, or Tier 3 for antidegradation purposes, 57 you must comply with the",
"confidence": "verified"
}
},
{
"id": "prohibited",
"label": "Prohibited discharges",
"status": "action_required",
"detail": "Certain discharges are prohibited outright, including concrete washout wastewater unless managed by an approved control. Review the prohibited discharge list against your site activities.",
"citation": {
"sourceCitation": "Parts 1.3.1 - 1.3.5",
"sourceUrl": "https://www.epa.gov/system/files/documents/2022-01/2022-cgp-final-permit.pdf",
"quote": "Wastewater from washout of concrete, unless managed by an appropriate control as described in Part 2.3.4; 1.3.2 Wastewater from washout and/or cleanout of stucco, paint, form release oils, curing compounds, and other construction",
"confidence": "verified"
}
}
],
"notices": [
"Massachusetts gates plan preparation conditionally. The gate is triggered by plan scope rather than acreage: Attaches to the Wetlands Protection Act pathway. Confirm which case applies to your plan before relying on a generated document.",
"Basinwise does not perform the physical site inspections the permit requires. Those must be carried out on site by a qualified person.",
"The source extraction contains the permit body (Parts 1-9) only. Appendices A (Definitions), B (Eligible Permit Areas), C (Small Construction Waivers), D (ESA Eligibility Procedures), E (Historic Property Screening), F (Buffer Requirements), G (Standard Permit Conditions), H (NOI Form), I (NOT Form), J (Chemical Treatment Request) and K (Turbidity Report Form) were NOT present in the extracted text. Every fact whose operative text lives only in an appendix is marked confidence \"unverified\" with a note naming the appendix to confirm."
],
"confidence": "verified",
"datasetVersion": "2026-07-19"
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}/api/v1/jurisdictions
Key optionalEvery state, territory and DC we hold a row for: NPDES authorisation status, the governing permit and its number, the agency name and URL, and the preparer-credential gate that applies there. Unverified jurisdictions are LISTED rather than omitted, each carrying confidence "unverified" and a note naming the agency to confirm with: a jurisdiction missing from a coverage list reads as "no permit applies", which is never what it means. Free, keyless and not rate-limited.
Can return: unauthorized (401), internal (500).
request
curl https://basinwise.vercel.app/api/v1/jurisdictions
response 200
{
"data": {
"count": 52,
"verifiedCount": 39,
"coverageNote": "Every jurisdiction we hold a row for is listed, including the ones we have not verified. An unverified row carries confidence \"unverified\" and a note telling you to confirm with the agency: it is not a claim that no permit applies.",
"jurisdictions": [
{
"code": "AK",
"name": "Alaska",
"npdesAuthorized": true,
"governingPermitId": "ak-akr100000",
"permitNumber": "AKR100000",
"permitName": "General Permit for Discharges from Large and Small Construction Activities (Construction General Permit), Permit Number AKR100000",
"agencyName": "Alaska Department of Environmental Conservation (Alaska DEC), Wastewater Discharge Authorization Program",
"agencyUrl": "https://dot.alaska.gov/stwddes/desenviron/resources/stormwater.shtml",
"permitUrl": "https://dot.alaska.gov/stwddes/desenviron/assets/pdf/resources/2026_cgp.pdf",
"confidence": "verified",
"sourceUrl": "https://dot.alaska.gov/stwddes/desenviron/assets/pdf/resources/2026_cgp.pdf",
"note": "Effective February 1, 2026, expires January 31, 2031. CREDENTIAL IS TIERED BY ACREAGE, do not flatten it. Section 5.1.2.3 requires the SWPPP to 'Be developed by a qualified person (as defined in Appendix C)'. Appendix C Table 4 sets the SWPPP Preparer standard as: 1 to under 5 acres, be familiar with the permit; 5 to under 20 acres, a SWPPP preparation course is recommended; over 20 acres, be AK-CESCL certified, with CPESC, CESSWI, CPISM, CPSWQ or CISEC accepted as substitutes. No PE stamp is required at any tier. Note the permit was fetched from an Alaska DOT and PF mirror because the issuing agency's own host refused automated retrieval.",
"credential": {
"gate": "conditional",
"summary": "Alaska gates plan preparation conditionally. Confirm which case applies to your plan before relying on a generated document.",
"routes": [
"AK-CESCL certified",
"Qualified person, tiered by disturbed acreage; AK-CESCL certification (or CPESC, CESSWI, CPISM, CPSWQ, CISEC) required above 20 acres"
],
"stateCourseRequired": false,
"sourceCitation": "2021 Alaska CGP Part 5.1.2.3",
"sourceUrl": "https://dec.alaska.gov/media/22136/2021-cgp-pmt-akr10-fnl-20201217.pdf",
"confidence": "verified"
}
},
{
"code": "AL",
"name": "Alabama",
"npdesAuthorized": true,
"governingPermitId": "al-alr100000",
"permitNumber": "ALR100000",
"permitName": "NPDES General Permit No. ALR100000, Construction General Permit (CGP)",
"agencyName": "Alabama Department of Environmental Management (ADEM)",
"agencyUrl": "https://adem.alabama.gov/water/npdes-programs/construction-general-permit",
"permitUrl": "https://adem.alabama.gov/sites/default/files/2026-02/CGP2026.pdf",
"confidence": "verified",
"sourceUrl": "https://adem.alabama.gov/water/npdes-programs/construction-general-permit",
"note": "Credential: ADEM requires a Qualified Credentialed Professional to prepare the Construction Best Management Practice Plan (CBMPP), and both the Responsible Official and the QCP must sign. Accepted credentials are PE, CPESC and CDSEC. Generated plans are drafts for a QCP to review, amend and sign. Caveat: the CGP PDF is a scanned image with no text layer, so the permit number and the QCP rule were verified from ADEM web pages rather than machine-read permit body text.",
"credential": {
"gate": "gated",
"summary": "Alabama requires a credentialed preparer. Treat the generated document as a complete draft for that person to review, adopt and sign. It is not by itself a compliant filed plan.",
"routes": [
"PE",
"CPESC",
"Landscape architect",
"Surveyor",
"PG",
"Forester",
"REM",
"Soil scientist"
],
"stateCourseRequired": false,
"sourceCitation": "ADEM Admin. Code r. 335-6-12-.21(2)(a) and .02(r)",
"sourceUrl": "https://adem.alabama.gov/sites/default/files/2026-03/Division6Vol1.pdf",
"confidence": "verified"
}
},
{
"code": "AR",
"name": "Arkansas",
"npdesAuthorized": true,
"governingPermitId": "ar-arr150000",
"permitNumber": "ARR150000",
"permitName": "Authorization to Discharge Stormwater Under the NPDES and the Arkansas Water and Air Pollution Control Act (Construction General Permit ARR150000)",
"agencyName": "Arkansas Department of Energy and Environment, Division of Environmental Quality (Arkansas DEQ), Office of Water Quality",
"agencyUrl": "https://www.adeq.state.ar.us/water/permits/npdes/stormwater/",
"permitUrl": "https://www.adeq.state.ar.us/water/permits/npdes/stormwater/pdfs/construction/arr150000-final-permit_2026-11-01.pdf",
"confidence": "verified",
"sourceUrl": "https://www.adeq.state.ar.us/water/permits/npdes/stormwater/pdfs/construction/arr150000-final-permit_2026-11-01.pdf",
"note": "Credential: no preparer credential. The permit requires that 'The SWPPP shall be prepared by qualified personnel using sound engineering practices', and defines qualified personnel by knowledge rather than certification. HOWEVER Arkansas DOES credential INSPECTORS: personnel conducting site inspections must hold either EPA construction inspection training completion or a valid construction inspection certification. That is an inspection credential, not a preparation credential.",
"credential": {
"gate": "open",
"summary": "No preparer credential was found for Arkansas. On what we have verified, a generated plan can be adopted by the operator without a credentialed signature. Local ordinances can still be stricter than state law.",
"routes": [],
"stateCourseRequired": false,
"sourceCitation": null,
"sourceUrl": "https://www.adeq.state.ar.us/water/permits/npdes/stormwater/pdfs/construction/arr150000-final-permit_2026-11-01.pdf",
"confidence": "verified"
}
}
],
"truncated_for_docs": "Showing 3 of 52 jurisdictions. The live endpoint returns all of them."
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}/api/v1/jurisdictions/{code}
Key optionalOne jurisdiction: who permits (the state or EPA), the governing permit and number, the agency links, and the preparer-credential gate. A code we hold no row for returns invalid_request with details.known_states so a caller can correct itself; a code we hold but have not verified returns 200 with confidence "unverified" and the agency to confirm with. Free, keyless and not rate-limited.
Can return: unauthorized (401), internal (500), invalid_request (400).
| Param | In | Required | Description |
|---|---|---|---|
| code | path | yes | Two-letter jurisdiction code, e.g. "CA". Case-insensitive. |
request
curl https://basinwise.vercel.app/api/v1/jurisdictions/CA
response 200
{
"data": {
"code": "CA",
"name": "California",
"npdesAuthorized": true,
"governingPermitId": "ca-cas000002",
"permitNumber": "CAS000002",
"permitName": "Construction General Permit, Order WQ 2022-0057-DWQ (NPDES No. CAS000002)",
"agencyName": "California State Water Resources Control Board (State Water Board)",
"agencyUrl": "https://www.waterboards.ca.gov/water_issues/programs/stormwater/construction.html",
"permitUrl": "https://www.waterboards.ca.gov/water_issues/programs/stormwater/construction/docs/2022-0057-dwq-with-attachments/cgp2022_order.pdf",
"confidence": "verified",
"sourceUrl": "https://www.waterboards.ca.gov/water_issues/programs/stormwater/construction/docs/2022-0057-dwq-with-attachments/cgp2022_order.pdf",
"note": "Permit Section V.C.1: the discharger must retain a QSD from the beginning of the project through Notice of Termination approval. Section 1641 requires the signature of the QSD who prepared the SWPPP. Generated SWPPPs are drafts for a QSD to review, amend and sign. A Qualified SWPPP Practitioner (QSP) is separately required for implementation and inspections.",
"credential": {
"gate": "gated",
"summary": "California requires a credentialed preparer. Treat the generated document as a complete draft for that person to review, adopt and sign. It is not by itself a compliant filed plan.",
"routes": [
"California PE or PG (self-certify)",
"Landscape architect, AIH hydrologist, CPESC or CPSWQ plus CASQA training and exam"
],
"stateCourseRequired": true,
"sourceCitation": "Order WQ 2022-0057-DWQ Attachment D, sections II.C, V.C.1 and V.F",
"sourceUrl": "https://www.waterboards.ca.gov/board_decisions/adopted_orders/water_quality/2022/wqo_2022-0057-dwq.pdf",
"confidence": "verified"
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}/api/v1/credentials
Key optionalDoes this state require a credentialed preparer to prepare or sign the stormwater plan, and does the requirement bite for a site of this size? This is the question that decides whether a generated document is the operator's deliverable or a draft somebody else has to sign, so it gets an endpoint of its own. The answer is a structured gate (open, gated, conditional or unknown) rather than a boolean, because states differ on three independent axes: which credentials qualify, whether a state course is layered on top, and what triggers the gate (acreage in Utah and Oregon, plan scope in New York). A state we have not verified returns "unknown", never "open": defaulting an unverified state to open would be the most dangerous answer this product could give. `documentStatus` states the consequence in plain language on every response.
Can return: unauthorized (401), internal (500), invalid_request (400), rate_limited (429).
| Param | In | Required | Description |
|---|---|---|---|
| state | query | yes | Two-letter state code, e.g. "CA". |
| acres | query | no | Acres disturbed. Optional, and it matters: several states gate only above an acreage threshold. Without it, a conditional state answers appliesToThisSite: null and names the threshold that decides it rather than guessing. |
request
curl "https://basinwise.vercel.app/api/v1/credentials?state=CA"
response 200
{
"data": {
"state": "CA",
"name": "California",
"acres": null,
"gate": "gated",
"appliesToThisSite": true,
"summary": "California requires a credentialed preparer. Treat the generated document as a complete draft for that person to review, adopt and sign. It is not by itself a compliant filed plan.",
"routes": [
"California PE or PG (self-certify)",
"Landscape architect, AIH hydrologist, CPESC or CPSWQ plus CASQA training and exam"
],
"stateCourseRequired": true,
"peStamp": null,
"sourceCitation": "Order WQ 2022-0057-DWQ Attachment D, sections II.C, V.C.1 and V.F",
"sourceUrl": "https://www.waterboards.ca.gov/board_decisions/adopted_orders/water_quality/2022/wqo_2022-0057-dwq.pdf",
"confidence": "verified",
"note": "The SWPPP shall be developed by a Qualified SWPPP Developer (QSD). No PE stamp mandate.",
"documentStatus": "A document generated for this site is a DRAFT for a credentialed preparer to review, amend and sign. It is not by itself a compliant filed plan."
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}/api/v1/pricing
Key optionalMachine-readable pricing: every plan id, its monthly price (read live from lib/plans.ts, never hardcoded), what it includes, the included monthly API-call allowance (a hard ceiling, not a meter), rate limits, and the public sandbox key. Lets an agent self-select a plan without a human reading the pricing page. Free, keyless, not rate-limited.
Can return: unauthorized (401), internal (500).
request
curl https://basinwise.vercel.app/api/v1/pricing
response 200
{
"data": {
"currency": "usd",
"unit": "Metered by billable call once you send a live key on a paid plan. Anonymous, sandbox and test-key calls never bill; they are rate-limited instead.",
"determinism": "Every response is a projection of a cited permit plus deterministic arithmetic. There is no model in the request path, so the same site always returns the same determination. Every requirement carries the permit section it came from (`citation.sourceCitation`, e.g. \"2022 CGP Part 4.1.2\") and a `confidence` of \"verified\" or \"unverified\"; render \"unverified\" as Unverified, never as fact. Where we have not read a jurisdiction's permit we return no requirements and say so in `notices`, rather than substituting another permit's numbers. Every determination is stamped with the `datasetVersion` it was computed against, so a saved answer stays defensible after the dataset moves.",
"anonymous": {
"price_usd": 0,
"rate_limit_per_minute": 4,
"rate_limit_per_day": 20,
"api_access": false,
"note": "No key needed. Every endpoint on this API works at this throttled rate. There is no paid endpoint: what a paid plan buys is the generated plan document and the retained inspection record in the app, plus a higher API throttle."
},
"sandbox_key": {
"key": "bw_test_sandbox",
"rate_limit_per_minute": 10,
"rate_limit_per_day": 200,
"bills": false,
"note": "A public sandbox key that works with no signup, so an agent succeeds on first contact. It is throttled per IP at the test-key rate and never bills. Your own free test key gives you a bucket nobody else shares."
},
"test_key": {
"rate_limit_per_minute": 10,
"rate_limit_per_day": 200,
"bills": false,
"note": "A bw_test_ key (see /api/v1 auth) runs the real engine against the real permit dataset, never bills, and only raises the anonymous throttle."
},
"plans": [
{
"id": "free",
"name": "Free",
"price_usd_per_month": 0,
"cadence": "free forever",
"tagline": "Screen one site. No card, no signup.",
"included_api_calls_per_month": 0,
"rate_limit_per_minute": 0,
"saved_sites": 0,
"seats": 1,
"api_access": false,
"site_history": false,
"swppp_document": false,
"inspection_log": false,
"exports": false,
"priority_support": false,
"features": [
"Single-site screening, runs in your browser so site data is never transmitted",
"Which permit governs the site, with the permit section cited",
"Eligibility screens, inspection frequency and stabilisation deadlines",
"Every jurisdiction page, with the agency and permit linked",
"Test API key for developers and agents (throttled, never bills)",
"Public API and MCP at the anonymous rate"
]
},
{
"id": "pro",
"name": "Pro",
"price_usd_per_month": 49,
"cadence": "per month",
"tagline": "For the contractor or manager running live sites.",
"included_api_calls_per_month": 1000,
"rate_limit_per_minute": 60,
"saved_sites": "unlimited",
"seats": 1,
"api_access": true,
"site_history": true,
"swppp_document": true,
"inspection_log": true,
"exports": true,
"priority_support": false,
"features": [
"Site-specific plan document, generated from your site and downloadable",
"The retained inspection and corrective-action record the permit requires you to keep",
"Unlimited saved sites, each with the permit version it was determined against",
"Amendment tracking, so a change to the site is dated and recorded",
"Export the record as CSV and the plan document for print",
"Stormwater permit API, 1,000 calls/mo included",
"Hosted MCP server at your plan's burst rate instead of the anonymous rate",
"Inspectable request log"
]
},
{
"id": "scale",
"name": "Scale",
"price_usd_per_month": 149,
"cadence": "per month",
"tagline": "For builders running a portfolio, and products built on the API.",
"included_api_calls_per_month": 10000,
"rate_limit_per_minute": 300,
"saved_sites": "unlimited",
"seats": 1,
"api_access": true,
"site_history": true,
"swppp_document": true,
"inspection_log": true,
"exports": true,
"priority_support": true,
"features": [
"Everything in Pro",
"10,000 API calls/mo",
"300 requests/minute burst",
"Priority support"
]
}
],
"checkout": {
"note": "There is no machine-callable checkout API: a signed-in human starts Stripe Checkout from the billing page. An agent choosing a plan on a user's behalf should direct them to upgrade_url.",
"upgrade_url": "https://basinwise.vercel.app/pricing"
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.",
"attribution": "Data from Basinwise (https://basinwise.vercel.app): NPDES stormwater permit requirements, cited to the permit section and carrying a confidence flag. Free responses require this attribution."
}Basinwise reports publicly published permit requirements and cites the permit section behind each one. It is not legal or engineering advice and it is not a permit. We do not perform the physical site inspections the permit requires; we generate the plan and keep the record. Where a jurisdiction requires a credentialed preparer, the document we generate is a draft for that person to review and sign. Always confirm against your permitting authority's current permit before you break ground.
Start with no key, then raise the throttle
Every route answers anonymously at the free rate. A key lifts it to your plan's quota and gives you the inspectable request log.