Skip to main content
Developer

Public API

A free, read-only REST API for EU ingredient data plus source-backed jurisdiction rules as they pass review. No authentication required. Returns JSON.

GET /api/v1/jurisdictions/{code}/rules/

ParameterValuesMeaning
qname, CAS, EC or titleOptional evidence search
statusprohibited, restricted, positive_list, inventory, under_reviewOptional exact status filter
page, per_pagepositive integers; max 100 per pagePagination

A standalone official record has substance.ingredient_url set to null because no safe local CosIng match exists. Linked records include the ingredient URL. Empty results never imply permission.

{
  "count": 1,
  "results": [{
    "substance": {"name": "Example", "cas_number": "123-45-6", "ingredient_url": null},
    "status": "prohibited", "source_record_id": "official:123"
  }],
  "disclaimer": "No matching record does not mean a substance is permitted in this market."
}

Base URL

https://cosingchecker.com/api/v1/

Jurisdiction evidence

Published rules include legal role, source reference, effective date, source language and translation status. An empty result does not mean the ingredient is permitted.

GET https://cosingchecker.com/api/v1/jurisdictions/
GET https://cosingchecker.com/api/v1/jurisdictions/{code}/rules/?q={name-or-identifier}&status={status}
GET https://cosingchecker.com/api/v1/ingredients/{slug}/jurisdictions/
GET https://cosingchecker.com/api/v1/ingredients/{slug}/eu-annex-evidence/

Annex entries

GET /api/v1/entries/

Search annex entries. At least one parameter is required.

ParameterTypeDescription
qstringSearch term — name, CAS, EC or colour index
annexstringAnnex code: II, III, IV, V or VI
casstringCAS number search
ecstringEC number search
entry_numberstringEntry number within an annex
product_typestringProduct type condition text
cmr1 / trueFilter to CMR substances only
has_cas, has_ec1 / trueRequire identifier fields
has_warnings, has_max_concentration1 / trueRequire warning or concentration fields
orderingstringComma-separated ordering: annex, entry_number, updated_at, id, with optional minus prefix
pageintegerPage number (default 1)
per_pageintegerResults per page (max 100, default 50)

Example requests:

GET https://cosingchecker.com/api/v1/entries/?q=sodium+benzoate
GET https://cosingchecker.com/api/v1/entries/?annex=III&cmr=1
GET https://cosingchecker.com/api/v1/entries/?cas=90-15-3
GET https://cosingchecker.com/api/v1/entries/?annex=V&page=2&per_page=20

GET /api/v1/entries/{slug}/

Get a single annex entry by its slug (from the entry page URL).

GET https://cosingchecker.com/api/v1/entries/iii-12-benzoic-acid-sodium-benzoate/
GET https://cosingchecker.com/api/v1/entries/iii-16-1-naphthol/?include=ingredients,related,allergens,groups

Entry response fields

FieldDescription
idInternal record ID
slugURL slug
urlRelative URL of the entry page
annexAnnex code (II, III, IV, V, VI)
entry_numberEntry number within the annex
display_namePrimary display name
chemical_nameChemical name
inci_glossary_nameINCI / Glossary name
cas_numberCAS number(s)
ec_numberEC number(s)
product_typeProduct type restrictions
max_concentrationMaximum allowed concentration
warningsWarning labels
other_restrictionsOther restrictions
regulationRegulation reference
sccs_opinionsSCCS opinion titles
sccs_opinions_with_urlsSCCS opinion titles paired with URLs when available
chemical_iupac_nameIUPAC / chemical description field
identified_ingredientsIdentified ingredient names
cmrCMR classification
update_dateLast update date

Ingredient inventory

GET /api/v1/ingredients/

Search the CosIng ingredient inventory by INCI name, INN name, CAS or EC number.

ParameterDescription
qSearch term
casCAS number search
ecEC number search
functionIngredient function text
has_restrictionSet to 1 to require inventory restriction text
pagePage number (default 1)
per_pageResults per page (max 100, default 50)
GET https://cosingchecker.com/api/v1/ingredients/?q=glycerin
GET https://cosingchecker.com/api/v1/ingredients/?function=preservative
GET https://cosingchecker.com/api/v1/ingredients/?cas=90-15-3

GET /api/v1/ingredients/{slug}/

Get a single ingredient by slug.

GET https://cosingchecker.com/api/v1/ingredients/12345-glycerin/
GET https://cosingchecker.com/api/v1/ingredients/31470-1-naphthol/?include=entries,functions

EU INCI glossary 2025

GET /api/v1/inci-glossary/

Browse or search the official English common ingredient names imported from Decision (EU) 2025/1175.

ParameterMeaning
qOptional common-name fragment or exact entry number
page, per_pagePagination; maximum 100 records per page
GET https://cosingchecker.com/api/v1/inci-glossary/?q=niacinamide
GET https://cosingchecker.com/api/v1/inci-glossary/?q=17380

Reference endpoints

GET https://cosingchecker.com/api/v1/annexes/
GET https://cosingchecker.com/api/v1/annexes/III/entries/
GET https://cosingchecker.com/api/v1/product-types/
GET https://cosingchecker.com/api/v1/product-types/{slug}/entries/
GET https://cosingchecker.com/api/v1/functions/
GET https://cosingchecker.com/api/v1/functions/{slug}/ingredients/
GET https://cosingchecker.com/api/v1/allergens/
GET https://cosingchecker.com/api/v1/allergens/{slug}/entries/
GET https://cosingchecker.com/api/v1/stats/
GET https://cosingchecker.com/api/v1/jurisdictions/
GET https://cosingchecker.com/api/v1/external-sources/
GET https://cosingchecker.com/api/v1/substances/?cas=13463-67-7
GET https://cosingchecker.com/api/v1/substances/?inchi_key=GWEVSGVZZGPLCZ-UHFFFAOYSA-N
GET https://cosingchecker.com/api/v1/taxa/?genus=Actinidia
GET https://cosingchecker.com/api/v1/openapi.json

Machine-readable description

The whole API describes itself, so a client library or an agent can be pointed at one URL instead of this page.

GET https://cosingchecker.com/api/v1/openapi.json

OpenAPI 3.1. Generated from the routes themselves, so it cannot describe an endpoint that does not exist or miss one that does.

Response format

All list endpoints return paginated JSON:

{
  "count": 1739,
  "num_pages": 35,
  "page": 1,
  "per_page": 50,
  "results": [ ... ]
}

Usage and terms

The API requires no key. Search requests are limited to 120 per minute per client, and text filters accept up to 240 characters. A limited response uses HTTP 429 with Retry-After: 60. Please cache responses where possible.

Reuse rights vary by underlying source and market; commercial republication is not automatically permitted.

Always verify regulatory decisions and reuse terms against official source documents. The external-sources endpoint and sources page expose provenance, licence and attribution notes where known.