The ACMA RRL Public API provides programmatic access to Australia's Register of Radiocommunications Licences data. This guide covers authentication, available endpoints, filtering, pagination, and rate limits.
#Table of Contents
- Authentication
- Base URL
- Endpoints
- Available Tables
- Filtering
- GeoJSON Format
- Pagination & Sorting
- Rate Limits
- Error Handling
- Examples
- Example Integrations
- Privacy Notice
#Authentication
All API requests require authentication via API key.
Header Format:
Authorization: Bearer YOUR_API_KEY
Or alternatively:
X-API-Key: YOUR_API_KEY
API keys are managed in your account settings. Each key is scoped to your subscription tier.
#Base URL
https://app.spectaura.com.au/api/v1/
All endpoints support CORS for browser-based requests.
#Endpoints
Data API
GET /api/v1
Query ACMA database tables with filtering, sorting, and pagination.
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
table | string | required | Table to query |
columns | string | all | Comma-separated column names |
sort | string | - | Column to sort by |
order | string | asc | Sort direction: asc or desc |
page | integer | 1 | Page number (1-indexed) |
limit | integer | 100 | Results per page (max: 1000) |
filter[column] | various | - | Filter values (see Filtering) |
Response Format:
{
"success": true,
"data": [...],
"pagination": {
"total": 1234,
"page": 1,
"limit": 100,
"totalPages": 13,
"hasNext": true,
"hasPrev": false
},
"meta": {
"table": "site",
"columns": ["site_id", "name", "latitude", "longitude"],
"filters": {},
"queryTimeMs": 45
},
"rateLimit": {
"limit": 1000,
"remaining": 999,
"resetAt": "2025-01-01T00:01:00.000Z"
}
}Response Headers:
| Header | Description |
|---|---|
X-Total-Count | Total matching records |
X-Page | Current page number |
X-Page-Size | Results per page |
X-Total-Pages | Total pages available |
X-Query-Time-Ms | Query execution time |
X-RateLimit-Limit | Rate limit ceiling |
X-RateLimit-Remaining | Remaining requests |
X-RateLimit-Reset | Reset timestamp (Unix ms) |
Schema API
GET /api/v1/schema
Get schema information for available tables. Requires API key authentication.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
table | string | No | Specific table to get schema for. If omitted, returns list of all tables. |
List All Tables Response:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1/schema"{
"success": true,
"tables": [
{ "name": "site", "description": "Transmitter site locations", "estimatedRows": "~127,000" },
{ "name": "licence", "description": "Radio communication licences", "estimatedRows": "~163,000" },
...
]
}Get Table Schema Response:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1/schema?table=site"{
"success": true,
"schema": {
"table": "site",
"description": "Transmitter site locations",
"estimatedRows": "~127,000",
"primaryKey": "site_id",
"columns": [
{ "name": "site_id", "type": "string", "nullable": false, "filterable": true, "sortable": true, "description": "Unique site identifier" },
{ "name": "latitude", "type": "number", "nullable": true, "filterable": true, "sortable": true, "description": "Latitude in decimal degrees (WGS84)" },
...
]
}
}Intermod API
POST /api/v1/intermod
Calculate third-order intermodulation (IM3) products for transmitters at a site, identifying potential interference with a reference frequency.
Tier Access:
| Tier | Access | Daily Limit |
|---|---|---|
| Free | Disabled | 0 |
| Professional | Enabled | 50/day |
| Business | Enabled | Unlimited |
Request Body:
{
"siteId": "string (required)",
"reference": {
"licenceNo": "string"
}
}Or with manual frequency:
{
"siteId": "string (required)",
"reference": {
"frequency": 450000000,
"bandwidth": 25000
}
}| Field | Type | Required | Description |
|---|---|---|---|
siteId | string | Yes | Site ID to analyse |
reference.licenceNo | string | Conditional | Licence number at the site to use as reference frequency |
reference.frequency | number | Conditional | Manual reference frequency in Hz |
reference.bandwidth | number | Conditional | Manual reference bandwidth in Hz |
Note: Provide either
licenceNoOR bothfrequencyandbandwidth, not both.
Response Format:
{
"success": true,
"data": {
"reference": {
"frequency": 450000000,
"bandwidth": 25000,
"licenceNo": "1234567/1",
"source": "licence"
},
"siteId": "10001",
"siteName": "MOUNT DANDENONG",
"deviceCount": 45,
"products": [
{
"productType": "2f1-f2",
"frequency": 449750000,
"bandwidth": 75000,
"device1": {
"sddId": "123456",
"licenceNo": "1234567/1",
"frequency": 450000000
},
"device2": {
"sddId": "123457",
"licenceNo": "1234568/1",
"frequency": 450250000
},
"overlapStatus": "partial",
"overlapPercentage": 35,
"separationHz": 0
}
],
"summary": {
"totalProducts": 124,
"fullOverlaps": 2,
"partialOverlaps": 5,
"adjacentProducts": 12,
"riskLevel": "medium"
},
"calculatedAt": "2025-01-15T10:30:00.000Z"
},
"meta": {
"queryTimeMs": 156,
"tier": "professional"
},
"rateLimit": {
"limit": 50,
"remaining": 49,
"resetAt": "2025-01-16T00:00:00.000Z"
}
}Overlap Status Values:
| Status | Description |
|---|---|
full | IM3 product completely overlaps reference band |
partial | IM3 product partially overlaps reference band |
adjacent | IM3 product is within 2× bandwidth of reference band edge |
none | No overlap or adjacency |
Risk Level:
| Level | Criteria |
|---|---|
high | Any full overlaps |
medium | Partial overlaps but no full overlaps |
low | Adjacent products only |
none | No overlapping or adjacent products |
Limits:
- Maximum 500 transmitters per site
- Sites exceeding this limit return
TOO_MANY_DEVICESerror
Error Codes (specific to Intermod API):
| Code | Status | Description |
|---|---|---|
SITE_NOT_FOUND | 404 | Site ID does not exist |
REFERENCE_NOT_FOUND | 404 | Licence not found at specified site |
TOO_MANY_DEVICES | 400 | Site exceeds 500 transmitter limit |
TIER_ACCESS_DENIED | 403 | Subscription tier does not allow intermod access |
Example Request:
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"siteId": "10001", "reference": {"licenceNo": "1234567/1"}}' \
"https://app.spectaura.com.au/api/v1/intermod"#Available Tables
Table access is controlled by subscription tier. All ACMA database tables are available to Professional subscribers, with additional views and materialized views available to Business subscribers.
Professional Tier Tables
All core ACMA RRL tables:
| Table | Description | Est. Rows |
|---|---|---|
site | Transmitter site locations | ~127,000 |
licence | Radio communication licences | ~163,000 |
device_details | Transmitter/receiver equipment | ~2,400,000 |
client | Licence holder records | ~14,000 |
antenna | Antenna specifications | ~8,500 |
bsl | Broadcasting Service Licences | ~3,600 |
auth_spectrum_area | AWL spectrum authorization areas | ~3,400 |
auth_spectrum_freq | Spectrum frequency allocations | ~3,400 |
Plus reference/lookup tables: access_area, antenna_pattern, antenna_polarity, applic_text_block, bsl_area, class_of_station, client_type, fee_status, industry_cat, licence_service, licence_status, licence_subservice, licensing_area, nature_of_service, reports_text_block, satellite.
Business Tier Additional Tables
Business subscribers have access to all Professional tables plus:
| Table | Type | Description |
|---|---|---|
base_info | Materialized View | Pre-aggregated site/licence data with geometry |
point_to_point_links | Materialized View | P2P microwave link pairs with geometry |
awl_info | Materialized View | AWL licence spectrum areas with polygon geometry |
client_info | View | Enriched client data with industry info |
bsl_info | View | Broadcasting licence details |
sites_without_licence | View | Orphaned site records |
#Table Schemas
Schema details for commonly used tables. Use the /api/v1/schema?table={name} endpoint to get full schema information for any table.
site (Professional+)
| Column | Type | Filterable | Sortable | Description |
|---|---|---|---|---|
site_id | string | Yes | Yes | Unique site identifier |
name | string | Yes | Yes | Site name |
latitude | number | Yes | Yes | Latitude (WGS84) |
longitude | number | Yes | Yes | Longitude (WGS84) |
state | string | Yes | Yes | State/territory code |
postcode | string | Yes | Yes | Postal code |
elevation | number | Yes | Yes | Elevation (metres ASL) |
site_precision | string | Yes | No | Location precision indicator |
hcis_l2 | string | Yes | No | HCIS Level 2 classification |
licence (Professional+)
| Column | Type | Filterable | Sortable | Description |
|---|---|---|---|---|
licence_no | string | Yes | Yes | Unique licence number |
client_no | bigint | Yes | Yes | Client/licensee number |
sv_id | bigint | Yes | Yes | Service type ID |
ss_id | bigint | Yes | Yes | Subservice type ID |
licence_type_name | string | Yes | Yes | Licence type |
licence_category_name | string | Yes | Yes | Licence category |
date_issued | date | Yes | Yes | Issue date |
date_of_effect | date | Yes | Yes | Effective date |
date_of_expiry | date | Yes | Yes | Expiry date |
status | string | Yes | Yes | Status code |
status_text | string | Yes | Yes | Status description |
bsl_no | string | Yes | Yes | BSL number (if applicable) |
awl_type | string | Yes | Yes | AWL type |
client_info (Business)
| Column | Type | Filterable | Sortable | Description |
|---|---|---|---|---|
client_no | bigint | Yes | Yes | Unique client number |
licencee | string | Yes | Yes | Licensee name* |
trading_name | string | Yes | Yes | Trading name |
postal_state | string | Yes | Yes | Postal state |
postal_postcode | string | Yes | Yes | Postal postcode |
industry | string | Yes | Yes | Industry category |
client_type | string | Yes | Yes | Type (Company, Person, etc.) |
fee_status | string | Yes | Yes | Fee status |
*Personal details are redacted for individual licensees (client_type: "Person")
Professional tier: Use the
clienttable for basic client data.
device_details (Professional+)
| Column | Type | Filterable | Sortable | Description |
|---|---|---|---|---|
sdd_id | bigint | Yes | Yes | Unique device ID |
licence_no | string | Yes | Yes | Associated licence |
site_id | string | Yes | Yes | Site location |
device_type | string | Yes | Yes | Device type |
frequency | number | Yes | Yes | Operating frequency (Hz) |
bandwidth | number | Yes | Yes | Bandwidth (Hz) |
polarisation | string | Yes | Yes | Signal polarisation |
transmitter_power | number | Yes | Yes | Transmitter power |
transmitter_power_unit | string | Yes | No | Power unit |
eirp | number | Yes | Yes | EIRP value |
eirp_unit | string | Yes | No | EIRP unit |
height | number | Yes | Yes | Antenna height (m) |
azimuth | number | Yes | Yes | Azimuth (degrees) |
antenna_id | string | Yes | Yes | Associated antenna |
sv_id | bigint | Yes | Yes | Service type ID |
ss_id | bigint | Yes | Yes | Subservice type ID |
efl_id | bigint | Yes | Yes | Equipment Freq Licence ID |
call_sign | string | Yes | Yes | Station call sign |
base_info (Business)
Pre-aggregated site and licence data optimized for map display and filtering.
| Column | Type | Filterable | Sortable | Description |
|---|---|---|---|---|
licence_no | string | Yes | Yes | Licence number |
site_id | string | Yes | Yes | Site identifier |
sv_id | bigint | Yes | Yes | Service type ID |
ss_id | bigint | Yes | Yes | Subservice type ID |
licence_type_name | string | Yes | Yes | Licence type |
licence_category_name | string | Yes | Yes | Licence category |
date_issued | date | Yes | Yes | Date issued |
date_of_effect | date | Yes | Yes | Date of effect |
date_of_expiry | date | Yes | Yes | Date of expiry |
licence_status | string | Yes | Yes | Licence status |
client_no | bigint | Yes | Yes | Client number |
bsl_no | string | Yes | Yes | BSL number |
licencee | string | Yes | Yes | Licensee name* |
industry | string | Yes | Yes | Industry |
client_type | string | Yes | Yes | Client type |
site_name | string | Yes | Yes | Site name |
latitude | number | Yes | Yes | Latitude |
longitude | number | Yes | Yes | Longitude |
state | string | Yes | Yes | State/territory |
postcode | string | Yes | Yes | Postcode |
site_licence_count | bigint | Yes | Yes | Licences at site |
has_awl | boolean | Yes | Yes | Has AWL |
has_bsl | boolean | Yes | Yes | Has BSL |
#Filtering
Filter syntax: filter[column][operator]=value
Operators:
| Operator | Description | Example |
|---|---|---|
eq | Equal to | filter[state][eq]=NSW |
ne | Not equal to | filter[state][ne]=NSW |
in | In array | filter[state][in]=NSW,VIC,QLD |
gte | Greater than or equal | filter[frequency][gte]=450000000 |
lte | Less than or equal | filter[frequency][lte]=470000000 |
gt | Greater than | filter[date_issued][gt]=2024-01-01 |
lt | Less than | filter[date_of_expiry][lt]=2025-12-31 |
between | Between range (inclusive) | filter[frequency][between]=400000000,500000000 |
like | SQL LIKE pattern | filter[name][like]=Mount% |
ilike | Case-insensitive LIKE | filter[licencee][ilike]=%some_licencee% |
is | NULL check | filter[bsl_no][is]=null |
Shorthand:
filter[column]=value is equivalent to filter[column][eq]=value
Type-Specific Operators:
| Column Type | Allowed Operators |
|---|---|
| string | eq, ne, in, like, ilike, is, between |
| number/bigint | eq, ne, in, gte, lte, gt, lt, between, is |
| date | eq, ne, gte, lte, gt, lt, between, is |
| boolean | eq |
Query Complexity Limits:
To protect database performance, the following limits apply:
| Limit | Value | Description |
|---|---|---|
| Max filters | 10 | Maximum number of filter conditions per request |
| Max IN values | 100 | Maximum values in a single in clause |
#GeoJSON Format
The API supports GeoJSON output for tables with geometry columns. Add format=geojson to get RFC 7946 compliant GeoJSON.
GeoJSON Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=site&format=geojson&filter[state]=NSW"GeoJSON Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
format | string | json | Set to geojson for GeoJSON output |
precision | integer | 6 | Coordinate decimal places (1-10) |
bbox | string | - | Bounding box filter: minLon,minLat,maxLon,maxLat |
GeoJSON Response
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "10001",
"geometry": {
"type": "Point",
"coordinates": [151.209900, -33.865143]
},
"properties": {
"site_id": "10001",
"name": "Sydney Tower",
"state": "NSW"
}
}
],
"bbox": [150.5, -34.2, 152.0, -33.0],
"metadata": {
"success": true,
"table": "site",
"geometryColumn": "geom_4326",
"featureCount": 150,
"results": {
"total": 150,
"returned": 150,
"truncated": false,
"limit": -1
},
"queryTimeMs": 234,
"rateLimit": { ... }
}
}Precision and File Size
The precision parameter controls coordinate decimal places, affecting both accuracy and response size:
| Precision | Accuracy | Example | Use Case |
|---|---|---|---|
| 1 | ~11 km | 151.2 | Regional overview |
| 2 | ~1.1 km | 151.21 | City-level |
| 3 | ~110 m | 151.210 | Suburb-level |
| 4 | ~11 m | 151.2099 | Street-level |
| 5 | ~1.1 m | 151.20990 | Building-level |
| 6 | ~0.11 m | 151.209900 | Default - Survey grade |
| 7+ | <0.01 m | 151.2099000 | Unnecessary for most uses |
File size impact: Each additional decimal place adds ~2 bytes per coordinate. For a 100,000 feature response:
| Precision | Approx. Size |
|---|---|
| 3 | ~15 MB |
| 6 | ~20 MB |
| 10 | ~28 MB |
Recommendation: Use precision 5-6 for most applications. Lower precision for large exports or visualization-only use cases.
Tables with Geometry Support
| Table | Geometry Type | Description |
|---|---|---|
site | Point | Transmitter site locations |
base_info | Point | Pre-aggregated site data |
point_to_point_links | LineString | P2P microwave links |
awl_info | Polygon | Area Wide spectrum Licences |
GeoJSON Pagination
Important: GeoJSON format does NOT support pagination. The page and limit parameters are rejected for GeoJSON requests. All matching features (up to your tier's GeoJSON row limit) are returned in a single response.
Use filters and bbox to reduce result size instead of pagination.
NDJSON Streaming (Large Responses)
For large GeoJSON responses (10,000+ features), the API supports Newline Delimited JSON (NDJSON) streaming. This reduces memory usage and allows progressive processing.
Request streaming:
curl -H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/x-ndjson" \
"https://api.example.com/api/v1?table=site&format=geojson"NDJSON Response Format:
Each line is a separate JSON object:
{"type":"header","format":"ndjson-geojson","version":"1.0","table":"site",...}
{"type":"Feature","id":"10001","geometry":{...},"properties":{...}}
{"type":"Feature","id":"10002","geometry":{...},"properties":{...}}
...
{"type":"footer","results":{"total":50000,"returned":50000},"queryTimeMs":1234}
Response Headers for Streaming:
| Header | Value |
|---|---|
Content-Type | application/x-ndjson |
Transfer-Encoding | chunked |
X-Streaming | true |
X-Streaming-Threshold | 10000 |
#Pagination & Sorting
Pagination Parameters
| Parameter | Type | Default | Max | Description |
|---|---|---|---|---|
page | integer | 1 | - | Page number (1-indexed) |
limit | integer | 100 | 1000 | Results per page |
Tier-Based Limits:
| Tier | Max Rows Per Request |
|---|---|
| Free | API access disabled |
| Professional | 1,000 |
| Business | 10,000 |
Sorting
?sort=column&order=asc|desc
Only columns marked as "sortable" can be used for sorting.
#Rate Limits
Authenticated API Requests
Rate limits are determined by your subscription tier. View your current limits and usage in your Account API Settings.
Note: API access requires a Professional or Business subscription. Free tier users do not have API access.
Tile Requests
Tiles are rate limited separately at 300 requests per minute per IP.
Rate Limit Headers
All responses include:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1735689600000
When rate limited, responses return 429 with:
Retry-After: 60
#Error Handling
Error Response Format
{
"success": false,
"error": {
"code": "INVALID_FILTER",
"message": "Column 'foo' is not filterable",
"details": {
"field": "filter[foo]"
}
}
}Error Codes
Authentication Errors (401)
| Code | Description |
|---|---|
AUTHENTICATION_REQUIRED | API key missing from request |
INVALID_API_KEY | API key not found in database |
INVALID_KEY_FORMAT | Malformed API key (must start with sk_live_) |
EXPIRED_API_KEY | API key has passed its expiration date |
REVOKED_API_KEY | API key has been revoked by the user |
Authorization Errors (403)
| Code | Description |
|---|---|
TIER_ACCESS_DENIED | Subscription tier does not allow API access |
SCOPE_ACCESS_DENIED | API key scope does not permit this operation |
TABLE_ACCESS_DENIED | Table not available for your subscription tier |
Rate Limit Errors (429)
| Code | Description |
|---|---|
RATE_LIMIT_EXCEEDED | Request rate limit exceeded. See Retry-After header. |
Validation Errors (400)
| Code | Description |
|---|---|
INVALID_TABLE | Unknown or unavailable table name |
INVALID_COLUMN | Unknown column name for the table |
INVALID_FILTER | Invalid filter syntax |
INVALID_FILTER_OPERATOR | Unknown filter operator |
INVALID_FILTER_VALUE | Value type doesn't match column type |
INVALID_SORT_COLUMN | Column is not sortable |
INVALID_PAGINATION | Invalid page or limit value |
ROW_LIMIT_EXCEEDED | Requested limit exceeds tier maximum |
TOO_MANY_FILTERS | More than 10 filter conditions |
TOO_MANY_IN_VALUES | More than 100 values in IN clause |
INVALID_BETWEEN_VALUE | Invalid between range format |
GeoJSON Errors (400)
| Code | Description |
|---|---|
TABLE_NO_GEOMETRY | Table does not support GeoJSON output |
INVALID_BBOX | Invalid bounding box format |
INVALID_PRECISION | Precision must be 1-10 |
GEOJSON_ROW_LIMIT_EXCEEDED | GeoJSON result exceeds tier limit |
Server Errors (500+)
| Code | Status | Description |
|---|---|---|
QUERY_ERROR | 500 | Database query failed |
QUERY_TIMEOUT | 504 | Query exceeded time limit (add filters to reduce scope) |
INTERNAL_ERROR | 500 | Unexpected server error |
#Examples
Basic Site Query
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=site&filter[state][in]=NSW,VIC&limit=10"Frequency Range Search (using between)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=device_details&filter[frequency][between]=450000000,470000000&sort=frequency&order=asc"Licences Expiring Soon (using between)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=licence&filter[date_of_expiry][between]=2025-01-01,2025-06-30&sort=date_of_expiry"Exclude Specific State (using ne)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=site&filter[state][ne]=NSW&limit=50"Client Search (Case-Insensitive)
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=client_info&filter[licencee][ilike]=%some_licencee%"P2P Links with Specific Client
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.example.com/api/v1?table=point_to_point_links&filter[client_no][eq]=12345&columns=a_site_id,b_site_id,distance_km,a_frequency"#Privacy Notice
Personal information of individual licensees (where client_type is "Person") is automatically redacted in API responses. This includes:
licencee- replaced with "[REDACTED]"trading_name- set to nullpostal_state- set to nullpostal_postcode- set to null
This redaction is applied to all endpoints and export functions.
#Example Integrations
Python
import requests
API_KEY = "sk_live_your_api_key_here"
BASE_URL = "https://api.example.com/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Query sites in NSW
response = requests.get(
BASE_URL,
headers=headers,
params={
"table": "site",
"filter[state][eq]": "NSW",
"limit": 100
}
)
data = response.json()
if data["success"]:
for site in data["data"]:
print(f"{site['site_id']}: {site['name']}")
# Check rate limit
remaining = data["rateLimit"]["remaining"]
print(f"Requests remaining: {remaining}")JavaScript/Node.js
const API_KEY = "sk_live_your_api_key_here";
const BASE_URL = "https://api.example.com/api/v1";
async function querySites(state) {
const params = new URLSearchParams({
table: "site",
"filter[state][eq]": state,
limit: "100"
});
const response = await fetch(`${BASE_URL}?${params}`, {
headers: { Authorization: `Bearer ${API_KEY}` }
});
const data = await response.json();
if (!data.success) {
throw new Error(`API Error: ${data.error.code} - ${data.error.message}`);
}
return data;
}
// Usage
const result = await querySites("VIC");
console.log(`Found ${result.pagination.total} sites`);GeoJSON with Python (GeoPandas)
import requests
import geopandas as gpd
from io import StringIO
API_KEY = "sk_live_your_api_key_here"
# Fetch GeoJSON
response = requests.get(
"https://api.example.com/api/v1",
headers={"Authorization": f"Bearer {API_KEY}"},
params={
"table": "site",
"format": "geojson",
"filter[state][eq]": "NSW",
"precision": 6
}
)
# Load into GeoPandas
gdf = gpd.GeoDataFrame.from_features(response.json()["features"])
print(f"Loaded {len(gdf)} features")
# Save to file
gdf.to_file("nsw_sites.geojson", driver="GeoJSON")NDJSON Streaming (Python)
import requests
import json
API_KEY = "sk_live_your_api_key_here"
# Stream large GeoJSON response
response = requests.get(
"https://api.example.com/api/v1",
headers={
"Authorization": f"Bearer {API_KEY}",
"Accept": "application/x-ndjson"
},
params={"table": "site", "format": "geojson"},
stream=True
)
features = []
for line in response.iter_lines():
if line:
obj = json.loads(line)
if obj.get("type") == "Feature":
features.append(obj)
elif obj.get("type") == "footer":
print(f"Query completed in {obj['queryTimeMs']}ms")
print(f"Processed {len(features)} features")Pagination Loop (All Results)
import requests
API_KEY = "sk_live_your_api_key_here"
BASE_URL = "https://api.example.com/api/v1"
def fetch_all(table, filters=None):
"""Fetch all records using pagination."""
all_data = []
page = 1
limit = 1000
while True:
params = {"table": table, "page": page, "limit": limit}
if filters:
params.update(filters)
response = requests.get(
BASE_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
params=params
)
data = response.json()
if not data["success"]:
raise Exception(f"Error: {data['error']['message']}")
all_data.extend(data["data"])
if not data["pagination"]["hasNext"]:
break
page += 1
return all_data
# Fetch all Victorian licences
licences = fetch_all("licence", {"filter[state][eq]": "VIC"})
print(f"Total licences: {len(licences)}")#Support
For API issues or questions:
- Check the status page
- Contact support via the website
- Review your API usage in account settings