A model gets announced. The post says "open weights." Someone drops a Hugging Face repo ID in the thread. You are about to plan a week of work around it.
The check takes one command. What takes longer is knowing how to read the answer, because all three of the obvious signals lie to you in different ways.
Everything below is real output from 2026-07-27. You can re-run all of it right now, unauthenticated.
Probe 1: does the repo resolve?
curl -s -o /dev/null -w '%{http_code}\n' \
https://huggingface.co/api/models/moonshotai/Kimi-K3
401
Here is the trap. A 401 reads like "it exists, you just need to log in" — a gated release. So people log in, still see nothing, and conclude the gate is strict rather than that the shelf is empty.
Ask a repo that definitely does not exist:
curl -s https://huggingface.co/api/models/does-not-exist/nope
curl -s https://huggingface.co/api/models/moonshotai/Kimi-K3
{"error":"Invalid username or password."}
{"error":"Invalid username or password."}
Byte-identical. 401 carries zero information about existence.
And gating does not even produce a 401. A genuinely gated repo answers 200 and tells you it is gated:
curl -s https://huggingface.co/api/models/meta-llama/Llama-3.1-8B-Instruct \
| jq '{gated, private, downloads}'
{
"gated": "manual",
"private": false,
"downloads": 8041649
}
So the rule is the opposite of the intuitive one: gated releases are visible anonymously. A 401 means there is nothing there to be gated.
Probe 2: what did the org actually publish last?
Skip the rumoured ID entirely and ask the org what it has shipped:
curl -s 'https://huggingface.co/api/models?author=moonshotai&sort=lastModified&direction=-1&limit=5' \
| jq -r '.[] | "\(.lastModified) \(.id)"'
2026-06-15T07:49:29.000Z moonshotai/Kimi-K2.7-Code
2026-05-19T09:01:54.000Z moonshotai/Kimi-K2.6
2026-04-30T03:56:40.000Z moonshotai/Kimi-K2.5
2026-04-23T02:08:36.000Z moonshotai/Kimi-K2-Instruct
2026-01-30T04:53:11.000Z moonshotai/Kimi-VL-A3B-Thinking-2506
The newest thing Moonshot has published is Kimi-K2.7-Code, six weeks old. Same question to Qwen:
2026-07-22T11:58:47.000Z Qwen/Qwen3-ASR-0.6B-hf
2026-07-22T11:58:31.000Z Qwen/Qwen3-ASR-1.7B-hf
2026-06-26T08:42:38.000Z Qwen/Qwen3-ForcedAligner-0.6B-hf
2026-06-25T07:24:16.000Z Qwen/Qwen-AgentWorld-35B-A3B
2026-05-28T08:07:27.000Z Qwen/Qwen-Image-Bench
Active orgs, shipping regularly. Neither has published the thing being discussed. This probe is the one that actually settles the question, because it cannot be defeated by a wrong guess at the repo ID.
Probe 3: search, and meet the two decoys
curl -s 'https://huggingface.co/api/models?search=Kimi-K3&limit=10' \
| jq -r '.[] | "\(.id) likes=\(.likes) downloads=\(.downloads)"'
audnai/penclaw-Kimi-K3.0-abliterated-GGUF likes=82 downloads=0
HFVwr/kimi-k3-article-svg-preview likes=2 downloads=0
StephYang/qwen3-32B-kimi-k3-8k likes=0 downloads=0
Three hits, and the two interesting ones fail in opposite directions.
Decoy 1 — the right name, no weights. audnai/penclaw-Kimi-K3.0-abliterated-GGUF, created 2026-07-18, 82 likes. Ask it what files it holds:
curl -s https://huggingface.co/api/models/audnai/penclaw-Kimi-K3.0-abliterated-GGUF \
| jq -r '.siblings[].rfilename'
.gitattributes
README.md
Eighty-two people endorsed a repository containing no model. Likes are a social signal, not a storage signal, and on a page like this the two point in opposite directions.
Decoy 2 — real weights, wrong model. StephYang/qwen3-32B-kimi-k3-8k, created 2026-07-26, ships 14 genuine safetensors shards. It is a Qwen3-32B derivative wearing the name. If your check was "are there weight files," it passes.
The third hit is a bag of .svg diagrams. Search matches strings, not artifacts.
The positive control: what a real release looks like
Run the same probes against something indisputably released, so you know the shape you are looking for:
curl -s https://huggingface.co/api/models/openai/gpt-oss-120b \
| jq '{gated, downloads, files: (.siblings|length),
shards: ([.siblings[].rfilename | select(endswith(".safetensors"))] | length)}'
{
"gated": false,
"downloads": 4380610,
"files": 37,
"shards": 22
}
Twenty-two shards, a model.safetensors.index.json, a LICENSE blob, four million downloads. That is what "released" leaves behind. Not one of those is present on a repo that is only a name.
The checklist
REPO=org/model-name; ORG=org
# 1. Does it resolve at all? (401 == no information, not "gated")
curl -s -o /dev/null -w '%{http_code}\n' "https://huggingface.co/api/models/$REPO"
# 2. What has the org ACTUALLY published, most recent first?
curl -s "https://huggingface.co/api/models?author=$ORG&sort=lastModified&direction=-1&limit=5" \
| jq -r '.[] | "\(.lastModified) \(.id)"'
# 3. Is there storage behind the name — shards, a licence?
# `.siblings // []` matters: on a 401 there is no siblings key, and bare
# `.siblings[]` aborts with "Cannot iterate over null" on exactly the repos
# you most want to check.
curl -s "https://huggingface.co/api/models/$REPO" \
| jq '{gated, downloads,
shards: ([(.siblings // [])[].rfilename | select(endswith(".safetensors"))] | length),
licence: [(.siblings // [])[].rfilename | select(test("license"; "i"))]}'
# 4. Who else is squatting the name?
curl -s "https://huggingface.co/api/models?search=${REPO#*/}&limit=10" \
| jq -r '.[] | "\(.id) likes=\(.likes) downloads=\(.downloads)"'
Four commands, no auth, under a minute. The failure mode worth internalising is that an announcement, a benchmark table, and a repo with 82 likes can all exist while the weights do not. Downloads and shard counts are the only signals in that list that require someone to have actually uploaded a model.
I keep a running tracker of the Kimi K3 / Qwen 3.8 case specifically — which architecture claims are checkable, where each benchmark number originates, and an update log for when files do appear — over on my site. If you would rather just have the reproducible checks, the four commands above are the whole method.
The one habit worth keeping: when someone says open weights, ask the org what it published, not the rumour what it is called.
Top comments (0)