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.
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.
curl "https://civicgraph.au/api/data?type=entities&abn=12345678901"curl "https://civicgraph.au/api/data?type=entities&q=salvation%20army&limit=10"curl "https://civicgraph.au/api/data?type=grants&min_amount=10000&limit=20"curl "https://civicgraph.au/api/data/power-index?min_systems=4&state=NSW&limit=20"https://civicgraph.au/apiFormat: 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.
- No API key required
- 60 requests/minute per IP
- All read endpoints: entities, relationships, grants, foundations
- Health and reports endpoints
- API key via Bearer token
- 1,000 requests/hour (configurable)
- Data export in CSV/JSON
- Key management API
curl -H "Authorization: Bearer cg_your_api_key_here" \
"https://civicgraph.au/api/data/export?type=foundations&format=csv"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
/api/data?type=entitiesSearch and filter the national entity graph. 159K+ entities including charities, companies, government bodies, foundations, and community-controlled organisations.
| q | string | Search by entity name (case-insensitive partial match) |
| abn | string | Exact ABN lookup |
| entity_type | string | Filter by type: charity, company, foundation, government, etc. |
| state | string | Australian state: NSW, VIC, QLD, WA, SA, TAS, NT, ACT |
| postcode | string | Filter by postcode |
| community_controlled | boolean | Only community-controlled organisations (true) |
| limit | integer | Max results (default 100, max 500) |
| offset | integer | Pagination 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
/api/data?type=relationshipsQuery the cross-system relationship graph. 1M+ edges linking entities through contracts, grants, donations, and funding flows.
| relationship_type | string | Filter by type: contracted_with, donated_to, funded_by, etc. |
| dataset | string | Source dataset: austender, political_donations, justice_funding, etc. |
| min_amount | integer | Minimum dollar amount |
| year | integer | Filter by year |
| limit | integer | Max results (default 100, max 500) |
| offset | integer | Pagination 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
/api/data?type=grantsSearch live and historical grant opportunities. 18K+ grants from government and philanthropic sources.
| min_amount | integer | Minimum grant amount (filters on amount_max) |
| max_amount | integer | Maximum grant amount |
| category | string | Filter by category (array contains match) |
| limit | integer | Max results (default 100, max 500) |
| offset | integer | Pagination 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"
}
]
}/api/data?type=foundationsSearch 10.8K+ grant-making foundations. Filter by thematic focus and geographic coverage.
| focus | string | Thematic focus filter: indigenous, education, health, environment, etc. |
| state | string | Geographic focus filter (by AU state code) |
| limit | integer | Max results (default 100, max 500) |
| offset | integer | Pagination 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
}
]
}/api/data?type=social-enterprisesSearch social enterprises including B Corps, Supply Nation, and indigenous enterprises.
| source | string | Source registry: supply_nation, bcorp, etc. |
| state | string | Filter by state |
| indigenous | boolean | Only indigenous enterprises (true) |
| q | string | Search by name |
| limit | integer | Max results (default 100, max 500) |
Reports & Analysis
/api/data/power-indexCross-system power concentration index. 82K+ entities scored across 7 Australian government datasets.
| view | string | View mode: entities (default), deserts, or summary |
| min_systems | integer | Minimum system count (default 2) |
| state | string | Filter by state |
| type | string | Filter by entity type |
| community | boolean | Only community-controlled (true) |
| sort | string | Sort by: power_score, system_count, total_dollar_flow, procurement_dollars |
| limit | integer | Max 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": { ... } }
}/api/data/power-index?view=desertsFunding deserts: LGAs with high disadvantage and low funding. Desert score combines SEIFA IRSD, remoteness, entity coverage, and funding gaps.
| state | string | Filter by state |
| min_desert | integer | Minimum desert score (default 0) |
| limit | integer | Max results (default 50, max 500) |
/api/data/power-index?view=summaryAggregate power statistics by entity type, remoteness category, and community-controlled status.
/api/data/funding-desertsDetailed 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 }
}/api/data/who-runs-australiaCross-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
}
}/api/data/data-healthComprehensive data health metrics: entity coverage, linkage rates, relationship network quality, and agent pipeline status.
Graph
/api/data/graphForce-directed graph data. Returns nodes and edges for visualization. Supports hub, justice, power, and interlock modes.
| mode | string | Graph mode: hubs, justice, power, interlocks |
| entity_type | string | Hub mode: entity type (foundation, charity, company) |
| topic | string | Justice mode: topic filter (youth-justice, child-protection, indigenous, diversion) |
| min_systems | integer | Power mode: minimum systems (default 3) |
| min_boards | integer | Interlocks mode: minimum board seats (default 2) |
| state | string | Filter by state |
| min_amount | integer | Minimum edge amount |
| hubs | integer | Number of top hubs (default 30, max 100) |
| limit | integer | Max 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
/api/data/exportRequires AuthBulk data export in CSV or JSON format. Requires authentication with 'research' module access.
| type | string | Data type: entities, relationships, foundations, grants, social-enterprises, money-flows, community-orgs, government-programs |
| format | string | Output format: csv or json (default csv) |
| domain | string | Domain filter (for money-flows, government-programs, community-orgs) |
| jurisdiction | string | Jurisdiction filter (for government-programs) |
| limit | integer | Max rows (default 5000, max 10000) |
Health
/api/data/healthPlatform 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
/api/keysRequires AuthList 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"
}
]
}/api/keysRequires AuthGenerate a new API key. The full key is returned only once in the response -- store it securely.
| name | string (required) | Human-readable key name |
| permissions | string[] | Permission scopes (default: ["read"]) |
| rate_limit_per_hour | integer | Requests per hour (default: 1000) |
/api/keys/[keyId]Requires AuthUpdate an API key's name or enabled status.
| name | string | New key name |
| enabled | boolean | Enable or disable the key |
/api/keys/[keyId]Requires AuthPermanently revoke an API key. This action cannot be undone.
Rate Limits
| Tier | Rate | Daily Limit | Features |
|---|---|---|---|
| Public (no key) | 60 req/min | 1,000/day | Read-only data access |
| Authenticated | 1,000 req/hr | 10,000/day | Read + Export (CSV/JSON) |
| Enterprise | Custom | Custom | Dedicated support, custom integrations |
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.
# 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.csvconst 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`);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).
| Dataset | Table | Records |
|---|---|---|
| Entity Graph | gs_entities | 159K |
| Relationships | gs_relationships | 1M+ |
| AusTender Contracts | austender_contracts | 772K |
| ACNC Charities | acnc_charities | 66K |
| Political Donations | political_donations | 312K |
| Justice Funding | justice_funding | 71K |
| ATO Tax Transparency | ato_tax_transparency | 24K |
| Foundations | foundations | 10.8K |
| Grant Opportunities | grant_opportunities | 18K |
| Social Enterprises | social_enterprises | 2K+ |
| ALMA Interventions | alma_interventions | 1.2K |
Materialized Views (Pre-computed Analytics)
| mv_entity_power_index | Cross-system power scores for 82K+ entities | 82K |
| mv_funding_deserts | LGA-level disadvantage vs funding desert scores | 1.6K |
| mv_revolving_door | Entities with 2+ influence vectors | 4.7K |
| mv_board_interlocks | Shared board members between organisations | 1.2K |
| mv_gs_donor_contractors | Entities that both donate politically and hold contracts | 500+ |
| mv_gs_entity_stats | Entity-level rollup statistics | 159K |
Terms of Use
When using CivicGraph data in publications, research, or applications, please credit:Source: CivicGraph (civicgraph.au)
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.
- Research, journalism, and public interest investigation
- Non-profit sector analysis and grant-seeking
- Government transparency and accountability projects
- Academic research with appropriate citation
- Reselling raw data without transformation or added value
- Automated scraping that exceeds rate limits
- Misrepresenting CivicGraph data or analysis
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.