Research & Innovation

Can You Actually Use This Model? A Licence and Availability Checklist

"Open" has stopped carrying information. Here is the ten-minute audit — API licence field, gating status, whether the weights exist, whether the repo exists, and what NOASSERTION means — before you build on anything.

Everything in today’s round needed this check, and each one failed or passed in a different place. Bria’s FIBO 2.0 is trained on 100% licensed data and ships CC BY-NC 4.0 gated weights. RoboParty’s RP1 is genuinely open on 34 of 71 repos and unlicensed on 18. GenXR-Bench’s “code available” link 404s. RLMuscle’s repo is real and carries no licence.

None of that is visible from a README badge. Here is how to find it out.

The three words people use interchangeably

  • Open source — the code is licensed under terms that let you use, modify and redistribute it. Says nothing about weights.
  • Open weights — the weights are downloadable. Says nothing about what you may do with them. This is where most of the confusion lives.
  • Open access — you can use it, usually through an API. Often means you can download nothing at all.

A model can be open-weights and non-commercial. It can be open-source code with no weights. It can be neither while being described as both.

Step 1: ask the API, not the page

The model card is marketing with a licence field. The API is the licence field.

curl -s "https://huggingface.co/api/models/<org>/<model>" \
  | python3 -c "
import sys,json
d=json.load(sys.stdin)
print('license :', [t for t in d.get('tags',[]) if t.startswith('license')])
print('gated   :', d.get('gated'))
print('created :', d.get('createdAt','')[:10])
print('files   :', [f['rfilename'] for f in d.get('siblings',[])][:10])
"

Four things come back and all four matter.

license is the authoritative tag. Watch for license:other — that means a custom licence, and custom licences are where the restrictions are. FIBO 2.0 reports license:other and tags itself bria-fibo; the actual terms are CC BY-NC 4.0 with commercial use by separate agreement. You would not learn that from the tag alone, but the tag tells you to go and read.

gated is the one people miss. gated: auto or gated: manual means there is a form between you and the weights, and agreeing to it is a contract. Both FIBO repos are gated. A gated model cannot be part of an automated pipeline without a token and an accepted agreement, which has consequences for CI, for collaborators, and for anyone who forks your project.

createdAt catches the thing that bit us this round: a repo appearing in a trending list is not a new release. Comfy-Org/Z-Image-Turbo showed up in our tracker’s “new to the tracked set” table with 8.8 million downloads — it was created 331 days earlier. It entered a top-500 cut, it was not published.

files is how you check the weights are there at all. If the sibling list is a README, a .gitattributes and some PNGs, there are no weights in that repo.

Step 2: check the weights exist, both ways

A model card can announce weights that were never uploaded. Verify in both directions: the card claims them, and the file listing contains them.

curl -s "https://huggingface.co/api/models/<org>/<model>" \
  | python3 -c "
import sys,json
d=json.load(sys.stdin)
f=[s['rfilename'] for s in d.get('siblings',[])]
w=[x for x in f if x.endswith(('.safetensors','.bin','.gguf','.pt','.onnx'))]
print(f'{len(w)} weight files of {len(f)} total')
[print(' ',x) for x in w[:12]]
"

Zero weight files and a confident model card is a real combination. It happened with Voxtral 3, where Mistral shipped Apache-2.0 weights for one model and nothing downloadable for the next.

Step 3: for research code, query the org

If a paper says “code available,” check the repo rather than the sentence.

curl -s "https://api.github.com/repos/<owner>/<repo>" \
  -o /dev/null -w "%{http_code}\n"

404 ends the conversation. It is not rare.

If it exists, get the licence — and if you are assessing a whole project, get all of them at once:

curl -s "https://api.github.com/orgs/<org>/repos?per_page=100" \
  | python3 -c "
import sys,json,collections
d=json.load(sys.stdin)
c=collections.Counter((r.get('license') or {}).get('spdx_id','NONE') for r in d)
for k,v in c.most_common(): print(f'{k:18} {v}')
print()
for r in d:
    l=(r.get('license') or {}).get('spdx_id','NONE')
    if l in ('NONE','NOASSERTION') and r['stargazers_count']>=10:
        print(f\"unlicensed: {r['name'][:30]:30} {l:13} {r['stargazers_count']} stars\")
"

That is the exact command that produced our RoboParty audit, and the “unlicensed with stars” filter is the useful part — it surfaces the repos people are actually depending on without permission to.

Step 4: know what the three bad values mean

  • NONE — no licence file. Under default copyright this is all rights reserved. Public does not mean permitted. You may read it; you may not safely build on it.
  • NOASSERTION — there is a licence-like file that GitHub’s classifier could not match to a known licence. Could be a custom research licence with field-of-use restrictions, a modified MIT, or a LICENSE file containing only a citation request. You have to open it and read it. There is no shortcut.
  • license:other on Hugging Face — same situation, same remedy.

Step 5: read the licence for the two clauses that decide it

Once you have the actual text, you are looking for two things:

  1. Commercial use. Permitted, prohibited, or permitted-by-separate-agreement. NC in a licence name means non-commercial, full stop — CC BY-NC 4.0 is not a commercial licence no matter how clean the training data is.
  2. Copyleft reach. GPL-3.0 requires derivative work you distribute to carry the same terms. For research that is usually fine. For a product it is a decision to make deliberately, early. CERN-OHL-W-2.0 is the hardware equivalent and a genuine open-hardware licence — if you see it, someone has thought about this properly.

Permissive (MIT, Apache-2.0, BSD) means roughly “do what you like, keep the notice.” Apache-2.0 additionally grants patent rights, which is why it is the better default for anything model-shaped.

The ten-minute version

  1. Query the HF API: licence tag, gated, createdAt, file list.
  2. Confirm weight files exist by extension.
  3. curl the GitHub repo for a status code before believing “code available.”
  4. Pull SPDX licences for the whole org; flag NONE and NOASSERTION.
  5. Open every custom licence and find the commercial-use and copyleft clauses.
  6. Write down what you found, with the date, because licences change under you.

That last point is not pedantry. A model’s licence is a fact about a moment. Record which day you checked, the way you would record a citation — then when a repo relicenses, you know what you agreed to and when.

Sources