This is a MuniPro demonstration of a redesigned Texas Bond Review Board website. It is not the official BRB site: nothing filed here reaches BRB, and the email addresses shown are BRB's own.

The official site is brb.texas.gov.

Data Center · Open data

Open data API

Use the same published rows as our downloads in your own tools. No account or API key is needed.

Datasets and endpoints

The base address is https://txbrb.muniopen.com/api/v1/. It lists every dataset, its row count, as-of date and download links. Read a dataset's metadata for its fields, definitions and the meaning of each blank.

Version 1 datasets
DatasetMetadataRows endpointYear parameter
Debt outstanding by issuance local by yearlocal-issuesJSON rowsfy
Debt outstanding by issuance state by yearstate-issuesJSON rowsfy
Local government borrowerslocal-issuersJSON rowsfy
Bond market participantsparticipantsJSON rowsfy
Local government cost of issuancecost-of-issuanceJSON rowsfy
Private activity bond requestspab-requestsJSON rowsyear
Private activity bond totalspab-totalsJSON rowsyear
Local issuance fee by yearlocal-feesJSON rowsfy
State issuance fee by yearstate-feesJSON rowsfy
County debt rankingexplore-rankingJSON rowsfy
Debt by issuer typeexplore-typesJSON rowsfy
Debt by issuer type and pledgeexplore-pledge-typesJSON rowsfy
Debt by pledgeexplore-pledgeJSON rowsfy
Largest local issuersexplore-issuersJSON rowsfy
Largest state issuersexplore-state-issuersJSON rowsfy
State debt by programexplore-state-programsJSON rowsfy
State debt by fiscal yearexplore-state-yearsJSON rowsfy
State issuers over timeexplore-state-issuers-historyJSON rowsfy
State programs over timeexplore-state-programs-historyJSON rowsfy
County issuersexplore-county-issuersJSON rowsfy
Counties' other listed issuersexplore-county-alsoJSON rowsfy
County debt by issuer typeexplore-county-typesJSON rowsfy
County debt over timeexplore-county-trendJSON rowsfy
Changes in BRB issue source dataissue-revisionsJSON rowsNo year filter
Cost of issuance benchmarkscost-benchmarksJSON rowsNo year filter
Fee totals by rolerole-totalsJSON rowsfy
Published firm spelling mergesfirm-aliasesJSON rowsNo year filter
Issues worked on by firmfirm-dealsJSON rowsfy
Issuer debt historyissuer-historyJSON rowsfy
Reported tax rate notesexplore-rate-notesJSON rowsfy
State issuersstate-issuersJSON rowsNo year filter
Local debt by issuer typelocal-by-typeJSON rowsNo year filter
Published market issues and maturitiesemma-maturitiesJSON rowsNo year filter

Every response has public caching for 600 seconds, an ETag and Access-Control-Allow-Origin: *. Send the ETag in If-None-Match to receive HTTP 304 when unchanged. The API accepts GET only; other methods return HTTP 405. Browser access is allowed from any origin.

While a dataset is being rebuilt, its rows come from the last complete build, with that build's as_of, and are cached for 60 seconds. If no complete build exists, rows answer HTTP 503 with a Retry-After header.

Coming with BRB's database export

Rows and downloads are unavailable for these datasets. Their metadata lists the planned fields.

  • Proposed bonds and election results — Metadata
  • Final reports and debt service — Metadata

Paging and filters

A rows response contains dataset, version, as_of, total, start, limit, next and rows. start is a zero-based offset. The default limit is 100; the maximum is 1000. Values above 1000 use 1000.

Follow next until it is null. It retains your year and issuer filters. Rows use a stable order for the same data version. A release can replace rows while you page; check the release calendar and restart your walk after a release if you need one complete snapshot.

Use ?fy=2025 for one fiscal year, or ?year=2026 for a program-year dataset. Texas fiscal years run from September 1 through August 31 and are named for the year they end. Metadata declares the supported year parameter. A dataset with an issuer_field also accepts issuer, the published stable issuer id, rather than an issuer name. Other filters are unsupported.

Unknown or repeated parameters, non-integer page or year values, negative offsets, empty issuer ids and limits below 1 return HTTP 400 with a JSON error. Unknown datasets return HTTP 404. The grids' ?format=json responses serve the user interface and have a separate contract.

Field names are the stable API keys in the dictionary. Money is a decimal string, such as "1250000.00", with no thousands separators; parse it with a decimal type to preserve cents. Dates use YYYY-MM-DD. Missing values are JSON null, never zero; each field's dictionary explains what a blank means.

Copy-paste examples

curl

Get the first page of local issues for fiscal year 2025:

curl --fail 'https://txbrb.muniopen.com/api/v1/datasets/local-issues/rows/?fy=2025&start=0&limit=1000'

Python

This uses only Python's standard library and follows every page. Use Decimal when reading money strings.

import json
from decimal import Decimal
from urllib.request import urlopen
from urllib.parse import urljoin

base = "https://txbrb.muniopen.com/api/v1/"
url = base + "datasets/local-issues/rows/?fy=2025&limit=1000"
rows = []
while url:
    with urlopen(url) as response:
        page = json.load(response)
    rows.extend(page["rows"])
    url = urljoin(base, page["next"]) if page["next"] else None
principal = sum((Decimal(row["principal"]) for row in rows
                 if row["principal"] is not None), Decimal("0"))
print(len(rows), principal)

Excel Power Query

In Excel, choose Data → Get Data → From Other Sources → Blank Query, open Advanced Editor and paste this query. It follows every page and leaves money as exact text; choose your decimal conversion deliberately.

let
    Base = "https://txbrb.muniopen.com/api/v1/",
    GetPage = (url as text) as record => Json.Document(Web.Contents(url)),
    First = Base & "datasets/local-issues/rows/?fy=2025&limit=1000",
    Pages = List.Generate(
        () => GetPage(First),
        each _ <> null,
        each if [next] = null then null
             else GetPage(Uri.Combine(Base, [next])),
        each [rows]
    ),
    Rows = List.Combine(Pages),
    Data = Table.FromRecords(Rows)
in
    Data

Compatibility policy

Inside v1, fields are only added, never renamed or removed. A breaking change becomes v2, and v1 keeps running for at least 12 months after v2 is released. Every field addition is listed below with its date. Applications should accept added fields and check a field's blank meaning before treating missing data.

Change log

10/6/2026 — Version 1 published

The initial version added the dataset index, metadata and paged rows. The field additions are listed individually:

Debt outstanding by issuance local by year — 38 fields added 10/6/2026
Debt outstanding by issuance state by year — 22 fields added 10/6/2026
Local government borrowers — 15 fields added 10/6/2026
Bond market participants — 15 fields added 10/6/2026
Local government cost of issuance — 12 fields added 10/6/2026
Private activity bond requests — 19 fields added 10/6/2026
Private activity bond totals — 8 fields added 10/6/2026
Local issuance fee by year — 23 fields added 10/6/2026
State issuance fee by year — 22 fields added 10/6/2026
County debt ranking — 13 fields added 10/6/2026
Debt by issuer type — 3 fields added 10/6/2026
Debt by issuer type and pledge — 7 fields added 10/6/2026
Debt by pledge — 6 fields added 10/6/2026
Largest local issuers — 8 fields added 10/6/2026
Largest state issuers — 8 fields added 10/6/2026
State debt by program — 6 fields added 10/6/2026
State debt by fiscal year — 6 fields added 10/6/2026
State issuers over time — 7 fields added 10/6/2026
State programs over time — 5 fields added 10/6/2026
County issuers — 10 fields added 10/6/2026
Counties' other listed issuers — 9 fields added 10/6/2026
County debt by issuer type — 6 fields added 10/6/2026
County debt over time — 6 fields added 10/6/2026
Changes in BRB issue source data — 7 fields added 10/6/2026
Cost of issuance benchmarks — 12 fields added 10/6/2026
Fee totals by role — 12 fields added 10/6/2026
Published firm spelling merges — 3 fields added 10/6/2026
Issues worked on by firm — 12 fields added 10/6/2026
Issuer debt history — 9 fields added 10/6/2026
Reported tax rate notes — 4 fields added 10/6/2026
State issuers — 6 fields added 10/6/2026
Local debt by issuer type — 5 fields added 10/6/2026
Published market issues and maturities — 26 fields added 10/6/2026
Proposed bonds and election results — 14 fields added 10/6/2026
Final reports and debt service — 19 fields added 10/6/2026