# Codebook

Michigan Plate Readers data files, version 1 (2026-10-03).

Cite as: Ackley-Smith, Chance. Michigan Plate Readers: data files, version 1 (2026-10-03). https://michiganplatereaders.org/data/

- An empty cell means no value: not yet known or not applicable.
- Dates are YYYY-MM-DD.
- The agency column holds the agency's slug (the short name in its page address) in every table except agencies.csv and requests.csv, where it holds the agency's name. agencies.csv maps one to the other.
- The request log (requests.csv, appeals.csv, fees.csv) and the correspondence listed in documents.csv cover every request filed: what was asked, when the agency answered, what it charged and decided, each appeal, each fee paid, our requests and appeals, and the agency letters and portal messages we have saved. The project's list of Michigan agencies is in agencies.csv. The records an agency produced (documents.csv, class = record) and every other file appear only for agencies whose findings have been published, after the agency has had seven days with a draft.
- Business days (requests.csv, business_days) are weekdays after the day the request is deemed received (the next business day after an electronic request, MCL 15.235(1); that day is day zero) through the day the response was delivered. Saturdays, Sundays and these dates are skipped: 2026-09-07, 2026-11-03, 2026-11-11, 2026-11-26, 2026-11-27, 2026-12-24, 2026-12-25, 2026-12-31, 2027-01-01. A holiday that one agency observes is skipped for that agency's requests.

## agencies.csv

One row per agency on the project's list, in order of name. Agencies with an empty slug have no page on the site yet.

| Column | Type | Meaning | Source |
|---|---|---|---|
| agency | string | Agency name as used in the request log. requests.csv joins on this column. | Our request log |
| slug | string | Short name used in the agency's page address and in the agency column of the other tables. Empty until the agency has a page on the site: from its first request, or from the day its findings are published. | Assigned by us |
| county | string | Oakland, Wayne, Macomb, or Statewide. | Entered by us from public sources |
| polices_itself | string | Yes when the community runs its own police department; No, with who polices it, when another agency does; n/a for county and state bodies and for a city council or oversight board. | Entered by us from public sources |

## appeals.csv

One row per appeal filed with the head of a public body under MCL 15.240 (a denial) or MCL 15.240a (a fee).

| Column | Type | Meaning | Source |
|---|---|---|---|
| agency | string | Agency slug. | agencies.csv, slug |
| agency_name | string | Agency name. | Entered by us |
| request | string | Tracking number of the request appealed. | requests.csv |
| kind | code | fee: an appeal of a fee under MCL 15.240a. denial: an appeal of a denial under MCL 15.240. | The appeal as filed |
| date_sent | date | Day the appeal was sent. | The appeal as filed |
| outcome_code | code | pending: no determination yet. fee_reduced, fee_upheld, fee_waived: the determination on a fee appeal. reversed, reversed_in_part, upheld: the determination on an appeal of a denial. withdrawn: withdrawn by us before a determination. | The agency's determination |
| outcome_date | date | Day the determination was delivered, or the day the appeal was withdrawn. Empty while pending. | The agency's determination |
| our_doc | string | Path of the published copy of the appeal, contact details omitted. | documents.csv, kind = ours |
| agency_doc | string | Path of the published copy of the agency's determination, where there is one. | documents.csv, kind = agency |

## documents.csv

One row per published document: letters, notices and records received from agencies, records released to other requesters, and our own filings.

| Column | Type | Meaning | Source |
|---|---|---|---|
| agency | string | Agency slug. | agencies.csv, slug |
| kind | code | agency: a document an agency sent. ours: a request, appeal or other filing we sent. | Entered by us |
| class | code | correspondence: a document about the handling of a request (our requests and appeals; the agency's response letters, fee notices and forms, determinations and denials), published with the request log. record: a record the agency produced in answer to a request, published with the agency's findings. | Entered by us |
| file | string | Path of the published file. | Entered by us |
| title | string | What the document is. | Written from the document |
| request | string | The request that produced it (tracking number), or the MuckRock request number for a record released to another requester. | Entered by us |
| date_received | date | Day the record was received from the agency. For kind = ours, the day we sent it. For a record released to another requester, the date of that release. | Response files; MuckRock request pages |
| pages | integer | Page count for PDFs; empty for other file types. | Counted from the published file |
| sha256 | string | SHA-256 of the file as published, after any redaction. | Computed from the published file |
| redaction | string | What was removed before publication, or none. | Entered by us |
| source_url | string | Where the record was first released, for records obtained by another requester. | MuckRock request pages |

## fees.csv

Fees the project has paid to agencies for records, one row per payment. Fees demanded and not paid are in requests.csv.

| Column | Type | Meaning | Source |
|---|---|---|---|
| agency | string | Agency slug. | agencies.csv, slug |
| agency_name | string | Agency name. | Entered by us |
| date | date | Day the payment was made. | The project's payment record |
| request | string | Tracking number of the request the fee was charged on. | requests.csv |
| amount | number | Dollars paid. | The agency's invoice or fee form |
| kind | string | Deposit or final fee. | The agency's invoice or fee form |

## requests.csv

The request log: one row per request filed. Dates, dollar amounts and codes; the letters are listed in documents.csv.

| Column | Type | Meaning | Source |
|---|---|---|---|
| tracking | string | The agency's request number, or our own reference where the agency assigns none (for example WP-2026-09-29-A). Unique in this table. | Our request log |
| agency | string | Agency name, as in agencies.csv. | Our request log |
| status | code | open or closed, as marked in our request log. | Our request log |
| url | string | The request's page on the agency's NextRequest portal, where there is one. Some portals show the page only to the requester and the agency. | The agency's portal |
| our_doc | string | Path of the published copy of the request text, contact details omitted. | documents.csv, kind = ours |
| template_version | code | Which request text was sent. v1: the one-part text of the two requests filed August 19, 2026. v2-A and v2-B: the two-part text first used September 29, 2026, documents and system exports. The Royal Oak and Waterford Township texts add one paragraph about the agency's request form and ask for the same records. variant-westland, variant-sumpter: a shorter two-part text written for that agency, with a different list of records. followup-26-956: a one-off text that follows request 26-956. oneoff-26-1080: a one-off text sent to one agency on September 29, 2026. Compare agencies within one version. | Assigned by us from the text sent |
| text_sha256 | string | SHA-256 of the published PDF of the request text (the file in our_doc). The file opens with our line saying how and when the request was filed. The same version sent to two agencies has two hashes, because each text names its agency. | documents.csv, sha256 |
| date_sent | date | Day the request was submitted. | Our request log |
| deemed_received | date | Day the request counts as received under MCL 15.235(1): the next business day after an electronic submission. | Our request log |
| due_date | date | Five business days after deemed_received (MCL 15.235(2)). | Computed |
| extension_taken | yes/no | yes when the agency issued a notice extending its time to respond; no otherwise, including requests still pending. | The agency's notice |
| extended_due_date | date | Ten business days after due_date, by our count, when an extension was taken (MCL 15.235(2)(d)); empty otherwise. The agency's own notice may state a different date. | Computed |
| response_delivered | date | Day the response reached the requester. A letter dated earlier and delivered later is counted on the day it was delivered. | The agency's response |
| business_days | integer | Business days from deemed_received (day zero) through response_delivered, computed under the rule in the conventions above. Empty while the request is pending. | Computed |
| determination_code | code | The agency's own answer, in the terms of MCL 15.235(2). none: no answer yet. granted. granted_in_part: granted in part and denied in part. denied. no_records: denied with a statement that the records do not exist. | The agency's response |
| fee_demanded_usd | number | The first fee the agency stated, in dollars. 0.00 when the response stated no fee. Empty while pending. Later figures are in the agency's letters, listed in documents.csv. | The agency's response |
| deposit_usd | number | The first deposit the agency required before producing records, in dollars. 0.00 when none was required. Empty while pending. | The agency's response |
| waiver_code | code | Every request text asks for a fee waiver or reduction in the public interest. requested: no decision yet. granted: the fee was waived. denied: the agency charged a fee and declined the waiver. not_addressed: the agency charged a fee and its response said nothing about the waiver. na: no fee was charged. | The agency's response |
| fee_final_usd | number | Dollars paid for the request. 0.00 when the agency answered and charged no fee, or when the request ended with nothing paid. Empty while the request is pending or the fee is unresolved. | Our record of fees paid |
| disposition_code | code | Where the request stands. pending: no response yet. fee_pending: the agency responded with a fee or deposit that is unpaid or under appeal, and production waits on it. denied: denied in whole. no_records: the agency stated it has no responsive records. produced: records were produced. produced_full and produced_part replace produced once the agency's findings are published, after the agency has had seven days to review a draft: our check of what was produced against the items requested found every item (full) or only some (part). An agency's statement that a request is granted in full does not by itself make the code produced_full. withdrawn: withdrawn by the requester. | Coded by us |

## right_of_reply.csv

The right-of-reply log: the draft of an agency's findings sent to the agency before they are first published, and the agency's reply.

| Column | Type | Meaning | Source |
|---|---|---|---|
| agency | string | Agency slug. | agencies.csv, slug |
| round | integer | 1: the draft goes to an agency once. | Recorded by us |
| reason | string | Why it was sent: first publication. | Recorded by us |
| packet_built | date | Day the draft was prepared. | Recorded by us |
| packet_sha256 | string | SHA-256 of the PDF sent to the agency. | Recorded by us |
| statements | string | Twelve-character hashes, separated by spaces, of each Gap, Question, Analysis and Reported statement about the agency when the draft was built. A statement on the site whose hash is not in this list was added or changed after the agency's review and carries its date on the page. | Recorded by us |
| sent_date | date | Day the draft was sent. | Recorded by us |
| wait_days | integer | Days the agency has with the draft before the findings are published: 7. | Recorded by us |
| reply_date | date | Day the agency replied; empty if it has not. | Recorded by us |
