β οΈ Disclaimer: This is an unofficial, community-built integration. It is not affiliated with, endorsed by, or connected to Albert Heijn or Ahold Delhaize in any way. It uses the same mobile API that the Appie app uses β this is undocumented and may change or break without notice. The login flow is hacky (you need to extract an auth code from browser DevTools). You may run into rate limits or blocked requests. Use at your own risk.
An OpenClaw skill that turns your AI assistant into a personal grocery planner for Albert Heijn β the largest supermarket chain in the Netherlands. Built on top of the excellent appie-go library by @gwillem.
Your agent analyzes what you buy, checks this week's deals, suggests meals, and fills your shopping list β all through chat.
- π Login β Authenticates with your AH account via OAuth
- π Analyze β Pulls your purchase history (previously bought products)
- π§ Learn β Builds a taste profile from your history + feedback
- π·οΈ Bonus β Checks weekly deals and matches them to your preferences
- π½οΈ Suggest β Proposes meals using Allerhande recipes, optimized for bonus items
- π Shop β Adds everything to your AH shopping list (basics + meal ingredients)
- π Improve β Learns from approvals/rejections to get better over time
Requires Go 1.21+:
cd appie-cli go build -o appie-cli . mv appie-cli ~/go/bin/ # or anywhere in your PATH
appie-cli login-url
# Outputs a URL like: https://login.ah.nl/login?client_id=appie-ios&...- Open Developer Tools in your browser first (F12), go to the Network tab, and enable Preserve log
- Open the URL and log in with your Albert Heijn account
- After login, the browser will try to redirect to
appie://login-exit?code=XXXXXβ this will fail (it's a mobile app link, that's expected) - In the Network tab, find
ingelogd.json - Click it and look at the Response β you'll see:
"pageProps": { "__N_REDIRECT": "appie://login-exit?code=XXXXX", "__N_REDIRECT_STATUS": 302 }
- Copy the code (everything after
code=)
appie-cli exchange-code <your-code>
Tokens are saved to .appie.json and auto-refresh.
cp config-template.json config.json
Edit config.json with your preferences:
| Parameter | Default | Description |
|---|---|---|
meals_per_week |
3 | Number of meal suggestions per week |
max_cooking_time_minutes |
30 | Max cooking time for recipes |
household_size |
2 | Number of people |
shopping_day |
"friday" |
When you do groceries |
proposal_day |
"thursday" |
When to receive meal proposals |
dislikes |
[] |
Ingredients to avoid (e.g. ["fish", "mushrooms"]) |
allergies |
[] |
Allergies (e.g. ["gluten", "lactose"]) |
butcher_items |
[] |
Items to buy at the butcher instead of AH (optional) |
preferences.healthy |
true |
Prefer healthy recipes |
preferences.prefer_bonus |
true |
Prefer ingredients that are on sale |
Add to your OpenClaw workspace and the agent will handle the rest through conversation.
The skill uses the Albert Heijn mobile API (api.ah.nl) β the same API that powers the Appie app:
| Feature | Endpoint | Auth |
|---|---|---|
| Product search | REST /mobile-services/product/search/v2 |
Anonymous |
| Previously bought | GraphQL productSearch(previouslyBought: true) |
Required |
| Bonus products | REST ?bonus=true via AHWEBSHOP |
Anonymous |
| Shopping lists | REST /mobile-services/lists/v3/lists |
Required |
| Add to list | REST PATCH /mobile-services/shoppinglist/v2/items |
Required |
| Recipes | GraphQL recipeSearch + recipe(id) |
Anonymous |
| Member profile | GraphQL member |
Required |
previouslyBought: trueinProductSearchInputreturns all products you've ever purchased β this is undocumentedcustomerProfileAudienceson the member query reveals AH's internal segmentation (frequent buyer categories, food profile, dietary preferences)- Allerhande recipes are fully queryable via GraphQL with ingredients, cooking times, and portions
- Bonus products need the
x-application: AHWEBSHOPheader to return results via REST
Thursday morning (cron job):
βββ Fetch favorite lists (weekly basics)
βββ Fetch current bonus products
βββ Match bonus with purchase history
βββ Search Allerhande recipes matching:
β βββ Taste profile preferences
β βββ Available bonus ingredients
β βββ Cooking time constraints
β βββ Dislike/allergy filters
βββ Propose N meals via chat
βββ Wait for approval/modifications
βββ Add all items to AH shopping list (via batch-add)
βββ Look up product IDs from product-cache.json first
βββ Weekly basics (from favorite lists)
βββ Meal ingredients (with product IDs)
βββ Butcher items (as free text notes)
βββ Cache any newly discovered product IDs
appie-cli <command> [args]
Auth:
login-url Get the AH login URL
exchange-code <code> Exchange auth code for tokens
Products:
search <query> [limit] Search products
product <id> Get product details
bonus-products [limit] Get current bonus products
previously-bought [size] [page] Get previously bought products
Shopping List:
shopping-list Show main shopping list
shopping-lists List all shopping lists
list-items <list-id> Get items in a specific list
add-to-list <id> [qty] Add product to shopping list
add-to-list --text "item" Add free text item
batch-add Add multiple items from stdin (JSON array)
clear-list Clear shopping list
Account:
member Show member profile
receipts List receipts (β οΈ currently broken, see Known Issues)
receipt <id> Get receipt details (β οΈ currently broken)
AGPL-3.0
- Receipts endpoint broken β the AH receipt API returns 503. Tracked at gwillem/appie-go#1. Use
previously-boughtas an alternative.
This is an unofficial integration. Not affiliated with Albert Heijn or Ahold Delhaize. Use at your own risk. The API may change without notice.