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

# Courts API: Search and Retrieve Georgia Court Case Records

> GET /courts searches 305,000+ Georgia court cases. Filter by court type, defendant name, or case number. GET /courts/{case_number} returns case detail.

The Courts endpoints provide access to DocketStream's Georgia court records database, which aggregates case filings, hearing schedules, warrants, and dispositions from state, superior, magistrate, and warrant courts across Georgia. With more than **305,000 court cases** indexed — and new records added multiple times daily — you can build defendant lookups, track upcoming hearings, and monitor case outcomes programmatically.

***

## GET /courts

Search court cases across all indexed Georgia courts. Returns a paginated list of matching case records sorted by `filed_date` descending.

```bash theme={null}
GET https://api.docketstream.org/v1/courts?name=John+Doe&court_type=superior
Authorization: Bearer YOUR_API_KEY
```

### Query Parameters

<ParamField query="name" type="string">
  Defendant name to search for. Partial matches are supported and the search is
  case-insensitive. For example, `"doe"` will match `"JOHN DOE"`.
</ParamField>

<ParamField query="case_number" type="string">
  Exact case number to look up (e.g., `"2024-CR-00456"`). When provided, other
  filters are ignored and the response contains at most one record.
</ParamField>

<ParamField query="court_type" type="string">
  Filter by the type of court. Accepted values: `"state"`, `"superior"`,
  `"magistrate"`, or `"warrants"`.
</ParamField>

<ParamField query="county" type="string">
  The county name slug to filter results by (e.g., `"clayton"`, `"gwinnett"`).
</ParamField>

<ParamField query="status" type="string">
  Filter by case status. Accepted values: `"pending"`, `"closed"`, or
  `"warrant"`.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Maximum number of records to return per page. Minimum: `1`. Maximum: `200`.
</ParamField>

<ParamField query="offset" type="integer" default="0">
  Number of records to skip before returning results. Use with `limit` to
  paginate through large result sets.
</ParamField>

### Response

```json theme={null}
{
  "total": 3,
  "records": [
    {
      "case_number": "2024-CR-00456",
      "defendant": "John Doe",
      "offense": "Theft by Taking",
      "court_type": "Superior",
      "county": "Clayton",
      "filed_date": "2024-06-10",
      "status": "pending",
      "judge": "Hon. Sarah Williams",
      "next_hearing": "2024-07-15T09:00:00Z",
      "hearing_link": "https://zoom.us/j/example"
    }
  ]
}
```

### Response Fields

<ResponseField name="total" type="integer">
  The total number of cases matching your query across all pages.
</ResponseField>

<ResponseField name="records" type="array">
  An array of court case objects.

  <ResponseField name="records[].case_number" type="string">
    The official case number assigned by the court.
  </ResponseField>

  <ResponseField name="records[].defendant" type="string">
    The defendant's full name as it appears in court records.
  </ResponseField>

  <ResponseField name="records[].offense" type="string">
    The primary offense charged in the case.
  </ResponseField>

  <ResponseField name="records[].court_type" type="string">
    The type of court handling the case: `"State"`, `"Superior"`,
    `"Magistrate"`, or `"Warrants"`.
  </ResponseField>

  <ResponseField name="records[].county" type="string">
    Display name of the county where the case is filed.
  </ResponseField>

  <ResponseField name="records[].filed_date" type="string">
    The date the case was filed, in `YYYY-MM-DD` format.
  </ResponseField>

  <ResponseField name="records[].status" type="string">
    Current case status: `"pending"`, `"closed"`, or `"warrant"`.
  </ResponseField>

  <ResponseField name="records[].judge" type="string | null">
    Name of the presiding judge, or `null` if not yet assigned.
  </ResponseField>

  <ResponseField name="records[].next_hearing" type="string | null">
    ISO 8601 timestamp of the next scheduled hearing, or `null` if no hearing is
    currently scheduled.
  </ResponseField>

  <ResponseField name="records[].hearing_link" type="string | null">
    Virtual hearing URL (e.g., Zoom or Teams link), or `null` if the hearing is
    in-person or no link has been published.
  </ResponseField>
</ResponseField>

***

## GET /courts/{case_number}

Retrieve the full detail record for a single court case, including its complete hearing history and all recorded dispositions. Use this endpoint when you need the full case timeline rather than just summary information.

```bash theme={null}
GET https://api.docketstream.org/v1/courts/2024-CR-00456
Authorization: Bearer YOUR_API_KEY
```

### Path Parameter

<ParamField path="case_number" type="string" required>
  The official case number (e.g., `"2024-CR-00456"`). Case numbers are returned
  by `GET /courts` and are formatted as assigned by the originating court.
</ParamField>

### Response

Returns all fields from the list response, plus:

<ResponseField name="hearings" type="array">
  A chronological list of all hearings on record for this case.

  <ResponseField name="hearings[].date" type="string">
    Hearing date in `YYYY-MM-DD` format.
  </ResponseField>

  <ResponseField name="hearings[].time" type="string">
    Scheduled hearing time in `HH:MM` format (local court timezone).
  </ResponseField>

  <ResponseField name="hearings[].judge" type="string | null">
    Name of the judge presiding over this hearing.
  </ResponseField>

  <ResponseField name="hearings[].location" type="string | null">
    Courtroom or address where the hearing is held, or `null` if virtual only.
  </ResponseField>

  <ResponseField name="hearings[].zoom_link" type="string | null">
    Virtual hearing URL for this specific hearing, or `null` if in-person.
  </ResponseField>
</ResponseField>

<ResponseField name="dispositions" type="array">
  A list of all dispositions recorded for this case. May be empty for pending
  cases.

  <ResponseField name="dispositions[].date" type="string">
    Date the disposition was entered, in `YYYY-MM-DD` format.
  </ResponseField>

  <ResponseField name="dispositions[].outcome" type="string">
    The disposition outcome (e.g., `"Guilty Plea"`, `"Not Guilty"`,
    `"Dismissed"`, `"Nolle Prosequi"`).
  </ResponseField>

  <ResponseField name="dispositions[].sentence" type="string | null">
    Sentence imposed, if applicable (e.g., `"12 months probation"`), or `null`
    if no sentence was recorded.
  </ResponseField>
</ResponseField>

<Note>
  Court data is updated **multiple times daily**, but hearing schedules and
  dispositions sourced from individual clerk offices may have delays of up to
  24 hours. For time-sensitive monitoring, combine court queries with
  [Alert watchers](/api/alerts-webhooks) to receive push notifications.
</Note>
