{
    "openapi": "3.1.0",
    "info": {
        "title": "San Antonio Data Centers API",
        "version": "1.0.0",
        "summary": "Data center sites in San Antonio identified from the City permit record, published with the candidates that were rejected and why.",
        "description": "Read-only, CORS-enabled, cached JSON over an inventory of data center sites built from the City of San Antonio's issued building permits.\n\nThe record has no category for a data center: no occupancy type, no use code, no flag. The only handle is PROJECT NAME, a free-text field somebody typed. Sites are therefore DISCOVERED by name and CONFIRMED by two rules, and the count is a floor rather than a census, because the largest projects here are permitted under codenames that say nothing about the building.\n\nTwo things this API deliberately does not serve. There is no total floor area and no total investment, in any unit, on any endpoint: the same figure is stamped on several sibling permits at one project, so a sum multiplies one building by the number of forms it needed. And there are no power or water figures, because they are not in the permit record at all.\n\nThe rejected candidates are a first-class endpoint. A name match is not evidence of a building, and what was thrown away is as much of the product as what was kept.",
        "contact": {
            "name": "BrandShyp",
            "url": "https:\/\/brandshyp.org\/contact-us\/"
        },
        "license": {
            "name": "City of San Antonio open data",
            "url": "https:\/\/data.sanantonio.gov\/dataset\/building-permits"
        }
    },
    "externalDocs": {
        "description": "Human documentation, with the map and the caveats in context",
        "url": "https:\/\/brandshyp.org\/san-antonio-data-centers\/"
    },
    "servers": [
        {
            "url": "https:\/\/brandshyp.org\/api\/v1\/data-centers"
        }
    ],
    "security": [],
    "tags": [
        {
            "name": "sites",
            "description": "Confirmed sites and the candidates that were rejected"
        },
        {
            "name": "meta",
            "description": "Discovery, search coverage 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"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/sites": {
            "get": {
                "tags": [
                    "sites"
                ],
                "summary": "Confirmed data center sites",
                "description": "One row per address, including whether the record itself names data center work there or the site rests on an operator name plus a commercial permit. No total area or valuation is returned.",
                "operationId": "getSites",
                "responses": {
                    "200": {
                        "description": "Confirmed sites",
                        "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"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/rejected": {
            "get": {
                "tags": [
                    "sites"
                ],
                "summary": "Candidates that were rejected, and why",
                "description": "Each row carries its failure class and, where the exclusion rests on what the record calls the work, the quoted project name that produced it.",
                "operationId": "getRejected",
                "responses": {
                    "200": {
                        "description": "Rejected candidates",
                        "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"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/operators": {
            "get": {
                "tags": [
                    "meta"
                ],
                "summary": "Every operator searched for, including those with nothing here",
                "description": "Publishing the zeroes matters: an operator searched for and not found is a different statement from an operator nobody looked for.",
                "operationId": "getOperators",
                "responses": {
                    "200": {
                        "description": "Keyword census",
                        "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 record cannot tell you",
                "description": "Returns category_field: null, deliberately, plus the two confirmation rules and the fields absent from the permit file entirely.",
                "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"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/pipeline": {
            "get": {
                "tags": [
                    "sites"
                ],
                "summary": "Applied for, not issued. NOT counted as sites.",
                "description": "From the City\u2019s separate APPLICATIONS SUBMITTED resource. An application is a filing, not a permission and not a building; these rows are excluded from totals.sites and must never be added to it. Addresses already confirmed on the issued record are excluded, and the same building-type rule is applied.",
                "operationId": "getPipeline",
                "responses": {
                    "200": {
                        "description": "Applications not yet issued",
                        "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"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/sites.csv": {
            "get": {
                "tags": [
                    "sites"
                ],
                "summary": "Confirmed sites as CSV",
                "operationId": "getSitesCsv",
                "responses": {
                    "200": {
                        "description": "CSV of the confirmed sites",
                        "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"
                }
            }
        }
    }
}