On this page
Cosmetic Rules API · OpenAPI 3.1 and MCP
API documentation
- SpecOpenAPI 3.1
- openapi.json
- mcp-tools.json
- Base URLhttps://api.cosmeticrules.com
The Cosmetic Rules APIs, grouped by product: Formula Check, Ingredient Rules, Label Tools and the change feed, plus the MCP server.
Generated from the OpenAPI 3.1 spec (openapi.json); every example response below is real output of the API on the current data.
Try the API
Choose an endpoint and a sample, change the parameters, and send. Without a key the public demo answers the sample requests (marked demo, not counted against any quota, limited per IP address). With your key, or your account when you are signed in, any values work and the call counts against your plan. A key stays in this page's memory: it is never stored. Get a free key.
Summary
Response
{
"data": {
"count": 3,
"substances": [
{
"id": "inci:SALICYLIC ACID",
"id_type": "inci",
"value": "SALICYLIC ACID",
"display_name": "Salicylic acid",
"linked_identifiers": [
{
"id": "cas:69-72-7",
"via_rule_ids": ["EU-III-98", "GB-III-98", "… 1 more"],
"method": "CAS and legal-glossary INCI of a rule with exactly one CAS (code)"
}
],
"rule_count": 8,
"markets": {
"EU": [
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
"… 2 more"
],
"GB": [
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
"… 2 more"
]
}
},
{
"id": "name:SALICYLIC ACID",
"id_type": "name",
"value": "SALICYLIC ACID",
"display_name": "Salicylic acid",
"linked_identifiers": [],
"rule_count": 2,
"markets": {
"EU": [
{
"rule_id": "EU-V-3",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "V",
"entry": "3",
"provision": "Annex V, entry 3",
"status": "allowed_preservative",
"chemical_name": "Salicylic acid and its salts",
"…": "8 more fields"
}
],
"GB": [
{
"rule_id": "GB-V-3",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "V",
"entry": "3",
"provision": "Annex V, entry 3",
"status": "allowed_preservative",
"chemical_name": "Salicylic acid and its salts",
"…": "8 more fields"
}
]
}
},
"… 1 more"
],
"note": "Identifiers as listed in the legal texts (CAS, EC, legal-glossary INCI, chemical names) and CosIng example INCI names; each rule says how it matched."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}- 1Pin and diff: the version is also in the X-Dataset-Version header
Request
curl -s "https://api.cosmeticrules.com/demo/v1/cosmetics/ingredients?inci=Salicylic+Acid"Getting started
- Create a free account: confirm your email with a code, and your first key is on your dashboard, where you also create, name and revoke keys and see your usage.
- Send it in the
X-API-Keyheader (orAuthorization: Bearer). - Base URL:
https://api.cosmeticrules.com.
export API_KEY=xmd_live_...
curl -s "https://api.cosmeticrules.com/v1/cosmetics/ingredients?inci=Salicylic+Acid" -H "X-API-Key: $API_KEY"Responses and provenance
Every successful response is {"data": …, "meta": …}. meta always has dataset, dataset_version, dataset_built_at, data_status, the sources with their licences, a disclaimer and your usage. The X-Dataset-Version header repeats the version so you can pin and diff.
Inside data, each value carries its provenance: the source, the record id or URL, the source field and value, and the retrieval date; where an AI judged something, the method and a confidence. Calculations list their inputs and method.
{
"data": { … 3 more },
"meta": {
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
… 10 more
]
… 5 more
}
}- 1Pin and diff: the version is also in the X-Dataset-Version header
Errors and limits
Errors are {"error": {"code", "message", "details"}} with an HTTP status:
| Status | Meaning and typical codes |
|---|---|
| 400 | Invalid request: invalid_request, invalid_gtin, invalid_food_id, nutrient_values_not_accepted |
| 401 | missing_api_key, invalid_api_key, revoked_api_key |
| 404 | food_not_found, barcode_not_found |
| 422 | Valid but not computable: basis_not_per_100g, portion_without_grams, recipe_error |
| 429 | rate_limited (see Retry-After), quota_exceeded, too_many_attempts (signup, key changes and the demo) |
| 503 | dataset_not_loaded |
Rate limits are per key per minute; quotas are monthly units. Headers on every metered call: X-RateLimit-Limit, X-RateLimit-Remaining, X-Quota-Limit, X-Quota-Used. X-Quota-Limit is the units included in your plan each month, not the point where calls stop: free plans stop there, paid plans keep working up to meta.usage.hard_cap_units. meta.usage.units_charged is the units a call counted against your plan (a count, not money). Your usage by product and endpoint: GET /v1/usage. Errors cost nothing. See pricing for the limits of each plan.
Free keys stop at their included units until the next month. When paid plans open: Developer and Pro keep working above their included units at no extra charge during the beta, up to 3× the included units; then calls answer 429 quota_exceeded until the next month or until you upgrade. Months are calendar months in UTC. If we ever charge for usage above the included units, we will announce it at least 30 days in advance, and it will not apply to usage before that date.
Demo without a key
The playground above, and the try-it panels on the product pages, call https://api.cosmeticrules.com/demo followed by an endpoint's path when no key is given, for example GET /demo/v1/food/groups. The demo answers the sample requests listed at GET /demo/samples (some samples allow a few other values) with the endpoint's real output, marked meta.demo: true and the X-Demo header. It is not counted against any quota and is limited per IP address (30 requests a minute, 200 a day); any other input answers 403 demo_not_allowed. Use your key for real work.
MCP for AI agents
POST JSON-RPC 2.0 to /mcp (Streamable HTTP, JSON responses) with your key in X-API-Key. Methods: initialize, tools/list, tools/call, ping. Each REST operation below is a read-only tool with the same input schema; results come back as structuredContent with the same envelope and the same metering. Tool list: mcp-tools.json.
- cosmetics_ingredient_lookup
- cosmetics_ingredient_get
- cosmetics_rules_by_market
- cosmetics_compare_markets
- cosmetics_categories
- cosmetics_formula_check
- cosmetics_formula_check_batch
- cosmetics_allergen_label
- cosmetics_label_check
- cosmetics_changes
{
"mcpServers": {
"cosmeticrules": {
"type": "http",
"url": "https://api.cosmeticrules.com/mcp",
"headers": { "X-API-Key": "YOUR_KEY" }
}
}
}Endpoints by product
Every endpoint belongs to one product: Formula Check API, Ingredient Rules API, Label Tools API, Rule Change Feed. One key and one plan cover all of them.
Formula Check API
BetaThe formula check as data, for formulation, PLM and compliance software. Product page.
POST /v1/cosmetics/formula-check
Check a formula against market rules. For each market: PASS, FAIL, NEEDS_ATTENTION or NOT_MODELLED per ingredient and overall. Bans, maximum concentrations by product type (including on-head limits after mixing for oxidative hair dyes, group limits and limits 'calculated as'), positive lists for preservatives, UV filters and colorants, dates (placing on the market or making available), US state class bans and contaminant limits. Unmodelled wording never gives PASS, and an ingredient that resolves to no known substance (no rule, CosIng inventory INCI name, CAS or EC number) is NOT_MODELLED; a missing concentration is never treated as zero.
- Cost10 units
- MCP toolcosmetics_formula_check
| Name | Type | Required | Notes |
|---|---|---|---|
| markets | array | yes | |
| product_category | string | yes | GET /v1/cosmetics/categories |
| as_of | string | no | YYYY-MM-DD |
| mode | string: placing, making_available | no | Default placing. |
| children_under_3 | boolean | no | |
| professional_use | boolean | no | |
| mixing_ratio | string | no | Oxidative hair or eyelash dye: product:developer, e.g. '1:1' |
| formaldehyde_released_pct | number or string or null | no | Maximum theoretical releasable formaldehyde of the whole product, from every source, percent w/w. Settles the 'releases formaldehyde' label and the Annex II bans that apply only at or above 0,1 % (II/1605-1607). null or omitted = not known: never treated as 0 |
| contaminants_ppm | object | no | Measured contaminants, e.g. {"lead": 2, "1,4-dioxane": 1} |
| ingredients | array | yes |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/formula-check" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"markets":["EU","US-CA"],"product_category":"body_lotion","as_of":"2026-10-10","ingredients":[{"inci":"Aqua","pct":85},{"inci":"Glycerin","pct":5},{"inci":"Phenoxyethanol","pct":0.9,"function":"preservative"},{"inci":"Salicylic Acid","pct":0.5,"function":"preservative"}]}'Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"verdict": "PASS",
"markets": {
"EU": {
"engine": "formula_checker",
"dataset_version": "1.0.0",
"dataset_as_of": "2026-10-10",
"market": "EU",
"product_category": "body_lotion",
"product_attributes": ["body", "body_lotion", "… 2 more"],
"as_of": "2026-10-10",
"mode": "placing",
"ingredients": [
{
"input": { "inci": "Aqua", "pct": 85 },
"results": [],
"verdict": "PASS",
"note": "no rule in this market lists this ingredient"
},
{
"input": { "inci": "Glycerin", "pct": 5 },
"results": [],
"verdict": "PASS",
"note": "no rule in this market lists this ingredient"
},
"… 2 more"
],
"label_requirements": [
{
"ingredient": "Salicylic Acid",
"rule_id": "EU-V-3",
"text": "Not to be used for children under 3 years of age"
}
],
"advisories": [],
"assumptions": [
"Product is not intended for children under 3 (set children_under_3=true if it is)."
],
"contaminant_checks": [],
"verdict": "PASS",
"summary": {
"FAIL": 0,
"NEEDS_ATTENTION": 0,
"NOT_MODELLED": 0,
"PASS": 4
},
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
},
"US-CA": {
"engine": "formula_checker",
"dataset_version": "1.0.0",
"dataset_as_of": "2026-10-10",
"market": "US-CA",
"product_category": "body_lotion",
"product_attributes": ["body", "body_lotion", "… 2 more"],
"as_of": "2026-10-10",
"mode": "placing",
"ingredients": [
{
"input": { "inci": "Aqua", "pct": 85 },
"results": [],
"verdict": "PASS",
"note": "no rule in this market lists this ingredient"
},
{
"input": { "inci": "Glycerin", "pct": 5 },
"results": [],
"verdict": "PASS",
"note": "no rule in this market lists this ingredient"
},
"… 2 more"
],
"label_requirements": [],
"advisories": [],
"assumptions": [
"Product is not intended for children under 3 (set children_under_3=true if it is)."
],
"contaminant_checks": [
{
"rule_id": "US-21CFR700.13",
"contaminant": "mercury",
"limit_ppm": 1,
"verdict": "UNCHECKED",
"reason": "no contaminant data supplied (contaminants_ppm)"
}
],
"verdict": "PASS",
"summary": {
"FAIL": 0,
"NEEDS_ATTENTION": 0,
"NOT_MODELLED": 0,
"PASS": 4
},
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
}
},
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}POST /v1/cosmetics/formula-check/batch
Check many formulas. Up to 50 formulas in one call, each as POST /v1/cosmetics/formula-check takes it (plus an optional id), with at most 1,000 ingredient rows and 5,000 ingredient-market checks (ingredients x markets) in all; each answers with its verdicts or its own error, and the summary counts verdicts.
- Cost10 units per formula
- MCP toolcosmetics_formula_check_batch
| Name | Type | Required | Notes |
|---|---|---|---|
| formulas | array | yes |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/formula-check/batch" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"formulas":[{"id":"lotion","markets":["EU","GB"],"product_category":"body_lotion","as_of":"2026-10-10","ingredients":[{"inci":"Aqua","pct":85},{"inci":"Glycerin","pct":5},{"inci":"Phenoxyethanol","pct":0.9,"function":"preservative"}]},{"id":"shampoo","markets":["EU","GB"],"product_category":"shampoo","as_of":"2026-10-10","ingredients":[{"inci":"Aqua","pct":80},{"inci":"Sodium Laureth Sulfate","pct":12},{"inci":"Salicylic Acid","pct":3,"function":"anti_dandruff"}]}]}'Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"count": 2,
"errors": 0,
"verdicts": { "PASS": 2 },
"results": [
{
"id": "lotion",
"status": "ok",
"verdict": "PASS",
"result": {
"verdict": "PASS",
"markets": {
"EU": {
"engine": "formula_checker",
"dataset_version": "1.0.0",
"dataset_as_of": "2026-10-10",
"market": "EU",
"product_category": "body_lotion",
"product_attributes": ["body", "body_lotion", "… 2 more"],
"as_of": "2026-10-10",
"mode": "placing",
"…": "8 more fields"
},
"GB": {
"engine": "formula_checker",
"dataset_version": "1.0.0",
"dataset_as_of": "2026-10-10",
"market": "GB",
"product_category": "body_lotion",
"product_attributes": ["body", "body_lotion", "… 2 more"],
"as_of": "2026-10-10",
"mode": "placing",
"…": "8 more fields"
}
},
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
}
},
{
"id": "shampoo",
"status": "ok",
"verdict": "PASS",
"result": {
"verdict": "PASS",
"markets": {
"EU": {
"engine": "formula_checker",
"dataset_version": "1.0.0",
"dataset_as_of": "2026-10-10",
"market": "EU",
"product_category": "shampoo",
"product_attributes": ["hair", "rinse_off", "… 2 more"],
"as_of": "2026-10-10",
"mode": "placing",
"…": "8 more fields"
},
"GB": {
"engine": "formula_checker",
"dataset_version": "1.0.0",
"dataset_as_of": "2026-10-10",
"market": "GB",
"product_category": "shampoo",
"product_attributes": ["hair", "rinse_off", "… 2 more"],
"as_of": "2026-10-10",
"mode": "placing",
"…": "8 more fields"
}
},
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
}
}
],
"disclaimer": "Reference data from the published rule texts; not legal advice or a safety assessment."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}Ingredient Rules API
BetaLook up an ingredient by INCI, CAS or EC and get every rule in every market, with the legal quote. Product page.
GET /v1/cosmetics/ingredients
Ingredient lookup by INCI, CAS or text. Substances (by legal-glossary or CosIng INCI name, CAS number or chemical name) with every rule that lists them, by market: EU, GB, US federal and 8 US states, with citations to the official text.
- Cost1 unit
- MCP toolcosmetics_ingredient_lookup
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
| inci | query | string | no | |
| cas | query | string | no | |
| q | query | string | no | |
| limit | query | integer | no | Default 10. |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/ingredients?inci=Salicylic+Acid" \
-H "X-API-Key: $API_KEY"Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"count": 3,
"substances": [
{
"id": "inci:SALICYLIC ACID",
"id_type": "inci",
"value": "SALICYLIC ACID",
"display_name": "Salicylic acid",
"linked_identifiers": [
{
"id": "cas:69-72-7",
"via_rule_ids": ["EU-III-98", "GB-III-98", "… 1 more"],
"method": "CAS and legal-glossary INCI of a rule with exactly one CAS (code)"
}
],
"rule_count": 8,
"markets": {
"EU": [
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
"… 2 more"
],
"GB": [
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
"… 2 more"
]
}
},
{
"id": "name:SALICYLIC ACID",
"id_type": "name",
"value": "SALICYLIC ACID",
"display_name": "Salicylic acid",
"linked_identifiers": [],
"rule_count": 2,
"markets": {
"EU": [
{
"rule_id": "EU-V-3",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "V",
"entry": "3",
"provision": "Annex V, entry 3",
"status": "allowed_preservative",
"chemical_name": "Salicylic acid and its salts",
"…": "8 more fields"
}
],
"GB": [
{
"rule_id": "GB-V-3",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "V",
"entry": "3",
"provision": "Annex V, entry 3",
"status": "allowed_preservative",
"chemical_name": "Salicylic acid and its salts",
"…": "8 more fields"
}
]
}
},
"… 1 more"
],
"note": "Identifiers as listed in the legal texts (CAS, EC, legal-glossary INCI, chemical names) and CosIng example INCI names; each rule says how it matched."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}GET /v1/cosmetics/ingredients/{id}
Get a substance by id. One substance (cas:<CAS>, ec:<EC>, inci:<INCI>, name:<name>) with its rules in every market and linked identifiers.
- Cost1 unit
- MCP toolcosmetics_ingredient_get
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
| id | path | string | yes |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/ingredients/cas%3A69-72-7" \
-H "X-API-Key: $API_KEY"Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"id": "cas:69-72-7",
"id_type": "cas",
"value": "69-72-7",
"display_name": "69-72-7",
"cas_checkdigit_ok": true,
"linked_identifiers": [
{
"id": "inci:ACIDUM SALICYLICUM",
"via_rule_ids": ["cosing-inventory-other-name:37595"],
"method": "CAS and legal-glossary INCI of a rule with exactly one CAS (code)"
},
{
"id": "inci:SALICYLIC ACID",
"via_rule_ids": ["EU-III-98", "GB-III-98", "… 1 more"],
"method": "CAS and legal-glossary INCI of a rule with exactly one CAS (code)"
}
],
"rule_count": 8,
"markets": {
"EU": [
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
"… 2 more"
],
"GB": [
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"provision": "Annex III, entry 98",
"status": "restricted",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"…": "8 more fields"
},
"… 2 more"
]
}
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}GET /v1/cosmetics/rules
Rules by market. Machine-readable rules of a market: status (prohibited, restricted, allowed colorant/preservative/UV filter, labelling threshold, state ban), each clause with its product-type scope, limits (numbers copied by code from the legal text), conditions and warnings, dates (placing on the market, sell-through), citations with verbatim quotes, and how disagreements between the two extraction passes were resolved.
- Cost1 unit
- MCP toolcosmetics_rules_by_market
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
| market | query | string: EU, GB, US, US-CA, US-CO, US-MD, US-ME, US-MN, US-OR, US-VT, US-WA | yes | EU, GB, US (federal) or a US state (state rules plus US federal) |
| inci | query | string | no | |
| cas | query | string | no | |
| status | query | string: prohibited, restricted, labelling_threshold, allowed_colorant, allowed_preservative, allowed_uv_filter, state_ban | no | |
| limit | query | integer | no | Default 50. |
| offset | query | integer | no | Default 0. |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/rules?market=EU&inci=Phenoxyethanol" \
-H "X-API-Key: $API_KEY"Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"market": "EU",
"count": 1,
"total": 1,
"offset": 0,
"rules": [
{
"rule_id": "EU-V-29",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "V",
"entry": "29",
"provision": "Annex V, entry 29",
"status": "allowed_preservative",
"chemical_name": "2-Phenoxyethanol",
"effective_from": "2013-07-11",
"in_force_from": "2013-07-11",
"sell_through_until": null,
"not_yet_in_force": false,
"flags": [],
"chemical_name_other": [],
"cas": ["122-99-6"],
"ec": ["204-589-7"],
"cas_corrections": {},
"product_types": [],
"conditions": [],
"warnings": [],
"class_key": null,
"colour": null,
"clauses": [
{
"label": null,
"scope_text": null,
"scope_expr": { "all_products": true },
"scope_modelled": true,
"limits": [
{
"kind": "product_max",
"value": 1,
"value_text": "1,0 %",
"unit": "%",
"value_pct": 1,
"calculated_as": null,
"comparator": "<=",
"sum_group": null,
"…": "4 more fields"
}
],
"conditions": [],
"warnings": [],
"prohibitions": []
}
],
"limits": [
{
"rule_id": "EU-V-29",
"clause_label": null,
"kind": "product_max",
"value": 1,
"value_text": "1,0 %",
"unit": "%",
"value_pct": 1,
"calculated_as": null,
"…": "8 more fields"
}
],
"labelling": null,
"citations": [
{
"rule_id": "EU-V-29",
"role": "entry",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02009R1223-20260518",
"doc_id": "02009R1223-20260518",
"quote": "29 2-Phenoxyethanol Phenoxyethanol 122-99-6 204-589-7",
"snapshot": "extract-B/snapshots/eurlex_02009R1223-20260518.html",
"snapshot_sha256": "784c69f47fab890c182d07e502a7444d924091f09e1d70189951e8241326bcad",
"retrieved_at": "2026-10-10T09:57:19Z",
"…": "1 more fields"
},
{
"rule_id": "EU-V-29",
"role": "date",
"url": null,
"doc_id": null,
"quote": "It shall apply from 11 July 2013",
"snapshot": "extract-A/snapshots/eurlex/consol_02009R1223-20260518.html",
"snapshot_sha256": "66fa64c5420bc354ae13bcbaaed0db33c0be0799e4765605c006d8fd1001a044",
"retrieved_at": "2026-10-10T09:57:40+00:00",
"…": "1 more fields"
}
],
"provenance": {
"source": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and its amending acts",
"licence": "© European Union. Reuse authorised, including commercial, with acknowledgement (Commission Decision 2011/833/EU; EUR-Lex legal notice). Consolidated texts are documentation only; the Official Journal …",
"method": "two independent code extractions (A, B) adjudicated field by field against the snapshot; values copied by code",
"confidence": "high",
"agreement": "agreed",
"date_method": "base Regulation (EC) No 1223/2009 Art. 40(2) date of application",
"date_confidence": "high",
"date_quotes": [
{
"text": "It shall apply from 11 July 2013",
"source": "eurlex/consol_02009R1223-20260518.html"
}
]
}
}
]
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}GET /v1/cosmetics/compare
Compare an ingredient's rules across markets. Every rule that lists an ingredient, market by market (a US state also shows US federal rules), with status, dates, clause limits copied by code and the entry citation; plus EU/GB divergences entry by entry.
- Cost1 unit
- MCP toolcosmetics_compare_markets
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
| inci | query | string | no | |
| cas | query | string | no | |
| markets | query | string | no | Comma-separated markets (default: all), e.g. EU,GB,US-CA |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/compare?inci=Salicylic+Acid&markets=EU%2CGB%2CUS-CA" \
-H "X-API-Key: $API_KEY"Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"ingredient": { "inci": "Salicylic Acid", "cas": null },
"markets": {
"EU": {
"rule_count": 2,
"statuses": ["allowed_preservative", "restricted"],
"rules": [
{
"rule_id": "EU-III-98",
"jurisdiction": "EU",
"status": "restricted",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "98",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"effective_from": "2021-06-17",
"…": "5 more fields"
},
{
"rule_id": "EU-V-3",
"jurisdiction": "EU",
"status": "allowed_preservative",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "V",
"entry": "3",
"chemical_name": "Salicylic acid and its salts",
"effective_from": "2020-05-01",
"…": "5 more fields"
}
]
},
"GB": {
"rule_count": 2,
"statuses": ["allowed_preservative", "restricted"],
"rules": [
{
"rule_id": "GB-III-98",
"jurisdiction": "GB",
"status": "restricted",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "III",
"entry": "98",
"chemical_name": "Benzoic acid, 2-hydroxy-",
"effective_from": "2022-12-15",
"…": "5 more fields"
},
{
"rule_id": "GB-V-3",
"jurisdiction": "GB",
"status": "allowed_preservative",
"instrument": "Regulation (EC) No 1223/2009 (GB)",
"annex": "V",
"entry": "3",
"chemical_name": "Salicylic acid and its salts",
"effective_from": "2020-05-01",
"…": "5 more fields"
}
]
},
"US-CA": {
"rule_count": 0,
"statuses": [],
"rules": []
}
},
"eu_gb_divergences": [
{
"entry": "III/98",
"markets": ["EU", "GB"],
"difference": "status, date, scope or limits differ"
}
],
"note": "Every rule that lists the ingredient in each market (a US state also shows the US federal rules), with the clause limits copied by code from the legal text and the entry citation. EU/GB divergence com…",
"disclaimer": "Reference data from the published rule texts; not legal advice or a safety assessment."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}GET /v1/cosmetics/categories
Product categories. The product categories the checks accept, each with its product tags.
- Costfree
- MCP toolcosmetics_categories
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/categories" \
-H "X-API-Key: $API_KEY"Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"count": 58,
"categories": {
"shampoo": ["hair", "rinse_off", "… 2 more"],
"anti_dandruff_shampoo": ["anti_dandruff", "hair", "… 3 more"],
"hair_conditioner_rinse_off": ["conditioner", "hair", "… 1 more"],
"hair_conditioner_leave_on": ["conditioner", "hair", "… 1 more"],
"hair_styling_leave_on": ["hair", "hair_lotion", "… 1 more"],
"hair_spray_aerosol": ["aerosol", "hair", "… 2 more"],
"hair_lotion_leave_on": ["hair", "hair_lotion", "… 2 more"],
"oxidative_hair_dye": ["hair", "hair_dye", "… 2 more"],
"non_oxidative_hair_dye": ["hair", "hair_dye", "… 2 more"],
"eyelash_dye": ["eye_area", "eyelash_dye", "… 2 more"],
"hair_waving_straightening": ["hair", "hair_waving", "… 1 more"],
"depilatory": ["body", "depilatory", "… 2 more"],
"face_cream": ["face", "face_cream", "… 2 more"],
"body_lotion": ["body", "body_lotion", "… 2 more"],
"body_lotion_spray": ["aerosol", "body", "… 4 more"],
"hand_cream": ["hand_cream", "hands", "… 2 more"],
"foot_cream": ["feet", "leave_on", "… 1 more"],
"sunscreen_lotion": ["body", "face", "… 3 more"],
"sunscreen_spray_aerosol": ["aerosol", "body", "… 4 more"],
"sunscreen_pump_spray": ["body", "leave_on", "… 3 more"],
"self_tanning_lotion": ["body", "leave_on", "… 2 more"],
"baby_lotion": ["body", "body_lotion", "… 3 more"],
"baby_wipes": ["anogenital", "children_under_3", "… 3 more"],
"talcum_powder": ["body", "leave_on", "… 4 more"],
"shower_gel": ["bath", "body", "… 3 more"],
"liquid_hand_wash": ["hand_wash", "hands", "… 3 more"],
"bar_soap": ["bar_soap", "body", "… 4 more"],
"face_cleanser_rinse_off": ["face", "rinse_off", "… 1 more"],
"bath_product": ["bath", "body", "… 2 more"],
"deodorant_spray_aerosol": ["aerosol", "body", "… 4 more"],
"deodorant_pump_spray": ["body", "deodorant", "… 3 more"],
"deodorant_roll_on": ["body", "deodorant", "… 3 more"],
"deodorant_stick": ["body", "deodorant", "… 3 more"],
"antiperspirant_aerosol": ["aerosol", "antiperspirant", "… 5 more"],
"eau_de_parfum_spray": ["body", "fine_fragrance", "… 5 more"],
"eau_de_toilette_spray": ["body", "eau_de_toilette", "… 5 more"],
"fragrance_cream": ["body", "fragrance", "… 3 more"],
"perfume_oil": ["body", "fragrance", "… 2 more"],
"lipstick": ["leave_on", "lip_make_up", "… 3 more"],
"lip_balm": ["leave_on", "lip_balm", "… 1 more"],
"…": "18 more fields"
},
"note": "Each category maps to product tags (area, leave-on / rinse-off, form). Annex product-type wording is parsed into expressions over these tags; wording that is not modelled makes the checker answer NOT_…"
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}Label Tools API
BetaFragrance allergen labelling and INCI label validation for the EU, GB and the US. Product page.
POST /v1/cosmetics/allergen-label
Allergen label calculation. Which fragrance allergens must be named in the ingredient list (EU and GB): concentrations from a fragrance composition and dose or given directly, isomers and group members summed (e.g. geranial + neral = Citral), leave-on and rinse-off thresholds, dated by placing on the market (the 2023 EU allergen list applies from its dates).
- Cost10 units
- MCP toolcosmetics_allergen_label
| Name | Type | Required | Notes |
|---|---|---|---|
| markets | array | yes | |
| product_category | string | no | |
| exposure | string: leave_on, rinse_off | no | If no product_category |
| as_of | string | no | YYYY-MM-DD |
| fragrance | object | no | |
| allergens | array | no |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/allergen-label" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"markets":["EU","GB"],"product_category":"body_lotion","as_of":"2026-10-10","fragrance":{"dose_pct":0.8,"composition":[{"inci":"Linalool","pct_in_fragrance":8},{"inci":"Limonene","pct_in_fragrance":5},{"inci":"Geranial","pct_in_fragrance":0.15},{"inci":"Neral","pct_in_fragrance":0.1}]}}'Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"verdict": "NEEDS_ATTENTION",
"markets": {
"EU": {
"engine": "allergen_label_calculator",
"dataset_version": "1.0.0",
"market": "EU",
"as_of": "2026-10-10",
"exposure": "leave_on",
"must_label": [
{
"rule_id": "EU-III-84",
"label_as": ["Linalool"],
"threshold_pct": 0.001,
"total_pct": 0.064,
"members": [
{
"input": "Linalool",
"pct_in_product": 0.064,
"derived": "8 % in fragrance x 0.8 % fragrance dose / 100"
}
],
"citation": {
"rule_id": "EU-III-84",
"provision": "Annex III, entry 84",
"jurisdiction": "EU",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02009R1223-20260518",
"quote": "84 1,6-Octadien-3-ol, 3,7-dimethyl- Linalool 78-70-6 201-134-4",
"source": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and its amending acts",
"retrieved_at": "2026-10-10T09:57:19Z"
},
"effective_from": "2013-07-11"
},
{
"rule_id": "EU-III-88",
"label_as": ["Limonene"],
"threshold_pct": 0.001,
"total_pct": 0.04,
"members": [
{
"input": "Limonene",
"pct_in_product": 0.04,
"derived": "5 % in fragrance x 0.8 % fragrance dose / 100"
}
],
"citation": {
"rule_id": "EU-III-88",
"provision": "Annex III, entry 88",
"jurisdiction": "EU",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02009R1223-20260518",
"quote": "88 1-methyl-4-prop-1-en-2-yl-cyclohexene; dl-limonene (racemic); Dipentene ( 37 ) Limonene 138-86-3/ 7705-14-8 205-341-0/ 231-732-0",
"source": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and its amending acts",
"retrieved_at": "2026-10-10T09:57:19Z"
},
"effective_from": "2026-08-01"
},
"… 1 more"
],
"below_threshold": [],
"needs_attention": [],
"not_yet_applicable": [],
"unrecognised_inputs": [],
"label_names": ["Citral", "Limonene", "… 1 more"],
"verdict": "OK"
},
"GB": {
"engine": "allergen_label_calculator",
"dataset_version": "1.0.0",
"market": "GB",
"as_of": "2026-10-10",
"exposure": "leave_on",
"must_label": [
{
"rule_id": "GB-III-84",
"label_as": ["Linalool"],
"threshold_pct": 0.001,
"total_pct": 0.064,
"members": [
{
"input": "Linalool",
"pct_in_product": 0.064,
"derived": "8 % in fragrance x 0.8 % fragrance dose / 100"
}
],
"citation": {
"rule_id": "GB-III-84",
"provision": "Annex III, entry 84",
"jurisdiction": "GB",
"url": "https://www.legislation.gov.uk/eur/2009/1223/annex/III",
"quote": "84 1,6-Octadien-3-ol, 3,7-dimethyl- Linalool 78-70-6 201-134-4",
"source": "legislation.gov.uk: Regulation (EC) No 1223/2009 as it applies in Great Britain (Annexes II-VI, valid from 2026-08-15) and the amending UK S.I.s",
"retrieved_at": "2026-10-10T10:01:32Z"
},
"effective_from": "2013-07-11"
},
{
"rule_id": "GB-III-88",
"label_as": ["Limonene"],
"threshold_pct": 0.001,
"total_pct": 0.04,
"members": [
{
"input": "Limonene",
"pct_in_product": 0.04,
"derived": "5 % in fragrance x 0.8 % fragrance dose / 100"
}
],
"citation": {
"rule_id": "GB-III-88",
"provision": "Annex III, entry 88",
"jurisdiction": "GB",
"url": "https://www.legislation.gov.uk/eur/2009/1223/annex/III",
"quote": "88 d-Limonene(4R)-1-Methyl-4-(1-methylethenyl) cyclohexene Limonene 5989-27-5 227-813-5",
"source": "legislation.gov.uk: Regulation (EC) No 1223/2009 as it applies in Great Britain (Annexes II-VI, valid from 2026-08-15) and the amending UK S.I.s",
"retrieved_at": "2026-10-10T10:01:32Z"
},
"effective_from": "2013-07-11"
}
],
"below_threshold": [],
"needs_attention": [],
"not_yet_applicable": [],
"unrecognised_inputs": ["Geranial", "Neral"],
"label_names": ["Limonene", "Linalool"],
"verdict": "NEEDS_ATTENTION"
}
},
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}POST /v1/cosmetics/label-check
Validate an INCI ingredient list. Checks an ingredient list as printed (EU, GB or US): descending order above 1 % (with concentrations), fragrance term, nano and CI formats, prohibited ingredients for the product type, allergens that must be named, 'may contain' use; each finding cites Article 19 of Regulation 1223/2009 (or the GB text) or 21 CFR 701.3.
- Cost10 units
- MCP toolcosmetics_label_check
| Name | Type | Required | Notes |
|---|---|---|---|
| market | string: EU, GB, US, US-CA, US-CO, US-MD, US-ME, US-MN, US-OR, US-VT, US-WA | yes | EU, GB, US (federal) or a US state (state rules plus US federal) |
| label | string | yes | Ingredient list as printed, e.g. 'Ingredients: Aqua, Glycerin, ...' |
| product_category | string | no | |
| as_of | string | no | YYYY-MM-DD |
| children_under_3 | boolean | no | |
| formula | array | no | Concentrations (enables the order and allergen checks) |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/label-check" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"market":"EU","product_category":"body_lotion","label":"Ingredients: Aqua, Glycerin, Fragrance, Phenoxyethanol, Titanium Dioxide (nano)","formula":[{"inci":"Aqua","pct":88},{"inci":"Glycerin","pct":9},{"inci":"Fragrance","pct":1},{"inci":"Phenoxyethanol","pct":0.9},{"inci":"Titanium Dioxide","pct":1.1}]}'Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"engine": "inci_label_validator",
"dataset_version": "1.0.0",
"market": "EU",
"items": [
{
"position": 1,
"text": "Aqua",
"key": "AQUA",
"known_in_dataset": false
},
{
"position": 2,
"text": "Glycerin",
"key": "GLYCERIN",
"known_in_dataset": false
},
"… 3 more"
],
"errors": [
{
"position": 3,
"msg": "'Fragrance': use 'Parfum' (or 'Aroma' for flavour)",
"basis": {
"rule": "EU-ART19-PARFUM",
"quote": "Perfume and aromatic compositions and their raw materials shall be referred to by the terms ‘parfum’ or ‘aroma’.",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02009R1223-20260518"
}
},
{
"msg": "'Fragrance' (1 %) at or below 1 % is listed before an ingredient above 1 %",
"basis": {
"rule": "EU-ART19-ORDER",
"quote": "The list of ingredients shall be established in descending order of weight of the ingredients at the time they are added to the cosmetic product. Ingredients in concentrations of less than 1 % may be …",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02009R1223-20260518"
}
},
"… 1 more"
],
"warnings": [],
"info": [
{
"position": 1,
"msg": "'Aqua' is not in this dataset's annex-derived name list; spelling not confirmed (the dataset is not a full INCI dictionary)"
},
{
"position": 2,
"msg": "'Glycerin' is not in this dataset's annex-derived name list; spelling not confirmed (the dataset is not a full INCI dictionary)"
},
"… 1 more"
],
"formula_check_verdict": "NEEDS_ATTENTION",
"valid": false,
"disclaimer": "Reference calculation from the published rule texts; not legal advice or a safety assessment."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}Rule Change Feed
BetaDated rule events: entries into force, placing-on-market dates and sell-through deadlines, including adopted future dates. Product page.
GET /v1/cosmetics/changes
Rule change feed. Dated events of the rules, newest first: entries into force, placing-on-the-market dates, last days for non-compliant stock, adopted rules not yet in force, renumbering and replaced texts. Filter by date range, market and event.
- Cost1 unit
- MCP toolcosmetics_changes
| Name | In | Type | Required | Notes |
|---|---|---|---|---|
| since | query | string | yes | YYYY-MM-DD |
| until | query | string | no | YYYY-MM-DD |
| market | query | string: EU, GB, US, US-CA, US-CO, US-MD, US-ME, US-MN, US-OR, US-VT, US-WA | no | EU, GB, US (federal) or a US state (state rules plus US federal) |
| event | query | string: in_force, placing_on_market_ban_or_limit_applies, last_day_non_compliant_stock_may_be_made_available, pending_not_yet_in_force, requirement_applies_from, renumbered, text_replaced | no | |
| limit | query | integer | no | Default 100. |
| offset | query | integer | no | Default 0. |
Example
curl -s "https://api.cosmeticrules.com/v1/cosmetics/changes?since=2026-01-01&market=EU&limit=20" \
-H "X-API-Key: $API_KEY"Response (200, real output of the API on the current data; long arrays trimmed)
{
"data": {
"since": "2026-01-01",
"until": null,
"market": "EU",
"total": 174,
"count": 20,
"offset": 0,
"events": [
{
"date": "2028-07-31",
"event": "last_day_non_compliant_stock_may_be_made_available",
"detail": null,
"rule": {
"rule_id": "EU-III-109",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "109",
"status": "restricted",
"chemical_name": "Pinus mugo leaf and twig oil and extract",
"cas": ["90082-72-7"],
"…": "2 more fields"
}
},
{
"date": "2028-07-31",
"event": "last_day_non_compliant_stock_may_be_made_available",
"detail": null,
"rule": {
"rule_id": "EU-III-114",
"jurisdiction": "EU",
"instrument": "Regulation (EC) No 1223/2009",
"annex": "III",
"entry": "114",
"status": "restricted",
"chemical_name": "Pinus pumila leaf and twig oil and extract",
"cas": ["97676-05-6"],
"…": "2 more fields"
}
},
"… 18 more"
],
"events_meaning": {
"in_force": "the provision entered into force",
"placing_on_market_ban_or_limit_applies": "products placed on the market from this date must comply",
"last_day_non_compliant_stock_may_be_made_available": "last day non-compliant stock may still be sold",
"pending_not_yet_in_force": "adopted, not yet in force on the dataset's as-of date",
"requirement_applies_from": "a requirement (e.g. a state law) applies from this date",
"renumbered": "the entry was renumbered",
"text_replaced": "the entry text was replaced (the prior text is kept)"
},
"note": "Dated events of the rules in this dataset version, newest first, including future dates already adopted (e.g. EU sell-through deadlines, state bans from 2027 and 2035). Full rule texts and quotes: GET…",
"disclaimer": "Reference data from the published rule texts; not legal advice or a safety assessment."
},
"meta": {
"request_id": "req_…",
"api_version": "1",
"dataset": "cosmetics",
"dataset_version": "1.0.0",
"dataset_built_at": "2026-10-14T21:29:15+00:00",
"data_status": "released",
"sources": [
{
"id": "eur_lex_regulation_ec_no_1223_2009_conso",
"name": "EUR-Lex: Regulation (EC) No 1223/2009, consolidated text 02009R1223-20260518, and amending acts M1-M54",
"url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02009R1223-20260518",
"licence": "© European Union; reuse incl. commercial authorised with acknowledgement (Commission Decision 2011/833/EU). Consolidated text is documentation only.",
"commercial_redistribution_ok": true
},
{
"id": "cosing_annex_exports_and_ingredient_inve",
"name": "CosIng annex exports and ingredient inventory (European Commission)",
"url": "https://ec.europa.eu/growth/tools-databases/cosing/",
"licence": "© European Union; Commission reuse policy (Decision 2011/833/EU). CosIng has no legal value: used only for INCI names, their CAS / EC numbers and cross-checks.",
"commercial_redistribution_ok": true
},
"… 8 more"
],
"provenance_note": "Every value carries provenance (source, id or URL, retrieval date; method and confidence where an AI judged). Calculations list their inputs and method.",
"disclaimer": "Regulatory reference data. Not a safety assessment; a Responsible Person or safety assessor must sign off products.",
"usage": "…"
}
}