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/
| Parameter | Values | Meaning |
|---|---|---|
q | name, CAS, EC or title | Optional evidence search |
status | prohibited, restricted, positive_list, inventory, under_review | Optional exact status filter |
page, per_page | positive integers; max 100 per page | Pagination |
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.
| Parameter | Type | Description |
|---|---|---|
q | string | Search term — name, CAS, EC or colour index |
annex | string | Annex code: II, III, IV, V or VI |
cas | string | CAS number search |
ec | string | EC number search |
entry_number | string | Entry number within an annex |
product_type | string | Product type condition text |
cmr | 1 / true | Filter to CMR substances only |
has_cas, has_ec | 1 / true | Require identifier fields |
has_warnings, has_max_concentration | 1 / true | Require warning or concentration fields |
ordering | string | Comma-separated ordering: annex, entry_number, updated_at, id, with optional minus prefix |
page | integer | Page number (default 1) |
per_page | integer | Results 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=20GET /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,groupsEntry response fields
| Field | Description |
|---|---|
id | Internal record ID |
slug | URL slug |
url | Relative URL of the entry page |
annex | Annex code (II, III, IV, V, VI) |
entry_number | Entry number within the annex |
display_name | Primary display name |
chemical_name | Chemical name |
inci_glossary_name | INCI / Glossary name |
cas_number | CAS number(s) |
ec_number | EC number(s) |
product_type | Product type restrictions |
max_concentration | Maximum allowed concentration |
warnings | Warning labels |
other_restrictions | Other restrictions |
regulation | Regulation reference |
sccs_opinions | SCCS opinion titles |
sccs_opinions_with_urls | SCCS opinion titles paired with URLs when available |
chemical_iupac_name | IUPAC / chemical description field |
identified_ingredients | Identified ingredient names |
cmr | CMR classification |
update_date | Last update date |
Ingredient inventory
GET /api/v1/ingredients/
Search the CosIng ingredient inventory by INCI name, INN name, CAS or EC number.
| Parameter | Description |
|---|---|
q | Search term |
cas | CAS number search |
ec | EC number search |
function | Ingredient function text |
has_restriction | Set to 1 to require inventory restriction text |
page | Page number (default 1) |
per_page | Results 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-3GET /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,functionsEU INCI glossary 2025
GET /api/v1/inci-glossary/
Browse or search the official English common ingredient names imported from Decision (EU) 2025/1175.
| Parameter | Meaning |
|---|---|
q | Optional common-name fragment or exact entry number |
page, per_page | Pagination; maximum 100 records per page |
GET https://cosingchecker.com/api/v1/inci-glossary/?q=niacinamide
GET https://cosingchecker.com/api/v1/inci-glossary/?q=17380Reference 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.jsonMachine-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.jsonOpenAPI 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.