API reference · v1.0.0

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

GET/v1/municipal-capital-projects/projects

Published 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

NameInTypeDescription
governmentquerystring

One or more Census GEOIDs (7-digit place or 5-digit county), comma separated (at most 20).

Example: 3651000
statequerystring

Two-letter state code.

Example: TX
qquerystring

Words that must all appear in the project name (case-insensitive, at least 3 characters).

Example: fire station
departmentquerystring

Department as published (case-insensitive, exact).

Example: Public Works
statusqueryStatus

Normalised status.

fiscal_yearqueryinteger

Projects with an amount whose fiscal years include this year.

Example: 2027
limitqueryinteger
cursorquerystring

Responses

200

Matching projects.

ProjectsResponse
400

Invalid parameter (VALIDATION_ERROR; details.fields maps each parameter to the reason).

Error
401

Missing or invalid API key (UNAUTHORIZED), or a disabled, expired or revoked one (API_KEY_DISABLED, API_KEY_EXPIRED, API_KEY_REVOKED).

Error
403

Organization suspended (ORGANIZATION_SUSPENDED), no live subscription (NO_ACTIVE_SUBSCRIPTION), municipal-capital-projects not on the plan (PRODUCT_NOT_ENABLED) or a key scoped to another product (API_KEY_PRODUCT_SCOPE).

Error
429

Per-minute rate limit exceeded (RATE_LIMIT_EXCEEDED) or monthly quota exhausted (QUOTA_EXCEEDED).

Error
503

The dataset has no active publication yet (SERVICE_UNAVAILABLE, details.dataset_id).

Error
curl
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

GET/v1/municipal-capital-projects/projects/{project_id}

Authentication: API key (X-API-Key or Bearer)

Parameters

NameInTypeDescription
project_idrequiredpathstring

project_id as the API returns it (municap:<source_id>:<hash>).

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 (VALIDATION_ERROR; details.fields maps each parameter to the reason).

Error
401

Missing or invalid API key (UNAUTHORIZED), or a disabled, expired or revoked one (API_KEY_DISABLED, API_KEY_EXPIRED, API_KEY_REVOKED).

Error
403

Organization suspended (ORGANIZATION_SUSPENDED), no live subscription (NO_ACTIVE_SUBSCRIPTION), municipal-capital-projects not on the plan (PRODUCT_NOT_ENABLED) or a key scoped to another product (API_KEY_PRODUCT_SCOPE).

Error
404

No published project or government with this id (NOT_FOUND).

Error
429

Per-minute rate limit exceeded (RATE_LIMIT_EXCEEDED) or monthly quota exhausted (QUOTA_EXCEEDED).

Error
503

The dataset has no active publication yet (SERVICE_UNAVAILABLE, details.dataset_id).

Error
curl
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

GET/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

NameInTypeDescription
geoidrequiredpathstring

Census GEOID (7-digit place or 5-digit county).

Example: 3651000

Responses

200

The government.

GovernmentResponse
400

Invalid parameter (VALIDATION_ERROR; details.fields maps each parameter to the reason).

Error
401

Missing or invalid API key (UNAUTHORIZED), or a disabled, expired or revoked one (API_KEY_DISABLED, API_KEY_EXPIRED, API_KEY_REVOKED).

Error
403

Organization suspended (ORGANIZATION_SUSPENDED), no live subscription (NO_ACTIVE_SUBSCRIPTION), municipal-capital-projects not on the plan (PRODUCT_NOT_ENABLED) or a key scoped to another product (API_KEY_PRODUCT_SCOPE).

Error
404

No published project or government with this id (NOT_FOUND).

Error
429

Per-minute rate limit exceeded (RATE_LIMIT_EXCEEDED) or monthly quota exhausted (QUOTA_EXCEEDED).

Error
503

The dataset has no active publication yet (SERVICE_UNAVAILABLE, details.dataset_id).

Error
curl
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

GET/v1/municipal-capital-projects/coverage

Every 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 (UNAUTHORIZED), or a disabled, expired or revoked one (API_KEY_DISABLED, API_KEY_EXPIRED, API_KEY_REVOKED).

Error
403

Organization suspended (ORGANIZATION_SUSPENDED), no live subscription (NO_ACTIVE_SUBSCRIPTION), municipal-capital-projects not on the plan (PRODUCT_NOT_ENABLED) or a key scoped to another product (API_KEY_PRODUCT_SCOPE).

Error
429

Per-minute rate limit exceeded (RATE_LIMIT_EXCEEDED) or monthly quota exhausted (QUOTA_EXCEEDED).

Error
curl
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.

FieldTypeDescription
error *string

Human-readable message.

code *string

Stable machine-readable code.

productstring

Product that produced the error, when applicable.

detailsobject

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.

FieldTypeDescription
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

FieldTypeDescription
dataset_id *string
publication_id *integer (int64)
published_at *string (date-time)
freshness *enum: fresh | stale

Notice object

FieldTypeDescription
code *enum: as_published | not_published | totals_derived | do_not_add_types
message *string

Pagination object

FieldTypeDescription
limit *integer
has_more *boolean
next_cursor *string | null

Meta object

FieldTypeDescription
request_idstring
datasets *DatasetPublication []
notices *Notice []
paginationPagination

GovernmentRef object

FieldTypeDescription
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

FieldTypeDescription
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

FieldTypeDescription
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

FieldTypeDescription
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

kind: socrata: dataset, rows_updated_at, sha256, row_id, field, printed. kind: pdf: document (source_url, sha256), page, bbox, printed, method, spec, extractor. fiscal_year describes a derived year (rule, from).

provenance *Provenance

YearTotal object

Sum of published amounts of one type for one fiscal year (or range, or to date). Computed by this API.

FieldTypeDescription
fiscal_year_from *integer | null
fiscal_year_to *integer | null
amount_type *AmountType
amount *Money
lines *integer
derived *enum: true

ProjectsResponse object

FieldTypeDescription
data *Project []
meta *Meta

ProjectDetail object

FieldTypeDescription
project *Project
field_provenance *object

Field -> where it was read (column and row id, or PDF page, box and printed text).

amounts *Amount []
totals *YearTotal []
amounts_truncated *boolean

ProjectResponse object

FieldTypeDescription
data *ProjectDetail
meta *Meta

SourceCoverage object

FieldTypeDescription
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

FieldTypeDescription
data *object
meta *Meta

StatusCount object

FieldTypeDescription
status *string | null
projects *integer

DepartmentCount object

FieldTypeDescription
department *string | null
projects *integer

GovernmentDetail object

FieldTypeDescription
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

FieldTypeDescription
data *GovernmentDetail
meta *Meta

Identifier object

One identifier of an entity, with how and where it was linked.

FieldTypeDescription
scheme *string

Scheme code (org-id.guide prefix, or an Olympus OLY- scheme).

value *string

Normalised value.

method *enum: published | exact | derived

published: the source publishes this identifier for the record. exact: the same normalised value in another dataset. derived: computed from published values.

confidence *number

1 for published and exact links.

source *IdentifierSource

IdentifierSource object

Provenance of the link.

FieldTypeDescription
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)

RelatedVia object

The identifier the link goes through.

FieldTypeDescription
scheme *string
value *string

* required field