---
title: "List configured CKAN portals"
method: GET
path: "/api/v1/opendata/portals"
tags: ["Public Finance & Government"]
---

# List configured CKAN portals

`GET /api/v1/opendata/portals`

Registered government open-data CKAN portals served by the Sugra universal adapter. Returns each portal's slug, display name, country, CKAN action base URL, default licence, upstream CKAN version (when reported), and verified dataset count at registration. Use the `portal` slug as the `{portal}` path segment on the other seven opendata endpoints.

## Response `200`

Portal registry with base URLs, licences, and dataset counts.

- EnvelopeOpendataPortalsPayload
  - `data` OpendataPortalsPayload, required — Response payload for `/api/v1/opendata/portals`.
    - `count` integer, required — Number of portals registered in the Sugra opendata adapter.
    - `portals` OpendataPortalEntry[], required — Registered CKAN portals with configuration snapshot.
      - `portal` string, required — Portal slug (lowercase-hyphen) used in the URL path.
      - `name` string, required — Portal display name (upstream host).
      - `country` string, required — Jurisdiction covered by the portal.
      - `country_code` string, required — ISO 3166-1 alpha-2 country code.
      - `base_url` string, required — CKAN action-API base URL (what Sugra calls upstream).
      - `licence` string, required — Default open-data licence advertised by the portal.
      - `ckan_version` string, nullable — Upstream-reported CKAN version, or null when `status_show` is blocked.
      - `datasets_count` integer, required — Dataset count verified on 2026-04-18 (informational).
      - `status_blocked` boolean, required — True when the portal blocks CKAN `status_show` at a front proxy.
      - `notes` string, nullable — Portal-specific notes (path quirks, locale, known soft-404 surfaces).
  - `meta` SugraMeta, required — Metadata attached to every /api/v1/* response envelope.
    - `endpoint` string, required — Requested endpoint path.
    - `data_time` string, required — ISO 8601 UTC timestamp of the source data, not of the request.
    - `response_time` string, required — ISO 8601 UTC timestamp when this response was produced.
    - `provider` string, required — API name and version.
    - `source` string, nullable — Identifier of the primary upstream source used for this response.
    - `attribution` string, nullable — Human-readable attribution mandated by an upstream source (e.g. a securities regulator or self-regulatory organization). Present only on responses whose source requires the owner and source to be clearly identified. Do not remove or alter it when using the response.
    - `fallback_used` boolean, nullable — True when the primary source failed and a fallback produced the data.
    - `fallback_chain` string[], nullable — Ordered list of sources attempted, in the order they were tried.
    - `cached` boolean, nullable — True when this response was served from the internal cache.
    - `stale` boolean, nullable — True when the cached response was returned after the upstream rate-limited or errored. Clients can use this to detect degraded data.

## Other responses

- `401` — Missing or invalid `x-api-key` header. JSON body with a stable `code` distinguishing `missing_api_key` (no header sent) from `invalid_api_key` (header sent, key not accepted); any other 401 source carries the generic `unauthorized` with its detail as `reason`. Plus `hint`. `plan` is always null on 401 - an unauthenticated request has no plan; quota exhaustion is 429, not 401.
- `429` — Daily rate limit exceeded. Check `X-RateLimit-Reset` for the next window.
- `503` — Upstream source is temporarily unavailable. Retry after a short delay.

---

[API](https://skmtc.net/sugra/apis/sugra-api.md) · [All operations](https://skmtc.net/sugra/apis/sugra-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sugra/sugra-api/versions/4c4530760ba1/schema)
