Snapcraft Store API
Query the Snap Store for a package's channels, architectures, revisions and download URLs. No key, but one required header catches everyone out. Live example.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Snapcraft Store API?
The Snap Store exposes a public API at `https://api.snapcraft.io/v2/snaps/info/{name}`. It returns a channel map covering every track, risk level and architecture, each with its revision, version, size and download URL. No API key is needed, but the request must carry a `Snap-Device-Series: 16` header.
The single most important thing about this API is the header. Without `Snap-Device-Series: 16` every request fails with 400, regardless of how correct the URL is, and the error body does not make the cause obvious. That header exists because the store models clients as devices on a series, a design inherited from Ubuntu Core, and 16 remains the current value.
What you get back is a `channel-map`, which is the store's core concept made concrete. Snaps are published to a track (usually `latest`), a risk level (`stable`, `candidate`, `beta`, `edge`) and an architecture, and each combination resolves to its own revision. So one snap name expands into many rows, and asking 'what version is it' only makes sense once you have fixed all three coordinates. Each row also carries a `sha3-384` digest, which is unusual and worth noting if you are scripting verification.
Quick facts
- Base URL
https://api.snapcraft.io/v2- Authentication
- No key or account, but the `Snap-Device-Series: 16` header is mandatory. Requests without it return 400.
- Rate limit
- Not published. The store is production infrastructure for millions of Linux machines, so behave and cache.
- Pricing
- Free.
- CORS
- Not enabled — call it from your server
- Official docs
- Read the docs
How to use the Snapcraft Store API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch a snap's channel map
GET https://api.snapcraft.io/v2/snaps/info/hello
curl 'https://api.snapcraft.io/v2/snaps/info/hello' \
-H 'Snap-Device-Series: 16'const res = await fetch("https://api.snapcraft.io/v2/snaps/info/hello", {
headers: {
"Snap-Device-Series": "16",
},
});
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
headers = {
"Snap-Device-Series": "16",
}
res = requests.get("https://api.snapcraft.io/v2/snaps/info/hello", headers=headers, timeout=20)
res.raise_for_status()
print(res.json()){
"channel-map": [
{
"channel": {
"architecture": "amd64",
"name": "stable",
"released-at": "2022-01-14T02:01:54.911048+00:00",
"risk": "stable",
"track": "latest"
},
"created-at": "2022-01-14T01:57:34.375432+00:00",
"download": {
"deltas": [],
"sha3-384": "3ed745c76ad474ea42c4860c56f35b33e51fe78e8b7734c0a488f65084a53e4d9bae0c271e1fdb99b698790811f50139",
"size": 106496,
"url": "https://api.snapcraft.io/api/v1/snaps/download/mVyGrEwiqSi5PugCwyH7WgpoQLemtTd6_42.snap"
},
"revision": 42,
"type": "app",
"version": "2.10"
},
{
"channel": {
"architecture": "arm64",
"name": "stable",
"released-at": "2022-01-14T02:01:58.246105+00:00",
"risk": "stable",
"track": "latest"
},
"created-at": "2022-01-14T01:57:55.737383+00:00",
"download": {
"deltas": [],
"sha3-384": "00b08c1cdf94b806c7adc369ac8ffd077935b0126421aa3c3f755e2cada7b9f9d9f2685b64d7c4eea1a316d5c4b8acab",
"size": 106496,
"url": "https://api.snapcraft.io/api/v1/snaps/download/mVyGrEwiqSi5PugCwyH7WgpoQLemtTd6_43.snap"
},
"revision": 43,
"type": "app",
"version": "2.10"
},
{
"channel": {
"architecture": "armhf",
"name": "stable",
"released-at": "2022-01-14T02:01:56.717583+00:00",
"risk": "stable",
"track": "latest"
},
"created-at": "2022-01-14T01:58:12.588026+00:00",
"download": {
"deltas": [],
"Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
{name} | path | Required | The snap name as published in the store. hello |
Snap-Device-Series | header | Required | Must be sent as `16`. Omitting it returns 400 on every request. 16 |
fields | string | Optional | Comma-separated list to trim the response, which is large by default. version,revision,download |
architecture | string | Optional | Restrict the channel map to one architecture instead of all of them. amd64 |
Response fields
channel-maparray- One entry per track, risk level and architecture combination. A single snap commonly produces dozens of rows.
channel-map[].channelobject- The coordinates of the row: `track`, `risk`, `name` (the combined form) and `architecture`.
channel-map[].versionstring- Upstream version string for that channel. Different risks routinely carry different versions.
channel-map[].revisioninteger- Store revision number, which is the true build identifier. Two channels sharing a version can point at different revisions.
channel-map[].download.urlstring- Direct `.snap` download URL for that revision.
channel-map[].download.sha3-384string- SHA3-384 digest of the file. Note the algorithm: it is not SHA-256, so use a hasher that supports SHA3.
channel-map[].download.sizeinteger- Download size in bytes.
channel-map[].released-at / created-atstring- ISO 8601 timestamps with microsecond precision for when the revision was released to that channel and when it was built.
What you can build with the Snapcraft Store API
- Check which version of a snap is on stable versus edge before rolling an update
- Mirror snap packages for an offline or bandwidth-constrained fleet
- Verify a downloaded `.snap` against the store's published SHA3-384 digest
- Audit which architectures a snap actually publishes for
- Monitor a snap for new revisions in a release-tracking dashboard
Common errors and how to fix them
400 on every request
The `Snap-Device-Series: 16` header is missing.
Fix: Add the header. This is the single most common failure and the error message does not name it clearly.
404
The snap name does not exist in the store.
Fix: Names are lowercase and hyphenated. Confirm on snapcraft.io before querying.
Enormous response
The default channel map covers every architecture and risk level.
Fix: Use the `fields` and `architecture` parameters to cut the payload down to what you actually need.
Snapcraft Store API — frequently asked questions
Why do I get a 400 from the Snapcraft API?
Almost always because the `Snap-Device-Series: 16` header is missing. It is mandatory on every request to the v2 endpoints even though no authentication is involved.
What is a channel map?
It is the expansion of a snap into every track, risk level and architecture combination the publisher supports, each resolving to a specific revision. One snap name yields many rows.
Which hash does the store publish?
SHA3-384, not SHA-256. Make sure your hashing library supports SHA3 before wiring up verification.
Can I download snaps through this API?
The API gives you a direct `download.url` per revision, so yes, though for normal use the `snap` client handles this and manages assertions for you.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Hash Comparer
Compare two hashes or strings side by side to check they match. Get a normalized equality verdict plus per-character diff highlighting, all offline in your browser.
JSON Viewer
View JSON as a collapsible interactive tree online. Expand and collapse nodes, search keys and values, and copy the JSONPath of any node privately.
Unit Converter
Convert between units of length, weight, temperature, area, volume, speed, time and data storage instantly, with a swap button and common conversion tables.
Snapcraft Store is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.