# Changelog of CourtListener Court Opinions Scraper — Free Case Law Search (`devilscrapes/courtlistener-court-opinions-scraper`) Actor

- **URL**: https://apify.com/devilscrapes/courtlistener-court-opinions-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/devilscrapes/courtlistener-court-opinions-scraper.md

## Changelog

All notable changes to this Actor will be documented in this file.

### \[Unreleased]

#### Added

- Scaffold: `.actor/` (actor.json, input\_schema.json, output\_schema.json,
  dataset\_schema.json, pay\_per\_event.json, Dockerfile), `src/models.py`
  (fully implemented `ActorInput` + `ResultRow` per spec.md), `pyproject.toml`,
  `README.md`, `tests/fixtures/input.qa.json` (`{"query": "miranda rights"}`).
- Two PPE events: `actor-start` ($0.05), `result-scraped` ($0.005).
- Real fetch/pagination/parse logic: `src/parser.py` (`build_search_url`,
  `map_result`), `src/scraper.py` (`fetch_page` — curl-cffi + retry/backoff
  per REQ-5), and the REQ-2/REQ-3/REQ-4/REQ-6 run loop in `src/main.py`
  (cursor pagination follows `next` verbatim, per-row fault isolation,
  `max_results` cap, zero-match SUCCEEDED handling). Scaffold placeholder
  push path removed entirely (tasks.md T04-T09).
- `tests/fixtures/search_response_page1.json` — real captured CourtListener
  response (3 results), used by parser/main tests.
- Unit tests: `tests/test_parser.py`, `tests/test_scraper.py`,
  `tests/test_models.py`, `tests/test_charge_no_idempotency_key.py`, plus
  fault-isolation/zero-row/max\_results-cap/PPE-count coverage in
  `tests/test_main.py`.
- Live prefill verification (T13): `q=miranda+rights&type=o` returned
  `count=97719` against the live API (2026-09-02) — REQ-9 confirmed
  against real data, not just schema validity.
