Developer Portal

CivicGraph API

Programmatic access to Australia's most comprehensive cross-system civic intelligence dataset. Query entities, relationships, grants, contracts, political donations, and evidence programs through a simple REST API.

159K+
Entities
1M+
Relationships
770K+
Contracts
7
Data Systems

Quick Start

The CivicGraph API is a read-only REST API. Most endpoints are publicly accessible. Authenticated endpoints (export, API key management) require a Bearer token.

1. Look up an entity by ABN
bash
curl "https://civicgraph.au/api/data?type=entities&abn=12345678901"
2. Search entities by name
bash
curl "https://civicgraph.au/api/data?type=entities&q=salvation%20army&limit=10"
3. Get open grant opportunities
bash
curl "https://civicgraph.au/api/data?type=grants&min_amount=10000&limit=20"
4. Check the cross-system power index
bash
curl "https://civicgraph.au/api/data/power-index?min_systems=4&state=NSW&limit=20"
Base URL: https://civicgraph.au/api
Format: All responses are JSON. Export endpoints support CSV.
Pagination: Use limit and offset parameters. Max 500 per request.

Authentication

Most read endpoints are publicly accessible without authentication. For higher rate limits, data export, and key management, authenticate with an API key.

Public Access
  • No API key required
  • 60 requests/minute per IP
  • All read endpoints: entities, relationships, grants, foundations
  • Health and reports endpoints
Authenticated Access
  • API key via Bearer token
  • 1,000 requests/hour (configurable)
  • Data export in CSV/JSON
  • Key management API
Using your API key
bash
curl -H "Authorization: Bearer cg_your_api_key_here" \
  "https://civicgraph.au/api/data/export?type=foundations&format=csv"
Generate an API key (requires account)
bash
curl -X POST "https://civicgraph.au/api/keys" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "My App", "permissions": ["read"]}'
{
  "id": "uuid",
  "key_prefix": "cg_a1b2c3d4",
  "key": "cg_a1b2c3d4e5f6...full_key_shown_once",
  "name": "My App",
  "enabled": true,
  "rate_limit_per_hour": 1000,
  "created_at": "2026-03-20T00:00:00Z"
}

The full API key is only shown once at creation. Store it securely.

Endpoints

All data endpoints use the unified /api/data route with a type parameter, plus dedicated routes for specialized queries.

Entities

GET/api/data?type=entities

Search and filter the national entity graph. 159K+ entities including charities, companies, government bodies, foundations, and community-controlled organisations.

Parameters
qstringSearch by entity name (case-insensitive partial match)
abnstringExact ABN lookup
entity_typestringFilter by type: charity, company, foundation, government, etc.
statestringAustralian state: NSW, VIC, QLD, WA, SA, TAS, NT, ACT
postcodestringFilter by postcode
community_controlledbooleanOnly community-controlled organisations (true)
limitintegerMax results (default 100, max 500)
offsetintegerPagination offset
{
  "type": "entities",
  "data": [
    {
      "gs_id": "GS-00001",
      "canonical_name": "The Salvation Army",
      "abn": "85007834963",
      "entity_type": "charity",
      "sector": "welfare",
      "state": "VIC",
      "postcode": "3101",
      "remoteness": "Major Cities of Australia",
      "seifa_irsd_decile": 9,
      "lga_name": "Boroondara",
      "is_community_controlled": false,
      "website": "https://salvationarmy.org.au",
      "description": "..."
    }
  ],
  "limit": 100,
  "offset": 0
}

Relationships

GET/api/data?type=relationships

Query the cross-system relationship graph. 1M+ edges linking entities through contracts, grants, donations, and funding flows.

Parameters
relationship_typestringFilter by type: contracted_with, donated_to, funded_by, etc.
datasetstringSource dataset: austender, political_donations, justice_funding, etc.
min_amountintegerMinimum dollar amount
yearintegerFilter by year
limitintegerMax results (default 100, max 500)
offsetintegerPagination offset
{
  "type": "relationships",
  "data": [
    {
      "id": "uuid",
      "source_entity_id": "uuid",
      "target_entity_id": "uuid",
      "relationship_type": "contracted_with",
      "amount": 15000000,
      "year": 2024,
      "dataset": "austender"
    }
  ],
  "limit": 100,
  "offset": 0
}

Grants & Foundations

GET/api/data?type=grants

Search live and historical grant opportunities. 18K+ grants from government and philanthropic sources.

Parameters
min_amountintegerMinimum grant amount (filters on amount_max)
max_amountintegerMaximum grant amount
categorystringFilter by category (array contains match)
limitintegerMax results (default 100, max 500)
offsetintegerPagination offset
{
  "type": "grants",
  "data": [
    {
      "id": "uuid",
      "name": "Community Development Grant",
      "provider": "Dept of Social Services",
      "program": "Stronger Communities",
      "amount_min": 5000,
      "amount_max": 50000,
      "closes_at": "2026-06-30T00:00:00Z",
      "url": "https://...",
      "categories": ["community", "indigenous"],
      "geography": "National"
    }
  ]
}
GET/api/data?type=foundations

Search 10.8K+ grant-making foundations. Filter by thematic focus and geographic coverage.

Parameters
focusstringThematic focus filter: indigenous, education, health, environment, etc.
statestringGeographic focus filter (by AU state code)
limitintegerMax results (default 100, max 500)
offsetintegerPagination offset
{
  "type": "foundations",
  "data": [
    {
      "id": "uuid",
      "name": "Ian Potter Foundation",
      "type": "private_ancillary_fund",
      "website": "https://ianpotter.org.au",
      "total_giving_annual": 35000000,
      "thematic_focus": ["arts", "education", "environment", "health"],
      "geographic_focus": ["AU-VIC", "AU-NSW"],
      "profile_confidence": 0.9
    }
  ]
}
GET/api/data?type=social-enterprises

Search social enterprises including B Corps, Supply Nation, and indigenous enterprises.

Parameters
sourcestringSource registry: supply_nation, bcorp, etc.
statestringFilter by state
indigenousbooleanOnly indigenous enterprises (true)
qstringSearch by name
limitintegerMax results (default 100, max 500)

Reports & Analysis

GET/api/data/power-index

Cross-system power concentration index. 82K+ entities scored across 7 Australian government datasets.

Parameters
viewstringView mode: entities (default), deserts, or summary
min_systemsintegerMinimum system count (default 2)
statestringFilter by state
typestringFilter by entity type
communitybooleanOnly community-controlled (true)
sortstringSort by: power_score, system_count, total_dollar_flow, procurement_dollars
limitintegerMax results (default 100, max 1000)
{
  "entities": [
    {
      "gs_id": "GS-00001",
      "canonical_name": "Serco Group",
      "entity_type": "company",
      "system_count": 5,
      "power_score": 47,
      "in_procurement": true,
      "in_political_donations": true,
      "procurement_dollars": 4200000000,
      "total_dollar_flow": 4500000000
    }
  ],
  "meta": { "count": 100, "filters": { ... } }
}
GET/api/data/power-index?view=deserts

Funding deserts: LGAs with high disadvantage and low funding. Desert score combines SEIFA IRSD, remoteness, entity coverage, and funding gaps.

Parameters
statestringFilter by state
min_desertintegerMinimum desert score (default 0)
limitintegerMax results (default 50, max 500)
GET/api/data/power-index?view=summary

Aggregate power statistics by entity type, remoteness category, and community-controlled status.

GET/api/data/funding-deserts

Detailed funding desert analysis. Returns worst deserts, best-funded LGAs, breakdowns by remoteness and state.

{
  "worst30": [ ... ],
  "best10": [ ... ],
  "byRemoteness": [
    {
      "remoteness": "Very Remote Australia",
      "lga_count": 84,
      "avg_desert_score": 142.3,
      "avg_funding": 521000
    }
  ],
  "byState": [ ... ],
  "summary": { "total_lgas": 492, "severe_deserts": 156 }
}
GET/api/data/who-runs-australia

Cross-system influence network: revolving door entities, board interlocks, and political crossover data.

{
  "revolving_door": [ ... ],
  "board_interlocks": [ ... ],
  "political_crossover": [ ... ],
  "stats": {
    "revolving_door_total": 4700,
    "three_vector_plus": 240,
    "multi_board_people": 1200,
    "board_donors": 85
  }
}
GET/api/data/data-health

Comprehensive data health metrics: entity coverage, linkage rates, relationship network quality, and agent pipeline status.

Graph

GET/api/data/graph

Force-directed graph data. Returns nodes and edges for visualization. Supports hub, justice, power, and interlock modes.

Parameters
modestringGraph mode: hubs, justice, power, interlocks
entity_typestringHub mode: entity type (foundation, charity, company)
topicstringJustice mode: topic filter (youth-justice, child-protection, indigenous, diversion)
min_systemsintegerPower mode: minimum systems (default 3)
min_boardsintegerInterlocks mode: minimum board seats (default 2)
statestringFilter by state
min_amountintegerMinimum edge amount
hubsintegerNumber of top hubs (default 30, max 100)
limitintegerMax nodes (default 5000, max 60000)
{
  "nodes": [
    {
      "id": "uuid",
      "label": "Entity Name",
      "type": "charity",
      "state": "NSW",
      "degree": 15,
      "community_controlled": true
    }
  ],
  "edges": [
    {
      "source": "uuid",
      "target": "uuid",
      "type": "funded_by",
      "amount": 500000,
      "dataset": "justice_funding"
    }
  ],
  "meta": { "total_nodes": 811, "total_edges": 1596 }
}

Export

GET/api/data/exportRequires Auth

Bulk data export in CSV or JSON format. Requires authentication with 'research' module access.

Parameters
typestringData type: entities, relationships, foundations, grants, social-enterprises, money-flows, community-orgs, government-programs
formatstringOutput format: csv or json (default csv)
domainstringDomain filter (for money-flows, government-programs, community-orgs)
jurisdictionstringJurisdiction filter (for government-programs)
limitintegerMax rows (default 5000, max 10000)

Health

GET/api/data/health

Platform health and statistics. No authentication required. Returns comprehensive stats about data coverage, freshness, quality, and recent agent pipeline runs.

{
  "platform": {
    "name": "CivicGraph",
    "total_records": 1890000,
    "dataset_count": 17,
    "agents": 48
  },
  "entities": { "total": 333000, "by_type": [...] },
  "relationships": { "total": 1000000 },
  "grants": { "total": 18000, "open": 3200 },
  "foundations": { "total": 10800, "programs": 2400 },
  "money_flows": {
    "contracts": { "records": 772000, "total_value": 853000000000 },
    "political_donations": { "records": 312000 },
    "justice_funding": { "records": 71000 }
  },
  "datasets": [
    { "name": "Entity Graph", "table": "gs_entities", "records": 333000, "status": "fresh" }
  ],
  "recent_agent_runs": [...]
}

API Key Management

GET/api/keysRequires Auth

List all API keys for the authenticated user. Returns key metadata (prefix, name, permissions, rate limits, usage) but never the full key.

{
  "keys": [
    {
      "id": "uuid",
      "key_prefix": "cg_a1b2c3d4",
      "name": "Production App",
      "permissions": ["read"],
      "rate_limit_per_hour": 1000,
      "enabled": true,
      "last_used_at": "2026-03-19T12:00:00Z",
      "expires_at": null,
      "created_at": "2026-01-15T00:00:00Z"
    }
  ]
}
POST/api/keysRequires Auth

Generate a new API key. The full key is returned only once in the response -- store it securely.

Parameters
namestring (required)Human-readable key name
permissionsstring[]Permission scopes (default: ["read"])
rate_limit_per_hourintegerRequests per hour (default: 1000)
PATCH/api/keys/[keyId]Requires Auth

Update an API key's name or enabled status.

Parameters
namestringNew key name
enabledbooleanEnable or disable the key
DELETE/api/keys/[keyId]Requires Auth

Permanently revoke an API key. This action cannot be undone.

Rate Limits

TierRateDaily LimitFeatures
Public (no key)60 req/min1,000/dayRead-only data access
Authenticated1,000 req/hr10,000/dayRead + Export (CSV/JSON)
EnterpriseCustomCustomDedicated support, custom integrations
Rate limit headers: All responses include X-RateLimit-Limit and X-RateLimit-Window headers. When rate limited, you will receive a 429 Too Many Requests response.
Caching: Public endpoints are cached for 5 minutes (s-maxage=300) with 10-minute stale-while-revalidate.

SDKs & Examples

No official SDK is required -- the API is a standard REST API that works with any HTTP client. Here are examples in common languages.

curl
bash
# Search entities
curl "https://civicgraph.au/api/data?type=entities&q=indigenous&state=QLD&limit=20"

# Get power index for NSW
curl "https://civicgraph.au/api/data/power-index?state=NSW&min_systems=3"

# Export foundations as CSV (authenticated)
curl -H "Authorization: Bearer cg_your_key" \
  "https://civicgraph.au/api/data/export?type=foundations&format=csv" \
  -o foundations.csv
JavaScript / TypeScript
javascript
const API_BASE = "https://civicgraph.au/api";

// Search entities
const res = await fetch(
  `${API_BASE}/data?type=entities&q=salvation+army&limit=10`
);
const { data: entities } = await res.json();

// Get power index with authentication
const powerRes = await fetch(
  `${API_BASE}/data/power-index?min_systems=4`,
  { headers: { Authorization: "Bearer cg_your_key" } }
);
const { entities: powerEntities } = await powerRes.json();

// Check platform health
const healthRes = await fetch(`${API_BASE}/data/health`);
const health = await healthRes.json();
console.log(`${health.platform.total_records} records across ${health.platform.dataset_count} datasets`);
Python
python
import requests

API_BASE = "https://civicgraph.au/api"

# Search entities
resp = requests.get(f"{API_BASE}/data", params={
    "type": "entities",
    "q": "indigenous",
    "state": "QLD",
    "community_controlled": "true",
    "limit": 50,
})
entities = resp.json()["data"]

# Get funding deserts
deserts = requests.get(f"{API_BASE}/data/funding-deserts").json()
for d in deserts["worst30"][:5]:
    print(f"{d['lga_name']} ({d['state']}): desert_score={d['desert_score']}")

# Export as CSV (authenticated)
headers = {"Authorization": "Bearer cg_your_key"}
csv_resp = requests.get(
    f"{API_BASE}/data/export",
    params={"type": "foundations", "format": "csv"},
    headers=headers,
)
with open("foundations.csv", "w") as f:
    f.write(csv_resp.text)

Data Dictionary

CivicGraph aggregates data from 7 Australian public datasets, cross-referenced by ABN. Data is updated daily via an automated agent pipeline (48 agents across 9 categories).

DatasetTableRecords
Entity Graphgs_entities159K
Relationshipsgs_relationships1M+
AusTender Contractsaustender_contracts772K
ACNC Charitiesacnc_charities66K
Political Donationspolitical_donations312K
Justice Fundingjustice_funding71K
ATO Tax Transparencyato_tax_transparency24K
Foundationsfoundations10.8K
Grant Opportunitiesgrant_opportunities18K
Social Enterprisessocial_enterprises2K+
ALMA Interventionsalma_interventions1.2K

Materialized Views (Pre-computed Analytics)

mv_entity_power_indexCross-system power scores for 82K+ entities82K
mv_funding_desertsLGA-level disadvantage vs funding desert scores1.6K
mv_revolving_doorEntities with 2+ influence vectors4.7K
mv_board_interlocksShared board members between organisations1.2K
mv_gs_donor_contractorsEntities that both donate politically and hold contracts500+
mv_gs_entity_statsEntity-level rollup statistics159K

Terms of Use

Attribution

When using CivicGraph data in publications, research, or applications, please credit:
Source: CivicGraph (civicgraph.au)

Data Sources

CivicGraph aggregates publicly available Australian government data: AusTender, AEC political donations, ACNC charity registry, ATO tax transparency, state justice funding data, and community-sourced evidence databases. All source data is public record.

Acceptable Use
  • Research, journalism, and public interest investigation
  • Non-profit sector analysis and grant-seeking
  • Government transparency and accountability projects
  • Academic research with appropriate citation
Prohibited Use
  • Reselling raw data without transformation or added value
  • Automated scraping that exceeds rate limits
  • Misrepresenting CivicGraph data or analysis
Contact

For enterprise access, custom integrations, or research partnerships: hello@civicgraph.au

Ready to Build?

Start making API requests now -- no key required for read access. Create an account for higher rate limits and data export capabilities.