{"openapi":"3.1.0","info":{"title":"Juriset API","description":"Juriset is a verified, versioned, cited record of jurisdiction rules: US and Canadian\nemployment and payroll rules to start (minimum wage, overtime, paid leave, termination notice,\npayroll contributions). Every published value is multi-model verified against the primary\nsource, with full provenance; escalations are reviewed by a human. Each value comes with its\nofficial source, the verbatim passage, a stored snapshot of the source and its verification\nrecord. Responses report values and declarative criteria; they never compute an answer for a\ncase.\n\n**Start here.** Find a jurisdiction's slug with `GET /v1/jurisdictions?q=Washington`, the rule\ntypes with `GET /v1/rule-types`, then `GET /v1/rules/employment/us-wa/minimum_wage`. Store the\n`id` of the version you relied on: `GET /v1/versions/{id}` returns that exact version\nforever.\n\n**API keys.** Send `Authorization: Bearer jrs_live_…`. A free key comes from\nhttps://juriset.dev/account. Keep keys on servers, never in browsers or apps. Reads also work\nwith no key at all: 60 requests an hour and 500 a day per IP, with the Free plan's\nfeatures. Discovery, versions by id and snapshots never need a key and are not counted.\n\n**Plans.** Free: today's rules and announced changes, 1,000 lookups a month, 2 requests a\nsecond. Developer and above add history, `as_of` and the change feed; Scale adds bulk export.\nDeveloper and above also download audit bundles (`GET /v1/versions/{id}/audit-bundle`): a zip\nwith a version, its whole verification record and the cited source, each file hashed. A feature\noutside the caller's plan answers 403 `plan_required`. Limits are in `x-plans`.\n\n**Lookups and limits.** Each answered call is one lookup; comparing jurisdictions counts one\nper jurisdiction returned. Errors, `304 Not Modified` and discovery are free. Responses carry\n`RateLimit-Limit/Remaining/Reset` (with a key: requests per second, with a small burst;\nwithout: the keyless window) and `Juriset-Quota-Limit/Remaining/Reset` (lookups this month,\nUTC). Past them: 429 `rate_limited` or `quota_exceeded`, with `Retry-After`.\n\n**Caching.** Every response has an `ETag`. Send it back as `If-None-Match`: while nothing\nchanged you get a free 304. Rule responses are `Cache-Control: no-cache` (revalidate each\ntime) because `verified_at` and `review_pending` change without a new version.\n\n**Errors.** One body everywhere: `{\"error\": {code, message, docs_url, details}}`, with the\nsame fields repeated at the top level (plus `status` and `status_page`) for clients written\nagainst Juriset V1. Codes are stable and listed in `x-error-codes`; `message` says what to do\ninstead.\n\n**Reading a rule.** `resolution` says how jurisdiction levels combine (`override`, `max`,\n`stack`); `layers` holds each level with its own sources and verification, never merged;\n`missing_layers` says what is not answered and why. Values are reported as the sources state\nthem. `verification.published_by` is `auto` when the verification gate published a version\nwith no person involved, and `human` when a person reviewed it.\n\nQuestions: support@juriset.dev. Informational only. Not legal advice. Verify with the cited\nsource.\n","version":"1","termsOfService":"https://juriset.dev/terms","contact":{"name":"Juriset support","email":"support@juriset.dev"}},"servers":[{"url":"https://api.juriset.dev","description":"Production"}],"paths":{"/v1/rules/{domain}/{jurisdiction}/{rule_type}":{"get":{"tags":["rules"],"summary":"The rule in a jurisdiction, today or on a date","description":"What a rule type requires in a jurisdiction, with every jurisdiction level that\napplies, each with its own sources and verification. Example: `GET /v1/rules/employment/\nus-wa/minimum_wage` for Washington's minimum wage today, or `?as_of=2027-01-01` for the\nrate scheduled on that date.\n\n**How to read it.** `resolution` says how levels combine:\n- `override` and `max`: read the top level. `resolved_from` names the layer it mirrors;\n  `id` is that version's stable id and `citation` its primary source passage.\n- `stack` (e.g. US overtime: federal weekly plus state daily rules): the top level is\n  null; read every entry of `layers`, each a separate rule that applies, with its own\n  `id`.\n\n**Before relying on it, check:**\n- `missing_layers`: a level that applies has nothing published, and the answer is\n  incomplete. `not_addressed` means the official sources were searched and say\n  nothing, which is not \"no requirement\".\n- `has_requirement: false`: the jurisdiction verifiably sets no rule of this type (a\n  cited answer).\n- `tiers_present`: tiers or exceptions exist; the top-level value is not the answer\n  for everyone. `criteria` states when values apply; Juriset never evaluates it.\n- `coverage.local_rules_may_apply`: cities or counties set their own rule.\n- `review_pending`: a change to a source awaits verification or review.\n- `upcoming`: announced changes not yet in effect.\n\nStore the `id` you relied on: `GET /v1/versions/{id}` returns that exact version\nforever. Values are reported as the sources state them; nothing is computed or merged.\nNot legal advice. Errors: `jurisdiction_not_covered` (with `nearest_covered`),\n`not_covered_for_date`, `jurisdiction_not_found` (with `suggestions`),\n`rule_type_not_found`, `domain_not_found`.\n\nEvery plan, Free and keyless included, gets today's rule and `upcoming`; `as_of` needs a\npaid plan (Developer and above).","operationId":"getRule","security":[{"ApiKey":[]},{}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`).","examples":["employment"],"title":"Domain"},"description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`)."},{"name":"jurisdiction","in":"path","required":true,"schema":{"type":"string","description":"Jurisdiction slug, e.g. `us` (federal), `us-wa`, `ca-ab`. Never guess one: `GET /v1/jurisdictions?q=Washington` returns it.","examples":["us-wa"],"title":"Jurisdiction"},"description":"Jurisdiction slug, e.g. `us` (federal), `us-wa`, `ca-ab`. Never guess one: `GET /v1/jurisdictions?q=Washington` returns it."},{"name":"rule_type","in":"path","required":true,"schema":{"type":"string","description":"Rule type slug, with underscores: `minimum_wage`, `overtime`, `paid_leave`, `termination_notice`. `GET /v1/rule-types` lists them with schemas.","examples":["minimum_wage"],"title":"Rule Type"},"description":"Rule type slug, with underscores: `minimum_wage`, `overtime`, `paid_leave`, `termination_notice`. `GET /v1/rule-types` lists them with schemas."},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"A date, `YYYY-MM-DD`, past or future: the rule in effect on that day. Future dates return what is scheduled then (`scheduled: true`). Before the rule's `coverage.covered_since`: `not_covered_for_date`. Omit for today. Paid plans (Developer and above); on Free, `plan_required`.","examples":["2027-01-01"],"title":"As Of"},"description":"A date, `YYYY-MM-DD`, past or future: the rule in effect on that day. Future dates return what is scheduled then (`scheduled: true`). Before the rule's `coverage.covered_since`: `not_covered_for_date`. Omit for today. Paid plans (Developer and above); on Free, `plan_required`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleOut"},"examples":{"override":{"summary":"override: Alberta overtime (top level mirrors the one layer)","value":{"domain":"employment","schema_version":"1.1.0","as_of":"2026-10-26","scheduled":false,"coverage":{"covered_since":"2026-01-01","local_rules_may_apply":false},"tiers_present":false,"missing_layers":[],"upcoming":[],"review_pending":false,"disclaimer":"Informational only. Not legal advice. Verify with the cited source.","rule":{"domain":"employment","rule_type":"overtime","jurisdiction":{"slug":"ca-ab","name":"Alberta","level":"province"},"resolved_from":"ca-ab"},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json","rule_type":"overtime","jurisdiction":{"slug":"ca-ab","name":"Alberta","level":"province"},"resolution":"override","resolved_from":"ca-ab","version":3,"has_requirement":true,"effective_from":"2026-01-01","verified_at":"2026-10-18T07:02:11Z","data":{"threshold_daily_hours":8,"threshold_weekly_hours":44,"multiplier":1.5,"basis":"whichever is greater"},"citations":[{"role":"primary","title":"Employment Standards Code, RSA 2000, c E-9","section":"s. 21","url":"https://kings-printer.alberta.ca/documents/Acts/E09.pdf","excerpt":"An employer must pay an employee overtime pay for overtime hours ...","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7A","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"citation":{"title":"Employment Standards Code, RSA 2000, c E-9","section":"s. 21","url":"https://kings-printer.alberta.ca/documents/Acts/E09.pdf","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10","excerpt":"An employer must pay an employee overtime pay for overtime hours ..."},"layers":[{"jurisdiction":"ca-ab","level":"province","version":3,"has_requirement":true,"effective_from":"2026-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"threshold_daily_hours":8,"threshold_weekly_hours":44,"multiplier":1.5,"basis":"whichever is greater"},"citations":[{"role":"primary","title":"Employment Standards Code, RSA 2000, c E-9","section":"s. 21","url":"https://kings-printer.alberta.ca/documents/Acts/E09.pdf","excerpt":"An employer must pay an employee overtime pay for overtime hours ...","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7A","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json"}]}},"max":{"summary":"max: Washington minimum wage (the higher of federal and state answers)","value":{"domain":"employment","schema_version":"1.1.0","as_of":"2026-10-26","scheduled":false,"coverage":{"covered_since":"2026-01-01","local_rules_may_apply":true,"note":"Seattle and SeaTac set their own minimum wages."},"tiers_present":false,"missing_layers":[],"upcoming":[{"jurisdiction":"us-wa","level":"state","version":5,"has_requirement":true,"effective_from":"2027-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"amount":17.13,"currency":"USD","per_unit":"hour","applies_to":"Employees aged 16 and over"},"citations":[{"role":"primary","title":"Minimum wage","url":"https://lni.wa.gov/workers-rights/wages/minimum-wage/","excerpt":"The 2026 minimum wage is $16.66 per hour.","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7F","status":"upcoming","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/minimum_wage/v1.json","change_type":"amendment","summary":"minimum_wage us-wa v5 effective 2027-01-01 (amendment of v4)"}],"review_pending":false,"disclaimer":"Informational only. Not legal advice. Verify with the cited source.","rule":{"domain":"employment","rule_type":"minimum_wage","jurisdiction":{"slug":"us-wa","name":"Washington","level":"state"},"resolved_from":"us-wa"},"schema_url":"https://juriset.dev/schemas/employment/minimum_wage/v1.json","rule_type":"minimum_wage","jurisdiction":{"slug":"us-wa","name":"Washington","level":"state"},"resolution":"max","resolved_from":"us-wa","version":4,"has_requirement":true,"effective_from":"2026-01-01","effective_to":"2027-01-01","verified_at":"2026-10-18T07:02:11Z","data":{"amount":16.66,"currency":"USD","per_unit":"hour","applies_to":"Employees aged 16 and over"},"citations":[{"role":"primary","title":"Minimum wage","url":"https://lni.wa.gov/workers-rights/wages/minimum-wage/","excerpt":"The 2026 minimum wage is $16.66 per hour.","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7C","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"citation":{"title":"Minimum wage","url":"https://lni.wa.gov/workers-rights/wages/minimum-wage/","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10","excerpt":"The 2026 minimum wage is $16.66 per hour."},"layers":[{"jurisdiction":"us","level":"country","version":2,"has_requirement":true,"effective_from":"2026-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"amount":7.25,"currency":"USD","per_unit":"hour","applies_to":"Covered nonexempt workers"},"citations":[{"role":"primary","title":"29 U.S.C. § 206","url":"https://www.dol.gov/agencies/whd/minimum-wage","excerpt":"... not less than $7.25 an hour ...","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7B","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/minimum_wage/v1.json"},{"jurisdiction":"us-wa","level":"state","version":4,"has_requirement":true,"effective_from":"2026-01-01","effective_to":"2027-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"amount":16.66,"currency":"USD","per_unit":"hour","applies_to":"Employees aged 16 and over"},"citations":[{"role":"primary","title":"Minimum wage","url":"https://lni.wa.gov/workers-rights/wages/minimum-wage/","excerpt":"The 2026 minimum wage is $16.66 per hour.","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7C","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/minimum_wage/v1.json"}]}},"stack":{"summary":"stack: California overtime (read `layers`; no single answer)","value":{"domain":"employment","schema_version":"1.1.0","as_of":"2026-10-26","scheduled":false,"coverage":{"covered_since":"2026-01-01","local_rules_may_apply":false},"tiers_present":false,"missing_layers":[],"upcoming":[],"review_pending":false,"disclaimer":"Informational only. Not legal advice. Verify with the cited source.","rule":{"domain":"employment","rule_type":"overtime","jurisdiction":{"slug":"us-ca","name":"California","level":"state"}},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json","rule_type":"overtime","jurisdiction":{"slug":"us-ca","name":"California","level":"state"},"resolution":"stack","verified_at":"2026-10-18T07:02:11Z","layers":[{"jurisdiction":"us","level":"country","version":1,"has_requirement":true,"effective_from":"2026-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"threshold_weekly_hours":40,"multiplier":1.5},"citations":[{"role":"primary","title":"29 U.S.C. § 207","url":"https://www.dol.gov/agencies/whd/overtime","excerpt":"... one and one-half times ...","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7D","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json"},{"jurisdiction":"us-ca","level":"state","version":2,"has_requirement":true,"effective_from":"2026-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"threshold_daily_hours":8,"threshold_weekly_hours":40,"multiplier":1.5,"double_time_daily_hours":12},"citations":[{"role":"primary","title":"Cal. Lab. Code § 510","url":"https://www.dir.ca.gov/dlse/faq_overtime.htm","excerpt":"... eight hours ...","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7E","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json"}]}},"sources_silent":{"summary":"stack with a missing level: Texas overtime (official sources silent)","value":{"domain":"employment","schema_version":"1.1.0","as_of":"2026-10-26","scheduled":false,"coverage":{"local_rules_may_apply":false},"tiers_present":false,"missing_layers":[{"jurisdiction":"us-tx","level":"state","reason":"not_addressed","checked_on":"2026-10-26","note":"TWC pages describe only the federal FLSA; no Texas statute found.","review_pending":false}],"upcoming":[],"review_pending":false,"disclaimer":"Informational only. Not legal advice. Verify with the cited source.","rule":{"domain":"employment","rule_type":"overtime","jurisdiction":{"slug":"us-tx","name":"Texas","level":"state"}},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json","rule_type":"overtime","jurisdiction":{"slug":"us-tx","name":"Texas","level":"state"},"resolution":"stack","verified_at":"2026-10-18T07:02:11Z","layers":[{"jurisdiction":"us","level":"country","version":1,"has_requirement":true,"effective_from":"2026-01-01","verified_at":"2026-10-18T07:02:11Z","schema_version":"1.1.0","data":{"threshold_weekly_hours":40,"multiplier":1.5},"citations":[{"role":"primary","title":"29 U.S.C. § 207","url":"https://www.dol.gov/agencies/whd/overtime","excerpt":"... one and one-half times ...","fetched_at":"2026-10-18T07:02:11Z","snapshot_url":"https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"}],"review_pending":false,"id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7D","status":"current","verification":{"extractor":{"vendor":"anthropic","model":"claude-extractor","prompt_version":"3"},"verifier":{"vendor":"google","model":"gemini-verifier","prompt_version":"1"},"agreement_score":1.0,"published_by":"auto"},"schema_url":"https://juriset.dev/schemas/employment/overtime/v1.json"}]}}}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones. `rule_type_not_found`: Unknown rule type; `details.rule_types` lists the known ones (`GET /v1/rule-types`). `jurisdiction_not_found`: Unknown jurisdiction slug; `details.suggestions` lists likely ones. Find slugs with `GET /v1/jurisdictions?q=`. `jurisdiction_not_covered`: Juriset does not cover this rule type in this jurisdiction (for example a city). `details.nearest_covered` names the nearest level that is covered; its rule may not be the whole answer here. `not_covered_for_date`: `as_of` is before the date Juriset's data for this rule is authoritative from (`details.covered_since`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/rules/{domain}/{jurisdiction}/{rule_type}/history":{"get":{"tags":["rules"],"summary":"Every published version of a jurisdiction's rule","description":"Every version ever published for this jurisdiction's own rule, by effective date,\nwith sources and verification: the timeline (`published`), corrections it replaced\n(`superseded`) and versions removed by a rollback (`withdrawn`). Example:\n`GET /v1/rules/employment/us-wa/minimum_wage/history`.\n\nHistory is per jurisdiction. `layer_jurisdictions` names the other levels that apply\n(e.g. `us` for a state's minimum wage); fetch their history separately. To ask what\napplied on a date, use `GET /v1/rules/{domain}/{jurisdiction}/{rule_type}?as_of=`.\n\nPaid plans (Developer and above); on Free or without a key, `plan_required`.","operationId":"getRuleHistory","security":[{"ApiKey":[]},{}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`).","examples":["employment"],"title":"Domain"},"description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`)."},{"name":"jurisdiction","in":"path","required":true,"schema":{"type":"string","description":"Jurisdiction slug, e.g. `us` (federal), `us-wa`, `ca-ab`. Never guess one: `GET /v1/jurisdictions?q=Washington` returns it.","examples":["us-wa"],"title":"Jurisdiction"},"description":"Jurisdiction slug, e.g. `us` (federal), `us-wa`, `ca-ab`. Never guess one: `GET /v1/jurisdictions?q=Washington` returns it."},{"name":"rule_type","in":"path","required":true,"schema":{"type":"string","description":"Rule type slug, with underscores: `minimum_wage`, `overtime`, `paid_leave`, `termination_notice`. `GET /v1/rule-types` lists them with schemas.","examples":["minimum_wage"],"title":"Rule Type"},"description":"Rule type slug, with underscores: `minimum_wage`, `overtime`, `paid_leave`, `termination_notice`. `GET /v1/rule-types` lists them with schemas."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryOut"}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones. `rule_type_not_found`: Unknown rule type; `details.rule_types` lists the known ones (`GET /v1/rule-types`). `jurisdiction_not_found`: Unknown jurisdiction slug; `details.suggestions` lists likely ones. Find slugs with `GET /v1/jurisdictions?q=`. `jurisdiction_not_covered`: Juriset does not cover this rule type in this jurisdiction (for example a city). `details.nearest_covered` names the nearest level that is covered; its rule may not be the whole answer here.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/rules/{domain}/{rule_type}":{"get":{"tags":["rules"],"summary":"One rule type across jurisdictions","description":"The rule response of every jurisdiction at the given levels, or of the jurisdictions\nnamed in `jurisdiction`, for comparing jurisdictions. Examples:\n`GET /v1/rules/employment/minimum_wage` for every state and province;\n`GET /v1/rules/employment/minimum_wage?jurisdiction=us-wa,us-or,us-ca` for three states.\nEach entry of `results` is the same object `getRule` returns, so `layers`,\n`missing_layers` and the rest apply per jurisdiction. Each result counts as one lookup.\nWith `as_of` (paid plans), jurisdictions whose coverage starts later are listed in\n`not_covered`.","operationId":"compareJurisdictions","security":[{"ApiKey":[]},{}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`).","examples":["employment"],"title":"Domain"},"description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`)."},{"name":"rule_type","in":"path","required":true,"schema":{"type":"string","description":"Rule type slug, with underscores: `minimum_wage`, `overtime`, `paid_leave`, `termination_notice`. `GET /v1/rule-types` lists them with schemas.","examples":["minimum_wage"],"title":"Rule Type"},"description":"Rule type slug, with underscores: `minimum_wage`, `overtime`, `paid_leave`, `termination_notice`. `GET /v1/rule-types` lists them with schemas."},{"name":"level","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated jurisdiction levels to include: `country`, `state`, `province`, `county`, `city`. Defaults to `state,province` (US states and DC, Canadian provinces and territories), so later city coverage does not change this response. `country` returns the federal rules. Not with `jurisdiction`.","examples":["state,province"],"default":"state,province","title":"Level"},"description":"Comma-separated jurisdiction levels to include: `country`, `state`, `province`, `county`, `city`. Defaults to `state,province` (US states and DC, Canadian provinces and territories), so later city coverage does not change this response. `country` returns the federal rules. Not with `jurisdiction`."},{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated jurisdiction slugs to compare instead of whole levels, at most 100, any level: `us-wa,us-or,us-ca`. Not with `level`. A slug with no rule of this type is refused, as `getRule` refuses it (`jurisdiction_not_covered`, naming the nearest covered jurisdiction); an unknown slug is `jurisdiction_not_found`.","examples":["us-wa,us-or,us-ca"],"title":"Jurisdiction"},"description":"Comma-separated jurisdiction slugs to compare instead of whole levels, at most 100, any level: `us-wa,us-or,us-ca`. Not with `level`. A slug with no rule of this type is refused, as `getRule` refuses it (`jurisdiction_not_covered`, naming the nearest covered jurisdiction); an unknown slug is `jurisdiction_not_found`."},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"A date, `YYYY-MM-DD`, past or future: the rule in effect on that day. Future dates return what is scheduled then (`scheduled: true`). Before the rule's `coverage.covered_since`: `not_covered_for_date`. Omit for today. Paid plans (Developer and above); on Free, `plan_required`.","examples":["2027-01-01"],"title":"As Of"},"description":"A date, `YYYY-MM-DD`, past or future: the rule in effect on that day. Future dates return what is scheduled then (`scheduled: true`). Before the rule's `coverage.covered_since`: `not_covered_for_date`. Omit for today. Paid plans (Developer and above); on Free, `plan_required`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RulesAcrossOut"}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones. `rule_type_not_found`: Unknown rule type; `details.rule_types` lists the known ones (`GET /v1/rule-types`). `jurisdiction_not_found`: Unknown jurisdiction slug; `details.suggestions` lists likely ones. Find slugs with `GET /v1/jurisdictions?q=`. `jurisdiction_not_covered`: Juriset does not cover this rule type in this jurisdiction (for example a city). `details.nearest_covered` names the nearest level that is covered; its rule may not be the whole answer here.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/changes":{"get":{"tags":["changes"],"summary":"The change feed: rules published or taking effect","description":"Every change to a published rule, oldest first: a version `published` (new rule,\namendment, correction, repeal; announced changes are published before they take\neffect), or an announced version that `took_effect` on its date. Each entry names the\nrule and links to it (`rule_url`) and to the version (`version_id`); read those for the\nfull answer. Example: `GET /v1/changes?since=2026-10-01T00:00:00Z&jurisdiction=us,us-wa`,\nthen poll `GET /v1/changes?cursor=<cursor>` daily for anything new.\n\nPaid plans (Developer and above); on Free or without a key, `plan_required`. One lookup\nper call.","operationId":"listChanges","security":[{"ApiKey":[]},{}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start from changes recorded at or after this moment (ISO 8601, e.g. `2026-10-01T00:00:00Z`; a date alone means its midnight UTC). Give this or `cursor`.","examples":["2026-10-01T00:00:00Z"],"title":"Since"},"description":"Start from changes recorded at or after this moment (ISO 8601, e.g. `2026-10-01T00:00:00Z`; a date alone means its midnight UTC). Give this or `cursor`."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Continue after a previous call: its `cursor`. Polling with the last `cursor` returns only what is new.","title":"Cursor"},"description":"Continue after a previous call: its `cursor`. Polling with the last `cursor` returns only what is new."},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Limit to one domain.","examples":["employment"],"title":"Domain"},"description":"Limit to one domain."},{"name":"jurisdiction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated jurisdiction slugs: changes to those jurisdictions' own rules. A state's answer also depends on its federal layer: to follow both, pass `us,us-wa`.","examples":["us,us-wa"],"title":"Jurisdiction"},"description":"Comma-separated jurisdiction slugs: changes to those jurisdictions' own rules. A state's answer also depends on its federal layer: to follow both, pass `us,us-wa`."},{"name":"rule_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Limit to one rule type (needs `domain`).","examples":["overtime"],"title":"Rule Type"},"description":"Limit to one rule type (needs `domain`)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Changes per call, at most 500.","default":100,"title":"Limit"},"description":"Changes per call, at most 500."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesOut"},"examples":{"feed":{"summary":"Two changes","value":{"since":"2026-10-01T00:00:00Z","count":2,"changes":[{"id":"5f0c2a8e-1d4b-4f7e-9a51-2b7d3c9e8f10","ts":"2026-10-02T15:04:11Z","event":"published","change_type":"amendment","domain":"employment","rule_type":"minimum_wage","jurisdiction":{"slug":"us-wa","name":"Washington","level":"state"},"effective_from":"2027-01-01","version":4,"from_version":3,"summary":"Minimum wage rises to $17.13 per hour on January 1, 2027.","rule_url":"https://api.juriset.dev/v1/rules/employment/us-wa/minimum_wage","version_id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7C"},{"id":"a3e1b7c2-6f0d-4c1a-8e29-7d5b4c3a2f01","ts":"2026-10-03T07:00:02Z","event":"took_effect","change_type":"amendment","domain":"employment","rule_type":"overtime","jurisdiction":{"slug":"ca-ab","name":"Alberta","level":"province"},"effective_from":"2026-10-03","version":2,"from_version":1,"rule_url":"https://api.juriset.dev/v1/rules/employment/ca-ab/overtime","version_id":"rv_01JC3W9V6S7QX8YB2M4N5P6R7G"}],"has_more":false,"cursor":"MjAyNi0xMC0wM1QwNzowMDowMiswMDowMHxhM2UxYjdjMi02ZjBkLTRjMWEtOGUyOS03ZDViNGMzYTJmMDE","disclaimer":"Informational only. Not legal advice. Verify with the cited source."}}}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones. `rule_type_not_found`: Unknown rule type; `details.rule_types` lists the known ones (`GET /v1/rule-types`). `jurisdiction_not_found`: Unknown jurisdiction slug; `details.suggestions` lists likely ones. Find slugs with `GET /v1/jurisdictions?q=`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/versions/{version_id}/audit-bundle":{"get":{"tags":["rules"],"summary":"Download an audit bundle for one version","description":"A zip that shows an auditor or regulator which rule a decision rested on: the version\nas served, the whole verification record (the extractor's output, the second vendor's\nblind re-extraction and their field-by-field comparison, who published it and when,\nany sample audit), the change events around it, and the cited source as fetched, each\nfile with its SHA-256 in `manifest.json`. Example:\n`GET /v1/versions/rv_01JC3W9V6S7QX8YB2M4N5P6R7T/audit-bundle`.\n\nThe bundle is not signed (signed attestations are planned), and it reports what the\nsource says; it never says how a rule applies to a case. A source too large or no\nlonger readable is listed in `snapshots.json` with the reason, not skipped silently.\nPaid plans (Developer and above); on Free or without a key, `plan_required`. One lookup\nper call.","operationId":"getAuditBundle","security":[{"ApiKey":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","maxLength":64,"description":"A version id from a rule response's `id`, e.g. `rv_000000000000000000000000F2`.","title":"Version Id"},"description":"A version id from a rule response's `id`, e.g. `rv_000000000000000000000000F2`."}],"responses":{"200":{"description":"A zip archive: README.txt, manifest.json (SHA-256 of every file), version.json, provenance.json, snapshots.json and the cited sources as fetched.","content":{"application/json":{"schema":{}},"application/zip":{"schema":{"type":"string","format":"binary"}}},"headers":{"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}}},"404":{"description":"`version_not_found`: No published version has this id or number. Version ids look like `rv_01JC3…` (26 characters after `rv_`) and come from a rule response's `id`; numbers are in the rule's history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/export/{domain}":{"get":{"tags":["export"],"summary":"Bulk export of every current rule in a domain","description":"Every jurisdiction's current answer for every rule type in the domain, in one call,\nfor loading into your own store. Example: `GET /v1/export/employment?format=csv`.\n\n**JSON** results are the same objects `getRule` returns (layers, missing layers,\nupcoming, citations, verification). **CSV** has one row per jurisdiction and rule type\nwith that jurisdiction's own current version only (other levels are their own rows;\ncombining them is `getRule`'s job), `data` as a JSON string, the primary citation, the\nversion's `version_id` and how it was published (`published_by`).\n\nScale plan only; others get `plan_required`. One lookup per call.","operationId":"exportDomain","security":[{"ApiKey":[]},{}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`).","examples":["employment"],"title":"Domain"},"description":"Domain slug: `employment` or `payroll` (list them with `GET /v1/rule-types`)."},{"name":"format","in":"query","required":false,"schema":{"enum":["json","csv"],"type":"string","description":"`json`: full rule responses. `csv`: one row per jurisdiction and rule type, its own layer, `data` as JSON.","default":"json","title":"Format"},"description":"`json`: full rule responses. `csv`: one row per jurisdiction and rule type, its own layer, `data` as JSON."}],"responses":{"200":{"description":"JSON (`ExportOut`) or, with `format=csv`, one CSV row per jurisdiction and rule type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportOut"}},"text/csv":{"schema":{"type":"string"},"example":"domain,rule_type,jurisdiction,jurisdiction_name,level,resolution,version,has_requirement,effective_from,effective_to,schema_version,verified_at,review_pending,missing_reason,data,citation_title,citation_section,citation_url,snapshot_url,rule_url,version_id,published_by\n"}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/reports":{"post":{"tags":["reports"],"summary":"Report a suspected error in a published rule","description":"Tell Juriset a published value looks wrong: name the rule (and the `version`, or\nomit it for the current one), say what the source says instead, and add an official\nURL if you have one. It goes to the escalation queue, where a person checks it against\nthe source; a confirmed error is corrected as a new version, which the change feed then\ncarries. Example body: `{\"domain\": \"employment\", \"jurisdiction\": \"us-wa\", \"rule_type\":\n\"minimum_wage\", \"message\": \"The source says $16.66 from January 1, 2026.\"}`.\n\nAny key, Free included; a key is required (`missing_api_key` without one). Not billed.\nAt most 20 reports per key per day (`too_many_reports`). Do not include personal\ndetails about anyone.","operationId":"reportIssue","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportIn"},"examples":{"wrong_amount":{"summary":"A wrong rate","value":{"domain":"employment","jurisdiction":"us-wa","rule_type":"minimum_wage","version":3,"message":"The L&I page now says $16.66 per hour from January 1, 2026, not $16.28.","suggested_source_url":"https://lni.wa.gov/workers-rights/wages/minimum-wage/"}}}}},"required":true},"responses":{"201":{"description":"Successful Response","headers":{"RateLimit-Limit":{"description":"With a key: requests it may make at once (its burst). Without one: the keyless requests allowed in the window that binds first (an hour or a day).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the burst (or keyless window) right now.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the burst is fully available again (or the keyless window starts again).","schema":{"type":"integer"}},"Juriset-Quota-Limit":{"description":"Lookups this key's account may use this month (UTC): the plan's included lookups. Absent when there is no quota (keyless callers, Scale).","schema":{"type":"integer"}},"Juriset-Quota-Remaining":{"description":"Lookups left this month, after this response.","schema":{"type":"integer"}},"Juriset-Quota-Reset":{"description":"When the month's count starts again (UTC, ISO 8601).","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportOut"}}}},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones. `rule_type_not_found`: Unknown rule type; `details.rule_types` lists the known ones (`GET /v1/rule-types`). `jurisdiction_not_found`: Unknown jurisdiction slug; `details.suggestions` lists likely ones. Find slugs with `GET /v1/jurisdictions?q=`. `jurisdiction_not_covered`: Juriset does not cover this rule type in this jurisdiction (for example a city). `details.nearest_covered` names the nearest level that is covered; its rule may not be the whole answer here. `version_not_found`: No published version has this id or number. Version ids look like `rv_01JC3…` (26 characters after `rv_`) and come from a rule response's `id`; numbers are in the rule's history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"409":{"description":"`nothing_published`: Nothing is published for this rule yet, so there is no value to report on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"`too_many_reports`: More than 20 issue reports from this key today (UTC). `rate_limited`: More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits. `quota_exceeded`: This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"401":{"description":"`missing_api_key`: This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier). `invalid_api_key`: The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole. `revoked_api_key`: The key was revoked (`details.revoked_at`). Use another key from your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"403":{"description":"`plan_required`: The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included. `read_only_key`: A read-only key (the site's own) tried to write.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}},"security":[{"ApiKey":[]}]}},"/v1/jurisdictions":{"get":{"tags":["discovery"],"summary":"Jurisdiction tree and search","description":"Find the slug of a jurisdiction before looking up its rules, so callers never guess\none. `?q=WA` returns `us-wa`; `?q=CA` returns both Canada (`ca`) and California\n(`us-ca`), best match first, with `match` saying why. Without `q`: every jurisdiction,\neach with its `parent`. No API key needed; not billed.","operationId":"listJurisdictions","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Name, postal abbreviation or slug, any case, accents optional: `Washington`, `WA`, `Alberta`, `AB`, `quebec`. Omit for the whole tree.","examples":["Washington"],"title":"Q"},"description":"Name, postal abbreviation or slug, any case, accents optional: `Washington`, `WA`, `Alberta`, `AB`, `quebec`. Omit for the whole tree."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JurisdictionsOut"}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/rule-types":{"get":{"tags":["discovery"],"summary":"Rule types with their schemas and resolution","description":"The rule type registry: each rule type's slug, the JSON Schema of `data` in rule\nresponses (every field described) and of `criteria`, its `schema_version` and\n`schema_url`, and how jurisdiction levels combine (`resolution`, with per-country\n`countries`). No API key needed; not billed.","operationId":"listRuleTypes","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Limit to one domain, e.g. `employment`.","examples":["employment"],"title":"Domain"},"description":"Limit to one domain, e.g. `employment`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleTypesOut"}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`domain_not_found`: Unknown domain; `details.domains` lists the known ones.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/track-record":{"get":{"tags":["trust"],"summary":"Juriset's public accuracy record","description":"How the verification gate has performed: the auto-publish rate, the escalation\nrate, the correction rate (overall, by publisher and by rule type), sample-audit\noutcomes, the median time a person takes to resolve an escalation, and every recent\ncorrection. Recomputed weekly, as of `computed_through`. While nothing has been\npublished through the gate, `status` is `no_data_yet`, every count is 0 and every rate\nis null: absence of history is never reported as a perfect score. `definitions` says how\neach figure is computed. Versions imported from V1 are counted apart\n(`imported_from_v1`), not in the rates. No API key needed; not billed.","operationId":"getTrackRecord","responses":{"200":{"description":"Successful Response","headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackRecordOut"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/versions/{version_id}":{"get":{"tags":["rules"],"summary":"One rule version by its stable id","description":"Returns exactly the version a stored `id` names, forever: values, effective dates,\ncitation and verification as published, with its status today (`current`,\n`upcoming`, `superseded` or `withdrawn`). Use it to re-check a value an agent relied\non. Versions imported from Juriset V1 carry `verification.legacy =\n\"v1-human-review\"`: a person reviewed them before multi-model verification existed.\nNo API key needed; not billed. Informational only, not legal advice.","operationId":"getVersion","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","maxLength":64,"description":"A version id from a rule response's `id`, e.g. `rv_000000000000000000000000F2`.","title":"Version Id"},"description":"A version id from a rule response's `id`, e.g. `rv_000000000000000000000000F2`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionOut"}}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}}}},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`version_not_found`: No published version has this id or number. Version ids look like `rv_01JC3…` (26 characters after `rv_`) and come from a rule response's `id`; numbers are in the rule's history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/snapshots/{snapshot_id}":{"get":{"tags":["sources"],"summary":"A stored copy of a cited source","description":"The source page or document exactly as Juriset fetched it, for a citation's\n`snapshot_url`. Redirects to a signed URL that expires after a few minutes (PRD 14), so\nfollow redirects and do not store the target. Only snapshots cited by a published\nversion are served. No API key needed.","operationId":"getSnapshot","parameters":[{"name":"snapshot_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"From a citation's `snapshot_url`.","title":"Snapshot Id"},"description":"From a citation's `snapshot_url`."}],"responses":{"200":{"description":"The source as fetched, in its own content type (HTML, PDF, …), as an attachment. Served directly only where signed URLs are unavailable.","content":{"application/json":{"schema":{}},"application/octet-stream":{}},"headers":{"ETag":{"description":"Hash of the body. Send it back as `If-None-Match` to get a free 304 while nothing changed.","schema":{"type":"string"}},"Cache-Control":{"description":"Caching policy.","schema":{"type":"string"}}}},"302":{"description":"Redirect to a signed, short-lived URL for the stored copy."},"304":{"description":"Not modified since the `If-None-Match` ETag; no body, not billed."},"404":{"description":"`snapshot_not_found`: No stored snapshot with that id is cited by a published version; use a `snapshot_url` from a rule response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"503":{"description":"`snapshots_unavailable`: Snapshot storage cannot be reached here. Retry later; the citation's `url` is the live source. `overloaded`: Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"`invalid_parameter`: A parameter or body field is malformed; `details.problems` lists each one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"500":{"description":"`internal_error`: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}}},"/v1/health":{"get":{"tags":["meta"],"summary":"Readiness","description":"Readiness: the API and its database answer. For uptime monitors (PRD 15).","operationId":"getApiHealth","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}}},"components":{"schemas":{"ChangeOut":{"properties":{"id":{"type":"string","title":"Id","description":"Change event id."},"ts":{"type":"string","format":"date-time","title":"Ts","description":"When the event was recorded."},"event":{"type":"string","enum":["published","took_effect"],"title":"Event","description":"`published`: a version was published (for an announced change, before it takes effect). `took_effect`: an announced version became current on its effective date (local midnight)."},"change_type":{"type":"string","enum":["new","amendment","correction","repeal","rollback"],"title":"Change Type","description":"`new` (first version), `amendment` (the law changed), `correction` (the previous version misstated the source), `repeal`, or `rollback` (a published version was withdrawn and an earlier one restored)."},"domain":{"type":"string","title":"Domain","examples":["employment"]},"rule_type":{"type":"string","title":"Rule Type","examples":["minimum_wage"]},"jurisdiction":{"$ref":"#/components/schemas/JurisdictionRef"},"effective_from":{"type":"string","format":"date","title":"Effective From","description":"Effective date of the version this event is about."},"version":{"type":"integer","title":"Version","description":"The version the rule moved to."},"from_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"From Version","description":"The version it moved from; null for `new`."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Factual one-line summary of the change."},"rule_url":{"type":"string","title":"Rule Url","description":"Absolute URL of the rule (`getRule`), to read the full current answer.","examples":["https://api.juriset.dev/v1/rules/employment/us-wa/minimum_wage"]},"version_id":{"type":"string","title":"Version Id","description":"Stable id of the version moved to (`GET /v1/versions/{id}`).","examples":["rv_01JC3W9V6S7QX8YB2M4N5P6R7T"]}},"type":"object","required":["id","ts","event","change_type","domain","rule_type","jurisdiction","effective_from","version","from_version","summary","rule_url","version_id"],"title":"ChangeOut"},"ChangesOut":{"properties":{"since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since","description":"`since` as given; null when paging by `cursor`."},"count":{"type":"integer","title":"Count"},"changes":{"items":{"$ref":"#/components/schemas/ChangeOut"},"type":"array","title":"Changes","description":"Oldest first."},"has_more":{"type":"boolean","title":"Has More","description":"True when more changes wait: call again with `cursor`."},"cursor":{"type":"string","title":"Cursor","description":"Opaque position after the last change returned (or where this call began when none were). Pass it as `cursor` to page on, or keep it and poll with it later to get only what is new."},"disclaimer":{"type":"string","title":"Disclaimer"}},"type":"object","required":["since","count","changes","has_more","cursor","disclaimer"],"title":"ChangesOut"},"Citation":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","examples":["New York State Minimum Wage (P700)"]},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section","description":"Where in the source.","examples":["Basic minimum hourly rate"]},"url":{"type":"string","title":"Url","description":"The live source page or document."},"snapshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Url","description":"Juriset's stored copy of the source as it was read, so the excerpt can be checked even after the live page changes. Redirects to a short-lived signed URL."},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt","description":"The verbatim passage the values come from."}},"type":"object","required":["title","url","snapshot_url","excerpt"],"title":"Citation"},"CorrectionOut":{"properties":{"ts":{"type":"string","format":"date-time","title":"Ts","description":"When the correction or rollback was published."},"change_type":{"type":"string","enum":["correction","rollback"],"title":"Change Type"},"domain":{"type":"string","title":"Domain"},"rule_type":{"type":"string","title":"Rule Type"},"jurisdiction":{"$ref":"#/components/schemas/VersionJurisdiction"},"corrected_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Corrected Version Id","description":"The version that was corrected or withdrawn (`GET /v1/versions/{id}`).","examples":["rv_01JC3W9V6S7QX8YB2M4N5P6R7T"]},"version_id":{"type":"string","title":"Version Id","description":"The version published in its place."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["ts","change_type","domain","rule_type","jurisdiction","corrected_version_id","version_id","summary"],"title":"CorrectionOut"},"CountryResolution":{"properties":{"country_code":{"type":"string","title":"Country Code","examples":["CA"]},"resolution":{"type":"string","enum":["override","stack","max"],"title":"Resolution"},"resolution_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Field"},"parent_levels":{"items":{"type":"string","enum":["country","state","province","county","city"]},"type":"array","title":"Parent Levels","description":"Levels above the queried jurisdiction that contribute layers in this country. `[province]` for Canada: provinces do not inherit federal employment standards, and the federal jurisdiction (`ca`) is queried directly."}},"type":"object","required":["country_code","resolution","resolution_field","parent_levels"],"title":"CountryResolution"},"Coverage":{"properties":{"covered_since":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Covered Since","description":"The earliest date Juriset's data for this rule is authoritative for: the date Juriset set, or else the effective date of the earliest published version. An `as_of` before it returns `not_covered_for_date`. Null: nothing published yet."},"local_rules_may_apply":{"type":"boolean","title":"Local Rules May Apply","description":"True when lower-level jurisdictions (cities, counties) are known to set their own rule of this type and Juriset does not cover them yet. The answer here is then not the whole answer for every place in the jurisdiction."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"What is not covered, in plain words."}},"type":"object","required":["covered_since","local_rules_may_apply","note"],"title":"Coverage"},"ErrorBody":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine-readable code.","examples":["version_not_found"]},"message":{"type":"string","title":"Message","description":"What went wrong and what to do instead."},"docs_url":{"type":"string","title":"Docs Url","description":"The code's entry in the error reference."},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Code-specific details; the same object as the top level's."}},"type":"object","required":["code","message","docs_url"],"title":"ErrorBody"},"ErrorOut":{"properties":{"error":{"$ref":"#/components/schemas/ErrorBody","description":"PRD 9.3's error object. Read this one."},"code":{"type":"string","title":"Code","description":"The same as `error.code`, kept at the top level for clients written against Juriset V1.","examples":["jurisdiction_not_covered"]},"message":{"type":"string","title":"Message","description":"What went wrong and what to do instead."},"status":{"type":"integer","title":"Status","description":"The HTTP status, repeated.","examples":[404]},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Code-specific details, e.g. `nearest_covered` for `jurisdiction_not_covered`, `suggestions` for unknown slugs."},"docs_url":{"type":"string","title":"Docs Url","examples":["https://juriset.dev/docs/errors#jurisdiction_not_covered"]},"status_page":{"type":"string","title":"Status Page","description":"Service status and incidents.","examples":["https://status.juriset.dev"]}},"type":"object","required":["error","code","message","status","details","docs_url","status_page"],"title":"ErrorOut"},"ExportOut":{"properties":{"domain":{"type":"string","title":"Domain"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"rule_types":{"items":{"type":"string"},"type":"array","title":"Rule Types"},"count":{"type":"integer","title":"Count","description":"Number of `results`."},"results":{"items":{"$ref":"#/components/schemas/RuleOut"},"type":"array","title":"Results","description":"The current rule response of every jurisdiction (all levels) for every rule type in the domain, by rule type then jurisdiction slug: the same objects `getRule` returns."},"disclaimer":{"type":"string","title":"Disclaimer"}},"type":"object","required":["domain","generated_at","rule_types","count","results","disclaimer"],"title":"ExportOut"},"Health":{"properties":{"status":{"type":"string","title":"Status"},"service":{"type":"string","title":"Service"},"environment":{"type":"string","title":"Environment"},"version":{"type":"string","title":"Version"}},"type":"object","required":["status","service","environment","version"],"title":"Health"},"HistoryOut":{"properties":{"domain":{"type":"string","title":"Domain"},"rule_type":{"type":"string","title":"Rule Type"},"schema_version":{"type":"string","title":"Schema Version"},"jurisdiction":{"$ref":"#/components/schemas/JurisdictionRef"},"resolution":{"type":"string","enum":["override","stack","max"],"title":"Resolution"},"layer_jurisdictions":{"items":{"$ref":"#/components/schemas/JurisdictionRef"},"type":"array","title":"Layer Jurisdictions","description":"Every level that applies under `resolution`, highest first, this jurisdiction included. History is per jurisdiction: fetch each one's history for the other levels."},"coverage":{"$ref":"#/components/schemas/Coverage"},"versions":{"items":{"$ref":"#/components/schemas/HistoryVersion"},"type":"array","title":"Versions","description":"Every version ever published for this jurisdiction, by effective date."},"missing":{"anyOf":[{"$ref":"#/components/schemas/MissingLayer"},{"type":"null"}],"description":"Set when nothing was ever published here, with the reason."},"review_pending":{"type":"boolean","title":"Review Pending"},"review_pending_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Pending Since"},"disclaimer":{"type":"string","title":"Disclaimer"}},"type":"object","required":["domain","rule_type","schema_version","jurisdiction","resolution","layer_jurisdictions","coverage","versions","missing","review_pending","review_pending_since","disclaimer"],"title":"HistoryOut"},"HistoryVersion":{"properties":{"version":{"type":"integer","title":"Version"},"status":{"type":"string","enum":["published","superseded","withdrawn"],"title":"Status","description":"`published`: part of the timeline. `superseded`: replaced by a correction with the same effective date. `withdrawn`: removed by a rollback, or before it took effect. Superseded and withdrawn versions are kept for the record."},"in_effect":{"type":"boolean","title":"In Effect","description":"This is the version in effect today."},"has_requirement":{"type":"boolean","title":"Has Requirement"},"effective_from":{"type":"string","format":"date","title":"Effective From"},"effective_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective To","description":"For published versions: the next published version's effective date. Null for superseded and withdrawn versions."},"published_at":{"type":"string","format":"date-time","title":"Published At"},"change_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Type","description":"`new`, `amendment`, `correction`, `repeal` or `rollback`.","examples":["amendment"]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At"},"schema_version":{"type":"string","title":"Schema Version"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"citations":{"items":{"$ref":"#/components/schemas/LayerCitation"},"type":"array","title":"Citations"},"id":{"type":"string","title":"Id","description":"Stable version id (PRD 9.2): store it beside your decision. `GET /v1/versions/{id}` returns this exact version forever.","examples":["rv_01JC3W9V6S7QX8YB2M4N5P6R7T"]},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria","description":"Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional."},"verification":{"$ref":"#/components/schemas/Verification"},"schema_url":{"type":"string","title":"Schema Url","description":"JSON Schema for `data`, by major schema version (PRD 9.2).","examples":["https://juriset.dev/schemas/employment/minimum_wage/v1.json"]}},"type":"object","required":["version","status","in_effect","has_requirement","effective_from","effective_to","published_at","change_type","summary","verified_at","schema_version","data","citations","id","criteria","verification","schema_url"],"title":"HistoryVersion"},"JurisdictionOut":{"properties":{"slug":{"type":"string","title":"Slug","description":"Hierarchical slug: `us`, `us-wa`, `ca-ab`; a locality embeds its region (`us-wa-seattle`). Find one with `GET /v1/jurisdictions?q=`.","examples":["us-wa"]},"name":{"type":"string","title":"Name","examples":["Washington"]},"level":{"type":"string","enum":["country","state","province","county","city"],"title":"Level","description":"`country` for federal rules; DC is a `state` and Canadian territories are `province`s.","examples":["state"]},"parent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent","description":"Parent slug; null for a country.","examples":["us"]},"country_code":{"type":"string","title":"Country Code","examples":["US"]},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code","description":"Postal abbreviation of a state or province.","examples":["WA"]},"timezone":{"type":"string","title":"Timezone","description":"IANA zone whose midnight switches future-dated versions.","examples":["America/Los_Angeles"]},"match":{"anyOf":[{"type":"string","enum":["slug","region_code","country_code","name","name_prefix","name_contains"]},{"type":"null"}],"title":"Match","description":"Why it matched `q`, best first; null when listing without `q`."}},"type":"object","required":["slug","name","level","parent","country_code","region_code","timezone","match"],"title":"JurisdictionOut"},"JurisdictionRef":{"properties":{"slug":{"type":"string","title":"Slug","description":"Hierarchical slug: `us`, `us-wa`, `ca-ab`; a locality embeds its region (`us-wa-seattle`). Find one with `GET /v1/jurisdictions?q=`.","examples":["us-wa"]},"name":{"type":"string","title":"Name","examples":["Washington"]},"level":{"type":"string","enum":["country","state","province","county","city"],"title":"Level","description":"`country` for federal rules; DC is a `state` and Canadian territories are `province`s.","examples":["state"]}},"type":"object","required":["slug","name","level"],"title":"JurisdictionRef"},"JurisdictionsOut":{"properties":{"q":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"},"count":{"type":"integer","title":"Count"},"jurisdictions":{"items":{"$ref":"#/components/schemas/JurisdictionOut"},"type":"array","title":"Jurisdictions","description":"Without `q`: the whole tree, each country followed by its jurisdictions. With `q`: matches, best first."}},"type":"object","required":["q","count","jurisdictions"],"title":"JurisdictionsOut"},"Layer":{"properties":{"jurisdiction":{"type":"string","title":"Jurisdiction","description":"Jurisdiction slug of this layer.","examples":["us"]},"level":{"type":"string","enum":["country","state","province","county","city"],"title":"Level"},"version":{"type":"integer","title":"Version","description":"Version number within this jurisdiction's rule."},"has_requirement":{"type":"boolean","title":"Has Requirement","description":"False: the jurisdiction verifiably sets no rule of this type (a cited answer, not a gap). `data` is then null."},"effective_from":{"type":"string","format":"date","title":"Effective From"},"effective_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective To","description":"The day the next published version takes effect; null while no later version is published. Derived, never stored."},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At","description":"When the version's sources were last confirmed against the live pages: the oldest of its sources'. Null: a source was never verified."},"schema_version":{"type":"string","title":"Schema Version","description":"Rule type schema version `data` was validated against (semver).","examples":["1.2.0"]},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"The rule's values as the sources state them, shaped by the rule type's `json_schema` (`GET /v1/rule-types`). Never computed or merged across layers."},"citations":{"items":{"$ref":"#/components/schemas/LayerCitation"},"type":"array","title":"Citations","description":"Primary source first."},"review_pending":{"type":"boolean","title":"Review Pending","description":"A change to this rule's sources was detected and awaits verification, human review or publication; the values shown may be outdated."},"review_pending_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Pending Since","description":"When that change was first detected; null when nothing is pending."},"id":{"type":"string","title":"Id","description":"Stable version id (PRD 9.2): store it beside your decision. `GET /v1/versions/{id}` returns this exact version forever.","examples":["rv_01JC3W9V6S7QX8YB2M4N5P6R7T"]},"status":{"type":"string","enum":["current","upcoming","superseded","withdrawn"],"title":"Status","description":"This version today: `current`, `upcoming` (published, not yet in effect) or `superseded` (an `as_of` answer from the past)."},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria","description":"Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional."},"verification":{"$ref":"#/components/schemas/Verification","description":"How this layer's version was checked before it was published."},"schema_url":{"type":"string","title":"Schema Url","description":"JSON Schema for `data`, by major schema version (PRD 9.2).","examples":["https://juriset.dev/schemas/employment/minimum_wage/v1.json"]}},"type":"object","required":["jurisdiction","level","version","has_requirement","effective_from","effective_to","verified_at","schema_version","data","citations","review_pending","review_pending_since","id","status","criteria","verification","schema_url"],"title":"Layer"},"LayerCitation":{"properties":{"role":{"type":"string","enum":["primary","supporting"],"title":"Role","description":"Each version has exactly one `primary` source; any others are `supporting`."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The source's title as cited.","examples":["Employment Standards Code, RSA 2000, c E-9"]},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section","description":"Statute section or page part, when cited."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"The official page or document."},"excerpt":{"type":"string","title":"Excerpt","description":"Verbatim passage of the source supporting the values (French sources stay in French)."},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"The `data` paths this source supports, down to array items (`amount`, `exceptions[2]`). Null: the whole version.","examples":[["amount","tiers[0]"]]},"fetched_at":{"type":"string","format":"date-time","title":"Fetched At","description":"When Juriset fetched the snapshot cited."},"snapshot_url":{"type":"string","title":"Snapshot Url","description":"Absolute URL of the stored copy of the source as Juriset fetched it (`GET /v1/snapshots/{snapshot_id}`), to show what the page said when it was cited.","examples":["https://api.juriset.dev/v1/snapshots/0b6d7f0e-6a51-4c3e-9f3c-6d1f3f0b2a10"]}},"type":"object","required":["role","title","section","url","excerpt","fields","fetched_at","snapshot_url"],"title":"LayerCitation"},"LookupRuleRef":{"properties":{"domain":{"type":"string","title":"Domain","examples":["employment"]},"rule_type":{"type":"string","title":"Rule Type","examples":["minimum_wage"]},"jurisdiction":{"$ref":"#/components/schemas/JurisdictionRef","description":"The jurisdiction asked about."},"resolved_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved From","description":"The level whose version answers (PRD 9.2): the jurisdiction itself, or a parent under `max`. Null under `stack` (read `layers`) and when no level can answer (read `missing_layers`).","examples":["us-wa"]}},"type":"object","required":["domain","rule_type","jurisdiction","resolved_from"],"title":"LookupRuleRef"},"MissingLayer":{"properties":{"jurisdiction":{"type":"string","title":"Jurisdiction","examples":["us-tx"]},"level":{"type":"string","enum":["country","state","province","county","city"],"title":"Level"},"reason":{"type":"string","enum":["not_addressed","not_yet_reviewed","no_version_in_effect","not_covered_for_date"],"title":"Reason","description":"Why this level contributes no layer:\n- `not_addressed`: a reviewer searched this jurisdiction's official sources on `checked_on` and none says whether it has a rule of this type (`note` says what was read). Not the same as \"no requirement\".\n- `not_yet_reviewed`: nothing is published yet for this jurisdiction.\n- `no_version_in_effect`: versions are published, but none is in effect on `as_of` (see `upcoming`).\n- `not_covered_for_date`: `as_of` is before this rule's `covered_since`."},"checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Checked On","description":"For `not_addressed`: the day of the search."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"For `not_addressed`: what was searched and found."},"covered_since":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Covered Since","description":"For `not_covered_for_date`."},"review_pending":{"type":"boolean","title":"Review Pending","description":"A draft for this level awaits review or publication."},"review_pending_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Pending Since"}},"type":"object","required":["jurisdiction","level","reason","checked_on","note","covered_since","review_pending","review_pending_since"],"title":"MissingLayer"},"ModelRun":{"properties":{"vendor":{"type":"string","title":"Vendor","examples":["anthropic"]},"model":{"type":"string","title":"Model"},"prompt_version":{"type":"string","title":"Prompt Version"}},"type":"object","required":["vendor","model","prompt_version"],"title":"ModelRun"},"NotCovered":{"properties":{"jurisdiction":{"$ref":"#/components/schemas/JurisdictionRef"},"code":{"type":"string","const":"not_covered_for_date","title":"Code"},"message":{"type":"string","title":"Message"},"covered_since":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Covered Since"}},"type":"object","required":["jurisdiction","code","message","covered_since"],"title":"NotCovered"},"Rate":{"properties":{"numerator":{"type":"integer","title":"Numerator","description":"Events counted, e.g. versions auto-published."},"denominator":{"type":"integer","title":"Denominator","description":"Everything they are counted against."},"rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate","description":"`numerator / denominator`, 0 to 1. Null while the denominator is 0: no history yet is not the same as a perfect score, so no number is shown.","examples":[0.93]}},"type":"object","required":["numerator","denominator","rate"],"title":"Rate"},"ReportIn":{"properties":{"domain":{"type":"string","title":"Domain","examples":["employment"]},"jurisdiction":{"type":"string","title":"Jurisdiction","description":"Jurisdiction slug.","examples":["us-wa"]},"rule_type":{"type":"string","title":"Rule Type","examples":["minimum_wage"]},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version","description":"The version you believe is wrong (`version` in a rule response or its layer). Omit for the jurisdiction's current version."},"message":{"type":"string","maxLength":5000,"minLength":10,"title":"Message","description":"What is wrong, and what the source says instead. Do not include personal details about anyone.","examples":["The source says $16.66 from January 1, 2026, not $16.28."]},"suggested_source_url":{"anyOf":[{"type":"string","maxLength":2000,"pattern":"^https?://"},{"type":"null"}],"title":"Suggested Source Url","description":"An official page that shows the right value, if you have one."},"reporter_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Reporter Email","description":"Optional: where Juriset may reply. Used for this report only."}},"type":"object","required":["domain","jurisdiction","rule_type","message"],"title":"ReportIn"},"ReportOut":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["open","accepted","dismissed"],"title":"Status","description":"`open` on creation: a person reviews every report."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"domain":{"type":"string","title":"Domain"},"jurisdiction":{"type":"string","title":"Jurisdiction"},"rule_type":{"type":"string","title":"Rule Type"},"version":{"type":"integer","title":"Version"}},"type":"object","required":["id","status","created_at","domain","jurisdiction","rule_type","version"],"title":"ReportOut"},"RuleOut":{"properties":{"domain":{"type":"string","title":"Domain","examples":["employment"]},"rule_type":{"type":"string","title":"Rule Type","examples":["minimum_wage"]},"schema_version":{"type":"string","title":"Schema Version","description":"The rule type's current schema version (semver). Each layer carries the version its `data` was validated against.","examples":["1.2.0"]},"jurisdiction":{"$ref":"#/components/schemas/JurisdictionRef"},"as_of":{"type":"string","format":"date","title":"As Of","description":"The date answered for: `as_of` when given, else today in the jurisdiction's time zone."},"scheduled":{"type":"boolean","title":"Scheduled","description":"True when `as_of` is after today: the answer is what is scheduled to be in effect then, and may still change."},"resolution":{"type":"string","enum":["override","stack","max"],"title":"Resolution","description":"How jurisdiction levels combine for this rule type here:\n- `override`: this jurisdiction's own rule answers; top-level fields mirror it.\n- `max`: every level applies and the most favourable on the rule type's `resolution_field` wins; top-level fields mirror the winner; `layers` lists every level compared.\n- `stack`: every level applies together; top-level `resolved_from`, `version`, `data` and `citations` are null and callers must read `layers`."},"resolved_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved From","description":"Slug of the layer the top-level fields mirror (`override`, `max`). Null for `stack`, and when no layer can answer (see `missing_layers`)."},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"has_requirement":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Requirement"},"effective_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective From"},"effective_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective To"},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At","description":"Mirrors the answering layer; for `stack`, the oldest of the layers'."},"coverage":{"$ref":"#/components/schemas/Coverage"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"citations":{"anyOf":[{"items":{"$ref":"#/components/schemas/LayerCitation"},"type":"array"},{"type":"null"}],"title":"Citations"},"tiers_present":{"type":"boolean","title":"Tiers Present","description":"True when any layer's `data` holds a non-empty list (tiers, exceptions, alternative schemes): the top-level values are not the whole answer for every employer or worker. With `max`, only base values were compared."},"layers":{"items":{"$ref":"#/components/schemas/Layer"},"type":"array","title":"Layers","description":"Every published level that applies, highest (federal) first. Each is a full answer with its own sources; layers are never merged."},"missing_layers":{"items":{"$ref":"#/components/schemas/MissingLayer"},"type":"array","title":"Missing Layers","description":"Levels that apply but contribute no layer, with the reason. Non-empty means the answer is incomplete: a missing level is never filled from another level."},"upcoming":{"items":{"$ref":"#/components/schemas/Upcoming"},"type":"array","title":"Upcoming","description":"Published versions of the levels that apply that are not yet in effect today, soonest first (announced changes)."},"review_pending":{"type":"boolean","title":"Review Pending","description":"A source change for any level here awaits verification, human review or publication."},"review_pending_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Pending Since","description":"Earliest detection among the pending changes."},"disclaimer":{"type":"string","title":"Disclaimer","examples":["Informational only. Not legal advice. Verify with the cited source."]},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Stable id of the answering version (PRD 9.2), the one to store beside your decision; null under `stack` (each layer has its own `id`) and when nothing answers.","examples":["rv_01JC3W9V6S7QX8YB2M4N5P6R7T"]},"rule":{"$ref":"#/components/schemas/LookupRuleRef"},"status":{"anyOf":[{"type":"string","enum":["current","upcoming","superseded","withdrawn"]},{"type":"null"}],"title":"Status","description":"The answering version's status today; null when no single layer answers."},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria","description":"Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional."},"citation":{"anyOf":[{"$ref":"#/components/schemas/Citation"},{"type":"null"}],"description":"The answering version's primary source passage (PRD 9.2); `citations` has them all."},"verification":{"anyOf":[{"$ref":"#/components/schemas/Verification"},{"type":"null"}],"description":"How the answering version was checked; under `stack`, read each layer's."},"schema_url":{"type":"string","title":"Schema Url","description":"JSON Schema for `data`, by major schema version (PRD 9.2).","examples":["https://juriset.dev/schemas/employment/minimum_wage/v1.json"]}},"type":"object","required":["domain","rule_type","schema_version","jurisdiction","as_of","scheduled","resolution","resolved_from","version","has_requirement","effective_from","effective_to","verified_at","coverage","data","citations","tiers_present","layers","missing_layers","upcoming","review_pending","review_pending_since","disclaimer","id","rule","status","criteria","citation","verification","schema_url"],"title":"RuleOut"},"RuleRef":{"properties":{"domain":{"type":"string","title":"Domain","examples":["employment"]},"rule_type":{"type":"string","title":"Rule Type","examples":["minimum_wage"]},"jurisdiction":{"$ref":"#/components/schemas/VersionJurisdiction"},"resolved_from":{"type":"string","title":"Resolved From","description":"The jurisdiction whose rule this version belongs to. For a lookup that inherits from a parent level it names the parent; for `/v1/versions/{id}` it is always the rule's own jurisdiction.","examples":["us-ny"]}},"type":"object","required":["domain","rule_type","jurisdiction","resolved_from"],"title":"RuleRef"},"RuleTypeCorrections":{"properties":{"domain":{"type":"string","title":"Domain","examples":["employment"]},"rule_type":{"type":"string","title":"Rule Type","examples":["minimum_wage"]},"published":{"type":"integer","title":"Published"},"corrected":{"type":"integer","title":"Corrected"},"correction_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Correction Rate"}},"type":"object","required":["domain","rule_type","published","corrected","correction_rate"],"title":"RuleTypeCorrections"},"RuleTypeOut":{"properties":{"domain":{"type":"string","title":"Domain"},"slug":{"type":"string","title":"Slug","examples":["minimum_wage"]},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["active","deprecated"],"title":"Status"},"schema_version":{"type":"string","title":"Schema Version"},"resolution":{"type":"string","enum":["override","stack","max"],"title":"Resolution","description":"Default resolution, for countries not in `countries` (every level above the queried jurisdiction contributes)."},"resolution_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Field","description":"For `max`: the field compared."},"countries":{"items":{"$ref":"#/components/schemas/CountryResolution"},"type":"array","title":"Countries","description":"Per-country overrides."},"json_schema":{"additionalProperties":true,"type":"object","title":"Json Schema","description":"JSON Schema (2020-12) of `data` in rule responses; every field described."},"display_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Template","description":"Logic-less Mustache template rendering one layer's `data` as a sentence."},"criteria_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria Schema","description":"JSON Schema of `criteria` (PRD 8); null while the rule type has none."},"stakes":{"type":"string","enum":["standard","high"],"title":"Stakes","description":"`high` rule sets (benefits, claims) publish under narrower bounds, with a person approving every version for the first change cycle (PRD 7.3)."},"schema_url":{"type":"string","title":"Schema Url","description":"JSON Schema for `data`, by major schema version (PRD 9.2).","examples":["https://juriset.dev/schemas/employment/minimum_wage/v1.json"]}},"type":"object","required":["domain","slug","name","description","status","schema_version","resolution","resolution_field","countries","json_schema","display_template","criteria_schema","stakes","schema_url"],"title":"RuleTypeOut"},"RuleTypesOut":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"rule_types":{"items":{"$ref":"#/components/schemas/RuleTypeOut"},"type":"array","title":"Rule Types"}},"type":"object","required":["domain","rule_types"],"title":"RuleTypesOut"},"RulesAcrossOut":{"properties":{"domain":{"type":"string","title":"Domain"},"rule_type":{"type":"string","title":"Rule Type"},"schema_version":{"type":"string","title":"Schema Version"},"levels":{"items":{"type":"string","enum":["country","state","province","county","city"]},"type":"array","title":"Levels","description":"The `level` filter applied; empty when `jurisdiction` named the jurisdictions instead."},"jurisdictions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Jurisdictions","description":"The `jurisdiction` filter applied, when given."},"as_of":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of","description":"`as_of` when given; else each result is current."},"count":{"type":"integer","title":"Count","description":"Number of `results` (each is one billed lookup)."},"results":{"items":{"$ref":"#/components/schemas/RuleOut"},"type":"array","title":"Results","description":"One rule response per jurisdiction at those levels (or named in `jurisdiction`), by slug. Jurisdictions with nothing published are included, with `missing_layers`."},"not_covered":{"items":{"$ref":"#/components/schemas/NotCovered"},"type":"array","title":"Not Covered","description":"Jurisdictions skipped because `as_of` is before their coverage starts."},"disclaimer":{"type":"string","title":"Disclaimer"}},"type":"object","required":["domain","rule_type","schema_version","levels","as_of","count","results","not_covered","disclaimer"],"title":"RulesAcrossOut"},"SourceRef":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","examples":["New York State Minimum Wage (P700)"]},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section","description":"Where in the source.","examples":["Basic minimum hourly rate"]},"url":{"type":"string","title":"Url","description":"The live source page or document."},"snapshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Url","description":"Juriset's stored copy of the source as it was read, so the excerpt can be checked even after the live page changes. Redirects to a short-lived signed URL."},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt","description":"The verbatim passage the values come from."},"role":{"type":"string","enum":["primary","supporting"],"title":"Role","description":"`primary` is the passage in `citation`; `supporting` passages back particular fields."},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"The `data` fields this passage supports; null means all of them.","examples":[["exceptions[0]"]]}},"type":"object","required":["title","url","snapshot_url","excerpt","role"],"title":"SourceRef"},"TrackRecordOut":{"properties":{"status":{"type":"string","enum":["no_data_yet","recorded"],"title":"Status","description":"`no_data_yet`: no version has been published through the verification gate as of `computed_through`, so every count is 0 and every rate null. `recorded`: the numbers below describe real history."},"computed_through":{"type":"string","format":"date-time","title":"Computed Through","description":"The Monday 00:00 UTC cut-off the figures are computed to. They change once a week, on the next Monday; anything after the cut-off is not counted yet."},"since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since","description":"When the first counted version was published; null while there is none."},"published":{"type":"integer","title":"Published","description":"Versions published through the verification gate (they carry a verification run), counting those since superseded or withdrawn."},"published_auto":{"type":"integer","title":"Published Auto","description":"Of `published`: no person involved in publishing."},"published_human":{"type":"integer","title":"Published Human","description":"Of `published`: a person approved them."},"verified":{"type":"integer","title":"Verified","description":"Versions the verifier model checked, whether or not they were published."},"escalated":{"type":"integer","title":"Escalated","description":"Of `verified`: sent to a person (disagreement, a failed validator, a value outside its bounds, a new jurisdiction or a repeal)."},"audits_sampled":{"type":"integer","title":"Audits Sampled"},"audits_passed":{"type":"integer","title":"Audits Passed"},"audits_failed":{"type":"integer","title":"Audits Failed"},"audits_pending":{"type":"integer","title":"Audits Pending","description":"Sampled, not yet compared with the source."},"auto_publish_rate":{"$ref":"#/components/schemas/Rate","description":"Auto-published ÷ all published."},"escalation_rate":{"$ref":"#/components/schemas/Rate","description":"Escalated ÷ all verified."},"correction_rate":{"$ref":"#/components/schemas/Rate","description":"Versions later corrected, rolled back or withdrawn ÷ all published."},"correction_rate_by_publisher":{"additionalProperties":{"$ref":"#/components/schemas/Rate"},"propertyNames":{"enum":["auto","human"]},"type":"object","title":"Correction Rate By Publisher"},"correction_rate_by_rule_type":{"items":{"$ref":"#/components/schemas/RuleTypeCorrections"},"type":"array","title":"Correction Rate By Rule Type"},"audit_pass_rate":{"$ref":"#/components/schemas/Rate","description":"Passes ÷ audits decided (passed + failed)."},"escalations_resolved":{"type":"integer","title":"Escalations Resolved"},"median_hours_to_escalation_resolution":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Hours To Escalation Resolution","description":"Median hours from the gate escalating a version to a person approving or rejecting it; null while none has been resolved."},"recent_corrections":{"items":{"$ref":"#/components/schemas/CorrectionOut"},"type":"array","title":"Recent Corrections","description":"Newest first, at most 25. Every correction and rollback is counted in `correction_rate`; none is hidden."},"imported_from_v1":{"type":"integer","title":"Imported From V1","description":"Versions published before multi-model verification, imported from Juriset V1 after a person reviewed them. They are not in any figure above."},"imported_corrections":{"type":"integer","title":"Imported Corrections","description":"Corrections and rollbacks recorded for imported V1 versions: out of scope for the rates, listed here so they are not hidden."},"definitions":{"additionalProperties":{"type":"string"},"type":"object","title":"Definitions","description":"How each figure is computed, in words."},"disclaimer":{"type":"string","title":"Disclaimer","examples":["Informational only. Not legal advice. Verify with the cited source."]}},"type":"object","required":["status","computed_through","since","published","published_auto","published_human","verified","escalated","audits_sampled","audits_passed","audits_failed","audits_pending","auto_publish_rate","escalation_rate","correction_rate","correction_rate_by_publisher","correction_rate_by_rule_type","audit_pass_rate","escalations_resolved","median_hours_to_escalation_resolution","recent_corrections","imported_from_v1","imported_corrections","definitions","disclaimer"],"title":"TrackRecordOut"},"Upcoming":{"properties":{"jurisdiction":{"type":"string","title":"Jurisdiction","description":"Jurisdiction slug of this layer.","examples":["us"]},"level":{"type":"string","enum":["country","state","province","county","city"],"title":"Level"},"version":{"type":"integer","title":"Version","description":"Version number within this jurisdiction's rule."},"has_requirement":{"type":"boolean","title":"Has Requirement","description":"False: the jurisdiction verifiably sets no rule of this type (a cited answer, not a gap). `data` is then null."},"effective_from":{"type":"string","format":"date","title":"Effective From"},"effective_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective To","description":"The day the next published version takes effect; null while no later version is published. Derived, never stored."},"verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verified At","description":"When the version's sources were last confirmed against the live pages: the oldest of its sources'. Null: a source was never verified."},"schema_version":{"type":"string","title":"Schema Version","description":"Rule type schema version `data` was validated against (semver).","examples":["1.2.0"]},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"The rule's values as the sources state them, shaped by the rule type's `json_schema` (`GET /v1/rule-types`). Never computed or merged across layers."},"citations":{"items":{"$ref":"#/components/schemas/LayerCitation"},"type":"array","title":"Citations","description":"Primary source first."},"review_pending":{"type":"boolean","title":"Review Pending","description":"A change to this rule's sources was detected and awaits verification, human review or publication; the values shown may be outdated."},"review_pending_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Review Pending Since","description":"When that change was first detected; null when nothing is pending."},"id":{"type":"string","title":"Id","description":"Stable version id (PRD 9.2): store it beside your decision. `GET /v1/versions/{id}` returns this exact version forever.","examples":["rv_01JC3W9V6S7QX8YB2M4N5P6R7T"]},"status":{"type":"string","enum":["current","upcoming","superseded","withdrawn"],"title":"Status","description":"This version today: `current`, `upcoming` (published, not yet in effect) or `superseded` (an `as_of` answer from the past)."},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria","description":"Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional."},"verification":{"$ref":"#/components/schemas/Verification","description":"How this layer's version was checked before it was published."},"schema_url":{"type":"string","title":"Schema Url","description":"JSON Schema for `data`, by major schema version (PRD 9.2).","examples":["https://juriset.dev/schemas/employment/minimum_wage/v1.json"]},"change_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Type","description":"`new`, `amendment`, `correction`, `repeal` or `rollback`.","examples":["amendment"]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Factual one-line summary of the change."}},"type":"object","required":["jurisdiction","level","version","has_requirement","effective_from","effective_to","verified_at","schema_version","data","citations","review_pending","review_pending_since","id","status","criteria","verification","schema_url","change_type","summary"],"title":"Upcoming"},"Verification":{"properties":{"extractor":{"anyOf":[{"$ref":"#/components/schemas/ModelRun"},{"type":"null"}],"description":"The model run that extracted the values."},"verifier":{"anyOf":[{"$ref":"#/components/schemas/ModelRun"},{"type":"null"}],"description":"The model from another vendor that re-extracted the rule blind from the source and agreed (PRD 6.3). Null for V1-era versions, which a human reviewed instead (see `legacy`)."},"agreement_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Agreement Score","description":"Share of required fields on which extractor and verifier agreed (0-1)."},"published_by":{"type":"string","enum":["auto","human"],"title":"Published By","description":"`auto`: published by the verification gate with no human involved. `human`: a person reviewed it, after an escalation or in V1. Say \"multi-model verified against the primary source\" for `auto`, never \"human-verified\"."},"audit":{"anyOf":[{"type":"string","enum":["pass","fail"]},{"type":"null"}],"title":"Audit","description":"Result of the random human audit of auto-published versions, when this version was sampled."},"legacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy","description":"Set on versions published before multi-model verification: how they were checked instead.","examples":["v1-human-review"]},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At","description":"When a person reviewed this version, if one did."}},"type":"object","required":["extractor","verifier","agreement_score","published_by","audit"],"title":"Verification"},"VersionJurisdiction":{"properties":{"slug":{"type":"string","title":"Slug","description":"Stable jurisdiction slug.","examples":["us-ny"]},"name":{"type":"string","title":"Name","examples":["New York"]},"level":{"type":"string","title":"Level","description":"country, state, province, county or city.","examples":["state"]}},"type":"object","required":["slug","name","level"],"title":"VersionJurisdiction","description":"T0's jurisdiction object of `/v1/versions/{id}`, kept as it shipped."},"VersionOut":{"properties":{"id":{"type":"string","title":"Id","description":"Stable version id. `GET /v1/versions/{id}` returns this exact version forever, even after it is superseded or withdrawn.","examples":["rv_000000000000000000000000F2"]},"rule":{"$ref":"#/components/schemas/RuleRef"},"version":{"type":"integer","title":"Version","description":"1, 2, 3… within the rule.","examples":[2]},"effective_from":{"type":"string","format":"date","title":"Effective From","examples":["2026-01-01"]},"effective_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective To","description":"The day the next published version takes effect; null while none has."},"verified_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Verified At","description":"The last day every source of this version was confirmed to still say what is published (the oldest of its sources). Null if one never was."},"status":{"type":"string","enum":["current","upcoming","superseded","withdrawn"],"title":"Status","description":"`current`: in effect now. `upcoming`: published, takes effect on `effective_from`. `superseded`: replaced by a later version. `withdrawn`: removed (a rollback or a correction); never rely on its values."},"has_requirement":{"type":"boolean","title":"Has Requirement","description":"False when the jurisdiction sets no requirement of this type; `data` is then null and the citation says so."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"The values, per the schema at `schema_url`."},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria","description":"Declarative conditions for when the values apply; null when unconditional."},"citation":{"anyOf":[{"$ref":"#/components/schemas/Citation"},{"type":"null"}],"description":"The primary source passage."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"Every source passage this version rests on."},"verification":{"$ref":"#/components/schemas/Verification"},"schema_url":{"type":"string","title":"Schema Url","description":"JSON Schema for `data`, by major schema version.","examples":["https://juriset.dev/schemas/employment/minimum_wage/v1.json"]},"disclaimer":{"type":"string","title":"Disclaimer","examples":["Informational only. Not legal advice. Verify with the cited source."]}},"type":"object","required":["id","rule","version","effective_from","effective_to","verified_at","status","has_requirement","data","criteria","citation","sources","verification","schema_url","disclaimer"],"title":"VersionOut"}},"securitySchemes":{"ApiKey":{"type":"http","description":"An API key as a bearer token: `Authorization: Bearer jrs_live_…`. Free keys come from https://juriset.dev/account. Keys are secrets: send them from a server, never from a browser. Reads also work with no key, limited to 60 requests an hour and 500 a day per IP with the Free plan's features.","scheme":"bearer"}}},"tags":[{"name":"rules","description":"What a rule type requires in a jurisdiction: today, on a date, its history, or across jurisdictions, and any version by its stable id. Every response lists the jurisdiction levels that apply (`layers`), what is missing (`missing_layers`), announced changes (`upcoming`), the sources (`citations`) and how each version was verified (`verification`). An API key, or none on the keyless tier."},{"name":"discovery","description":"Find jurisdiction slugs and rule types before a lookup, so nothing is guessed. No key needed; not billed."},{"name":"changes","description":"The change feed: what was published or took effect. Developer plan and above."},{"name":"export","description":"Every current rule in a domain at once. Scale plan."},{"name":"reports","description":"Tell Juriset a published value looks wrong. Any key; not billed."},{"name":"sources","description":"Stored copies of the cited sources, as fetched. No key needed."},{"name":"trust","description":"Juriset's public accuracy record: auto-publish, escalation, correction and audit figures, recomputed weekly. No key needed; not billed."},{"name":"meta","description":"Service health."}],"x-error-codes":[{"code":"missing_api_key","status":401,"description":"This needs an API key: send `Authorization: Bearer jrs_live_…`. A free key comes from https://juriset.dev/account. Reads of today's rules need no key (the keyless tier)."},{"code":"invalid_api_key","status":401,"description":"The header is not `Bearer <key>`, the key is not a Juriset key or is another environment's, or no such key exists. Check it was copied whole."},{"code":"revoked_api_key","status":401,"description":"The key was revoked (`details.revoked_at`). Use another key from your account."},{"code":"plan_required","status":403,"description":"The caller's plan does not include this feature (`details.feature`); `details.plans` lists the plans that do. Today's rule and `upcoming` are in every plan, keyless included."},{"code":"read_only_key","status":403,"description":"A read-only key (the site's own) tried to write."},{"code":"rate_limited","status":429,"description":"More requests than the plan allows: per second for a key, per hour or per day for keyless callers. Wait `Retry-After` seconds; the `RateLimit-*` headers show what is left. A free key lifts the keyless limits."},{"code":"quota_exceeded","status":429,"description":"This month's lookups are used: the plan's included lookups. `details.resets_at` says when the count starts again; upgrade for more."},{"code":"too_many_reports","status":429,"description":"More than 20 issue reports from this key today (UTC)."},{"code":"domain_not_found","status":404,"description":"Unknown domain; `details.domains` lists the known ones."},{"code":"rule_type_not_found","status":404,"description":"Unknown rule type; `details.rule_types` lists the known ones (`GET /v1/rule-types`)."},{"code":"jurisdiction_not_found","status":404,"description":"Unknown jurisdiction slug; `details.suggestions` lists likely ones. Find slugs with `GET /v1/jurisdictions?q=`."},{"code":"jurisdiction_not_covered","status":404,"description":"Juriset does not cover this rule type in this jurisdiction (for example a city). `details.nearest_covered` names the nearest level that is covered; its rule may not be the whole answer here."},{"code":"not_covered_for_date","status":404,"description":"`as_of` is before the date Juriset's data for this rule is authoritative from (`details.covered_since`)."},{"code":"version_not_found","status":404,"description":"No published version has this id or number. Version ids look like `rv_01JC3…` (26 characters after `rv_`) and come from a rule response's `id`; numbers are in the rule's history."},{"code":"nothing_published","status":409,"description":"Nothing is published for this rule yet, so there is no value to report on."},{"code":"snapshot_not_found","status":404,"description":"No stored snapshot with that id is cited by a published version; use a `snapshot_url` from a rule response."},{"code":"invalid_parameter","status":422,"description":"A parameter or body field is malformed; `details.problems` lists each one."},{"code":"not_found","status":404,"description":"No such endpoint. The routes are listed at `/openapi.json` and https://juriset.dev/docs."},{"code":"method_not_allowed","status":405,"description":"The endpoint exists but not with this HTTP method."},{"code":"snapshots_unavailable","status":503,"description":"Snapshot storage cannot be reached here. Retry later; the citation's `url` is the live source."},{"code":"overloaded","status":503,"description":"Juriset is answering more requests than it can at this moment. Retry after `Retry-After` seconds; the request was not billed."},{"code":"http_error","status":400,"description":"Another HTTP-level error; `status` and `message` say which."},{"code":"internal_error","status":500,"description":"Something failed on our side; it has been reported. Retry later, and see the status page if it persists."}],"x-plans":[{"plan":"free","name":"Free","available":"now","features":[],"monthly_lookups":1000,"overage_usd_per_1000":null,"rate_per_second":2,"burst":5,"per_caller_hourly_lookups":null,"per_caller_daily_lookups":null,"per_caller_rate_per_second":null},{"plan":"developer","name":"Developer","available":"now","features":["as_of","audit_bundles","changes","history"],"monthly_lookups":50000,"overage_usd_per_1000":null,"rate_per_second":10,"burst":20,"per_caller_hourly_lookups":null,"per_caller_daily_lookups":null,"per_caller_rate_per_second":null},{"plan":"growth","name":"Growth","available":"later","features":["as_of","audit_bundles","changes","history"],"monthly_lookups":500000,"overage_usd_per_1000":null,"rate_per_second":50,"burst":100,"per_caller_hourly_lookups":null,"per_caller_daily_lookups":null,"per_caller_rate_per_second":null},{"plan":"scale","name":"Scale","available":"by_request","features":["as_of","audit_bundles","changes","export","history"],"monthly_lookups":null,"overage_usd_per_1000":null,"rate_per_second":100,"burst":200,"per_caller_hourly_lookups":null,"per_caller_daily_lookups":null,"per_caller_rate_per_second":null},{"plan":"keyless","name":"Keyless","available":"now","features":[],"monthly_lookups":null,"overage_usd_per_1000":null,"rate_per_second":null,"burst":null,"per_caller_hourly_lookups":60,"per_caller_daily_lookups":500,"per_caller_rate_per_second":null}]}