Getting started

MuniSpot REST API

Programmatic access to standardized financial statements, MuniScore and economic indicators for 20,000+ U.S. governments. Built from audited ACFRs and structured for institutional platforms, research tools and analytical workflows.

For developers

Build on MuniSpot

Self-serve API keys, a free tier for prototyping, four REST endpoints and an MCP server. Start with authentication.

Get started →
For enterprise

Evaluate and integrate

For data teams, buy-side credit and institutional research. Integration patterns, sandbox access, SLA, redistribution terms.

Enterprise overview →
Base URLhttps://www.munispot.com/api/v1

All requests need a valid API key, passed as a Bearer token in the Authorization header. Generate one in your account, or contact sales for enterprise access.

Intended use cases

Credit dashboardsShow MuniScore next to standardized financial trends for any government or portfolio of issuers.
Screening and filteringScreen 20,000+ governments by state, sector, score range and standardized metrics for issuer selection.
Research and analysisPull standardized ACFR line items and compute your own ratios, benchmarks or composites.
Alerts and monitoringTrack MuniScore changes and financial trends across a defined universe or a fixed income portfolio.

Endpoints

Rate limits

PlanPriceRequests per monthEndpointsSupport
StarterFree100All 4 endpointsCommunity forum
Professional$999/month10,000All 4 endpointsEmail support
EnterpriseCustomUnlimitedAll endpoints, plus webhooksDedicated account support

For full plan details and annual billing, see Pricing.

Security

Authentication

Every request must include your API key as a Bearer token in the Authorization header.

Request header
Authorization: Bearer YOUR_API_KEY

Example: cURL

Shell
curl "https://www.munispot.com/api/v1/entities?per_page=5" \
  -H "Authorization: Bearer ms_live_abc123..."

Example: Python

Python
import requests

response = requests.get(
    "https://www.munispot.com/api/v1/entities",
    headers={"Authorization": f"Bearer {API_KEY}"},
    params={"state": "CA", "per_page": 10}
)
data = response.json()

Keep your key secret. Never expose API keys in client-side code, public repositories or browser requests. Call the API from a server, and keep keys in environment variables.

Reference

Errors and rate limits

Every error response uses the same JSON envelope, so you can handle them in one place.

Response format

Success
{
  "status": "success",
  "data": { ... },
  "meta": { ... }
}
Error
{
  "status": "error",
  "code": 401,
  "message": "Invalid API key"
}

HTTP status codes

CodeMeaningCommon cause
200SuccessRequest processed normally
401UnauthorizedMissing, invalid or deactivated API key
404Not foundEIN doesn't exist, or no data for that fiscal year
429Rate limitedMonthly request limit exceeded
500Server errorInternal error, contact support

Rate limit behavior

Each API key has a monthly request quota (default 100) that resets on the 1st of each month, UTC. Past the limit, requests return 429 until the next reset.

Tip. Cache responses for governments that don't change often. Scores are recalculated monthly; financial data updates once per fiscal year.

API reference
GET/api/v1/entities

Search and filter all municipalities. Returns paginated results with basic profile data. Use the municipality or scores endpoint for MuniScore data.

Query parameters

NameTypeDescription
qstringSearch by name (case-insensitive partial match)
statestringTwo-letter state code, e.g. CA, NY
sectorstringGovernment type: city county school_district special_district state utility community_college public_university
fiscal_yearintegerFiscal year.Default 2024
pageintegerPage number.Default 1
per_pageintegerResults per page (1 to 50).Default 25
GET/api/v1/entitiesTry it
No key? The free tier gives you 100 requests a month.Get an API key ↗
Query parameters
string
Two-letter state code.
string
city, county, school_district, special_district, state, utility, community_college, public_university
string
integer
integer
1-50
integer
Response
// Send a request to see a live response.
curl "https://www.munispot.com/api/v1/entities?state=WI&sector=city&fiscal_year=2024&per_page=2&page=1" \
  -H "Authorization: Bearer YOUR_API_KEY"
API reference
GET/api/v1/entities/{ein}

Full profile for one government: municipality information, every score component, individual metric values and a generated fiscal-year financial summary.

Path parameters

NameTypeDescription
einrequiredstringEmployer Identification Number

Query parameters

NameTypeDescription
fiscal_yearintegerFiscal year.Default 2023

Response fields

NameTypeDescription
overall_scorenumberComposite MuniScore (1 to 99)
scorecardstringv5 (government MuniScore) or ut_v1 (utility MuniScore). Scores compare only within one scorecard.
factor_detailsobjectut_v1 only: factors, metrics (days_cash, dsc, debt_to_revenue, asset_condition_yrs, om_musd), flags and column scope. The four v5 factor fields below are null for ut_v1.
confidence_badgestringHIGH, MODERATE, LOW or INSUFFICIENT
economy_scorenumberEconomy factor (25% weight)
budgetary_scorenumberBudgetary factor (10% weight)
reserves_scorenumberReserves factor (40% weight)
debt_scorenumberDebt factor (25% weight)
financial_summarystringGenerated fiscal-year narrative
GET/api/v1/entities/{ein}Try it
No key? The free tier gives you 100 requests a month.Get an API key ↗
Path parameters
string
Employer Identification Number
Query parameters
integer
Response
// Send a request to see a live response.
curl "https://www.munispot.com/api/v1/entities/396005924?fiscal_year=2023" \
  -H "Authorization: Bearer YOUR_API_KEY"
API reference
GET/api/v1/entities/{ein}/scores

Scores only. Returns the composite score, four component scores with weights, and every metric value in a structured format. The response carries scorecard: for v5 the components are economy, budgetary, reserves and debt; for a utility (ut_v1) they are economy, system, liquidity and debt, the metrics are days_cash, dsc, debt_to_revenue (x), asset_condition_yrs and om_musd, and flags and factor_details record how each metric was read.

Path parameters

NameTypeDescription
einrequiredstringEmployer Identification Number

Query parameters

NameTypeDescription
fiscal_yearintegerFiscal year.Default 2023

Score interpretation

ScoreTier
90 to 99Very strong
75 to 89Strong
50 to 74Moderate
25 to 49Low
1 to 24Very low

Confidence badges

BadgeMetrics available
HIGH7 to 9
MODERATE5 to 6
LOW3 to 4
INSUFFICIENT0 to 2
GET/api/v1/entities/{ein}/scoresTry it
No key? The free tier gives you 100 requests a month.Get an API key ↗
Path parameters
string
Employer Identification Number
Query parameters
integer
Response
// Send a request to see a live response.
curl "https://www.munispot.com/api/v1/entities/396005924/scores?fiscal_year=2023" \
  -H "Authorization: Bearer YOUR_API_KEY"
API reference
GET/api/v1/entities/{ein}/financials

Standardized financial line items from the government's ACFR (Annual Comprehensive Financial Report): balance sheet, income statement, reconciliation and long-term obligations.

Path parameters

NameTypeDescription
einrequiredstringEmployer Identification Number

Query parameters

NameTypeDescription
fiscal_yearrequiredintegerFiscal year.
statement_typestringFilter: balance_sheet income_statement reconciliation_statement long_term_obligations. Utilities and community colleges: bta_net_position bta_activities bta_cash_flows bta_coverage (see Business-type statements).
fund_typestringFilter by fund type, e.g. General Fund
column_indexintegerOne fund column: 1 = General Fund, -1 = Total Governmental Funds. Omit for every fund column (up to 1,000 line items).

Line item fields

NameTypeDescription
valuenumberDollar amount, already adjusted for scale
class_1stringPrimary classification (e.g. CASH AND CASH EQUIVALENTS)
class_2stringSecondary classification (ASSETS, LIABILITIES and so on)
column_indexinteger1 = General Fund, -1 = Total Governmental Funds
observed_headerstringColumn title from the source statement
relative_indexintegerRow order within the statement
GET/api/v1/entities/{ein}/financialsTry it
No key? The free tier gives you 100 requests a month.Get an API key ↗
Free-tier keys return 403 on this endpoint. Use a Professional or Enterprise key.
Path parameters
string
Employer Identification Number
Query parameters
integer
string
balance_sheet | income_statement | reconciliation_statement | long_term_obligations (governments); bta_net_position | bta_activities | bta_cash_flows | bta_coverage (utilities, community colleges)
string
integer
Response
// Send a request to see a live response.
curl "https://www.munispot.com/api/v1/entities/396005924/financials?fiscal_year=2023&statement_type=balance_sheet" \
  -H "Authorization: Bearer YOUR_API_KEY"

Data coverage

20,000+Governments
2016 to 2025Fiscal years
4Statement types
50States

Sectors

ValueDescription
cityCities, towns, villages, boroughs
countyCounty governments
school_districtK-12 school districts
special_districtOther special-purpose districts (fire, library, transit and so on)
stateState governments
utilityStandalone water, sewer, electric and gas utilities (business-type statements; utility MuniScore, scorecard ut_v1)
community_collegePublic community and technical colleges (business-type statements; college and university MuniScore, scorecard he_v1)
public_universityPublic four-year universities (business-type statements; college and university MuniScore, scorecard he_v1)
API reference

Data dictionary: classifications

Every line item from Get financials carries a two-level classification. Source ACFRs label the same concept hundreds of ways; we map each line to a fixed taxonomy so property tax revenue, say, compares directly across all 20,000+ governments and every fiscal year.

The two fields

Despite the names, class_2 is the broad category and class_1 is the specific line item within it. Read them as a pair, scoped to statement_type. A class_1 value only has meaning inside its class_2.

NameTypeDescription
class_2stringStatement category the line rolls up to. Valid values depend on statement_type (below).
class_1stringNormalized line-item label within that category, e.g. PROPERTY TAX REVENUES inside REVENUES.

Worked example

One property-tax row from a city income statement:

One line item
{
  "fiscal_year": 2023,
  "statement_type": "income_statement",
  "class_2": "REVENUES",
  "class_1": "PROPERTY TAX REVENUES",
  "column_index": 1,
  "value": 48217000
}

Categories by statement type

Valid class_2 values differ per statement. The most common are below. Rows whose class_2 begins with TOTAL or SUBTOTAL are pre-computed roll-ups, not detail lines.

ValueCaptures
balance_sheetASSETS, LIABILITIES, DEFERRED INFLOWS OF RESOURCES, DEFERRED OUTFLOW OF RESOURCES, plus the GASB 54 fund-balance classes NONSPENDABLE, RESTRICTED, COMMITTED, ASSIGNED, UNASSIGNED.
income_statementREVENUES, EXPENSES, OTHER FINANCING SOURCES AND USES, NET INCOME, FUND BALANCES BEGINNING, FUND BALANCES ENDING.
long_term_obligationsThe debt roll-forward columns: BEGINNING_BALANCE, ADDITION, REDUCTION, OTHER_CHANGE (a printed transfers, adjustments or restatement column; non-zero amounts only), ENDING_BALANCE, DUE_IN_ONE_YEAR. Here the instrument type is in class_1 (below).
reconciliation_statementReconciling items between fund-level and government-wide presentation. Sparse coverage; mostly long-term-obligation adjustments.

Revenue line items class_2 = REVENUES

ValueCaptures
PROPERTY TAX REVENUESAd valorem taxes on real and personal property. Usually the largest own-source revenue for cities and counties.
INTERGOVERNMENTAL REVENUEGrants, shared taxes and aid from state and federal governments.
LOCAL REVENUELocally generated revenue, common on school-district statements.
FEDERAL REVENUEDirect federal grants and aid (distinct from federal money passed through the state).
CHARGES FOR SERVICESFees for government services such as utilities, recreation and inspections.
USE OF MONEY AND PROPERTYRents, leases and earnings on government-held property and balances.
LICENSES AND PERMITSBusiness licenses, building permits and regulatory fees.
FINES AND FORFEITURESCourt fines, penalties and forfeited collateral.
INTEREST AND DIVIDEND REVENUEInvestment earnings. Some statements report this as INTEREST INCOME.
TAX REVENUESTax revenue not classified above (for example sales or use taxes).
FRANCHISE TAX REVENUESFranchise fees from utility, cable and similar operators.
INCOME TAX REVENUESLocal income or earnings taxes, where levied.
SPECIAL ASSESSMENTSLevies on benefited properties to fund specific improvements.
PAYMENTS IN LIEU OF TAXESPILOT payments from tax-exempt organizations in place of property tax.
CONTRIBUTIONS AND DONATIONSGifts and contributed capital.
MISCELLANEOUSRevenue in the source statement not mapped to a specific category.

Expense line items class_2 = EXPENSES

ValueCaptures
INSTRUCTIONAL EXPENSESDirect classroom and teaching costs. School districts.
SUPPORT SERVICESNon-instructional school support: administration, transportation, operations.
GENERAL AND ADMINISTRATIVE EXPENSESGeneral government and overhead costs.
PUBLIC SAFETYPolice, fire, EMS and corrections.
CAPITAL OUTLAYSpending on capital assets such as equipment and construction.
DEBT SERVICE, ANNUAL PRINCIPAL PAYMENTPrincipal repaid on long-term debt during the year.
DEBT SERVICE, INTEREST EXPENDITUREInterest paid on outstanding debt.
CULTURE AND RECREATIONParks, libraries, museums and recreation programs.
TRANSPORTATION EXPENSESTransit and transportation programs. Roads may also appear under HIGHWAYS AND STREETS.
HIGHWAYS AND STREETSRoad and street construction and maintenance.
HEALTH SERVICESPublic health programs. Some governments use ENVIRONMENTAL AND HEALTH SERVICES.
HOUSING AND COMMUNITY SERVICESHousing and community-development programs.
ECONOMIC DEVELOPMENTEconomic-development and redevelopment activity.
MAINTENANCE AND REPAIRSUpkeep of facilities and infrastructure.
INTERGOVERNMENTAL EXPENSESPayments made to other governments.
JUDICIALCourts and the justice system.
LEGISLATIVEGoverning-body and legislative costs.
MISCELLANEOUSExpense in the source statement not mapped to a specific function.

Balance-sheet line items

Assets class_2 = ASSETS

ValueCaptures
CASH AND CASH EQUIVALENTSCash, deposits and highly liquid short-term holdings.
INVESTMENTS, FAIR VALUEInvestment portfolio reported at fair value.
RECEIVABLE, ACCOUNTSAmounts owed from non-tax sources.
TAXES RECEIVABLELevied taxes not yet collected.
DUE FROM OTHER FUNDSInterfund amounts owed to this fund.
DUE FROM OTHER GOVERNMENTSGrants and shared revenue receivable from other governments.
INVENTORIESSupplies and materials held for use.
PREPAID EXPENSES AND OTHER ASSETSPrepaid items and other current assets.
ADVANCES TO OTHER FUNDSLong-term interfund advances receivable.
OTHER ASSETSAssets not mapped to a specific category.

Liabilities class_2 = LIABILITIES

ValueCaptures
ACCOUNTS PAYABLEAmounts owed to vendors and suppliers.
ACCRUED PAYABLEAccrued liabilities not yet invoiced.
ACCRUED SALARIESWages and benefits earned but unpaid at period end.
UNEARNED REVENUECash received before the revenue is earned.
UNAVAILABLE REVENUEEarned revenue deferred because it is not yet available under modified accrual.
DUE TO OTHER FUNDSInterfund amounts this fund owes.
DUE TO OTHER GOVERNMENTSAmounts payable to other governments.
NOTES PAYABLEShort-term notes and similar obligations recorded at fund level.
OTHER LIABILITIESLiabilities not mapped to a specific category.

Fund balance is reported through class_2, not class_1. The five GASB 54 classes (NONSPENDABLE, RESTRICTED, COMMITTED, ASSIGNED, UNASSIGNED) describe spending constraints from least to most flexible.

Business-type statements utilities and community colleges

Standalone utilities and community colleges publish proprietary (business-type) statements instead of governmental fund statements. For them the endpoint returns these statement types only; governments never return them. Values are dollars as printed. class_1 is the standardized line class, or null for detail and subtotal lines; class_2 is null except on bta_coverage. column_index 1 to n are the columns in page order (one per system, e.g. Electric, Gas, Water), and -1 is a printed total column when the audit prints one.

NameTypeDescription
bta_net_positionstatementStatement of Net Position: CASH AND EQUIVALENTS, INVESTMENTS, CAPITAL ASSETS NET, LONG-TERM DEBT CURRENT / NONCURRENT, NET PENSION LIABILITY, DEFERRED OUTFLOWS / INFLOWS, TOTAL NET POSITION and others. Accumulated depreciation is negative.
bta_activitiesstatementStatement of Revenues, Expenses and Changes in Net Position: TOTAL OPERATING REVENUES, TOTAL OPERATING EXPENSES (both positive), OPERATING INCOME, nonoperating lines (expenses negative, e.g. INTEREST EXPENSE), STATE APPROPRIATIONS, CAPITAL CONTRIBUTIONS, CHANGE IN NET POSITION, NET POSITION ENDING.
bta_cash_flowsstatementStatement of Cash Flows: NET CASH FROM OPERATING / NONCAPITAL FINANCING / CAPITAL AND RELATED FINANCING / INVESTING ACTIVITIES, PRINCIPAL and INTEREST PAID ON CAPITAL DEBT (negative), NET CHANGE IN CASH, CASH ENDING.
bta_coveragestatementUtilities only, at most one row: the printed debt service coverage ratio (value, x). class_2 is the basis (net_revenues, printed, covenant); observed_header a flag (covenant_adds_funds, components_disagree); text the printed figure and its source table.

Several lines can share a class_1 (three INVESTMENTS lines, or a line and its total). For one figure per class, take the last line of the class whose label contains “total”, else the sum of the class's lines; never sum lines whose class_1 is null. When a utility prints several systems and no total column, there is no printed combined figure: any sum across columns is computed.

Debt instrument types statement_type = long_term_obligations

For long-term obligations the instrument type is in class_1 and the roll-forward column is in class_2. For year-end debt, filter class_2 = ENDING_BALANCE.

ValueCaptures
BONDSGeneral-obligation and revenue bonds. Usually the largest obligation.
NOTESNotes payable carried as long-term debt.
LOANDirect loans and state revolving-fund borrowings.
LEASESLease liabilities (GASB 87).
CERTIFICATESCertificates of participation (COPs).
FINANCED_PURCHASEFinanced purchases: installment purchase and lease-purchase agreements, energy performance contracts. Counted as debt.
PREMIUMUnamortized bond premium. DISCOUNT appears as the offsetting item.
PENSIONNet pension liability.
OPEBOther post-employment benefit liability (retiree healthcare).
COMPENSATED_ABSENCESAccrued vacation and sick leave owed to employees.
CLAIMS_JUDGMENTSEstimated liabilities for claims, judgments and litigation.
UNCATEGORIZEDObligation in the source statement not mapped to a specific instrument type.

Working with classifications

Three rules that prevent double-counting and mismatches:
  1. Match case-insensitively. The canonical form is uppercase, but a small share of legacy rows use mixed case (for example Bonds). Upper-case both sides before comparing.
  2. Exclude roll-up markers when summing detail. TOTAL, SUBTOTAL and any class_2 beginning with TOTAL are pre-computed aggregates. Summing them with detail rows double-counts.
  3. Always pair class_1 with class_2 and statement_type. One class_1 label can appear under more than one category. Never match on class_1 alone.

Need the full enumerated list to map against your current provider? The sandbox starter kit ships a machine-readable classification reference and an audit notebook that reports line-item match rate against ACFR source.

For enterprise

MuniSpot for institutions

Standardized ACFR financials, scoring and economic indicators through the same REST and MCP interfaces single developers use, with the contract terms, refresh commitments and integration support institutional teams need.

Already evaluating? Skip to Sandbox and evaluation for a structured side-by-side data-quality test against your current provider.

Who this is for

Buy-side credit and researchPortfolio surveillance, pre-trade due diligence, issuer screening and dispersion analysis across GO, school district and revenue-bond universes.
Asset managers and insurersEmbed standardized financials and MuniScore in internal credit dashboards, watchlists and monitoring workflows.
Municipal advisors and banksComparable-issuer screening, sector reports and prospective-client research without parsing ACFRs by hand.
Data and analytics teamsReplace fragile PDF-scraping pipelines with a stable, versioned schema covering 20,000+ governments and up to ten fiscal years each.

What enterprise customers get

  • Unlimited requestsNo monthly cap and no per-EIN daily limit. Predictable for batch workloads.
  • All 4 REST endpoints and MCPIncluding /financials (ACFR line items, not gated).
  • Multi-seat key managementUp to 10 keys per account, per-seat usage attribution, rotation without downtime.
  • Bulk extracts and scheduled snapshotsOn request: full-universe Parquet or CSV drops to S3 or GCS.
  • Webhooks (roadmap)Notifications on MuniScore changes, new fiscal-year availability or watchlist events.
  • Redistribution rightsNegotiated terms for embedding MuniSpot data in client-facing dashboards or research products.
  • SLA and dedicated supportUptime commitment, Slack channel, named technical contact.

Next steps

For enterprise

Integration patterns

Four patterns we see in institutional deployments. Pick the one closest to your stack, or combine them. All four use the same REST and MCP interfaces documented here, on the same api/v1 base.

AWarehouse sync

Scheduled ELT into Snowflake, BigQuery or Postgres. The most common pattern for buy-side credit teams. A nightly job pulls /entities for the universe, then iterates per issuer for /scores and /financials, landing rows in your own tables.

Python: daily incremental sync
import requests, time
from datetime import date

HEADERS = {"Authorization": f"Bearer {API_KEY}"}
BASE = "https://www.munispot.com/api/v1"

def sync_universe(state, fiscal_year):
    page, rows = 1, []
    while True:
        r = requests.get(f"{BASE}/entities", headers=HEADERS,
                         params={"state": state, "per_page": 50, "page": page,
                                 "fiscal_year": fiscal_year})
        body = r.json()
        rows.extend(body["data"])
        if len(rows) >= body["meta"]["total"]: break
        page += 1
    return rows

def sync_scores(ein, fiscal_year):
    r = requests.get(f"{BASE}/entities/{ein}/scores", headers=HEADERS,
                     params={"fiscal_year": fiscal_year})
    return r.json()["data"] if r.status_code == 200 else None

# Run nightly; write to warehouse via your loader of choice

BOn-demand lookup from internal apps

An internal credit dashboard or research portal calls MuniSpot per issuer at view time. Best for low-volume, interactive use where freshness matters more than batch efficiency. Cache aggressively: scores recompute monthly, line items annually.

Caching guideline. 24-hour cache on /scores, 7-day cache on /financials, no cache on user-driven searches.

CMCP server for analyst workflows

Point Claude Desktop, Cursor or any MCP client at https://www.munispot.com/api/mcp with your enterprise key. Analysts ask questions in plain language and the agent calls MuniSpot tools without anyone writing HTTP code. Common on credit research desks doing quick comparisons.

See the full MCP setup guide for client-specific configuration.

DBulk extract (on request)

For backtests, model training or large universe scans where REST round-trips are inefficient. We deliver point-in-time Parquet or CSV drops of the full universe, or a custom slice, to your S3 or GCS bucket on your cadence. Enterprise tier only.

Reliability and retry guidance

  • GETs are idempotent and safe to retry on network errors.
  • Back off exponentially on 429 (rate limit) and 5xx.
  • Enterprise keys have no monthly cap; per-second burst limits still apply.
  • The schema is versioned by the /v1 path. Breaking changes ship as /v2 with a six-month overlap.
For enterprise

Data refresh and coverage

When each data type updates, where it comes from, and the coverage to expect across the universe.

Refresh cadence

Data typeSourceRefreshLag
ACFR financialsAudited ACFRs, issuer-publishedDaily ingest of newly filed ACFRsAbout 30 to 60 days from filing
MuniScoreComputed from ACFR and economy dataMonthly recompute1st of each month
Economy indicatorsCensus ACS, BLS, BEAAnnual (ACS), monthly (BLS unemployment)Federal release schedule
Home Price IndexFHFA HPIQuarterlyAbout 45 days after quarter end
Building permitsCensus BPSAnnualAbout 6 months
Federal Audit ClearinghouseFAC datasetQuarterlyAbout 90 days
School enrollment and financeNCES CCDAnnualAbout 12 months

Coverage

20,000+Approved governments
2016 to 2025Fiscal years
50States
4Statement types

Coverage by sector

MuniSpot covers four core sectors. Special districts (water, fire, transit and so on) are in the database but excluded from the public catalog by default; available by enterprise contract.

  • Cities and municipalities, including towns, villages and boroughs
  • Counties
  • K-12 school districts
  • State governments

Freshness signal

Every municipality response includes a fiscal year and a confidence badge based on how many of the 9 underlying metrics were available for that filing. Use the badge to gate downstream decisions when freshness or completeness matters.

For enterprise

Security and compliance

What you need for procurement and legal review. For full attestation packets and DPA negotiation, contact sales.

API security

  • All traffic over TLS 1.2 or later. Plain HTTP requests are refused.
  • API keys are stored hashed; only a prefix and fingerprint are visible after creation.
  • Key rotation is self-serve from your account, without integration downtime.
  • Per-key audit log of creation, rotation, revocation and usage events.
  • Each response carries a key fingerprint, so a key shared in error can be traced internally.

Data source and provenance

MuniSpot is built only from public-record sources: issuer-published Annual Comprehensive Financial Reports (ACFRs), federal datasets (Census, BLS, BEA, FHFA, NCES) and the Federal Audit Clearinghouse. We do not use MSRB EMMA-restricted material, broker-dealer feeds or any non-public channel. Every as-reported line item is kept alongside our normalized version so you can reconcile to source.

Redistribution and licensing

Default API terms permit internal use only. Redistribution, meaning MuniSpot data in client-facing dashboards, research products or publications, needs an enterprise contract with explicit redistribution rights. Three patterns we support:

  • Internal onlyThe default. Use in your own apps, dashboards, models and research.
  • Attributed embedShow data in client-facing products with required attribution.
  • White labelEmbed without attribution under negotiated terms.

SLA and support

Enterprise contracts include a written SLA. Default targets:

  • 99.5% uptimeOn the REST API and MCP server.
  • P95 latency under 500 msOn municipality and score endpoints.
  • Email and Slack supportResponse times by severity.
  • Named technical contactFor integration support and incident handling.

Procurement documents. If your security or legal team needs a vendor questionnaire, DPA or attestation packet, request it from contact sales.

For enterprise

Sandbox and evaluation

A structured way to test MuniSpot against your current municipal data provider. We provision a time-bounded enterprise key, hand you a starter kit, and walk through a side-by-side data-quality comparison.

Status. During early access the sandbox is provisioned by hand. Request access from Contact sales and we reply within one business day.

What's in the starter kit

  • Time-bounded enterprise API keyTwo-week key with unlimited requests and no per-EIN daily cap, scoped to your evaluation universe.
  • Postman or Insomnia collectionPre-wired requests for every endpoint, with sample EINs across cities, counties, school districts and states.
  • Two Jupyter notebooks, Colab-readyA quickstart (key to dataframes in minutes) and a data-quality audit comparing coverage, freshness, line-item match rate and score correlation with your current provider.
  • MCP server configDrop-in JSON for Claude Desktop, Cursor or Gemini CLI to query MuniSpot in plain language during evaluation.
  • Sample SQLMaterialized-view definitions for landing MuniSpot data in Snowflake or BigQuery.

Quickstart notebooks

Two runnable notebooks. Open them in Google Colab with no local setup, or download and run anywhere. Your API key is entered at runtime with getpass, so it is never written into the file.

To run in Colab: open colab.research.google.com, choose File, Upload notebook, and select the downloaded file.

Recommended evaluation steps

  1. Pick 25 to 50 issuers you know well: a mix of large GO issuers, mid-size cities, school districts and at least one distressed name.
  2. Run the audit notebook against both providers. It reports coverage, freshness (latest fiscal year available), line-item match rate against ACFR source, and score correlation if your current provider has scores.
  3. Spot-check 3 to 5 issuers by opening the source ACFR and comparing line items in both providers to the published statement.
  4. Try the MCP server in Claude Desktop with one of your credit analysts. Ask the questions you'd normally ask an associate.
  5. Review the schema against your warehouse model to find joins, naming gaps and missing fields.

Try it live now

Every endpoint above has a Try it panel that calls the production API with your key. While we provision your sandbox kit, you can check the shape of every response in your browser:

For enterprise

Contact sales

For enterprise pricing, sandbox provisioning, contract terms, redistribution rights or technical onboarding.

What to include in your message

  • Your firm and roleSo we route you to the right technical contact.
  • Use caseInternal credit workflow, client dashboard, research product, model input and so on.
  • VolumeRough number of issuers in scope and expected request cadence.
  • Integration targetWarehouse (Snowflake, BigQuery and so on), BI tool or app stack.
  • Redistribution needsInternal only, attributed embed or white label.
  • TimelineWhen you'd like to be in production.

Already have a key? Start now: the Try it panels on every endpoint call the real API with your key. Get in touch when you're ready for enterprise terms or a sandbox kit.