How it works
One POST per question. JSON back.
1Pick an endpoint. Each one has a function ID and a short list of variables, such as a search term, a category or a postal code.
2Start a run. We open the retailer's site in a real browser on our side, read what a shopper would see, and structure it.
3Store the answer. The data is read at call time. Schedule the calls you need, daily or before each price meeting, and keep the history in your own warehouse.
Works from Python, R, Power Query, Airflow or anything that can send an HTTPS request.
illustrative shape
# Delhaize Belgium - product search
curl -L -X POST \
"https://api.notte.cc/functions/$FUNCTION_ID/runs/start" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{
"function_id": "'"$FUNCTION_ID"'",
"variables": {
"query": "halfvolle melk 1L"
}
}'
// Illustrative response shape. Field names vary by endpoint.
// Values below are made up.
{
"status": "closed",
"result": {
"banner": "delhaize-be",
"query": "halfvolle melk 1L",
"read_at": "2026-11-09T06:02:11Z",
"products": [
{
"name": "Halfvolle melk 1 L",
"brand": "Own label",
"price": 1.15,
"currency": "EUR",
"unit_price": "1.15 EUR/L",
"promotion": {
"mechanic": "2+1",
"valid_until": "2026-11-15"
},
"url": "https://..."
}
]
}
}
import os, requests
FUNCTION_ID = os.environ["SHELFFEED_FUNCTION_ID"]
KEY = os.environ["SHELFFEED_KEY"]
def shelf(query):
r = requests.post(
f"https://api.notte.cc/functions/{FUNCTION_ID}/runs/start",
headers={"Authorization": f"Bearer {KEY}"},
json={
"function_id": FUNCTION_ID,
"variables": {"query": query},
},
timeout=180,
)
r.raise_for_status()
return r.json()
# Your top SKUs, before the Monday meeting
for sku in ["halfvolle melk 1L", "koffie gemalen 500g"]:
print(shelf(sku))