What ingredient analysis returns
When you fetch ingredient data from the API, each analysed ingredient comes back with the following fields.The normalised common name of the ingredient as it appears in product labelling.
The official International Nomenclature of Cosmetic Ingredients (INCI) name. Returns
null when the INCI name cannot be determined from available data.The functional category of the ingredient. One of:
protein, oil, butter, humectant, emulsifier, surfactant, silicone, preservative, fragrance, or other.Whether the ingredient dissolves in water. Water-insoluble ingredients (many silicones and petroleum derivatives) require a surfactant-based cleanser to remove fully and may cause buildup on low-porosity hair.
A top-level boolean indicating whether the ingredient is generally considered curl-friendly across the textured hair community. This is a convenience flag — check
porosity_recommendation and avoid_if for more nuanced guidance.The porosity level this ingredient is best suited for. One of:
low, medium, high, all, or none. Lightweight humectants like glycerin are typically all; heavy butters are often high (best for high-porosity hair that needs sealing).A 2–3 sentence plain-English explanation of what the ingredient does in a hair product formulation.
1–2 sentences specifically addressing how the ingredient affects Black, natural, curly, or coily hair. These notes are generated with explicit awareness of the textured hair context and may highlight concerns (e.g. hygral fatigue risk for high-porosity hair) that generic ingredient databases omit.
Whether the ingredient is known to accumulate on the hair shaft over time. Ingredients that cause buildup typically require regular clarifying to maintain scalp health and product absorption.
Whether regular use of this ingredient means the user should incorporate a clarifying shampoo into their routine.
Product categories this ingredient commonly appears in — for example
["conditioner", "leave-in", "deep conditioner"].A list of hair concerns or conditions under which this ingredient should be avoided. For example:
["low porosity", "protein sensitive", "fine hair"].Example ingredient analysis response
Product-level ingredient flags
In addition to per-ingredient analysis, each product’sIngredients record carries aggregate boolean and string flags that let you filter products at the catalogue level without inspecting individual ingredients.
true if the product contains one or more sulphate surfactants (e.g. sodium lauryl sulphate, ammonium laureth sulphate). Sulphates cleanse effectively but can strip natural oils from coily and dry hair textures.true if the product contains paraben preservatives (e.g. methylparaben, propylparaben). Many consumers and brands in the textured hair space opt for paraben-free formulas.true if the product contains any silicone ingredient. Note that this flag does not distinguish between water-soluble silicones (e.g. cyclomethicone) and non-water-soluble ones (e.g. dimethicone). Use the per-ingredient is_water_soluble field for that distinction.The overall protein content of the formula:
none, low, medium, or high. Protein strengthens the hair shaft but can cause brittleness in users who are protein-sensitive — a common concern in 4C hair care.The overall moisture (humectant and emollient) content of the formula:
none, low, medium, or high. Use this alongside protein_level to help users maintain a healthy protein-moisture balance.The porosity levels this product is best suited for, derived from the aggregate ingredient profile. Possible values:
low, medium, high. A product heavy in lightweight humectants with no occlusive butters might return ["low", "medium"].Short descriptive tags produced during AI enrichment. Examples:
LOC-method, wash-and-go, protective-styles, scalp-safe, protein-free. These are useful for tag-based filtering and UI badge display.Using ingredient data in queries
Look up products by ingredient name
To find all products that contain a specific ingredient, use thename query parameter on the ingredients endpoint:
raw_list text field, so partial matches work — searching for glycerin will match vegetable glycerin and glycerin (derived from coconut).
Exclude ingredients from recommendations
When callingPOST /v1/recommend/, pass an exclude_ingredients array to filter out any product whose raw ingredient list contains one of your specified strings:
"dimethicone" will exclude products containing Dimethicone, Cyclopentasiloxane/Dimethicone Crosspolymer, and similar variants.