List Dataset Refresh Runs
const url = 'https://example.com/datasets/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/refresh-runs?skip=0&limit=50';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://example.com/datasets/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/refresh-runs?skip=0&limit=50'Refresh history for a dataset: every attempt, including the failures.
Durable across the ingest_jobs retention purge — that purge is why this
table exists rather than the jobs table serving as the record (#1219).
Access follows Rule 1 on the read path, and ADR-002 Decision 4e adds field redaction on top: a caller who is neither the dataset owner nor an admin sees the timeline and outcomes but not who triggered each run, nor the failure text, nor the schema diff. Without that, a PUBLIC dataset’s history enumerates its editors and leaks origin detail through error strings. The redaction is tested against a NAMED signed-in third party as well as an anonymous reader; a requester-scoped check that only exercises the anonymous case reads as complete and is not.
The owner-or-admin predicate (can_view_dataset_provenance) was extracted
to authorization.py under #1316, which applies the same rule to dataset
reads and /versions/ — this endpoint’s redaction is no longer the odd
one out among the three.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Query Parameters
Section titled “ Query Parameters ”Responses
Section titled “ Responses ”Successful Response
object
One refresh attempt, success or failure (ADR-002 Decision 4).
Five fields are redacted for callers who are neither the dataset owner nor
an admin: triggered_by, triggered_by_username, error_code,
error_message and schema_diff. A public dataset’s refresh history
otherwise enumerates who edits it, and failure text leaks internal origin
detail. The redaction is enumerated against NAMED third-party readers as
well as anonymous ones — a signed-in stranger is the case that gets
missed.
object
The run’s execution door, not the dataset’s origin: upload, postgis, service, stac, or raster. The two can visibly diverge; for example a STAC-imported raster’s pending or failed replace run is recorded ‘upload’ while the dataset’s origin stays ‘stac’ until the replace succeeds. ‘raster’ itself is reserved for a future, distinct raster-replace door label, with today’s raster-replace runs recorded ‘upload’.
Manual, api, or cli
Pending, running, succeeded, failed, or cancelled
Dispatch time, not claim time — queue wait is visible
object
Columns present in new but not old schema
object
Columns present in old but not new schema
object
Columns whose data type changed
object
Example generated
{ "runs": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "dataset_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "dataset_version_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "ingest_job_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "origin_kind": "example", "trigger": "example", "status": "example", "triggered_by": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "triggered_by_username": "example", "started_at": "2026-04-15T12:00:00Z", "claimed_at": "2026-04-15T12:00:00Z", "finished_at": "2026-04-15T12:00:00Z", "feature_count_before": 1, "feature_count_after": 1, "schema_diff": { "columns_added": [ { "name": "example", "type": "example" } ], "columns_removed": [ { "name": "example", "type": "example" } ], "type_changes": [ { "name": "example", "old_type": "example", "new_type": "example" } ], "row_count_old": 1, "row_count_new": 1, "row_count_delta": 1 }, "error_code": "example", "error_message": "example" } ], "total": 1}Bad request — invalid payload
Unauthorized — missing or invalid credentials
Forbidden — caller lacks access to this resource
Not found
Conflict — resource state prevents the operation
Validation error
Too many requests — retry after the advertised interval
Headers
Section titled “ Headers ”Seconds until the request may be retried
Internal server error
Service unavailable — the database could not serve the request