{"api":"Lunenburg Budget Project \u2014 read-only data API","about":"An independent archive of the Lunenburg, Massachusetts town and school budget. Everything here is derived from documents the town and district published, and every row can be traced back to one.","readFirst":["Never mix a BUDGET with an ACTUAL in one calculation. They differ by up to 59% on some lines, and a growth rate measured from one to the other is partly growth and partly the step between them.","A budget line is NET -- what the town must raise after grants, fees and state aid. It is not what the thing costs. A line can rise because a grant ended and no cost changed at all.","A STAGE (proposed / settled / actual) is not a PERIOD (1-13). `budget_figure` and `ledger_snapshot` do not join, and joining them produces a plausible wrong number.","NO budget line is mapped to a ledger account. The crosswalk table is empty on purpose. Budget-to-actual at line level cannot be answered from this database yet."],"endpoints":[{"url":"https://lunenburgbudgetproject.org/api/schema","about":"Read this first. Grain, conventions, and the four ways to get a confident wrong answer.","bytes":10845},{"url":"https://lunenburgbudgetproject.org/api/coverage","about":"What we hold for each fiscal year.","bytes":3184},{"url":"https://lunenburgbudgetproject.org/api/ledger","about":"The town's books, every account and period.","bytes":404818},{"url":"https://lunenburgbudgetproject.org/api/lines","about":"Index of every budget line. Each row carries the URL of that one line's figures.","bytes":115539},{"url":"https://lunenburgbudgetproject.org/api/workbook","about":"The FY27 workbook, one file per year.","bytes":909},{"url":"https://lunenburgbudgetproject.org/api/totals","about":"Whole-year budget against actual.","bytes":984},{"url":"https://lunenburgbudgetproject.org/api/funding","about":"Revenue, transfers, funds and grants.","bytes":121771},{"url":"https://lunenburgbudgetproject.org/api/documents","about":"Provenance for every source.","bytes":2861028},{"url":"https://lunenburgbudgetproject.org/mcp","about":"MCP server, Streamable HTTP, no authentication. Eight tools over the same database, shaped so the documented mistakes cannot be made.","bytes":43421696},{"url":"https://lunenburgbudgetproject.org/api/query","about":"Ask a question in SQL instead of downloading a table. Read-only, one statement, provenance with every answer.","bytes":null},{"url":"https://lunenburgbudgetproject.org/api/questions","about":"107 worked examples: a question, the SQL that answers it, and the columns it returns. Every one is executed on each build.","bytes":null},{"url":"https://lunenburgbudgetproject.org/api/tables","about":"EVERY dataset in the project, fetchable, with its size. Staff rosters, placement counts, annual-report extracts \u2014 the raw grain the endpoints above are built from.","bytes":19005},{"url":"https://lunenburgbudgetproject.org/data/lunenburg.db","about":"The whole database, SQLite. sha256 eac92e417cb85e1f147c87ee06e244ad503b3553f04a96cb20c6270f1cf67437.","bytes":43421696}],"format":"Static JSON. No authentication, no rate limit, nothing computed per request. Cache freely. Every endpoint states its own size in `bytes` so a caller can decide before fetching; nothing here exceeds 200 KB except the database download itself.","generatedFrom":"scripts/build_api.py, from sources/data/lunenburg.db","alsoSee":{"llms.txt":"https://lunenburgbudgetproject.org/llms.txt","method":"https://lunenburgbudgetproject.org/docs/analyses/show-your-work.md","schemaNotes":"notes/reference/SCHEMA.md in the repository"},"contact":"https://lunenburgbudgetproject.org/sources"}