Transparency Laws API

Access comprehensive transparency law data for all 52 US jurisdictions (50 states + DC + federal).

Overview

The Transparency API provides:

  • 52 Jurisdictions: All US states, DC, and federal government
  • 990+ Rights of Access: Public records, open meetings, inspection rights
  • 365+ Exemptions: Privacy, security, law enforcement exemptions
  • Full Statute Texts: Complete legal text with citations
  • Structured Data: JSON responses with metadata and relationships

Jurisdictions

List All Jurisdictions

Get all 52 US jurisdictions:

1import { HoleFoundationClient } from '@hole-foundation/sdk';
2
3const client = new HoleFoundationClient({
4 environment: 'https://api.theholefoundation.org',
5 token: 'your-jwt-token'
6});
7
8const jurisdictions = await client.transparency.listJurisdictions({
9 limit: 52
10});
11
12jurisdictions.forEach(j => {
13 console.log(`${j.name} (${j.code})`);
14 console.log(` Type: ${j.type}`);
15 console.log(` Statutes: ${j.statute_count}`);
16});

Python Example

1from hole_foundation_api import HoleFoundationClient
2
3client = HoleFoundationClient(
4 environment="https://api.theholefoundation.org",
5 token="your-jwt-token"
6)
7
8jurisdictions = client.transparency.list_jurisdictions(limit=52)
9
10for j in jurisdictions:
11 print(f"{j.name} ({j.code})")
12 print(f" Type: {j.type}")
13 print(f" Statutes: {j.statute_count}")

Filter by Type

Get only states or only federal:

1// Get all states
2const states = await client.transparency.listJurisdictions({
3 type: 'state',
4 limit: 51 // 50 states + DC
5});
6
7// Get federal only
8const federal = await client.transparency.listJurisdictions({
9 type: 'federal',
10 limit: 1
11});

Rights of Access

Rights of access define what information citizens can request from government.

Search Rights

Find rights by keyword:

1const rights = await client.transparency.searchRights({
2 query: 'public records',
3 jurisdiction: 'california',
4 limit: 20
5});
6
7rights.forEach(right => {
8 console.log(right.title);
9 console.log(` Citation: ${right.citation}`);
10 console.log(` Summary: ${right.summary}`);
11});

Get Specific Right

Retrieve full details:

1const right = await client.transparency.getRight('right-123');
2
3console.log(right.title);
4console.log(right.full_text);
5console.log('Applies to:', right.applies_to);
6console.log('Deadlines:', right.deadlines);

Filter by Category

Rights are categorized by type:

1const meetingRights = await client.transparency.searchRights({
2 query: 'meetings',
3 category: 'open_meetings',
4 limit: 50
5});
6
7const recordsRights = await client.transparency.searchRights({
8 query: 'records',
9 category: 'public_records',
10 limit: 50
11});

Available Categories:

  • public_records - Document access rights
  • open_meetings - Meeting transparency
  • inspection_rights - Physical inspection
  • electronic_access - Digital records
  • fee_waivers - Cost reduction rights

Exemptions

Exemptions define what information government can withhold.

Search Exemptions

Find exemptions by topic:

1const exemptions = await client.transparency.searchExemptions({
2 query: 'privacy',
3 jurisdiction: 'federal',
4 limit: 20
5});
6
7exemptions.forEach(ex => {
8 console.log(ex.title);
9 console.log(` Citation: ${ex.citation}`);
10 console.log(` Category: ${ex.category}`);
11 console.log(` Summary: ${ex.summary}`);
12});

Filter by Category

1// Get all privacy exemptions
2const privacy = await client.transparency.searchExemptions({
3 category: 'personal_information',
4 limit: 100
5});
6
7// Get national security exemptions
8const security = await client.transparency.searchExemptions({
9 category: 'national_security',
10 limit: 50
11});

Available Categories:

  • personal_information - Privacy protections
  • national_security - Security exemptions
  • law_enforcement - Investigative records
  • trade_secrets - Commercial confidentiality
  • deliberative_process - Internal discussions
  • attorney_client - Legal privilege
  • medical_records - Health information

Get Specific Exemption

1const exemption = await client.transparency.getExemption('exemption-456');
2
3console.log(exemption.title);
4console.log(exemption.full_text);
5console.log('Category:', exemption.category);
6console.log('Jurisdiction:', exemption.jurisdiction);

Statutes

Full text of transparency statutes with citations.

Get Statute

Retrieve complete statute text:

1const statute = await client.transparency.getStatute('5-USC-552');
2
3console.log(statute.title);
4console.log(statute.citation);
5console.log(statute.full_text);
6console.log('Jurisdiction:', statute.jurisdiction);
7console.log('Effective date:', statute.effective_date);

Common Statutes

Federal:

  • 5-USC-552 - Freedom of Information Act (FOIA)
  • 5-USC-552b - Government in the Sunshine Act
  • 44-USC-3501 - Paperwork Reduction Act

State Examples:

  • California: CAL-GOV-6250 (California Public Records Act)
  • Texas: TEX-GOV-552 (Texas Public Information Act)
  • Florida: FLA-STAT-119 (Florida Public Records Law)

Cross-Jurisdiction Analysis

Compare Rights Across States

1async function compareRights(states: string[], query: string) {
2 const comparisons = await Promise.all(
3 states.map(async state => {
4 const rights = await client.transparency.searchRights({
5 query,
6 jurisdiction: state,
7 limit: 10
8 });
9 return { state, count: rights.length, rights };
10 })
11 );
12
13 return comparisons;
14}
15
16// Compare public records laws
17const comparison = await compareRights(
18 ['california', 'texas', 'florida'],
19 'public records deadlines'
20);
21
22comparison.forEach(c => {
23 console.log(`${c.state}: ${c.count} rights found`);
24});

Find Most Restrictive Exemptions

1async function findExemptions(query: string) {
2 const allJurisdictions = await client.transparency.listJurisdictions({
3 limit: 52
4 });
5
6 const exemptionsByJurisdiction = await Promise.all(
7 allJurisdictions.map(async j => {
8 const exemptions = await client.transparency.searchExemptions({
9 query,
10 jurisdiction: j.code,
11 limit: 100
12 });
13 return {
14 jurisdiction: j.name,
15 count: exemptions.length,
16 exemptions
17 };
18 })
19 );
20
21 // Sort by most exemptions
22 return exemptionsByJurisdiction
23 .sort((a, b) => b.count - a.count);
24}
25
26const analysis = await findExemptions('law enforcement');
27console.log('Most law enforcement exemptions:');
28analysis.slice(0, 10).forEach(a => {
29 console.log(` ${a.jurisdiction}: ${a.count} exemptions`);
30});

Response Formats

Jurisdiction Object

1interface Jurisdiction {
2 id: string;
3 name: string; // "California"
4 code: string; // "california"
5 type: string; // "state" or "federal"
6 abbreviation: string; // "CA"
7 statute_count: number;
8 metadata: {
9 population?: number;
10 capital?: string;
11 website?: string;
12 };
13}

Right of Access Object

1interface RightOfAccess {
2 id: string;
3 title: string;
4 citation: string;
5 summary: string;
6 full_text: string;
7 jurisdiction: string;
8 category: string;
9 applies_to: string[];
10 deadlines?: {
11 response_time: string;
12 appeal_time: string;
13 };
14 fees?: {
15 permitted: boolean;
16 limits?: string;
17 };
18 metadata: Record<string, any>;
19}

Exemption Object

1interface Exemption {
2 id: string;
3 title: string;
4 citation: string;
5 summary: string;
6 full_text: string;
7 jurisdiction: string;
8 category: string;
9 scope: 'mandatory' | 'discretionary';
10 case_law?: Array<{
11 citation: string;
12 summary: string;
13 year: number;
14 }>;
15 metadata: Record<string, any>;
16}

Common Patterns

Build a Jurisdiction Guide

1async function buildJurisdictionGuide(jurisdiction: string) {
2 // Get jurisdiction info
3 const jurisdictions = await client.transparency.listJurisdictions({
4 limit: 52
5 });
6 const info = jurisdictions.find(j => j.code === jurisdiction);
7
8 // Get all rights
9 const rights = await client.transparency.searchRights({
10 jurisdiction,
11 limit: 100
12 });
13
14 // Get all exemptions
15 const exemptions = await client.transparency.searchExemptions({
16 jurisdiction,
17 limit: 100
18 });
19
20 return {
21 jurisdiction: info,
22 rights,
23 exemptions,
24 summary: {
25 total_rights: rights.length,
26 total_exemptions: exemptions.length,
27 categories: {
28 rights: [...new Set(rights.map(r => r.category))],
29 exemptions: [...new Set(exemptions.map(e => e.category))]
30 }
31 }
32 };
33}
34
35const guide = await buildJurisdictionGuide('california');
36console.log(JSON.stringify(guide, null, 2));

Check Request Deadlines

1async function getDeadlines(jurisdiction: string) {
2 const rights = await client.transparency.searchRights({
3 query: 'deadlines',
4 jurisdiction,
5 limit: 50
6 });
7
8 const withDeadlines = rights.filter(r => r.deadlines);
9
10 return withDeadlines.map(r => ({
11 title: r.title,
12 citation: r.citation,
13 response_time: r.deadlines.response_time,
14 appeal_time: r.deadlines.appeal_time
15 }));
16}
17
18const deadlines = await getDeadlines('federal');
19deadlines.forEach(d => {
20 console.log(`${d.title}:`);
21 console.log(` Response: ${d.response_time}`);
22 console.log(` Appeal: ${d.appeal_time}`);
23});

Fee Analysis

1async function analyzeFees(jurisdiction: string) {
2 const rights = await client.transparency.searchRights({
3 query: 'fees',
4 jurisdiction,
5 limit: 100
6 });
7
8 const feeStats = {
9 with_fees: rights.filter(r => r.fees?.permitted).length,
10 without_fees: rights.filter(r => !r.fees?.permitted).length,
11 fee_limits: rights
12 .filter(r => r.fees?.limits)
13 .map(r => ({ title: r.title, limits: r.fees.limits }))
14 };
15
16 return feeStats;
17}
18
19const fees = await analyzeFees('texas');
20console.log('Fee structure:', fees);

Error Handling

1import { TheholetruthApiError } from '@hole-foundation/sdk';
2
3try {
4 const rights = await client.transparency.searchRights({
5 query: 'public records',
6 jurisdiction: 'invalid-jurisdiction'
7 });
8} catch (error) {
9 if (error instanceof TheholetruthApiError) {
10 if (error.status === 404) {
11 console.error('Jurisdiction not found');
12 } else if (error.status === 400) {
13 console.error('Invalid query parameters');
14 }
15 }
16 throw error;
17}

Data Quality

All transparency data is:

  • Verified: Sourced from official .gov websites
  • Current: Updated quarterly
  • Complete: All 52 jurisdictions
  • Structured: Consistent JSON format
  • Cited: Full legal citations included

Data Sources:

  • Federal: usa.gov, congress.gov
  • States: Official state legislative websites
  • Citations: Official statute compilations

Rate Limits

  • Free tier: 100 requests/day
  • Standard tier: 1,000 requests/day
  • Premium tier: 10,000 requests/day

See Rate Limits for details.

Support