{"slug":"horizonpulse-dev-api-grocery-normalize-555f2f","title":"Recipe ingredient parser and shopping list API","host":"horizonpulse.dev","method":"GET","resource":"https://horizonpulse.dev/api/grocery/normalize","category":"commerce","description":"Recipe ingredient parser and shopping list API: POST JSON {ingredients: [lines], servings?, targetServings?} (or GET ingredients=line|line). Returns per line name, canonicalId, qty, unit, metric (ml or g), category, optional/toTaste, prepNote, stated pack size, a typical pack hint, plus a merged sho","price_listed":0.002,"price_asked":0.002,"state":"answering","state_label":"Answering","checks_7d":1,"answered_7d":1,"latency_ms_median":500,"reported_calls_30d":3,"reported_payers_30d":2,"networks":["eip155:137","eip155:8453","solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","xrpl:0"],"badge":"unverified","paid_checks_7d":0,"paid_ok_7d":0,"example_input":{"method":"GET","queryParams":{"ingredients":"2 cups all-purpose flour|3 large eggs|1 tbsp olive oil","servings":"4","targetServings":"8"},"type":"http"},"output_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"input":{"additionalProperties":false,"properties":{"method":{"enum":["GET"],"type":"string"},"queryParams":{"properties":{"ingredients":{"description":"Ingredient lines separated by | (max 100 lines, 200 chars each). POST JSON is preferred.","type":"string"},"servings":{"description":"Servings the recipe makes, integer 1-100 as digits. Give with targetServings to scale, or neither.","pattern":"^[0-9]{1,3}$","type":"string"},"targetServings":{"description":"Servings wanted, integer 1-100 as digits.","pattern":"^[0-9]{1,3}$","type":"string"}},"required":["ingredients"],"type":"object"},"type":{"const":"http","type":"string"}},"required":["type","method"],"type":"object"},"output":{"properties":{"example":{"description":"Horizon Pulse grocery normalize: per line name, canonicalId, qty, unit, metric, category, pack hint; merged shoppingList; unparsed lines (no prices). The example is a trimmed real response recorded from GET /api/demo/grocery-normalize at 2026-10-14T21:18Z UTC; live values differ on every call.","type":"object"},"type":{"type":"string"}},"required":["type"],"type":"object"}},"required":["input"],"type":"object"},"history":[{"day":"2026-10-18","reachable":true,"status":402,"valid_402":true,"asked_usdc":0.002,"price_match":true,"latency_ms":500,"error":null}],"description_full":"Recipe ingredient parser and shopping list API: POST JSON {ingredients: [lines], servings?, targetServings?} (or GET ingredients=line|line). Returns per line name, canonicalId, qty, unit, metric (ml or g), category, optional/toTaste, prepNote, stated pack size, a typical pack hint, plus a merged shoppingList scaled to targetServings and unparsed lines. Deterministic, no outbound calls, no prices, nothing stored. Bad input (400) or nothing parsed (422): not charged.","last_updated":"2026-10-16T22:45:59.012Z","schemes":["exact"]}