Recipe ingredient parser and shopping list API
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.
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
GET https://horizonpulse.dev/api/grocery/normalize
| Category | Commerce and shopping |
|---|---|
| Provider host | horizonpulse.dev |
| Networks | eip155:137, eip155:8453, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp, xrpl:0 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 3 from 2 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-18 | valid payment request | 402 | $0.002 | 500 ms |
Example input (from the provider)
{
"method": "GET",
"queryParams": {
"ingredients": "2 cups all-purpose flour|3 large eggs|1 tbsp olive oil",
"servings": "4",
"targetServings": "8"
},
"type": "http"
}
Promised output schema (from the provider)
{
"$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"
}