Skip to content

Export a dataset as CSV or NDJSON (Pro and above)

GET
/v1/export/{dataset}

The whole dataset — or a jurisdiction / status slice of it — as one file: every licence, every operator, or every domain ↔ operator link we hold. The same records the other endpoints serve; each row carries its own provenance (status_source_url, status_observed_at, last_listed_at), and for KH, TGC and IOM license_number_kind: igregulator_reference says the licence number is our key, not the regulator’s.

Plans. Pro and above. Starter and legacy trial keys get 402 payment_required with details.reason: "export_requires_pro" (Pro isn’t open yet — email founder@igregulator.io). 10 exports per UTC day on Pro, 100 on Business, unlimited on Enterprise — API and dashboard counted together; over it → 429 rate_limited, details.reason: "export_daily_limit_reached". An export counts as one request against the monthly quota, whatever its size. A refused request (4xx) counts against neither.

Formats. csv (default): RFC 4180, UTF-8 without BOM, CRLF line ends, a header row, arrays |-joined, objects as JSON text, null as an empty cell; a text starting with = + - @ gets a leading ' so spreadsheets don’t run it as a formula. json: NDJSON — line 1 is {"_meta": ExportMeta}, then one row object per line, keys in column order, values untouched.

Current state only. as_of is not supported (400 as_of_not_supported); for a past status use ?as_of= on /v1/licenses/{id}, /v1/operators/{slug} or /v1/check. Rows are read in one statement, so the row count and the rows are the same snapshot; compare the lines you received with X-Export-Row-Count to detect a cut-off download.

Row schemas: LicenceExportRow, OperatorExportRow, DomainExportRow. Guide: https://igregulator.io/docs/export/. There is no MCP tool for exports.

dataset
required
string
Allowed values: licences operators domains

licences (one row per licence), operators (one per legal entity), domains (one per domain ↔ operator link). licenses is accepted for licences.

format
string
default: csv
Allowed values: csv json

csv or json (NDJSON; ndjson is accepted too).

jurisdiction
string

Comma-separated jurisdiction codes (case-insensitive; repeat the parameter or use commas). licences: the licence’s jurisdiction. operators: holds a licence there. domains: the jurisdiction of the licence the link’s status comes from. An unknown code is a 400.

Example
UKGC,MGA
status
string

Comma-separated licence statuses (active, suspended, revoked, expired, pending, unknown, surrendered, not_in_register). operators: holds a licence with that status — in the jurisdiction given, when both are. domains: the status of the licence the link answers to.

Example
active

The file, streamed. Content-Disposition: attachment; filename="igregulator-<dataset>-<YYYY-MM-DD>.<csv|ndjson>".

string
Example
license_id,license_number,license_number_kind,jurisdiction_code,…
4db0141c-…,039028-R-319297-013,regulator,UKGC,…
Content-Disposition
string
X-Dataset-Generated-At
string format: date-time

When the rows were read (ISO-8601 UTC).

X-Export-Row-Count
integer

Rows in the file (the CSV header / NDJSON _meta line not counted).

X-Export-Dataset
string
X-Export-Daily-Limit
string

Exports per UTC day on your plan (API + dashboard together), or unlimited.

X-Export-Daily-Used
integer

Exports made today, this one included. Omitted when unlimited.

X-Export-Daily-Remaining
integer

Exports left today. Omitted when unlimited.

X-Export-Daily-Reset
string format: date-time

Next 00:00 UTC, when the daily counter starts again.

Invalid query / parameters.

object
error
required

Human-readable error summary.

string
code
required

HTTP-status-level class. Stable enum; branch on details.reason for finer control. Current values: invalid_query, invalid_slug, invalid_license_id, invalid_jurisdiction_code, invalid_pagination, not_found, auth_required, auth_invalid, auth_revoked, payment_required, quota_exceeded, rate_limited, server_error.

string
details
required
object
reason
required

Machine-readable refinement of the top-level code. Stable vocabulary; branch on this in clients. Examples: invalid_input, missing_required_parameter, conflicting_parameters, operator_not_found, license_not_found, jurisdiction_not_found, route_not_found, api_key_missing, malformed_header, api_key_invalid, api_key_revoked, quota_exceeded, export_requires_pro, export_daily_limit_reached, as_of_not_supported, dataset_not_found, internal_error.

string
field

Present only when the error maps to a specific request input field (query param, path param, body key). Omitted for errors that aren’t field-scoped (e.g. rate_limited, auth_revoked).

string
suggestion

Optional human-readable / agent-actionable hint describing how to resolve the error.

string
{
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
{
"error": "API key has been revoked",
"code": "auth_revoked",
"details": {
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
}

Missing / malformed / revoked API key.

object
error
required

Human-readable error summary.

string
code
required

HTTP-status-level class. Stable enum; branch on details.reason for finer control. Current values: invalid_query, invalid_slug, invalid_license_id, invalid_jurisdiction_code, invalid_pagination, not_found, auth_required, auth_invalid, auth_revoked, payment_required, quota_exceeded, rate_limited, server_error.

string
details
required
object
reason
required

Machine-readable refinement of the top-level code. Stable vocabulary; branch on this in clients. Examples: invalid_input, missing_required_parameter, conflicting_parameters, operator_not_found, license_not_found, jurisdiction_not_found, route_not_found, api_key_missing, malformed_header, api_key_invalid, api_key_revoked, quota_exceeded, export_requires_pro, export_daily_limit_reached, as_of_not_supported, dataset_not_found, internal_error.

string
field

Present only when the error maps to a specific request input field (query param, path param, body key). Omitted for errors that aren’t field-scoped (e.g. rate_limited, auth_revoked).

string
suggestion

Optional human-readable / agent-actionable hint describing how to resolve the error.

string
{
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
{
"error": "API key has been revoked",
"code": "auth_revoked",
"details": {
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
}

Export is a Pro feature: Starter and legacy trial keys see the endpoint and get this, never a row. (A canceled or plan-less account gets plan_inactive instead.)

object
error
required

Human-readable error summary.

string
code
required

HTTP-status-level class. Stable enum; branch on details.reason for finer control. Current values: invalid_query, invalid_slug, invalid_license_id, invalid_jurisdiction_code, invalid_pagination, not_found, auth_required, auth_invalid, auth_revoked, payment_required, quota_exceeded, rate_limited, server_error.

string
details
required
object
reason
required

Machine-readable refinement of the top-level code. Stable vocabulary; branch on this in clients. Examples: invalid_input, missing_required_parameter, conflicting_parameters, operator_not_found, license_not_found, jurisdiction_not_found, route_not_found, api_key_missing, malformed_header, api_key_invalid, api_key_revoked, quota_exceeded, export_requires_pro, export_daily_limit_reached, as_of_not_supported, dataset_not_found, internal_error.

string
field

Present only when the error maps to a specific request input field (query param, path param, body key). Omitted for errors that aren’t field-scoped (e.g. rate_limited, auth_revoked).

string
suggestion

Optional human-readable / agent-actionable hint describing how to resolve the error.

string
{
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
Example
{
"error": "CSV/JSON export is a Pro feature",
"code": "payment_required",
"details": {
"reason": "export_requires_pro",
"plan_tier": "starter",
"required_plan": "pro",
"suggestion": "CSV/JSON export is part of Pro. Pro isn't open yet — email founder@igregulator.io to get access or to hear when it opens."
}
}
X-Upgrade-URL
string format: uri

No row matched.

object
error
required

Human-readable error summary.

string
code
required

HTTP-status-level class. Stable enum; branch on details.reason for finer control. Current values: invalid_query, invalid_slug, invalid_license_id, invalid_jurisdiction_code, invalid_pagination, not_found, auth_required, auth_invalid, auth_revoked, payment_required, quota_exceeded, rate_limited, server_error.

string
details
required
object
reason
required

Machine-readable refinement of the top-level code. Stable vocabulary; branch on this in clients. Examples: invalid_input, missing_required_parameter, conflicting_parameters, operator_not_found, license_not_found, jurisdiction_not_found, route_not_found, api_key_missing, malformed_header, api_key_invalid, api_key_revoked, quota_exceeded, export_requires_pro, export_daily_limit_reached, as_of_not_supported, dataset_not_found, internal_error.

string
field

Present only when the error maps to a specific request input field (query param, path param, body key). Omitted for errors that aren’t field-scoped (e.g. rate_limited, auth_revoked).

string
suggestion

Optional human-readable / agent-actionable hint describing how to resolve the error.

string
{
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
{
"error": "API key has been revoked",
"code": "auth_revoked",
"details": {
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
}

Today’s exports are used up (export_daily_limit_reached, with Retry-After = seconds to 00:00 UTC), or the monthly quota / per-second limit the key hits everywhere.

object
error
required

Human-readable error summary.

string
code
required

HTTP-status-level class. Stable enum; branch on details.reason for finer control. Current values: invalid_query, invalid_slug, invalid_license_id, invalid_jurisdiction_code, invalid_pagination, not_found, auth_required, auth_invalid, auth_revoked, payment_required, quota_exceeded, rate_limited, server_error.

string
details
required
object
reason
required

Machine-readable refinement of the top-level code. Stable vocabulary; branch on this in clients. Examples: invalid_input, missing_required_parameter, conflicting_parameters, operator_not_found, license_not_found, jurisdiction_not_found, route_not_found, api_key_missing, malformed_header, api_key_invalid, api_key_revoked, quota_exceeded, export_requires_pro, export_daily_limit_reached, as_of_not_supported, dataset_not_found, internal_error.

string
field

Present only when the error maps to a specific request input field (query param, path param, body key). Omitted for errors that aren’t field-scoped (e.g. rate_limited, auth_revoked).

string
suggestion

Optional human-readable / agent-actionable hint describing how to resolve the error.

string
{
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
Example
{
"error": "Daily export limit reached",
"code": "rate_limited",
"details": {
"reason": "export_daily_limit_reached",
"current_usage": 10,
"limit": 10,
"reset_at": "2026-10-01T00:00:00.000Z",
"plan_tier": "pro",
"suggestion": "Your plan includes 10 exports per UTC day, API and dashboard together; the counter resets at reset_at (00:00 UTC). Need more? Email founder@igregulator.io."
}
}
Retry-After
integer
X-Export-Daily-Limit
string

Exports per UTC day on your plan (API + dashboard together), or unlimited.

X-Export-Daily-Used
integer

Exports made today, this one included. Omitted when unlimited.

X-Export-Daily-Remaining
integer

Exports left today. Omitted when unlimited.

X-Export-Daily-Reset
string format: date-time

Next 00:00 UTC, when the daily counter starts again.

Unexpected server error.

object
error
required

Human-readable error summary.

string
code
required

HTTP-status-level class. Stable enum; branch on details.reason for finer control. Current values: invalid_query, invalid_slug, invalid_license_id, invalid_jurisdiction_code, invalid_pagination, not_found, auth_required, auth_invalid, auth_revoked, payment_required, quota_exceeded, rate_limited, server_error.

string
details
required
object
reason
required

Machine-readable refinement of the top-level code. Stable vocabulary; branch on this in clients. Examples: invalid_input, missing_required_parameter, conflicting_parameters, operator_not_found, license_not_found, jurisdiction_not_found, route_not_found, api_key_missing, malformed_header, api_key_invalid, api_key_revoked, quota_exceeded, export_requires_pro, export_daily_limit_reached, as_of_not_supported, dataset_not_found, internal_error.

string
field

Present only when the error maps to a specific request input field (query param, path param, body key). Omitted for errors that aren’t field-scoped (e.g. rate_limited, auth_revoked).

string
suggestion

Optional human-readable / agent-actionable hint describing how to resolve the error.

string
{
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
{
"error": "API key has been revoked",
"code": "auth_revoked",
"details": {
"reason": "api_key_revoked",
"suggestion": "Generate a new API key at https://app.igregulator.io/api-keys. Revoked keys cannot be restored."
}
}