Docs / API reference

API reference

Every /v1 endpoint, with its parameters, a request to copy and the responses it returns. Keys, the keyless tier and caching are in the Quick start; every error code is on the errors page.

Generated from the OpenAPI document (JSON), which is the same contract for client generators and agents.

Rules

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.

GET /v1/rules/{domain}/{jurisdiction}/{rule_type}

The rule in a jurisdiction, today or on a dateKey optional

What a rule type requires in a jurisdiction, with every jurisdiction level that applies, each with its own sources and verification. Example: GET /v1/rules/employment/us-wa/minimum_wage for Washington's minimum wage today, or ?as_of=2027-01-01 for the rate scheduled on that date.

How to read it. resolution says how levels combine:

  • override and max: read the top level. resolved_from names the layer it mirrors; id is that version's stable id and citation its primary source passage.
  • stack (e.g. US overtime: federal weekly plus state daily rules): the top level is null; read every entry of layers, each a separate rule that applies, with its own id.

Before relying on it, check:

  • missing_layers: a level that applies has nothing published, and the answer is incomplete. not_addressed means the official sources were searched and say nothing, which is not "no requirement".
  • has_requirement: false: the jurisdiction verifiably sets no rule of this type (a cited answer).
  • tiers_present: tiers or exceptions exist; the top-level value is not the answer for everyone. criteria states when values apply; Juriset never evaluates it.
  • coverage.local_rules_may_apply: cities or counties set their own rule.
  • review_pending: a change to a source awaits verification or review.
  • upcoming: announced changes not yet in effect.

Store the id you relied on: GET /v1/versions/{id} returns that exact version forever. Values are reported as the sources state them; nothing is computed or merged. Not legal advice. Errors: jurisdiction_not_covered (with nearest_covered), not_covered_for_date, jurisdiction_not_found (with suggestions), rule_type_not_found, domain_not_found.

Every plan, Free and keyless included, gets today's rule and upcoming; as_of needs a paid plan (Developer and above).

Parameters

domain
path, required
string

Domain slug: employment or payroll (list them with GET /v1/rule-types).

jurisdiction
path, required
string

Jurisdiction slug, e.g. us (federal), us-wa, ca-ab. Never guess one: GET /v1/jurisdictions?q=Washington returns it.

rule_type
path, required
string

Rule type slug, with underscores: minimum_wage, overtime, paid_leave, termination_notice. GET /v1/rule-types lists them with schemas.

as_of
query
string | null

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.

Request

curl "https://api.juriset.dev/v1/rules/employment/us-wa/minimum_wage?as_of=2027-01-01" \
  -H "Authorization: Bearer $JURISET_API_KEY"

Responses

200 RuleOut

Successful Response

Headers: ETag, Cache-Control, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

Example: override: Alberta overtime (top level mirrors the one layer)
{
  "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,
    "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,
        "published_by": "auto"
      },
      "schema_url": "https://juriset.dev/schemas/employment/overtime/v1.json"
    }
  ]
}
Example: max: Washington minimum wage (the higher of federal and state answers)
{
  "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,
        "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,
    "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,
        "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,
        "published_by": "auto"
      },
      "schema_url": "https://juriset.dev/schemas/employment/minimum_wage/v1.json"
    }
  ]
}
Example: stack: California overtime (read `layers`; no single answer)
{
  "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,
        "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,
        "published_by": "auto"
      },
      "schema_url": "https://juriset.dev/schemas/employment/overtime/v1.json"
    }
  ]
}
Example: stack with a missing level: Texas overtime (official sources silent)
{
  "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,
        "published_by": "auto"
      },
      "schema_url": "https://juriset.dev/schemas/employment/overtime/v1.json"
    }
  ]
}

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 401, 403, 404, 422, 429, 500, 503
401

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.

403

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.

404

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

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

GET /v1/rules/{domain}/{jurisdiction}/{rule_type}/history

Every published version of a jurisdiction's ruleKey optional

Every version ever published for this jurisdiction's own rule, by effective date, with sources and verification: the timeline (published), corrections it replaced (superseded) and versions removed by a rollback (withdrawn). Example: GET /v1/rules/employment/us-wa/minimum_wage/history.

History is per jurisdiction. layer_jurisdictions names the other levels that apply (e.g. us for a state's minimum wage); fetch their history separately. To ask what applied on a date, use GET /v1/rules/{domain}/{jurisdiction}/{rule_type}?as_of=.

Paid plans (Developer and above); on Free or without a key, plan_required.

Parameters

domain
path, required
string

Domain slug: employment or payroll (list them with GET /v1/rule-types).

jurisdiction
path, required
string

Jurisdiction slug, e.g. us (federal), us-wa, ca-ab. Never guess one: GET /v1/jurisdictions?q=Washington returns it.

rule_type
path, required
string

Rule type slug, with underscores: minimum_wage, overtime, paid_leave, termination_notice. GET /v1/rule-types lists them with schemas.

Request

curl "https://api.juriset.dev/v1/rules/employment/us-wa/minimum_wage/history" \
  -H "Authorization: Bearer $JURISET_API_KEY"

Responses

200 HistoryOut

Successful Response

Headers: ETag, Cache-Control, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 401, 403, 404, 422, 429, 500, 503
401

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.

403

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.

404

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.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

GET /v1/rules/{domain}/{rule_type}

One rule type across jurisdictionsKey optional

The rule response of every jurisdiction at the given levels, or of the jurisdictions named in jurisdiction, for comparing jurisdictions. Examples: GET /v1/rules/employment/minimum_wage for every state and province; GET /v1/rules/employment/minimum_wage?jurisdiction=us-wa,us-or,us-ca for three states. Each entry of results is the same object getRule returns, so layers, missing_layers and the rest apply per jurisdiction. Each result counts as one lookup. With as_of (paid plans), jurisdictions whose coverage starts later are listed in not_covered.

Parameters

domain
path, required
string

Domain slug: employment or payroll (list them with GET /v1/rule-types).

rule_type
path, required
string

Rule type slug, with underscores: minimum_wage, overtime, paid_leave, termination_notice. GET /v1/rule-types lists them with schemas.

level
query
string

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.

jurisdiction
query
string | null

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.

as_of
query
string | null

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.

Request

curl "https://api.juriset.dev/v1/rules/employment/minimum_wage?level=state%2Cprovince&jurisdiction=us-wa%2Cus-or%2Cus-ca" \
  -H "Authorization: Bearer $JURISET_API_KEY"

Responses

200 RulesAcrossOut

Successful Response

Headers: ETag, Cache-Control, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 401, 403, 404, 422, 429, 500, 503
401

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.

403

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.

404

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.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

GET /v1/versions/{version_id}/audit-bundle

Download an audit bundle for one versionAPI key

A zip that shows an auditor or regulator which rule a decision rested on: the version as served, the whole verification record (the extractor's output, the second vendor's blind re-extraction and their field-by-field comparison, who published it and when, any sample audit), the change events around it, and the cited source as fetched, each file with its SHA-256 in manifest.json. Example: GET /v1/versions/rv_01JC3W9V6S7QX8YB2M4N5P6R7T/audit-bundle.

The bundle is not signed (signed attestations are planned), and it reports what the source says; it never says how a rule applies to a case. A source too large or no longer readable is listed in snapshots.json with the reason, not skipped silently. Growth and above; on Free, Developer or without a key, plan_required. One lookup per call.

Parameters

version_id
path, required
string

A version id from a rule response's id, e.g. rv_000000000000000000000000F2.

Request

curl "https://api.juriset.dev/v1/versions/%7Bversion_id%7D/audit-bundle" \
  -H "Authorization: Bearer $JURISET_API_KEY"

Responses

200 application/zip

A zip archive: README.txt, manifest.json (SHA-256 of every file), version.json, provenance.json, snapshots.json and the cited sources as fetched.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

Errors: 401, 403, 404, 422, 429, 500, 503
401

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.

403

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.

404

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.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

GET /v1/versions/{version_id}

One rule version by its stable idNo key

Returns exactly the version a stored id names, forever: values, effective dates, citation and verification as published, with its status today (current, upcoming, superseded or withdrawn). Use it to re-check a value an agent relied on. Versions imported from Juriset V1 carry verification.legacy = "v1-human-review": a person reviewed them before multi-model verification existed. No API key needed; not billed. Informational only, not legal advice.

Parameters

version_id
path, required
string

A version id from a rule response's id, e.g. rv_000000000000000000000000F2.

Request

curl "https://api.juriset.dev/v1/versions/%7Bversion_id%7D"

Responses

200 VersionOut

Successful Response

Headers: ETag, Cache-Control

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 404, 422, 500, 503
404

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.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

Discovery

Find jurisdiction slugs and rule types before a lookup, so nothing is guessed. No key needed; not billed.

GET /v1/jurisdictions

Jurisdiction tree and searchNo key

Find the slug of a jurisdiction before looking up its rules, so callers never guess one. ?q=WA returns us-wa; ?q=CA returns both Canada (ca) and California (us-ca), best match first, with match saying why. Without q: every jurisdiction, each with its parent. No API key needed; not billed.

Parameters

q
query
string | null

Name, postal abbreviation or slug, any case, accents optional: Washington, WA, Alberta, AB, quebec. Omit for the whole tree.

Request

curl "https://api.juriset.dev/v1/jurisdictions?q=Washington"

Responses

200 JurisdictionsOut

Successful Response

Headers: ETag, Cache-Control

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 422, 500, 503
422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

GET /v1/rule-types

Rule types with their schemas and resolutionNo key

The rule type registry: each rule type's slug, the JSON Schema of data in rule responses (every field described) and of criteria, its schema_version and schema_url, and how jurisdiction levels combine (resolution, with per-country countries). No API key needed; not billed.

Parameters

domain
query
string | null

Limit to one domain, e.g. employment.

Request

curl "https://api.juriset.dev/v1/rule-types?domain=employment"

Responses

200 RuleTypesOut

Successful Response

Headers: ETag, Cache-Control

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 404, 422, 500, 503
404

domain_not_found: Unknown domain; details.domains lists the known ones.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

Changes

The change feed: what was published or took effect. Developer plan and above.

GET /v1/changes

The change feed: rules published or taking effectKey optional

Every change to a published rule, oldest first: a version published (new rule, amendment, correction, repeal; announced changes are published before they take effect), or an announced version that took_effect on its date. Each entry names the rule and links to it (rule_url) and to the version (version_id); read those for the full answer. Example: GET /v1/changes?since=2026-10-01T00:00:00Z&jurisdiction=us,us-wa, then poll GET /v1/changes?cursor=<cursor> daily for anything new.

Paid plans (Developer and above); on Free or without a key, plan_required. One lookup per call.

Parameters

since
query
string (date-time) | null

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.

cursor
query
string | null

Continue after a previous call: its cursor. Polling with the last cursor returns only what is new.

domain
query
string | null

Limit to one domain.

jurisdiction
query
string | null

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.

rule_type
query
string | null

Limit to one rule type (needs domain).

limit
query
integer

Changes per call, at most 500.

Request

curl "https://api.juriset.dev/v1/changes?since=2026-10-01T00%3A00%3A00Z&domain=employment" \
  -H "Authorization: Bearer $JURISET_API_KEY"

Responses

200 ChangesOut

Successful Response

Headers: ETag, Cache-Control, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

Example: Two changes
{
  "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."
}

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 401, 403, 404, 422, 429, 500, 503
401

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.

403

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.

404

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

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

Export

Every current rule in a domain at once. Scale plan.

GET /v1/export/{domain}

Bulk export of every current rule in a domainKey optional

Every jurisdiction's current answer for every rule type in the domain, in one call, for loading into your own store. Example: GET /v1/export/employment?format=csv.

JSON results are the same objects getRule returns (layers, missing layers, upcoming, citations, verification). CSV has one row per jurisdiction and rule type with that jurisdiction's own current version only (other levels are their own rows; combining them is getRule's job), data as a JSON string, the primary citation, the version's version_id and how it was published (published_by).

Scale plan only; others get plan_required. One lookup per call.

Parameters

domain
path, required
string

Domain slug: employment or payroll (list them with GET /v1/rule-types).

format
query
"json" | "csv"

json: full rule responses. csv: one row per jurisdiction and rule type, its own layer, data as JSON.

Request

curl "https://api.juriset.dev/v1/export/employment" \
  -H "Authorization: Bearer $JURISET_API_KEY"

Responses

200 ExportOut text/csv

JSON (ExportOut) or, with format=csv, one CSV row per jurisdiction and rule type.

Headers: ETag, Cache-Control, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 401, 403, 404, 422, 429, 500, 503
401

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.

403

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.

404

domain_not_found: Unknown domain; details.domains lists the known ones.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

Reports

Tell Juriset a published value looks wrong. Any key; not billed.

POST /v1/reports

Report a suspected error in a published ruleAPI key

Tell Juriset a published value looks wrong: name the rule (and the version, or omit it for the current one), say what the source says instead, and add an official URL if you have one. It goes to the escalation queue, where a person checks it against the source; a confirmed error is corrected as a new version, which the change feed then carries. Example body: {"domain": "employment", "jurisdiction": "us-wa", "rule_type": "minimum_wage", "message": "The source says $16.66 from January 1, 2026."}.

Any key, Free included; a key is required (missing_api_key without one). Not billed. At most 20 reports per key per day (too_many_reports). Do not include personal details about anyone.

Body: ReportIn

{
  "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/"
}

Request

curl -X POST "https://api.juriset.dev/v1/reports" \
  -H "Authorization: Bearer $JURISET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"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/"}'

Responses

201 ReportOut

Successful Response

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Juriset-Quota-Limit, Juriset-Quota-Remaining, Juriset-Quota-Reset

Errors: 401, 403, 404, 409, 422, 429, 500, 503
401

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.

403

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.

404

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.

409

nothing_published: Nothing is published for this rule yet, so there is no value to report on.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

429

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.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

Sources

Stored copies of the cited sources, as fetched. No key needed.

GET /v1/snapshots/{snapshot_id}

A stored copy of a cited sourceNo key

The source page or document exactly as Juriset fetched it, for a citation's snapshot_url. Redirects to a signed URL that expires after a few minutes (PRD 14), so follow redirects and do not store the target. Only snapshots cited by a published version are served. No API key needed.

Parameters

snapshot_id
path, required
string (uuid)

From a citation's snapshot_url.

Request

curl "https://api.juriset.dev/v1/snapshots/%7Bsnapshot_id%7D"

Responses

200 application/octet-stream

The source as fetched, in its own content type (HTML, PDF, …), as an attachment. Served directly only where signed URLs are unavailable.

Headers: ETag, Cache-Control

302

Redirect to a signed, short-lived URL for the stored copy.

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 404, 422, 500, 503
404

snapshot_not_found: No stored snapshot with that id is cited by a published version; use a snapshot_url from a rule response.

422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

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.

Trust

Juriset's public accuracy record: auto-publish, escalation, correction and audit figures, recomputed weekly. No key needed; not billed.

GET /v1/track-record

Juriset's public accuracy recordNo key

How the verification gate has performed: the auto-publish rate, the escalation rate, the correction rate (overall, by publisher and by rule type), sample-audit outcomes, the median time a person takes to resolve an escalation, and every recent correction. Recomputed weekly, as of computed_through. While nothing has been published through the gate, status is no_data_yet, every count is 0 and every rate is null: absence of history is never reported as a perfect score. definitions says how each figure is computed. Versions imported from V1 are counted apart (imported_from_v1), not in the rates. The gate runs in Juriset's staging environment, so the escalation, audit and resolution figures arrive weekly in a file staging signs; gate_figures_source says which week they cover. No API key needed; not billed.

Request

curl "https://api.juriset.dev/v1/track-record"

Responses

200 TrackRecordOut

Successful Response

Headers: ETag, Cache-Control

304

Not modified since the If-None-Match ETag; no body, not billed.

Errors: 422, 500, 503
422

invalid_parameter: A parameter or body field is malformed; details.problems lists each one.

500

internal_error: Something failed on our side; it has been reported. Retry later, and see the status page if it persists.

503

overloaded: Juriset is answering more requests than it can at this moment. Retry after Retry-After seconds; the request was not billed.

Meta

Service health.

GET /v1/health

ReadinessNo key

Readiness: the API and its database answer. For uptime monitors (PRD 15).

Request

curl "https://api.juriset.dev/v1/health"

Responses

200 Health

Successful Response

Models

The objects the endpoints return and accept. Optional fields may be absent or null.

ChangeOut

id string

Change event id.

ts string (date-time)

When the event was recorded.

event "published" | "took_effect"

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 "new" | "amendment" | "correction" | "repeal" | "rollback"

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 string
rule_type string
jurisdictionJurisdictionRef (JurisdictionRef)
effective_from string (date)

Effective date of the version this event is about.

version integer

The version the rule moved to.

from_version integer | null

The version it moved from; null for new.

summary string | null

Factual one-line summary of the change.

rule_url string

Absolute URL of the rule (getRule), to read the full current answer.

version_id string

Stable id of the version moved to (GET /v1/versions/{id}).

ChangesOut

since string (date-time) | null

since as given; null when paging by cursor.

count integer
changesChangeOut (ChangeOut[])

Oldest first.

has_more boolean

True when more changes wait: call again with cursor.

cursor string

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 string

Citation

title string | null
section
optional
string | null

Where in the source.

url string

The live source page or document.

snapshot_url string | null

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 string | null

The verbatim passage the values come from.

CorrectionOut

ts string (date-time)

When the correction or rollback was published.

change_type "correction" | "rollback"
domain string
rule_type string
jurisdictionVersionJurisdiction (VersionJurisdiction)
corrected_version_id string | null

The version that was corrected or withdrawn (GET /v1/versions/{id}).

version_id string

The version published in its place.

summary string | null

CountryResolution

country_code string
resolution "override" | "stack" | "max"
resolution_field string | null
parent_levels "country" | "state" | "province" | "county" | "city"[]

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.

Coverage

covered_since string (date) | null

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 boolean

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 string | null

What is not covered, in plain words.

ErrorBody

code string

Stable machine-readable code.

message string

What went wrong and what to do instead.

docs_url string

The code's entry in the error reference.

details
optional
object | null

Code-specific details; the same object as the top level's.

ErrorOut

errorErrorBody (ErrorBody)

PRD 9.3's error object. Read this one.

code string

The same as error.code, kept at the top level for clients written against Juriset V1.

message string

What went wrong and what to do instead.

status integer

The HTTP status, repeated.

details object | null

Code-specific details, e.g. nearest_covered for jurisdiction_not_covered, suggestions for unknown slugs.

docs_url string
status_page string

Service status and incidents.

ExportOut

domain string
generated_at string (date-time)
rule_types string[]
count integer

Number of results.

resultsRuleOut (RuleOut[])

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 string

GateFiguresSource

origin "this_database" | "staging"

staging: verified, escalated, the audit counts and the escalation resolution figures come from the weekly file Juriset's staging environment signed, where the verification gate runs (production only receives what passed it). this_database: computed from the same database as the other figures (development and staging itself).

computed_through string (date-time) | null

The Monday 00:00 UTC cut-off those figures were computed to. It can be a week behind computed_through of the record while the newest file is on its way. Null while production has received no file: those figures are then 0 and null, not estimated.

generated_at string (date-time) | null

When staging wrote the file; null when computed here.

key_id string | null

The id of the key that signed the file; null when computed here.

Health

status string
service string
environment string
version string

HistoryOut

domain string
rule_type string
schema_version string
jurisdictionJurisdictionRef (JurisdictionRef)
resolution "override" | "stack" | "max"
layer_jurisdictionsJurisdictionRef (JurisdictionRef[])

Every level that applies under resolution, highest first, this jurisdiction included. History is per jurisdiction: fetch each one's history for the other levels.

coverageCoverage (Coverage)
versionsHistoryVersion (HistoryVersion[])

Every version ever published for this jurisdiction, by effective date.

missingMissingLayer (MissingLayer | null)

Set when nothing was ever published here, with the reason.

review_pending boolean
review_pending_since string (date-time) | null
disclaimer string

HistoryVersion

version integer
status "published" | "superseded" | "withdrawn"

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 boolean

This is the version in effect today.

has_requirement boolean
effective_from string (date)
effective_to string (date) | null

For published versions: the next published version's effective date. Null for superseded and withdrawn versions.

published_at string (date-time)
change_type string | null

new, amendment, correction, repeal or rollback.

summary string | null
verified_at string (date-time) | null
schema_version string
data object | null
citationsLayerCitation (LayerCitation[])
id string

Stable version id (PRD 9.2): store it beside your decision. GET /v1/versions/{id} returns this exact version forever.

criteria object | null

Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional.

verificationVerification (Verification)
schema_url string

JSON Schema for data, by major schema version (PRD 9.2).

JurisdictionOut

slug string

Hierarchical slug: us, us-wa, ca-ab; a locality embeds its region (us-wa-seattle). Find one with GET /v1/jurisdictions?q=.

name string
level "country" | "state" | "province" | "county" | "city"

country for federal rules; DC is a state and Canadian territories are provinces.

parent string | null

Parent slug; null for a country.

country_code string
region_code string | null

Postal abbreviation of a state or province.

timezone string

IANA zone whose midnight switches future-dated versions.

match "slug" | "region_code" | "country_code" | "name" | "name_prefix" | "name_contains" | null

Why it matched q, best first; null when listing without q.

JurisdictionRef

slug string

Hierarchical slug: us, us-wa, ca-ab; a locality embeds its region (us-wa-seattle). Find one with GET /v1/jurisdictions?q=.

name string
level "country" | "state" | "province" | "county" | "city"

country for federal rules; DC is a state and Canadian territories are provinces.

JurisdictionsOut

q string | null
count integer
jurisdictionsJurisdictionOut (JurisdictionOut[])

Without q: the whole tree, each country followed by its jurisdictions. With q: matches, best first.

Layer

jurisdiction string

Jurisdiction slug of this layer.

level "country" | "state" | "province" | "county" | "city"
version integer

Version number within this jurisdiction's rule.

has_requirement boolean

False: the jurisdiction verifiably sets no rule of this type (a cited answer, not a gap). data is then null.

effective_from string (date)
effective_to string (date) | null

The day the next published version takes effect; null while no later version is published. Derived, never stored.

verified_at string (date-time) | null

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 string

Rule type schema version data was validated against (semver).

data object | null

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.

citationsLayerCitation (LayerCitation[])

Primary source first.

review_pending boolean

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 string (date-time) | null

When that change was first detected; null when nothing is pending.

id string

Stable version id (PRD 9.2): store it beside your decision. GET /v1/versions/{id} returns this exact version forever.

status "current" | "upcoming" | "superseded" | "withdrawn"

This version today: current, upcoming (published, not yet in effect) or superseded (an as_of answer from the past).

criteria object | null

Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional.

verificationVerification (Verification)

How this layer's version was checked before it was published.

schema_url string

JSON Schema for data, by major schema version (PRD 9.2).

LayerCitation

role "primary" | "supporting"

Each version has exactly one primary source; any others are supporting.

title string | null

The source's title as cited.

section string | null

Statute section or page part, when cited.

url string | null

The official page or document.

excerpt string

Verbatim passage of the source supporting the values (French sources stay in French).

fields string[] | null

The data paths this source supports, down to array items (amount, exceptions[2]). Null: the whole version.

fetched_at string (date-time)

When Juriset fetched the snapshot cited.

snapshot_url string

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.

LookupRuleRef

domain string
rule_type string
jurisdictionJurisdictionRef (JurisdictionRef)

The jurisdiction asked about.

resolved_from string | null

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

MissingLayer

jurisdiction string
level "country" | "state" | "province" | "county" | "city"
reason "not_addressed" | "not_yet_reviewed" | "no_version_in_effect" | "not_covered_for_date"

Why this level contributes no layer:

  • 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".
  • not_yet_reviewed: nothing is published yet for this jurisdiction.
  • no_version_in_effect: versions are published, but none is in effect on as_of (see upcoming).
  • not_covered_for_date: as_of is before this rule's covered_since.
checked_on string (date) | null

For not_addressed: the day of the search.

note string | null

For not_addressed: what was searched and found.

covered_since string (date) | null

For not_covered_for_date.

review_pending boolean

A draft for this level awaits review or publication.

review_pending_since string (date-time) | null

ModelRun

vendor string
model string
prompt_version string

NotCovered

jurisdictionJurisdictionRef (JurisdictionRef)
code "not_covered_for_date"
message string
covered_since string (date) | null

Rate

numerator integer

Events counted, e.g. versions auto-published.

denominator integer

Everything they are counted against.

rate number | null

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.

ReportIn

domain string
jurisdiction string

Jurisdiction slug.

rule_type string
version
optional
integer | null

The version you believe is wrong (version in a rule response or its layer). Omit for the jurisdiction's current version.

message string

What is wrong, and what the source says instead. Do not include personal details about anyone.

suggested_source_url
optional
string | null

An official page that shows the right value, if you have one.

reporter_email
optional
string | null

Optional: where Juriset may reply. Used for this report only.

ReportOut

id string
status "open" | "accepted" | "dismissed"

open on creation: a person reviews every report.

created_at string (date-time)
domain string
jurisdiction string
rule_type string
version integer

RuleOut

domain string
rule_type string
schema_version string

The rule type's current schema version (semver). Each layer carries the version its data was validated against.

jurisdictionJurisdictionRef (JurisdictionRef)
as_of string (date)

The date answered for: as_of when given, else today in the jurisdiction's time zone.

scheduled boolean

True when as_of is after today: the answer is what is scheduled to be in effect then, and may still change.

resolution "override" | "stack" | "max"

How jurisdiction levels combine for this rule type here:

  • override: this jurisdiction's own rule answers; top-level fields mirror it.
  • 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.
  • stack: every level applies together; top-level resolved_from, version, data and citations are null and callers must read layers.
resolved_from string | null

Slug of the layer the top-level fields mirror (override, max). Null for stack, and when no layer can answer (see missing_layers).

version integer | null
has_requirement boolean | null
effective_from string (date) | null
effective_to string (date) | null
verified_at string (date-time) | null

Mirrors the answering layer; for stack, the oldest of the layers'.

coverageCoverage (Coverage)
data object | null
citationsLayerCitation (LayerCitation[] | null)
tiers_present boolean

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.

layersLayer (Layer[])

Every published level that applies, highest (federal) first. Each is a full answer with its own sources; layers are never merged.

missing_layersMissingLayer (MissingLayer[])

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.

upcomingUpcoming (Upcoming[])

Published versions of the levels that apply that are not yet in effect today, soonest first (announced changes).

review_pending boolean

A source change for any level here awaits verification, human review or publication.

review_pending_since string (date-time) | null

Earliest detection among the pending changes.

disclaimer string
id string | null

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.

ruleLookupRuleRef (LookupRuleRef)
status "current" | "upcoming" | "superseded" | "withdrawn" | null

The answering version's status today; null when no single layer answers.

criteria object | null

Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional.

citationCitation (Citation | null)

The answering version's primary source passage (PRD 9.2); citations has them all.

verificationVerification (Verification | null)

How the answering version was checked; under stack, read each layer's.

schema_url string

JSON Schema for data, by major schema version (PRD 9.2).

RuleRef

domain string
rule_type string
jurisdictionVersionJurisdiction (VersionJurisdiction)
resolved_from string

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.

RuleTypeCorrections

domain string
rule_type string
published integer
corrected integer
correction_rate number | null

RuleTypeOut

domain string
slug string
name string
description string | null
status "active" | "deprecated"
schema_version string
resolution "override" | "stack" | "max"

Default resolution, for countries not in countries (every level above the queried jurisdiction contributes).

resolution_field string | null

For max: the field compared.

countriesCountryResolution (CountryResolution[])

Per-country overrides.

json_schema object

JSON Schema (2020-12) of data in rule responses; every field described.

display_template string | null

Logic-less Mustache template rendering one layer's data as a sentence.

criteria_schema object | null

JSON Schema of criteria (PRD 8); null while the rule type has none.

stakes "standard" | "high"

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 string

JSON Schema for data, by major schema version (PRD 9.2).

RuleTypesOut

domain string | null
rule_typesRuleTypeOut (RuleTypeOut[])

RulesAcrossOut

domain string
rule_type string
schema_version string
levels "country" | "state" | "province" | "county" | "city"[]

The level filter applied; empty when jurisdiction named the jurisdictions instead.

jurisdictions
optional
string[] | null

The jurisdiction filter applied, when given.

as_of string (date) | null

as_of when given; else each result is current.

count integer

Number of results (each is one billed lookup).

resultsRuleOut (RuleOut[])

One rule response per jurisdiction at those levels (or named in jurisdiction), by slug. Jurisdictions with nothing published are included, with missing_layers.

not_coveredNotCovered (NotCovered[])

Jurisdictions skipped because as_of is before their coverage starts.

disclaimer string

SourceRef

title string | null
section
optional
string | null

Where in the source.

url string

The live source page or document.

snapshot_url string | null

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 string | null

The verbatim passage the values come from.

role "primary" | "supporting"

primary is the passage in citation; supporting passages back particular fields.

fields
optional
string[] | null

The data fields this passage supports; null means all of them.

TrackRecordOut

status "no_data_yet" | "recorded"

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 string (date-time)

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 string (date-time) | null

When the first counted version was published; null while there is none.

published integer

Versions published through the verification gate (they carry a verification run), counting those since superseded or withdrawn.

published_auto integer

Of published: no person involved in publishing.

published_human integer

Of published: a person approved them.

verified integer

Versions the verifier model checked, whether or not they were published.

escalated integer

Of verified: sent to a person (disagreement, a failed validator, a value outside its bounds, a new jurisdiction or a repeal).

audits_sampled integer
audits_passed integer
audits_failed integer
audits_pending integer

Sampled, not yet compared with the source.

auto_publish_rateRate (Rate)

Auto-published ÷ all published.

escalation_rateRate (Rate)

Escalated ÷ all verified.

correction_rateRate (Rate)

Versions later corrected, rolled back or withdrawn ÷ all published.

correction_rate_by_publisher object
correction_rate_by_rule_typeRuleTypeCorrections (RuleTypeCorrections[])
audit_pass_rateRate (Rate)

Passes ÷ audits decided (passed + failed).

escalations_resolved integer
median_hours_to_escalation_resolution number | null

Median hours from the gate escalating a version to a person approving or rejecting it; null while none has been resolved.

gate_figures_sourceGateFiguresSource (GateFiguresSource)

Where verified, escalated, the audit counts and the escalation resolution figures were computed, and which week they cover.

recent_correctionsCorrectionOut (CorrectionOut[])

Newest first, at most 25. Every correction and rollback is counted in correction_rate; none is hidden.

imported_from_v1 integer

Versions published before multi-model verification, imported from Juriset V1 after a person reviewed them. They are not in any figure above.

imported_corrections integer

Corrections and rollbacks recorded for imported V1 versions: out of scope for the rates, listed here so they are not hidden.

definitions object

How each figure is computed, in words.

disclaimer string

Upcoming

jurisdiction string

Jurisdiction slug of this layer.

level "country" | "state" | "province" | "county" | "city"
version integer

Version number within this jurisdiction's rule.

has_requirement boolean

False: the jurisdiction verifiably sets no rule of this type (a cited answer, not a gap). data is then null.

effective_from string (date)
effective_to string (date) | null

The day the next published version takes effect; null while no later version is published. Derived, never stored.

verified_at string (date-time) | null

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 string

Rule type schema version data was validated against (semver).

data object | null

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.

citationsLayerCitation (LayerCitation[])

Primary source first.

review_pending boolean

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 string (date-time) | null

When that change was first detected; null when nothing is pending.

id string

Stable version id (PRD 9.2): store it beside your decision. GET /v1/versions/{id} returns this exact version forever.

status "current" | "upcoming" | "superseded" | "withdrawn"

This version today: current, upcoming (published, not yet in effect) or superseded (an as_of answer from the past).

criteria object | null

Declarative, non-executable conditions for when the values apply (PRD 8), never evaluated by Juriset; null when unconditional.

verificationVerification (Verification)

How this layer's version was checked before it was published.

schema_url string

JSON Schema for data, by major schema version (PRD 9.2).

change_type string | null

new, amendment, correction, repeal or rollback.

summary string | null

Factual one-line summary of the change.

Verification

extractorModelRun (ModelRun | null)

The model run that extracted the values.

verifierModelRun (ModelRun | null)

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 number | null

Share of required fields on which extractor and verifier agreed (0-1).

published_by "auto" | "human"

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 "pass" | "fail" | null

Result of the random human audit of auto-published versions, when this version was sampled.

legacy
optional
string | null

Set on versions published before multi-model verification: how they were checked instead.

reviewed_at
optional
string (date-time) | null

When a person reviewed this version, if one did.

VersionJurisdiction

slug string

Stable jurisdiction slug.

name string
level string

country, state, province, county or city.

VersionOut

id string

Stable version id. GET /v1/versions/{id} returns this exact version forever, even after it is superseded or withdrawn.

ruleRuleRef (RuleRef)
version integer

1, 2, 3… within the rule.

effective_from string (date)
effective_to string (date) | null

The day the next published version takes effect; null while none has.

verified_at string (date) | null

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 "current" | "upcoming" | "superseded" | "withdrawn"

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 boolean

False when the jurisdiction sets no requirement of this type; data is then null and the citation says so.

data object | null

The values, per the schema at schema_url.

criteria object | null

Declarative conditions for when the values apply; null when unconditional.

citationCitation (Citation | null)

The primary source passage.

sourcesSourceRef (SourceRef[])

Every source passage this version rests on.

verificationVerification (Verification)
schema_url string

JSON Schema for data, by major schema version.

disclaimer string