Ewg APIewg.org ↗
Search for cosmetic ingredients and instantly access their safety ratings, health hazard scores, and potential concerns from EWG's trusted Skin Deep database. Get comprehensive ingredient information including alternative names, regulatory sources, and detailed safety assessments to make informed decisions about the products you use.
curl -X GET 'https://api.parse.bot/scraper/47ae178e-a2f8-4985-9dac-c800f6eeabae/search_ingredients?page=1&search=retinol' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ewg-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: EWG Skin Deep SDK — bounded, re-runnable; every call capped."""
from parse_apis.ewg_org_api import EWGSkinDeep, IngredientNotFound
client = EWGSkinDeep()
# Search for ingredients matching "retinol", cap at 3 results
for ingredient in client.ingredient_summaries.search(query="retinol", limit=3):
print(ingredient.name, ingredient.score, ingredient.data_availability)
# Drill down into the first result's full details
item = client.ingredient_summaries.search(query="glycerin", limit=1).first()
if item:
try:
detail = item.details()
print(detail.name, detail.score, detail.data_availability)
print(detail.description)
for concern in detail.common_concerns:
print(concern.name, concern.level)
except IngredientNotFound as e:
print(f"Not found: {e.ingredient_id}")
print("exercised: ingredient_summaries.search, ingredient_summaries.details")
Search the EWG Skin Deep database for cosmetic ingredients by name. Returns a paginated list of matching ingredients with their hazard scores and data availability ratings. Results are auto-iterated; use limit to cap total items fetched.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based). |
| search | string | Search query for ingredient name. Use '*' to list all ingredients. |
{
"type": "object",
"fields": {
"page": "current page number",
"total": "total number of matching ingredients",
"ingredients": "array of ingredient summaries with id, name, slug, score, score_min, data_availability, and url",
"total_pages": "total number of pages available"
},
"sample": {
"data": {
"page": 1,
"total": 74,
"ingredients": [
{
"id": "705545",
"url": "https://www.ewg.org/skindeep/ingredients/705545-RETINYL_PALMITATE_VITAMIN_A_PALMITATE/",
"name": "RETINYL PALMITATE (VITAMIN A PALMITATE)",
"slug": "RETINYL_PALMITATE_VITAMIN_A_PALMITATE",
"score": 9,
"score_min": 1,
"data_availability": "Fair"
},
{
"id": "706889",
"url": "https://www.ewg.org/skindeep/ingredients/706889-RETINOL_VITAMIN_A/",
"name": "RETINOL (VITAMIN A)",
"slug": "RETINOL_VITAMIN_A",
"score": 9,
"score_min": 1,
"data_availability": "Good"
}
],
"total_pages": 7
},
"status": "success"
}
}About the Ewg API
The Ewg API on Parse exposes 2 endpoints for the publicly available data on ewg.org. Calls return JSON over HTTPS and are billed per successful response.
Pin a release with the API-Snapshot-Version header so canonical updates don't silently change your contract.