Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Open Data

De facto standards for the open-data layer, published by the API Commons.

Nobody ratified CKAN's Action API as the open-data standard. It became one because government after government installed the same software, and a client written against one national portal now works against hundreds of city, state and research catalogues by changing a hostname.

This repository writes that interface down — and it is the only profile in this programme that is AUTHORED rather than derived, because CKAN publishes no machine- readable specification of its own Action API.

Where the action list comes from, and where it does not

The obvious shortcut was to count how often each action appears across the catalog's CKAN entries. That number is worthless. Run it and status_show comes out at 81% and package_search at 14%, which would make a health check the most-supported action in CKAN. It is not: our own harvester fingerprints portals by calling status_show, and four of the 'actions' it turned up came out of error catalogs we generated ourselves. The number measured us.

So the action list is enumerated from ckan/logic/action/*.py in CKAN's own repository — 134 actions, 65 of them reads — and support is established by calling them.

Action Tier Portals serving Share
organization_list_for_user core 36 100.0%
status_show core 36 100.0%
dataset_followee_count core 35 97.2%
dataset_followee_list core 35 97.2%
dataset_follower_list core 35 97.2%
get_site_user core 35 97.2%
group_followee_count core 35 97.2%
group_followee_list core 35 97.2%

A version-drift cohort, not a reimplementation cohort

Every other standard in this programme is implemented by independent teams writing their own servers, where divergence is a design choice. CKAN is not. These portals run the SAME SOFTWARE at different releases — 30 distinct ones in this sample, from 2.2b to 3.0.0 — so an absent action usually means an older CKAN rather than a decision. Every registry entry carries its software_version, and the matrix reports support per release rather than as one number.

Probing public-sector servers

48 portals were probed read-only, 36 produced usable results. One request at a time, a delay between every call, an identifying user agent, and a hard stop on 429. No write action was ever called: this probe runs anonymously, and an anonymous write attempt against a government server would be both useless and rude.

Response What it means
success: true The action is supported
unknown-action error The only proof an action is absent
403 Authorization Error Implemented and credential-gated
409 Validation Error Implemented, wrong arguments

The status code is never where the answer is. CKAN returns the same envelope whether an action succeeded, was refused for credentials, was given bad arguments, or does not exist — so a client that checks the status rather than success in the body is reading the wrong thing.

Two controls, because one is not enough

Every portal is asked for an action that cannot exist. A portal that does not say so has no working discriminator, and nothing it reports is recorded.

That alone was not enough. catalog.data.gov answers 404 to every action including status_show — so it passes a negative control, because it does say no to an action that cannot exist, and then reads as a CKAN portal with every action missing. A discriminator has to be shown to say yes as well as no, so every portal also gets a positive control: status_show, present in every CKAN release. A portal that cannot serve it is not serving the Action API at that base URL, whatever our catalog recorded.

12 portals were excluded this way — 9 blocked, 1 inconclusive, 2 unreachable.

What's here

standard/ckan-action-v3/
  profile.yml        134 actions, each with its tier and the evidence
  openapi.yml        one path per action, x-tier on each, the shared response envelope
  schema/            JSON Schema 2020-12 for the envelope and each core action
  mcp/tools.json     MCP tool definitions for the core tier
  arazzo/            status_show, then package_search, then package_show on the result
  spectral/          generated from the profile, with fixtures and a harness
adopters/
  ckan-action-v3.yml        48 entries, each with its portal, date and CKAN release
  ckan-action-v3-matrix.md  action by portal, and support by release
scripts/             every artifact above is generated; none is hand-maintained

Check a portal

python3 scripts/probe-adopters.py --endpoints endpoints.json --out probe.json

Or lint a document that claims to describe a CKAN-compatible API:

npx @stoplight/spectral-cli lint their-openapi.yaml \
  -r https://raw.githubusercontent.com/api-commons/open-data/main/standard/ckan-action-v3/spectral/ckan-profile.yaml

Who reaches the core tier

6 of 36 probed portals serve every core action. 30 serve some of it, which on this cohort usually means an older release rather than a choice. 12 could not be probed and carry no tier, because a portal we could not read is not a portal that failed.

Provenance

Action names enumerated from ckan/ckan at commit 0731a7a4ab76dd11889eb89a892b3feae4fd69a8.

CKAN the software is AGPL-3.0. That governs the code, not a description of the HTTP surface it serves — and this profile is authored from CKAN's own source and from live observation rather than copied from any document. Nothing here implies endorsement by CKAN, by the Open Knowledge Foundation, or by any portal named in the registry.

Part of API Commons

Related

License

Artifacts are CC BY-NC-SA 4.0. Code in scripts/ is Apache-2.0.

About

De facto standards for the open-data layer — the CKAN Action API authored from CKAN's own source and graded by probing live government portals across 30 releases.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages