{
    "openapi": "3.1.0",
    "info": {
        "title": "San Antonio License Plate Readers API",
        "version": "1.0.0",
        "summary": "Automated license plate readers mapped by volunteers in Bexar County, Texas, published as a floor rather than a census.",
        "description": "Read-only, CORS-enabled, cached JSON over an inventory of automated license plate readers in Bexar County.\n\nThis API is unlike the others on this platform in one important way: it is not built on a government record. Neither the City of San Antonio's open data catalog nor its GIS services publish any camera layer, and no agency that operates these devices publishes their locations. The only public inventory is crowdsourced, in OpenStreetMap.\n\nThat has a hard consequence. There is no denominator, so no coverage rate can be calculated and every count here is a floor rather than a total. `\/quality` returns `denominator: null` deliberately.\n\nWho operates a given device is unrecorded on most of them, so nothing here supports a claim that a named agency runs a particular number of cameras. The data records presence only: it says nothing about what any device captures, how long anything is retained, or who it is shared with.\n\nData from OpenStreetMap under the Open Database License. Derived works carry the same license and attribution requirement.",
        "contact": {
            "name": "BrandShyp",
            "url": "https:\/\/brandshyp.org\/contact-us\/"
        },
        "license": {
            "name": "Open Database License (ODbL) 1.0",
            "url": "https:\/\/opendatacommons.org\/licenses\/odbl\/1-0\/"
        }
    },
    "externalDocs": {
        "description": "Human documentation, with the map and the caveats in context",
        "url": "https:\/\/brandshyp.org\/san-antonio-license-plate-readers\/"
    },
    "servers": [
        {
            "url": "https:\/\/brandshyp.org\/api\/v1\/plate-readers"
        }
    ],
    "security": [],
    "tags": [
        {
            "name": "readers",
            "description": "Mapped devices and their recorded attributes"
        },
        {
            "name": "meta",
            "description": "Discovery and data quality"
        }
    ],
    "paths": {
        "\/": {
            "get": {
                "tags": [
                    "meta"
                ],
                "summary": "Discovery document",
                "operationId": "getRoot",
                "responses": {
                    "200": {
                        "description": "Endpoint list and headline totals",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "caveats"
                                    ],
                                    "properties": {
                                        "caveats": {
                                            "$ref": "#\/components\/schemas\/Caveats"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only (GET).",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Inventory temporarily unavailable. It is rebuilt weekly.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/summary": {
            "get": {
                "tags": [
                    "readers"
                ],
                "summary": "Counts by manufacturer, operator and council district",
                "operationId": "getSummary",
                "responses": {
                    "200": {
                        "description": "Aggregate counts",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "caveats"
                                    ],
                                    "properties": {
                                        "caveats": {
                                            "$ref": "#\/components\/schemas\/Caveats"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only (GET).",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Inventory temporarily unavailable. It is rebuilt weekly.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/cameras": {
            "get": {
                "tags": [
                    "readers"
                ],
                "summary": "Mapped device locations",
                "description": "Latitude, longitude, whether the device is a Flock Safety unit, and the year a contributor last confirmed it. The direction a camera faces is deliberately not published.",
                "operationId": "getCameras",
                "responses": {
                    "200": {
                        "description": "Point list",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "caveats"
                                    ],
                                    "properties": {
                                        "caveats": {
                                            "$ref": "#\/components\/schemas\/Caveats"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only (GET).",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Inventory temporarily unavailable. It is rebuilt weekly.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/quality": {
            "get": {
                "tags": [
                    "meta"
                ],
                "summary": "What this dataset cannot tell you",
                "description": "Returns denominator: null, deliberately. There is no published total to compare the mapped devices against.",
                "operationId": "getQuality",
                "responses": {
                    "200": {
                        "description": "Data quality statement",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "caveats"
                                    ],
                                    "properties": {
                                        "caveats": {
                                            "$ref": "#\/components\/schemas\/Caveats"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only (GET).",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Inventory temporarily unavailable. It is rebuilt weekly.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/summary.csv": {
            "get": {
                "tags": [
                    "readers"
                ],
                "summary": "Counts as CSV",
                "operationId": "getSummaryCsv",
                "responses": {
                    "200": {
                        "description": "CSV of the aggregate counts",
                        "content": {
                            "text\/csv": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only (GET).",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Inventory temporarily unavailable. It is rebuilt weekly.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/openapi.json": {
            "get": {
                "tags": [
                    "meta"
                ],
                "summary": "This document",
                "operationId": "getOpenapi",
                "responses": {
                    "200": {
                        "description": "OpenAPI 3.1 description of this API",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "caveats"
                                    ],
                                    "properties": {
                                        "caveats": {
                                            "$ref": "#\/components\/schemas\/Caveats"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only (GET).",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Inventory temporarily unavailable. It is rebuilt weekly.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "$ref": "#\/components\/schemas\/Error"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Error": {
                "type": "object",
                "required": [
                    "error",
                    "status"
                ],
                "properties": {
                    "error": {
                        "type": "string"
                    },
                    "status": {
                        "type": "integer"
                    }
                }
            },
            "Caveats": {
                "type": "array",
                "description": "The conditions under which these numbers mean anything. Present on every successful JSON response.",
                "items": {
                    "type": "string"
                }
            }
        }
    }
}