> ## Documentation Index
> Fetch the complete documentation index at: https://docs.courtrules.app/llms.txt
> Use this file to discover all available pages before exploring further.

# List rulebook rules

> Lists the rules of one rulebook in book order, with search, status filters and paging

Returns the rules of one rulebook in the order the rulebook prints them, without their text. Each rule carries its number, citation, heading, place in the rulebook, status, and how many requirements we read from it. Search the number, heading and text with `q`, then read a rule's text with [`/rulebooks/{rulebook_id}/rules/{number}`](/api-reference/get-rulebook-rule) and its requirements with [`/extracted-rules`](/api-reference/extracted-rules).

Results are paged with `limit` and `offset`: `meta.total` is the number of matching rules, and `meta.next_offset` is the offset of the next page, or `null` on the last page.

**rulebook\_id** `string` *required*

Rulebook identifier from [`/rulebooks`](/api-reference/rulebooks), such as
`california-rules-of-court`.

**q** `string`

Words to find in a rule's number, heading or operative text. Every word must appear; a word may
appear in any of the three. Not case-sensitive. History notes and committee comments are not
searched. Example: `opening memorandum`.

**legal\_status** `string`

Only rules with this status: `in_force`, `repealed` or `reserved`.

**has\_requirements** `boolean`

`true`: only rules whose current text has at least one requirement. `false`: only rules with none,
including rules whose requirements have not been read yet. Leave it out for both.

**limit** `number`

Maximum rules per page. Defaults to `100`, maximum `500`.

**offset** `number`

Number of matching rules to skip. Defaults to `0`. Pass `meta.next_offset` from the previous page
to read the next one.

```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl 'https://api.courtrules.app/api/v1/rulebooks/california-rules-of-court/rules?q=opening%20memorandum&has_requirements=true' \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
import requests

resp = requests.get(
    "https://api.courtrules.app/api/v1/rulebooks/california-rules-of-court/rules",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    params={"q": "opening memorandum", "has_requirements": "true"},
)
rules = resp.json()["rules"]
```

```typescript Node.js theme={"theme":{"light":"github-light","dark":"github-dark"}}
const params = new URLSearchParams({ q: "opening memorandum", has_requirements: "true" });
const resp = await fetch(
  `https://api.courtrules.app/api/v1/rulebooks/california-rules-of-court/rules?${params}`,
  { headers: { Authorization: "Bearer YOUR_API_KEY" } },
);
const { rules } = await resp.json();
```

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "rules": [
    {
      "number": "3.764",
      "slug": "3.764",
      "citation": "Cal. Rules of Court, rule 3.764",
      "revision_id": "87a3abf3-5690-421d-8c21-e64305fefbf3",
      "heading": "Motion to certify or decertify a class or amend or modify an order certifying a class",
      "outline": [
        { "label": "Title Three", "heading": "Civil Rules" },
        { "label": "Division 7", "heading": "Civil Case Management" },
        { "label": "Chapter 6", "heading": "Management of Class Actions" }
      ],
      "legal_status": "in_force",
      "effective_from": "2026-01-01",
      "observed_at": "2026-10-19T04:31:34.421+00:00",
      "removed": false,
      "requirement_count": 16,
      "extraction_status": "succeeded",
      "site_url": "https://www.courtrules.app/rules/california-rules-of-court/3.764"
    },
    {
      "number": "3.1113",
      "slug": "3.1113",
      "citation": "Cal. Rules of Court, rule 3.1113",
      "revision_id": "50dd0291-ae07-48d0-b490-23555244dcf1",
      "heading": "Memorandum",
      "outline": [
        { "label": "Title Three", "heading": "Civil Rules" },
        { "label": "Division 11", "heading": "Law and Motion" },
        { "label": "Chapter 2", "heading": "Format of Motion Papers" }
      ],
      "legal_status": "in_force",
      "effective_from": "2017-01-01",
      "observed_at": "2026-10-19T04:34:37.532+00:00",
      "removed": false,
      "requirement_count": 27,
      "extraction_status": "succeeded",
      "site_url": "https://www.courtrules.app/rules/california-rules-of-court/3.1113"
    }
  ],
  "meta": {
    "total": 2,
    "returned": 2,
    "limit": 100,
    "offset": 0,
    "next_offset": null,
    "rulebook_id": "california-rules-of-court",
    "q": "opening memorandum",
    "has_requirements": true
  }
}
```

## Response fields

**rules** `array`

The rules on this page, in rulebook order: by position in the book, then by id. Empty when nothing
matches.

**Rule**

**number** `string`

Official rule number without the word Rule, exactly as the rulebook prints it. Numbers can
hold dots, colons, hyphens and letters.

**slug** `string`

URL form of the number, as used in `site_url`

**citation** `string`

How to cite the rule

**revision\_id** `string`

Identifier of this version of the rule. It changes when the rule's heading, place in the
rulebook, text, status or effective date changes.

**heading** `string`

The rule's heading

**outline** `array`

Where the rule sits in the rulebook, from the top level down. Each level has a `label` such as
`Division 11` and a `heading`.

**legal\_status** `string`

`in_force`, `repealed` or `reserved`

**effective\_from** `string | null`

Date the current text took effect, as the official source states it (`YYYY-MM-DD`). `null`
when the source gives no date.

**observed\_at** `string`

When we first saw this version of the rule on the official source

**removed** `boolean`

`true` when the official source no longer lists the rule. A removed rule keeps the heading,
status and text it had when it was last listed, and it has no requirements.

**requirement\_count** `integer`

Requirements read from the rule's current text: the number of results
[`/extracted-rules`](/api-reference/extracted-rules) returns for this rule. Check
`extraction_status` before reading `0` as none.

**extraction\_status** `string`

`succeeded`: the text was read, and `requirement_count` is final. `0` means the text states
none of the requirements that are read: limits, deadlines, formats, copies, filing, service,
fees, sealing and contact with the court. A definition, a statement of scope and a rule about
mediators, court staff or a court program often have none; the text is still in the rule.
`pending`: not read yet, so the count is `0` for now. `failed`: reading did not work, so the
count is `0`. `skipped`: nothing is read from this rule, because it has no operative text or
is too long to process.

**site\_url** `string`

The rule's page on courtrules.app

**meta** `object`

**Meta**

**total** `integer`

Number of rules matching the filters, across all pages

**returned** `integer`

Number of rules in this page

**limit** `integer`

Page size requested

**offset** `integer`

Number of matching rules skipped

**next\_offset** `integer | null`

Offset of the next page, or `null` on the last page

**rulebook\_id** `string`

The rulebook listed

**q** `string`

The search you sent, when present

**legal\_status** `string`

The `legal_status` filter you sent, when present

**has\_requirements** `boolean`

The `has_requirements` filter you sent, when present

## Paging

Read a whole rulebook by following `next_offset` until it is `null`:

```python theme={"theme":{"light":"github-light","dark":"github-dark"}}
import requests

rules, offset = [], 0
while offset is not None:
    page = requests.get(
        "https://api.courtrules.app/api/v1/rulebooks/california-rules-of-court/rules",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        params={"limit": 500, "offset": offset},
    ).json()
    rules += page["rules"]
    offset = page["meta"]["next_offset"]
```

An offset at or past the last rule returns `200` with an empty `rules` array and the true `meta.total`. If the official source changes while you page, a rule can move between pages; read again from `offset=0` when you need a consistent copy.

## Filtering behavior

* **Search.** Every word in `q` must appear in the rule's number, heading or operative text. A `%` or `_` in `q` matches itself.
* **Status and requirements.** `legal_status` and `has_requirements` combine with each other and with `q`. `has_requirements=true` and `has_requirements=false` together cover every rule exactly once.
* **Removed rules** stay in the list, with `removed: true`. They never match `has_requirements=true`.

## Errors

### 400: Invalid parameters

Returned for a value the endpoint cannot use, such as `limit=0` or `has_requirements=yes`. Each failing parameter is named.

```json 400 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "error": "Invalid request",
  "details": [
    {
      "path": "limit",
      "message": "Number must be greater than or equal to 1"
    }
  ],
  "docs_url": "https://docs.courtrules.app/api-reference/rulebook-rules"
}
```

### 404: Rulebook not found

Returned when no rulebook has this identifier. A search with no match is `200` with an empty list, not a `404`.

```json 404 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "error": "Rulebook 'no-such-rulebook' not found.",
  "suggestion": "Use GET /api/v1/rulebooks to list the rulebooks you can read.",
  "docs_url": "https://docs.courtrules.app/api-reference/rulebooks"
}
```

Each rule in the answer counts as one row against your [daily row limit](/api-reference/rate-limits.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.