INCI Resolver API · Public endpoint
A thin, read-only JSON endpoint over the same curated ingredient table that backs the directory. No account, no API key — designed for indie-brand spreadsheets, partner platforms, and internal tools that need a deterministic INCI lookup.
Method
GET
Rate limit
60 / min / IP
Response
JSON
Auth
None
Sample response · 200
{
"query": "niacinamide",
"count": 1,
"results": [
{
"slug": "niacinamide",
"name": "Niacinamide",
"canonicalInciName": "Niacinamide",
"cas": "98-92-0",
"sourceUrl": "https://www.cir-cpanel.org/sites/default/files/ingredients/niacinamide.pdf",
"matchScore": 100,
"url": "/ingredients/niacinamide"
}
]
}Parameters
Both keys are passed as URL parameters. A non-integer limit is treated as omitted (and reverted to the default). Validation failures return a 400 with a flat { errors: { field: 'message' } } body.
| Name | Required | Type | Default |
|---|---|---|---|
qRequired Free-text query. Matched case- and whitespace-insensitively against the INCI name, the slug, and the display name. Minimum 1 character, maximum 200. | Yes | string | — |
limitOptional Maximum rows returned. Integer 1–50. Defaults to 10. | No | integer | 10 |
curl
The endpoint is exposed at the platform domain under /api/inci/resolve. Copy the line below verbatim — no headers, no auth, no body.
curl 'https://tinctloom.com/api/inci/resolve?q=niacinamide'A 429 indicates the per-IP bucket is exhausted — back off for the next minute. A 400 means the query string itself was rejected (oversize, missing, or non-integer where an integer was expected).
Try it
The widget below hits the live endpoint from your browser. It only fires on submit — landing on Tinctloom /ingredients/api does not count against the 60-per-minute bucket.
Try-it
/api/inci/resolve. Submit-driven — landing on this page does not call the endpoint.Type a query above and hit Resolve to see the JSON the endpoint returns.