BYTETOOLS

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.

No API key requiredHTTPSFree tier

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
curl 'https://api.snapcraft.io/v2/snaps/info/hello' \
  -H 'Snap-Device-Series: 16'
JavaScript (fetch)
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);
Python (requests)
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())
Response — HTTP 200 (truncated)
{
  "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

ParameterTypeRequiredDescription
{name}pathRequiredThe snap name as published in the store. hello
Snap-Device-SeriesheaderRequiredMust be sent as `16`. Omitting it returns 400 on every request. 16
fieldsstringOptionalComma-separated list to trim the response, which is large by default. version,revision,download
architecturestringOptionalRestrict 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

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.