Product · subscription
license_drift
The dataset or API you're already ingesting can change its license or terms text without ever telling you — no changelog entry, no email, just a silently different clause the next time you pull it. This watches the exact text over time and flags real drift the moment it happens — a changed hash, a changed clause — with the exact diff, never a silent "still fine". Also classifies the risk of a license/terms text on request: derivative-work rights, PII exposure tier, always with the evidence it was computed from.
Real example — license risk classification
Input (a real NKO-catalogued source, one of 91 tracked internally):
{
"id": "miteco-memoria-residuos",
"license": "Ley 37/2007 reutilizacion sector publico (LGA), cita obligatoria",
"commercial_reuse": true,
"redistribution": "con atribucion"
}
Real output (same function NKO runs internally):
{
"clase": "permissive",
"riesgos": {
"derivative_work_rights": "no_hasta_verificar",
"pii_tier": "elevated"
},
"evidencia": {
"license_declared": "Ley 37/2007 reutilizacion sector publico (LGA), cita obligatoria",
"commercial_reuse_declared": true,
"redistribution_declared": "con atribucion"
},
"disclaimer": "Risk classification based on declared license text - NOT legal advice.",
"method_version": "nko-license-drift-v0.1-2026-09-01"
}
Live public watch (real corpus, running daily, not illustrative):
7 real datasets with a documented history of license/terms
instability, checked once a day: laion/relaion2B-en-research-safe
(LAION's re-release after the 2023 CSAM takedown),
bigcode/the-stack-v2
(reworked after DMCA opt-out claims), allenai/c4,
EleutherAI/pile
(includes the Books3 subset, pulled after copyright suits),
codeparrot/github-code,
hendrycks/competition_math
(disabled after a real 2025 DMCA from Art of Problem Solving), and
Lurunchik/WikiHowNFQA
(disabled after a real DMCA from wikiHow, Inc.).
Method: snapshot the dataset's own metadata (license, gated status,
tags — the fields that represent real terms, excluding
download/like counters that change on every check without
meaning anything) once a day, archived with a date whether or not
anything changed; a real change fires a
license_drift_detected telemetry event, never
silently.
{
"status": "unchanged",
"dataset_id": "laion/relaion2B-en-research-safe",
"terms_hash": "1d13f71dacf42e6075a6680c44de5fcdf9dc46b5e98150bee0e0ec93769853e8",
"checked_at": "2026-09-03T07:00:00Z",
"drift_count": 0,
"first_seen": "2026-09-01T19:40:17Z"
}
Real status as of today: 0 real drift events across all 7 — which
is the honest, expected result, not a null test. The
classification/risk function (classify_license()) is
separately dogfooded internally against NKO's own 91 catalogued
sources.
Controlled fixture — same diff function NKO runs internally
(license_drift_diff.diff_canonical()), given a
synthetic before/after pair, to show the full chain end to end
since no real drift has occurred yet in the 7-dataset public
corpus above. This is illustrative input, not a captured real
event — labeled as such, never presented as if it happened:
{
"dataset_id": "example/dataset",
"status": "drift_detected",
"first_seen": "2026-08-15T07:00:00Z",
"last_known_safe": "2026-09-02T07:00:00Z",
"checked_at": "2026-09-03T07:00:00Z",
"drift_count": 1,
"severity": "HIGH",
"changes": [
{
"field": "cardData.license",
"old_value": "cc-by-4.0",
"new_value": "other",
"severity": "HIGH",
"machine_action": "REVIEW_LICENSE_TERMS_CHANGED"
},
{
"field": "tags:license",
"old_value": ["license:cc-by-4.0", "region:us"],
"new_value": ["license:other", "region:us"],
"added": ["license:other"],
"removed": ["license:cc-by-4.0"],
"severity": "HIGH",
"machine_action": "REVIEW_LICENSE_TERMS_CHANGED"
}
]
}
Severity is a deterministic classification of WHICH field changed
— disabled/private=CRITICAL (the dataset
may have disappeared from under you), gated or
cardData.license=HIGH (the access condition or the
license itself changed), other metadata=MEDIUM, tags=LOW (unless a
license:* tag is what changed, treated as HIGH) —
never a probabilistic guess, and it never infers WHY a publisher
changed something, only WHAT changed.
Need a source we don't watch yet?
v0 only supports Hugging Face dataset IDs today. ModelScope, Kaggle, GitHub, an API terms-of-service URL, or a custom license URL are planned but not built. Leave your email and tell us what source you need — it tells us what to build next.
€19/month — your corpus, watched
Up to 25 Hugging Face dataset sources you choose, checked daily, real drift alerts
(structured per-field diff with severity, evidence attached, never a guess). One line per source below (bare
org/dataset id, or paste the full huggingface.co URL — we normalize it).
Stripe Checkout, cancel anytime.