{
    "openapi": "3.1.0",
    "info": {
        "title": "San Antonio Bond Projects API",
        "version": "1.0.0",
        "summary": "Voter-approved capital projects in San Antonio, published with the coverage rate of every money field.",
        "description": "Read-only, CORS-enabled JSON over the City of San Antonio's own bond project master list, which the City states is updated monthly.\n\n**The field named `Total Budget` is a recorded ZERO on most projects, not a blank**, and the record does not document whether that means the project has no separate total budget or that nobody entered one. Summing it against `Total Expenditures` reports the City spending far above 100% of budget. Four divisions are therefore refused: either expenditure field by `Total Budget`, `Total Expenditures` by `Bond Budget`, and any of those summed citywide before dividing. A rate is computed only within a pair. Every dollar figure in this API uses the `Bond Budget` and `Bond Expenditures` pair and is returned beside its coverage rate.\n\n**No project carries a real date.** Every recorded construction end is a season, so no independent schedule variance exists and `\/quality` returns null for it. Whether a project is on time is the City's own assessment, published as such.\n\n**A project spanning several council districts is never split between them.** The record does not say how the money divides. `\/districts` returns the share that sits in one named district alongside the buckets that do not.\n\nEvery response carries a `caveats` object stating these conditions.",
        "license": {
            "name": "City of San Antonio open data, compilation by BrandShyp",
            "url": "https:\/\/data.sanantonio.gov\/dataset\/bond-project"
        },
        "contact": {
            "name": "BrandShyp",
            "url": "https:\/\/brandshyp.org\/contact-us\/"
        }
    },
    "servers": [
        {
            "url": "https:\/\/brandshyp.org\/api\/v1\/bond",
            "description": "Production"
        }
    ],
    "security": [],
    "tags": [
        {
            "name": "projects",
            "description": "The bond ledger"
        },
        {
            "name": "meta",
            "description": "Discovery and what the record cannot settle"
        }
    ],
    "paths": {
        "\/": {
            "get": {
                "summary": "Discovery document",
                "operationId": "getRoot",
                "tags": [
                    "meta"
                ],
                "responses": {
                    "200": {
                        "description": "What this is, the money block and the headline totals.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/projects": {
            "get": {
                "summary": "Every bond project",
                "operationId": "getProjects",
                "tags": [
                    "projects"
                ],
                "responses": {
                    "200": {
                        "description": "All projects with program, proposition, phase, status, district bucket and both money pairs.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/programmes": {
            "get": {
                "summary": "The bond programs",
                "operationId": "getProgrammes",
                "tags": [
                    "projects"
                ],
                "responses": {
                    "200": {
                        "description": "Each program with its own delivery rate. Always read together.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/propositions": {
            "get": {
                "summary": "By proposition",
                "operationId": "getPropositions",
                "tags": [
                    "projects"
                ],
                "responses": {
                    "200": {
                        "description": "Each proposition with its off-schedule share.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/districts": {
            "get": {
                "summary": "By council district",
                "operationId": "getDistricts",
                "tags": [
                    "projects"
                ],
                "responses": {
                    "200": {
                        "description": "The share of money placed in one named district, plus the buckets that are never allocated.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/quality": {
            "get": {
                "summary": "What the record cannot settle",
                "operationId": "getQuality",
                "tags": [
                    "meta"
                ],
                "responses": {
                    "200": {
                        "description": "Field coverage rates, what a naive budget sum reports, and the nulls for schedule variance and cost overrun.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/projects.csv": {
            "get": {
                "summary": "The same projects as CSV",
                "operationId": "getProjectsCsv",
                "tags": [
                    "projects"
                ],
                "responses": {
                    "200": {
                        "description": "Tidy CSV with the caveats in its header comments.",
                        "content": {
                            "text\/csv": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/openapi.json": {
            "get": {
                "summary": "This document",
                "operationId": "getOpenapi",
                "tags": [
                    "meta"
                ],
                "responses": {
                    "200": {
                        "description": "OpenAPI 3.1 description.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "405": {
                        "description": "Method not allowed. This API is read-only.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "The ledger cube has not been built yet.",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}