Nitrosamine Risk Assessment: An ICH M7 Workflow
A practical nitrosamine risk assessment workflow for NDSRIs: ICH M7 dual assessment, real CovaTox classifications, and where the QSAR goes out of domain.
Oliver Kraft
CovaSyn

You get a nitrosamine signal on an API. QA wants an ICH M7 classification, the structural basis written down, and a second, independent computational opinion - this week, not next quarter. And if the compound is an NDSRI (nitrosamine drug substance related impurity), there is no read-across standard sitting in a database waiting for you.
This article walks the assessment the way a practitioner actually runs it, with real outputs from the CovaTox covatox_ich_m7, covatox_assess_ichm7_batch and covatox_check_domain tools. It also shows the part most vendor material hides: where the statistical model tells you it does not know.
Why NDSRIs broke the old workflow
Classic nitrosamines - NDMA, NDEA - are small, well studied, and have carcinogenicity data you can cite. NDSRIs are different. They are formed when the API's own secondary or tertiary amine nitrosates, so the impurity is a drug-sized molecule that has never been tested in an Ames assay, has no IARC entry, and has no structural analogue with a published TD50.
That combination is what forces you into a computational assessment. ICH M7(R2) already expects one, and both FDA and EMA now expect a documented structure-based rationale for NDSRI limits (the agencies' Carcinogenic Potency Categorization Approach is built on exactly this kind of structural reasoning). The practical problem: the QSAR models you would normally lean on were trained on Ames data that contains very few drug-sized nitrosamines.
The ICH M7 dual assessment, concretely
ICH M7 asks for two complementary (Q)SAR methodologies: one expert-rule-based, one statistical. Two methods, one conclusion, both documented.
Here is covatox_ich_m7 on NDMA (CN(C)N=O), verbatim:
ich_class: 2- structural alert:
nitrosamine, evidencehigh, SMARTS[N;!$(NC=O)]N=O, matched atoms[1, 3, 4] - mechanism: "CYP2E1 activation to diazonium ion -> DNA alkylation", reference: IARC Monographs
statistical_score(Ames): 0.6905confidence: 0.628
Expert rule positive, statistical method positive, both agree: Class 2, a known structural alert with no supporting carcinogenicity data on the specific compound. TTC does not apply here. N-nitroso compounds sit in the ICH M7 cohort of concern, so the generic 1.5 µg/day TTC is off the table and you need a compound-specific acceptable intake. covatox_assess_ichm7_batch returns this explicitly rather than quietly printing a number: ttc_assessment.applicable: false, with the note "Class 2 (probable mutagen): TTC not applicable; control/elimination required."
That is the behaviour you want from a tool that will be cited in a filing.
The contrast case: an alert that does not become a Class 2
Run aniline (Nc1ccccc1) through the same tool:
ich_class: 3- structural alert:
aromatic_amine, evidencehigh, mechanism "Metabolic activation to nitrenium ion -> DNA adduct", reference Benigni & Bossa, 2006 statistical_score: 0.1677 (negative)confidence: 0.848
The alert fires. The statistical model disagrees. The result is Class 3 - alerting structure, unrelated to the drug substance, no mutagenicity data - not Class 2. This matters more than it looks: a system that maps "alert present" straight to "Class 2" is a SMARTS matcher with a compliance label on it, and reviewers spot that quickly. The two assessments have to be allowed to disagree, and the disagreement has to be visible in the record.
Worked example: an NDSRI on a secondary-amine API
Propranolol is a secondary amine, so the plausible NDSRI is N-nitroso-propranolol (CC(C)N(N=O)CC(O)COc1cccc2ccccc12). Running the batch tool with the API structure supplied as api_smiles gives per-impurity classification plus Tanimoto similarity to the parent, which is what you need to argue that an impurity is drug-related rather than a process contaminant.
Real covatox_assess_ichm7_batch output, five impurities against propranolol:
| Impurity | ICH M7 class | Ames QSAR score | Confidence | Tanimoto to API |
|---|---|---|---|---|
NDMA CN(C)N=O | 2 | 0.6905 | 0.628 | 0.023 |
NDEA CCN(CC)N=O | 2 | 0.7215 | 0.656 | 0.067 |
| N-nitroso-propranolol | 2 | 0.7206 | 0.655 | 0.563 |
| Aniline | 3 | 0.1677 | 0.848 | 0.122 |
| Benzoic acid | 5 | 0.0685 | 0.438 | 0.140 |
Summary block: 5 assessed, class counts {2: 3, 3: 1, 5: 1}, highest-risk impurity NDMA, TTC not applicable.
Two things are worth reading off this table. First, the similarity column separates the NDSRI (0.563 to the API) from the small-molecule nitrosamines (0.02 to 0.07) without you having to argue it by hand. Second, the Class 5 assignment for benzoic acid comes with a low confidence of 0.438 - the model is telling you the negative call is weakly supported, which is the correct posture for a "no alert, no concern" verdict.
The honest part: the QSAR is out of domain
This is where most nitrosamine tooling stops talking. Run covatox_check_domain on the same structures for the Ames endpoint:
| Compound | in_domain | Nearest Tanimoto (threshold 0.3) | Feature coverage |
|---|---|---|---|
| NDMA | false | 0.0 | 0.798 |
| N-nitroso-propranolol | false | 0.0 | 0.984 |
Both are flagged out of domain, with confidence_modifier 0.1. Nearest training-set similarity is 0.0 against a 0.3 threshold. For N-nitroso-propranolol the descriptor space is well covered (0.984) but there is no near neighbour, which is precisely the NDSRI problem: a drug-sized molecule whose reactive motif is under-represented in public Ames data.

So the Ames score of 0.7206 for N-nitroso-propranolol is not evidence. It is a directional signal that happens to agree with the expert rule. The defensible conclusion rests on the structural alert, its mechanism and the IARC reference - the statistical method is there because ICH M7 asks for a complementary method and because agreement between two independent methods is itself informative.
For calibration on where the underlying model is solid: on CovaTox's own scaffold holdout, the Ames classifier reaches 0.736 balanced accuracy (n_test = 1089; 0.848 on a random split). That is a respectable general mutagenicity model - and it is measured on chemistry that includes near neighbours in training, which nitrosamine NDSRIs do not have. Quote the benchmark, then quote the domain flag next to it.
A workflow that survives review
1. Enumerate. List every nitrosatable amine in the drug substance, the route, and the formulation (including nitrite in excipients). This step is chemistry, not software.
2. Classify. Run covatox_assess_ichm7_batch over the enumerated impurities with api_smiles set, so you get class, alert, mechanism, reference and API similarity in one record.
3. Record the domain check. covatox_check_domain for every compound where the statistical score is load-bearing. Attach the in_domain flag and nearest similarity to the assessment.
4. Resolve disagreements explicitly. Where the expert rule and the statistical method conflict, ICH M7 expects expert judgement and a documented rationale. Write it down; do not average the two.
5. Set the limit off the right framework. For cohort-of-concern nitrosamines, that is a compound-specific acceptable intake (CPCA or a read-across/TD50 argument), not the 1.5 µg/day TTC.
6. Confirm analytically. A Class 2 call drives an LC-MS/MS method at the AI-derived limit and a control strategy. The in silico work targets the analytical effort; it does not replace it.
What this does not tell you
- It is not a potency prediction. Class 2 says "probable mutagen"; it says nothing about the carcinogenic potency you need for an acceptable intake in µg/day.
- The statistical Ames score is out of domain for nitrosamines. Treat it as corroboration of the alert, never as a standalone negative.
- A negative result is weaker than a positive one. Absence of an alert plus a low QSAR score, at confidence 0.438 as in the benzoic acid case, is a screening outcome, not a clearance.
- The nitrosamine SMARTS
[N;!$(NC=O)]N=Odeliberately excludes N-nitrosoamides. Know what your alert set covers before you claim completeness. - Nothing here substitutes for an Ames test, an enhanced Ames protocol where required, or the analytical confirmation the agency will ask for.
Frequently asked questions
What is an NDSRI and why does it need a different risk assessment?
An NDSRI is a nitrosamine drug substance related impurity: the nitrosated form of the API itself, formed when a secondary or tertiary amine in the drug molecule reacts with nitrite. Unlike NDMA or NDEA, NDSRIs are drug-sized, usually have no Ames or carcinogenicity data, and often no close analogue. That absence of data is why regulators expect a structure-based computational assessment plus a compound-specific acceptable intake.
What does the ICH M7 dual assessment actually require?
ICH M7 requires two complementary (Q)SAR methodologies for bacterial mutagenicity: one expert-rule-based (structural alerts with a stated mechanism) and one statistical (a trained model). Both results are documented. Where they disagree, expert judgement resolves the case with a written rationale. In CovaTox this is one call to covatox_ich_m7, which returns the alert, its mechanism and reference, the statistical score, and the resulting class.
Why is the 1.5 µg/day TTC not usable for nitrosamines?
N-nitroso compounds belong to the ICH M7 cohort of concern, alongside aflatoxin-like and alkyl-azoxy structures. Compounds in this cohort can be carcinogenic well below the generic threshold of toxicological concern, so the 1.5 µg/day default does not apply. A compound-specific acceptable intake is required, derived from carcinogenicity data, read-across, or a potency categorisation framework such as CPCA.
Can an in silico tool clear a nitrosamine impurity?
No. It can classify, prioritise and document. A Class 2 call tells you to build an analytical method and a control strategy; a Class 5 call is a screening outcome that still needs the applicability-domain check and expert review behind it. CovaTox reports confidence and an explicit in-domain flag for exactly this reason - for NDMA and N-nitroso-propranolol the Ames model returns in_domain: false.
How accurate is the mutagenicity model behind the classification?
On CovaTox's own scaffold-split holdout, the Ames classifier scores 0.736 balanced accuracy (n_test = 1089), rising to 0.848 on a random split. Scaffold split is the honest number because test compounds have cores absent from training. That figure describes general chemistry, not nitrosamines specifically - the applicability-domain check returns nearest-neighbour Tanimoto 0.0 against a 0.3 threshold for the nitrosamines shown here.
How long does a batch assessment take?
covatox_assess_ichm7_batch handles up to 50 impurity SMILES in one call and returns per-impurity class, alert, mechanism, reference, confidence, similarity to the API, a class distribution, the worst-case impurity, and the TTC applicability verdict. Response is sub-second CPU work. The bottleneck in a real nitrosamine assessment is enumerating the impurities, not scoring them.
Related reading
Try the ICH M7 tools on your own impurity list on the CovaSyn free tier and see the alerts, the QSAR scores and the domain flags side by side. - ICH M7 Classification: Class 1 to 5, by Example - PBT Assessment for Pharmaceuticals: Very Toxic Is Not PBT
Tools for this topic
Use these in your AI agent right away.
- CovatoxICH M7, Tox21, CYP450, structural alerts, ADMET triage.
