{
  "name": "AlpharettaIntel",
  "description": "The City of Alpharetta's automated license-plate reader records, as produced under the Georgia Open Records Act, plus the public datasets they are read against.",
  "documentation": "https://flock.alpharettaintel.com/data",
  "site": "https://flock.alpharettaintel.com/",
  "as_of": "2026-07-31",
  "terms": {
    "note": "Take the files. There is no key, no quota and no rate limit — this is a publication, not a service. Licenses differ per dataset and are named on each; the produced records themselves are public records.",
    "attribution_required": true,
    "affiliation": "An independent project. Not affiliated with, endorsed by, or operated by the City of Alpharetta, the Alpharetta Police Department, Flock Safety, or any government agency."
  },
  "caching": "`url` is stable and revalidates on every request; `immutable_url` carries a content hash and may be cached forever. A refresh moves the second and never the first.",
  "datasets": [
    {
      "id": "usage",
      "name": "Hotlist alerts by year and topic",
      "description": "Every figure chapter 03 states: 10,742,367 alerts across 7 years, by topic, each year's row carrying the produced document, page and sha256 it was read from.",
      "url": "/api/usage.json",
      "immutable_url": "/data/usage.20f28fde.json",
      "bytes": 21183,
      "media_type": "application/json",
      "license": "https://creativecommons.org/licenses/by/4.0/",
      "attribution": "AlpharettaIntel, from records produced by the City of Alpharetta under the Georgia Open Records Act",
      "rows": 7,
      "tables": [
        {
          "id": "alerts-by-year",
          "name": "Hotlist alerts by year",
          "description": "One row per year of the produced alert statistics, with the document, page and sha256 each row was read from.",
          "url": "/api/alerts-by-year.csv",
          "immutable_url": "/data/alerts-by-year.b40103ee.csv",
          "media_type": "text/csv",
          "bytes": 1921,
          "rows": 7,
          "columns": [
            {
              "column": "Year",
              "description": "Calendar year. The first and last are partial — see the coverage columns."
            },
            {
              "column": "Tenant",
              "description": "The Flock tenant the export was run for."
            },
            {
              "column": "Coverage start",
              "description": "First day the year's figures cover (ISO 8601)."
            },
            {
              "column": "Coverage end",
              "description": "Last day the year's figures cover (ISO 8601)."
            },
            {
              "column": "Days covered",
              "description": "Days in the covered period, not days in the year."
            },
            {
              "column": "Partial year",
              "description": "true where the period is shorter than the calendar year. Do not compare a partial year to a full one."
            },
            {
              "column": "Total alerts",
              "description": "Every hotlist alert the export reports for the period."
            },
            {
              "column": "Official hotlist alerts",
              "description": "Alerts against official hotlists — NCIC and state files."
            },
            {
              "column": "Your custom hotlists",
              "description": "Alerts against lists the agency maintains itself. Empty where the export does not break it out."
            },
            {
              "column": "Other custom hotlists on your networks",
              "description": "Alerts against another agency's custom list, raised on this network."
            },
            {
              "column": "Alerts per day",
              "description": "Total divided by days covered, as reported."
            },
            {
              "column": "Registration share",
              "description": "Proportion of the year's alerts that are registration status — expired or suspended — as a fraction of 1."
            },
            {
              "column": "Registration alerts",
              "description": "Expired and suspended registration alerts."
            },
            {
              "column": "Custom alerts",
              "description": "Alerts against custom hotlists of any kind."
            },
            {
              "column": "Other official alerts",
              "description": "Official-hotlist alerts that are not registration status: stolen, warrants, missing persons and the rest."
            },
            {
              "column": "Source document",
              "description": "Path of the produced record this row was read from, under /records/."
            },
            {
              "column": "Page",
              "description": "Page of that document."
            },
            {
              "column": "SHA-256",
              "description": "Hash of the produced file, as published. Verifies the row against the original."
            }
          ]
        },
        {
          "id": "alerts-by-topic-year",
          "name": "Hotlist alerts by topic and year",
          "description": "The same alerts in long form — one row per topic per year, which is the shape a pivot table wants.",
          "url": "/api/alerts-by-topic-year.csv",
          "immutable_url": "/data/alerts-by-topic-year.00bc807c.csv",
          "media_type": "text/csv",
          "bytes": 3067,
          "rows": 75,
          "columns": [
            {
              "column": "Topic",
              "description": "The hotlist topic, as Flock's export names it."
            },
            {
              "column": "Class",
              "description": "registration, custom, or other_official. The site's grouping, not Flock's."
            },
            {
              "column": "Year",
              "description": "Calendar year."
            },
            {
              "column": "Alerts",
              "description": "Alerts on that topic in that year."
            }
          ]
        }
      ]
    },
    {
      "id": "procurement",
      "name": "Payments to Flock Group Inc.",
      "description": "The check register and the produced check images: $1,061,482.88 documented across 27 checks.",
      "url": "/api/procurement.json",
      "immutable_url": "/data/procurement.8e99defb.json",
      "bytes": 97235,
      "media_type": "application/json",
      "license": "https://creativecommons.org/licenses/by/4.0/",
      "attribution": "AlpharettaIntel, from records produced by the City of Alpharetta under the Georgia Open Records Act",
      "rows": 27,
      "tables": [
        {
          "id": "payments",
          "name": "Payments to Flock Group Inc.",
          "description": "Every produced check, with the amount read off the check itself and the document it came from.",
          "url": "/api/payments.csv",
          "immutable_url": "/data/payments.11373893.csv",
          "media_type": "text/csv",
          "bytes": 5025,
          "rows": 25,
          "columns": [
            {
              "column": "Check number",
              "description": "As printed on the check."
            },
            {
              "column": "Date paid",
              "description": "Date on the check (ISO 8601)."
            },
            {
              "column": "Amount (USD)",
              "description": "Plain number, no symbol or separators. Read from the check, not from the ledger."
            },
            {
              "column": "Invoice date",
              "description": "Date of the invoice the check settles, where one was produced."
            },
            {
              "column": "Amounts on the face",
              "description": "Every dollar figure found on the image, semicolon-separated. More than one means the check carries a total and its parts."
            },
            {
              "column": "Filename disagrees",
              "description": "true where the check number in the file name is not the number on the check."
            },
            {
              "column": "Pages",
              "description": "Pages in the produced PDF."
            },
            {
              "column": "Read as",
              "description": "How the text was extracted: native for an embedded text layer, ocr where it had to be recognised."
            },
            {
              "column": "Document path",
              "description": "Path of the produced file, under /records/."
            },
            {
              "column": "SHA-256",
              "description": "Hash of the produced file, as published."
            }
          ]
        }
      ]
    },
    {
      "id": "records",
      "name": "The document manifest",
      "description": "Every produced document this site publishes — 99 of them, 398 pages — with its sha256, byte length, production and extraction method. This is the list the site itself is built from; it is not a directory listing, and one production is deliberately absent.",
      "url": "/api/records.json",
      "immutable_url": "/data/records.45cf2204.json",
      "bytes": 63686,
      "media_type": "application/json",
      "license": "https://creativecommons.org/licenses/by/4.0/",
      "attribution": "AlpharettaIntel, from records produced by the City of Alpharetta under the Georgia Open Records Act",
      "rows": 99,
      "tables": [
        {
          "id": "documents",
          "name": "The document manifest",
          "description": "Every produced document this site publishes, with its hash, size and how its text was extracted.",
          "url": "/api/documents.csv",
          "immutable_url": "/data/documents.62336202.csv",
          "media_type": "text/csv",
          "bytes": 22683,
          "rows": 99,
          "columns": [
            {
              "column": "Path",
              "description": "Path under /records/. Also the document's identity across every other file here."
            },
            {
              "column": "Production",
              "description": "The Open Records production the document arrived in."
            },
            {
              "column": "Kind",
              "description": "File type as produced: pdf, xlsx, docx and so on."
            },
            {
              "column": "Pages",
              "description": "Pages, or sheets for a spreadsheet."
            },
            {
              "column": "Bytes",
              "description": "Size of the original file, byte-for-byte as produced."
            },
            {
              "column": "Characters of text",
              "description": "Length of the extracted text."
            },
            {
              "column": "Read as",
              "description": "How the text was obtained: native, ocr, spreadsheet. More than one where a document is mixed."
            },
            {
              "column": "Transcribed pages",
              "description": "Pages that had to be read by OCR rather than lifted from a text layer."
            },
            {
              "column": "OCR confidence",
              "description": "Mean confidence reported by the OCR engine, where OCR was used."
            },
            {
              "column": "SHA-256",
              "description": "Hash of the original file. The chain back to what the custodian handed over."
            }
          ]
        }
      ]
    },
    {
      "id": "metro-cameras",
      "name": "Mapped plate readers in the metro window",
      "description": "726 ALPR-tagged cameras as GeoJSON, 134 of them inside Alpharetta's boundary.",
      "url": "/api/metro-cameras.json",
      "immutable_url": "/data/metro-cameras.60899ad1.json",
      "bytes": 400232,
      "media_type": "application/geo+json",
      "license": "https://opendatacommons.org/licenses/odbl/1-0/",
      "attribution": "© OpenStreetMap contributors (ODbL), via DeFlock (deflock.org), plus rows from Alpharetta PD’s released asset list (public record, not ODbL) — each feature carries its own source and licence",
      "rows": 726
    },
    {
      "id": "sharing-partners",
      "name": "Sharing partners, located",
      "description": "The 1,389 of 1,562 partner agencies the Census gazetteer can place, as GeoJSON, with direction of exchange and distance.",
      "url": "/api/sharing-partners.json",
      "immutable_url": "/data/sharing-partners.44bf1b43.json",
      "bytes": 517932,
      "media_type": "application/geo+json",
      "license": "https://creativecommons.org/licenses/by/4.0/",
      "attribution": "AlpharettaIntel, from records produced by the City of Alpharetta under the Georgia Open Records Act",
      "rows": 1389
    },
    {
      "id": "states",
      "name": "Mapped cameras and Flock agencies, per state",
      "description": "The national join behind chapter 01's United States view: 128,855 mapped plate readers against 2,685 agencies the EFF Atlas records as Flock customers.",
      "url": "/api/states.json",
      "immutable_url": "/data/states.d2f09366.json",
      "bytes": 8281,
      "media_type": "application/json",
      "license": "https://opendatacommons.org/licenses/odbl/1-0/",
      "attribution": "© OpenStreetMap contributors (ODbL) via DeFlock; agencies: EFF Atlas of Surveillance (CC-BY); boundaries: US Census Bureau",
      "rows": 51,
      "tables": [
        {
          "id": "states-table",
          "name": "Mapped cameras and Flock agencies, per state",
          "description": "The national join behind chapter 01's United States view, one row per state.",
          "url": "/api/states-table.csv",
          "immutable_url": "/data/states-table.85bb8d5e.csv",
          "media_type": "text/csv",
          "bytes": 1679,
          "rows": 51,
          "columns": [
            {
              "column": "State",
              "description": "USPS two-letter code. Includes DC and Puerto Rico; Alaska appears in neither source and has no row."
            },
            {
              "column": "All ALPR cameras mapped",
              "description": "Every plate reader OpenStreetMap carries in that state, any brand."
            },
            {
              "column": "Flock cameras mapped",
              "description": "Of those, the ones tagged Flock Safety."
            },
            {
              "column": "Flock share of mapped",
              "description": "Flock cameras as a fraction of 1 of all mapped plate readers."
            },
            {
              "column": "Flock agencies",
              "description": "Agencies the EFF Atlas of Surveillance records as Flock customers."
            },
            {
              "column": "ALPR agencies",
              "description": "Agencies the Atlas records as running any plate reader."
            },
            {
              "column": "Mapped Flock cameras per Flock agency",
              "description": "A ratio between two different surveys, not a fleet size. A low number means the mapping is behind, not that the cameras are absent."
            }
          ]
        }
      ]
    },
    {
      "id": "doctext",
      "name": "Extracted text of every published document",
      "description": "One array, in manifest order, of the text extracted from all 99 documents. Personal names are withheld from this text where the site says so; the originals under /records/ are byte-identical to what the custodian produced and are what the published sha256 verifies against.",
      "url": "/api/doctext.json",
      "immutable_url": "/data/doctext.ac9b74db.json",
      "bytes": 1310542,
      "media_type": "application/json",
      "license": "https://creativecommons.org/licenses/by/4.0/",
      "attribution": "AlpharettaIntel, from records produced by the City of Alpharetta under the Georgia Open Records Act",
      "rows": 99
    },
    {
      "id": "roads",
      "name": "Metro road geometry",
      "description": "Arterial and secondary roads under chapter 01's map, simplified and delta-encoded. Drawn, not authoritative.",
      "url": "/api/roads.json",
      "immutable_url": "/data/roads.3feca212.json",
      "bytes": 243059,
      "media_type": "application/json",
      "license": "https://opendatacommons.org/licenses/odbl/1-0/",
      "attribution": "© OpenStreetMap contributors (ODbL)"
    },
    {
      "id": "roads-local",
      "name": "Metro residential streets",
      "description": "The z14 road tier, split out so a reader who never zooms in never fetches it.",
      "url": "/api/roads-local.json",
      "immutable_url": "/data/roads-local.14f95e74.json",
      "bytes": 613469,
      "media_type": "application/json",
      "license": "https://opendatacommons.org/licenses/odbl/1-0/",
      "attribution": "© OpenStreetMap contributors (ODbL)"
    },
    {
      "id": "boundary",
      "name": "Alpharetta city limit",
      "description": "The three rings of the corporate boundary, simplified for drawing. Every in-the-city classification on this site is computed against the unsimplified polygon, not this.",
      "url": "/api/boundary.json",
      "immutable_url": "/data/boundary.f891d92d.json",
      "bytes": 3692,
      "media_type": "application/json",
      "license": "https://www.usa.gov/government-works",
      "attribution": "City of Alpharetta corporate limit"
    },
    {
      "id": "districts",
      "name": "County lines and neighboring city limits",
      "description": "What chapter 01's map reveals as it is zoomed in: the six counties and sixteen other municipalities sharing its window, with a label point for each.",
      "url": "/api/districts.json",
      "immutable_url": "/data/districts.a48fe8db.json",
      "bytes": 42347,
      "media_type": "application/json",
      "license": "https://www.usa.gov/government-works",
      "attribution": "US Census Bureau — a work of the United States government (17 U.S.C. § 105)"
    },
    {
      "id": "us-states",
      "name": "US state outlines",
      "description": "Outer rings only, generalized to about 900 m, keyed by postal code so the national view can fill them. For orientation, not for measurement.",
      "url": "/api/us-states.json",
      "immutable_url": "/data/us-states.7ddb892c.json",
      "bytes": 98439,
      "media_type": "application/json",
      "license": "https://www.usa.gov/government-works",
      "attribution": "US Census Bureau — a work of the United States government (17 U.S.C. § 105)"
    },
    {
      "id": "streets",
      "name": "Every street in the window, and the cameras near it",
      "description": "11,431 named streets across 19 municipalities and counties, each with the camera sites standing within 250 feet of it and the distance to the closest one. 756 have a camera in range; for the rest the nearest is a median 1,970 feet away. A distance test, not a claim about which road a camera watches.",
      "url": "/api/streets.json",
      "immutable_url": "/data/streets.27826c94.json",
      "bytes": 709598,
      "media_type": "application/json",
      "license": "https://opendatacommons.org/licenses/odbl/1-0/",
      "attribution": "© OpenStreetMap contributors (ODbL)",
      "rows": 11431,
      "tables": [
        {
          "id": "streets-table",
          "name": "Streets and the cameras near them",
          "description": "Every named street in the metro window with the cameras standing within 250 feet of it, and the distance to the nearest one where there are none.",
          "url": "/api/streets-table.csv",
          "immutable_url": "/data/streets-table.1cab98bd.csv",
          "media_type": "text/csv",
          "bytes": 915178,
          "rows": 11431,
          "columns": [
            {
              "column": "Street",
              "description": "Name as the source network carries it. Suffixes are written out."
            },
            {
              "column": "Municipality",
              "description": "The city the street falls in, or the county where it falls in none."
            },
            {
              "column": "Latitude",
              "description": "A point on the street, nearest the middle of its own extent. WGS 84."
            },
            {
              "column": "Longitude",
              "description": "The same point. WGS 84."
            },
            {
              "column": "Extent, degrees of latitude",
              "description": "Height of the street's bounding box. A long arterial and a cul-de-sac are not the same thing."
            },
            {
              "column": "Extent, degrees of longitude",
              "description": "Width of the same box."
            },
            {
              "column": "Camera sites within 250 ft",
              "description": "Distinct poles. A distance test, not a claim about which road a camera watches — a camera on a corner counts for both roads."
            },
            {
              "column": "Cameras within 250 ft",
              "description": "Cameras rather than poles: one site can carry several lenses."
            },
            {
              "column": "Feet to the nearest camera",
              "description": "Distance from the street to the closest camera site, rounded to ten feet. Empty beyond five miles. Zero-ish where a camera stands on the street."
            },
            {
              "column": "Site IDs",
              "description": "site_id values from the camera GeoJSON, semicolon-separated. The join key to every other camera file here."
            },
            {
              "column": "Source network",
              "description": "osm where OpenStreetMap carries the street, tiger where only the Census does — most often a subdivision no volunteer has driven through."
            }
          ]
        }
      ]
    }
  ],
  "records": {
    "description": "The produced documents themselves, 99 files, served byte-identical to what the custodian handed over.",
    "manifest": "/api/records.json",
    "note": "Paths come from the manifest above. /records/ is not browsable, and that is not an oversight: one production is withheld from this site and its files are on the same disk.",
    "count": 99,
    "pages": 398
  },
  "endpoints": [
    {
      "path": "/api",
      "method": "GET",
      "description": "This index."
    },
    {
      "path": "/api/tip",
      "method": "POST",
      "description": "Corrections, records tips and feedback. Accepts application/json or application/x-www-form-urlencoded with `message` (required, 12 characters or more), `email` (optional — leave it blank to stay anonymous) and `about` (optional subject). Answers JSON to a JSON request and a 303 to a page otherwise. Rate-limited; there is no read side and nothing is stored but the notification.",
      "form": "https://flock.alpharettaintel.com/contact"
    },
    {
      "path": "/api/where",
      "method": "POST",
      "description": "Resolve a street address and say what is mapped near it. Send `{\"q\": \"12070 Example Rd, Alpharetta, GA\"}` as application/json or a form encoding. Answers with the geocoded point, the number of camera sites and cameras within 250 feet of it, the distance to the nearest one, and whether the point falls inside the window chapter 01 draws. The address is resolved by the US Census geocoder; the cameras are counted here, against all 115,103 sites this project holds, so what is near an address is never asked of anybody else. Rate-limited, cached, and nothing is stored.",
      "radius_ft": 250,
      "sites_searched": 115103,
      "geocoder": "US Census Bureau, Public_AR_Current — public domain, no key",
      "form": "https://flock.alpharettaintel.com/map"
    }
  ]
}
