US Municipal Capital Projects API
Download OpenAPI (municipal-capital-projects.yaml) · Base URL https://api.olympus.new-odyssey.com
City and county capital budgets and capital improvement programmes in one schema: projects with their department, category, status and location where the source gives them, and every published amount by fiscal year, amount type and funding source. Served by the Olympus Go gateway.
As published. Each government publishes its capital plan in its own way: an open-data table of budget lines, a project tracker, or a PDF budget document. Names, amounts, statuses and fiscal years are as each source publishes them, mapped onto one schema. Nothing is inflated, reconciled between a government's datasets, or estimated, and no amount is inferred. Every response repeats this in meta.notices (as_published).
Amount types. budget (budgeted, appropriated, adopted or programmed for the fiscal year or years given), cumulative_budget (budget or appropriation to date, over the project's life), actual (spent in the fiscal year), cumulative_actual (spent to date), committed (encumbered or committed), authorization (borrowing or loan authorization) and total_cost (a stated total project cost). amount_label names the column or printed heading each amount comes from. Amounts of different types must not be added together.
Fiscal years. Each government's own fiscal year, named by the year it ends (FY 2027 = the year ending in 2027 at most governments). An amount for several years has fiscal_year_from < fiscal_year_to; an amount to date has neither. fiscal_year_derived is true when the year is computed rather than printed in the row (NYC's year2_amt is yr1_fy + 1; Fremont's printed 2023/24 is read as FY 2024; a PDF's fiscal year comes from its title), and fiscal_year_label keeps what was printed.
Provenance. Every amount carries value_provenance: for an open-data source the dataset, its version (rows_updated_at), the SHA-256 of the retained response, the row id and the field; for a PDF the document URL and SHA-256, the page, the bounding box (PDF points from the top left), the printed text, how it was read and the extraction spec. Projects carry field_provenance for their own fields. PDF rows are published only when every check passed for the document and the row was read cleanly; rows held for review are counted in coverage and never served. derived marks computed values: the normalised status, a derived fiscal year, a scaled amount (amount_derived), and every total this API computes (totals_derived).
People. Columns that name people (project managers, their phone numbers and e-mail addresses, architects and contractors who may be individuals) are never read. Governments are identified by their Census GEOID: a place (OLY-US-CENSUS-PLACE, 7 digits) for a city or town, a county (OLY-US-CENSUS-COUNTY, 5 digits) for a county, checked against the Census Gazetteer at every load.
Coverage. Only the sources GET /v1/municipal-capital-projects/coverage lists as published. Each source's licence or terms are listed as the publisher states them, with commercial_reuse (permitted, attribution or unstated) and any attribution the publisher asks for.
Pagination. GET /projects pages with a cursor (meta.pagination.next_cursor; pass it back unchanged with the same filters). A cursor is tied to the publication it was issued under.
Authenticate with an API key in X-API-Key or Authorization: Bearer. The organization's plan must include municipal-capital-projects. Every response carries X-Request-Id. Errors share the Error body.
Projects
Search projects
/v1/municipal-capital-projects/projectsPublished projects ordered by government and name, filtered by any combination of government, state, name, department, status and the fiscal years they have amounts for.
Authentication: API key (X-API-Key or Bearer)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| government | query | string | One or more Census GEOIDs (7-digit place or 5-digit county), comma separated (at most 20). Example: 3651000 |
| state | query | string | Two-letter state code. Example: TX |
| q | query | string | Words that must all appear in the project name (case-insensitive, at least 3 characters). Example: fire station |
| department | query | string | Department as published (case-insensitive, exact). Example: Public Works |
| status | query | Status | Normalised status. |
| fiscal_year | query | integer | Projects with an amount whose fiscal years include this year. Example: 2027 |
| limit | query | integer | |
| cursor | query | string |
Responses
| 200 | Matching projects. | ProjectsResponse |
| 400 | Invalid parameter ( | Error |
| 401 | Missing or invalid API key ( | Error |
| 403 | Organization suspended ( | Error |
| 429 | Per-minute rate limit exceeded ( | Error |
| 503 | The dataset has no active publication yet ( | Error |
curl -s "https://api.olympus.new-odyssey.com/v1/municipal-capital-projects/projects" \
-H "X-API-Key: $OLYMPUS_API_KEY"One project with every published amount
/v1/municipal-capital-projects/projects/{project_id}Authentication: API key (X-API-Key or Bearer)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| project_idrequired | path | string |
Example: municap:nyc.capital_budget:4b1d0d1f0c6e2a9f8e7d6c5b |
Responses
| 200 | The project, its amounts (fiscal year order, at most 2000) and per-year totals. | ProjectResponse |
| 400 | Invalid parameter ( | Error |
| 401 | Missing or invalid API key ( | Error |
| 403 | Organization suspended ( | Error |
| 404 | No published project or government with this id ( | Error |
| 429 | Per-minute rate limit exceeded ( | Error |
| 503 | The dataset has no active publication yet ( | Error |
curl -s "https://api.olympus.new-odyssey.com/v1/municipal-capital-projects/projects/municap:nyc.capital_budget:4b1d0d1f0c6e2a9f8e7d6c5b" \
-H "X-API-Key: $OLYMPUS_API_KEY"Governments
One government's published capital data
/v1/municipal-capital-projects/governments/{geoid}The government's sources (as in coverage), project counts by status and department, and totals of its published amounts by fiscal year and amount type (computed by this API: totals_derived), with the shared entity_id / identifiers / related blocks of its Census place or county.
Authentication: API key (X-API-Key or Bearer)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| geoidrequired | path | string | Census GEOID (7-digit place or 5-digit county). Example: 3651000 |
Responses
| 200 | The government. | GovernmentResponse |
| 400 | Invalid parameter ( | Error |
| 401 | Missing or invalid API key ( | Error |
| 403 | Organization suspended ( | Error |
| 404 | No published project or government with this id ( | Error |
| 429 | Per-minute rate limit exceeded ( | Error |
| 503 | The dataset has no active publication yet ( | Error |
curl -s "https://api.olympus.new-odyssey.com/v1/municipal-capital-projects/governments/3651000" \
-H "X-API-Key: $OLYMPUS_API_KEY"Coverage
What is served, from which sources, under which terms
/v1/municipal-capital-projects/coverageEvery configured source: published with its government, licence or terms as stated, data version, counts and rows not published, or not_loaded. Answers 200 before anything is published.
Authentication: API key (X-API-Key or Bearer)
Responses
| 200 | Coverage. | CoverageResponse |
| 401 | Missing or invalid API key ( | Error |
| 403 | Organization suspended ( | Error |
| 429 | Per-minute rate limit exceeded ( | Error |
curl -s "https://api.olympus.new-odyssey.com/v1/municipal-capital-projects/coverage" \
-H "X-API-Key: $OLYMPUS_API_KEY"Schemas
Error object
The error body shared by every Olympus service.
| Field | Type | Description |
|---|---|---|
| error * | string | Human-readable message. |
| code * | string | Stable machine-readable code. |
| product | string | Product that produced the error, when applicable. |
| details | object |
Money string
US dollars as a decimal string with two places.
GEOID string
Census GEOID of the government's area (7-digit place, or 5-digit county).
Status enum: planned | design | bidding | construction | active | ongoing | completed | on_hold | cancelled | other
Normalised from status_as_published (derived); other when the published status maps to none.
planneddesignbiddingconstructionactiveongoingcompletedon_holdcancelledother
AmountType enum: budget | cumulative_budget | actual | cumulative_actual | committed | authorization | total_cost
budgetcumulative_budgetactualcumulative_actualcommittedauthorizationtotal_cost
Provenance object
Where this record came from and which publication introduced this version of it.
| Field | Type | Description |
|---|---|---|
| dataset_id * | enum: municap.projects | |
| source_id * | string | |
| source_url * | string (uri) | The SODA API request or PDF document the record was read from. |
| source_version * | string | The dataset and its rowsUpdatedAt time, or the PDF's title and SHA-256 prefix. |
| source_date * | string (date) | null | |
| published_at * | string (date-time) | When this version of the record was first published. Unchanged records keep their original time. |
| schema_version * | string | |
| validation_status * | enum: passed | passed_with_warnings | |
| record_id * | string |
DatasetPublication object
| Field | Type | Description |
|---|---|---|
| dataset_id * | string | |
| publication_id * | integer (int64) | |
| published_at * | string (date-time) | |
| freshness * | enum: fresh | stale |
Notice object
| Field | Type | Description |
|---|---|---|
| code * | enum: as_published | not_published | totals_derived | do_not_add_types | |
| message * | string |
Pagination object
| Field | Type | Description |
|---|---|---|
| limit * | integer | |
| has_more * | boolean | |
| next_cursor * | string | null |
Meta object
| Field | Type | Description |
|---|---|---|
| request_id | string | |
| datasets * | DatasetPublication [] | |
| notices * | Notice [] | |
| pagination | Pagination |
GovernmentRef object
| Field | Type | Description |
|---|---|---|
| geoid * | GEOID | |
| scheme * | enum: OLY-US-CENSUS-PLACE | OLY-US-CENSUS-COUNTY | |
| name * | string | |
| state * | string | |
| government_type * | enum: city | town | village | county |
Location object
| Field | Type | Description |
|---|---|---|
| description * | string | null | Address or place as published. |
| latitude * | number | null | |
| longitude * | number | null | |
| district * | string | null | Council district or ward as published. |
Project object
| Field | Type | Description |
|---|---|---|
| project_id * | string | This API's id for the project (stable while the source keeps the same key). |
| government * | GovernmentRef | |
| source_kind * | enum: socrata | pdf | |
| project_key * | string | The source's key fields as published, joined by " | " (e.g. a budget line, or department and title). |
| published_project_id * | string | null | The source's own project identifier. |
| name * | string | |
| description * | string | null | |
| department * | string | null | |
| category * | string | null | |
| status * | Status | null | |
| status_as_published * | string | null | |
| location * | Location | |
| start_date * | string (date) | null | |
| end_date * | string (date) | null | |
| fiscal_year_min * | integer | null | |
| fiscal_year_max * | integer | null | |
| amount_lines * | integer | Published amounts of the project. |
| provenance * | Provenance |
Amount object
| Field | Type | Description |
|---|---|---|
| amount_id * | string | |
| fiscal_year_from * | integer | null | |
| fiscal_year_to * | integer | null | |
| fiscal_year_label * | string | null | |
| fiscal_year_derived * | boolean | |
| amount_type * | AmountType | |
| amount_label * | string | The published column or printed heading. |
| funding_source * | string | null | |
| funding_source_code * | string | null | |
| line_item * | string | null | What the published row is (phase, account, subproject). |
| amount * | Money | |
| amount_printed * | string | The published text the amount was read from. |
| amount_derived * | boolean | True when scaled from a printed unit. |
| value_provenance * | object |
|
| provenance * | Provenance |
YearTotal object
Sum of published amounts of one type for one fiscal year (or range, or to date). Computed by this API.
| Field | Type | Description |
|---|---|---|
| fiscal_year_from * | integer | null | |
| fiscal_year_to * | integer | null | |
| amount_type * | AmountType | |
| amount * | Money | |
| lines * | integer | |
| derived * | enum: true |
ProjectsResponse object
ProjectDetail object
ProjectResponse object
| Field | Type | Description |
|---|---|---|
| data * | ProjectDetail | |
| meta * | Meta |
SourceCoverage object
| Field | Type | Description |
|---|---|---|
| source_id * | string | |
| government * | GovernmentRef | |
| kind * | enum: socrata | pdf | |
| title * | string | |
| publisher * | string | |
| status * | enum: published | not_loaded | |
| licence * | string | null | As the publisher states it. |
| terms_url * | string | null | |
| commercial_reuse * | enum: permitted | attribution | unstated | |
| attribution * | string | null | Credit line the publisher asks for. |
| dataset_url * | string | null | |
| route * | string | null | The documented API the data was found through. |
| data_version * | string | null | |
| documents * | array of object | PDF documents retained (url, sha256, fiscal year, rows ok / review / invalid). |
| projects * | integer | |
| amount_lines * | integer | |
| rows_read * | integer | |
| rows_skipped * | object | Reason -> values not published (e.g. blank_amount, not_a_number). |
| rows_held_for_review * | integer | |
| rows_invalid * | integer | |
| fiscal_year_min * | integer | null | |
| fiscal_year_max * | integer | null | |
| published_at * | string (date-time) | null |
CoverageResponse object
| Field | Type | Description |
|---|---|---|
| data * | object | |
| meta * | Meta |
StatusCount object
| Field | Type | Description |
|---|---|---|
| status * | string | null | |
| projects * | integer |
DepartmentCount object
| Field | Type | Description |
|---|---|---|
| department * | string | null | |
| projects * | integer |
GovernmentDetail object
| Field | Type | Description |
|---|---|---|
| government * | GovernmentRef | |
| sources * | SourceCoverage [] | |
| projects * | integer | |
| by_status * | StatusCount [] | |
| by_department * | DepartmentCount [] | The 25 departments with the most projects. |
| totals * | YearTotal [] | |
| entity_id * | string | null | |
| identifiers * | Identifier [] | |
| related * | RelatedLink [] |
GovernmentResponse object
| Field | Type | Description |
|---|---|---|
| data * | GovernmentDetail | |
| meta * | Meta |
Identifier object
One identifier of an entity, with how and where it was linked.
| Field | Type | Description |
|---|---|---|
| scheme * | string | Scheme code (org-id.guide prefix, or an Olympus OLY- scheme). |
| value * | string | Normalised value. |
| method * | enum: published | exact | derived |
|
| confidence * | number | 1 for published and exact links. |
| source * | IdentifierSource |
IdentifierSource object
Provenance of the link.
| Field | Type | Description |
|---|---|---|
| dataset_id * | string | Registry dataset that published the link. |
| source_id * | string | |
| source_url * | string | |
| source_version * | string | |
| source_date * | string (date) | null | |
| published_at * | string (date-time) |
RelatedLink object
The record a product serves for the same entity.
| Field | Type | Description |
|---|---|---|
| product * | string | Public product ID. |
| resource * | string | |
| path * | string | Public path of the record. |
| via * | RelatedVia |
RelatedVia object
The identifier the link goes through.
| Field | Type | Description |
|---|---|---|
| scheme * | string | |
| value * | string |
* required field