Rules Beta Get a free key

Formula Check API

Beta

The formula check as data, for formulation, PLM and compliance software.

Send a formula (INCI, CAS or EC, percentage and function) with a product category and markets; get a verdict per ingredient and market with citations. One formula or a batch of up to 50.

At a glance

Status
Beta
Endpoints
POST /v1/cosmetics/formula-check
POST /v1/cosmetics/formula-check/batch
Cost
10 units (each endpoint)
MCP tools
cosmetics_formula_check
cosmetics_formula_check_batch
Data
Cosmetics dataset 1.0.0, built 2026-10-14.

Try it

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.

10 units per call. Endpoint docs

Your API key (optional)

Leave empty for the demo. With a key the playground calls the real endpoint from your browser; the key is kept in memory only.

Recorded answer of the real API on the current data for this sample (long arrays trimmed).

Response

Response 200POST/v1/cosmetics/formula-check
{
  "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": "…"
  }
}
  1. 1Pin and diff: the version is also in the X-Dataset-Version header

Request

curlPOST/v1/cosmetics/formula-check
curl -s -X POST "https://api.cosmeticrules.com/demo/v1/cosmetics/formula-check" \
  -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"}]}'

Endpoints

Endpoints of the Formula Check API
EndpointWhat it doesCostMCP toolDocumentation
POST /v1/cosmetics/formula-checkCheck a formula against market rules10 unitscosmetics_formula_checkDocs
POST /v1/cosmetics/formula-check/batchCheck many formulas10 units per formulacosmetics_formula_check_batchDocs

What is included

  • Bans, maximum concentrations by product type, positive lists, dates and state class bans
  • On-head limits after mixing for oxidative hair dyes, group limits and limits 'calculated as'
  • Batch of up to 50 formulas

How it differs

  • Every finding cites the rule and quotes its text.
  • Unmodelled wording answers NOT_MODELLED or NEEDS_ATTENTION, never PASS.
  • US state laws next to EU and GB rules.

Plans

One key and one plan cover every Cosmetic Rules product, this one included. Free: 2,500 units a month (250 calls of /v1/cosmetics/formula-check). Paid plans are coming soon. Caching inside your product is allowed, and so is use by AI agents. Plans and units.

Status: Beta (new: the interface may still change, with notice in the docs). All products.