[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FH9WT9W06ATRKWSS8EN4RT":3,"skill-same:01M6FH9WT9W06ATRKWSS8EN4RT":238},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M6FH9WT9W06ATRKWSS8EN4RT","supermarkt-prijzen",null,"Albert Heijn bonuses, product search, multi-store price comparison (12 supermarkets), recipe search by ingredients, and fridge scanner with vision AI.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"supermarkt prijzen","product","search","https","python3","curl","vision","scanner","vision ai","recipe","price","store","multi","comparison","with","2026-11-10 10:12:30",false,"---\nname: supermarkt-prijzen\ndescription: Albert Heijn bonuses, product search, multi-store price comparison (12 supermarkets), recipe search by ingredients, and fridge scanner with vision AI.\nhomepage: https:\u002F\u002Fwww.ah.nl\nmetadata: {\"openclaw\":{\"emoji\":\"?\",\"requires\":{\"bins\":[\"python3\",\"curl\"]}}}\n---\n\n# Albert Heijn API Skill\n\nComplete AH bonussen + producten + recepten via GraphQL (web) en OAuth (mobile).\n\n## Features\n\n✅ **Bonussen ophalen** (GraphQL, 200+ items, **geen login**)  \n✅ **Producten zoeken** (REST API, 20k+ items, **geen login**)  \n✅ **Recepten zoeken** (GraphQL, **geen login**)  \n✅ **Multi-supermarkt prijsvergelijking** (Checkjebon.nl - 12 supermarkten, 107k producten)  \n✅ **OAuth token flow** (mobile API access - alleen voor persoonlijke data)  \n✅ **Fridge scanner** (vision AI → recepten → shopping list)\n\n## Quick Start\n\n### 1. Bonussen + Producten (GEEN LOGIN NODIG!)\n\n**Bonussen ophalen (200+ items):**\n```bash\n.\u002Fah-api.py bonuses --filter WEB_BONUS_PAGE --pretty\n```\n\n**Producten zoeken (20.000+ items):**\n```bash\n.\u002Fah-api.py search --query \"melk\" --limit 10 --pretty\n```\n\n**Recepten zoeken:**\n```bash\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --pretty\n```\n\n**Recept ophalen via URL:**\n```bash\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips\" --pretty\n```\n\n✨ **Alles werkt zonder cookies!** Gebruikt `curl-cffi` met Chrome fingerprint.\n\n### 2. OAuth Token Flow (mobile API)\n\n**Get initial token:**\n1. Open Appie app\n2. Tap profiel → instellingen → scroll down → \"Developer\" (hidden option)\n3. Tap \"OAuth Code\" → copy code\n4. Run binnen 30 seconden:\n```bash\ncurl -X POST 'https:\u002F\u002Fapi.ah.nl\u002Fmobile-auth\u002Fv1\u002Fauth\u002Ftoken' \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -H 'User-Agent: Appie\u002F8.22.3' \\\n  -d '{\"clientId\":\"appie\",\"code\":\"PASTE_CODE_HERE\"}'\n```\n\n**Response:**\n```json\n{\n  \"access_token\": \"USERID_TOKEN\",\n  \"refresh_token\": \"REFRESH_TOKEN\",\n  \"expires_in\": 604798\n}\n```\n\n**Save to ~\u002F.ah_tokens.json:**\n```bash\necho '{\"access_token\":\"...\",\"refresh_token\":\"...\",\"expires_in\":604798}' > ~\u002F.ah_tokens.json\n```\n\n**Refresh token (na 7 dagen):**\n```bash\n.\u002Frefresh-token.py\n```\n\n### 3. Multi-store price comparison\n\n**Search across 12 supermarkets:**\n```bash\n.\u002Fcheckjebon-search.py --compare \"melk\" --top 10\n```\n\n**Stores:** AH, Jumbo, Lidl, Plus, Dekamarkt, Spar, Dirk, Hoogvliet, Poiesz, Aldi, Vomar, Ekoplaza\n\n## Tools\n\n| Tool | Purpose |\n|------|---------|\n| `ah-api.py` | Cookie-based bonussen + producten (GraphQL + REST) |\n| `ah-recipes.py` | **NEW!** Recipe search by text or ingredients |\n| `fridge-scan.sh` | **NEW!** Scan fridge with camera\u002Fpeekaboo |\n| `smart-cook.sh` | **NEW!** Complete workflow: scan → recipes → shopping |\n| `get-bonuses.py` | Legacy bonus tool (GraphQL only) |\n| `checkjebon-search.py` | Multi-store prijsvergelijking |\n| `refresh-token.py` | OAuth token vernieuwen |\n| `setup-cookies.sh` | Cookie setup helper |\n\n## Technical Details\n\n### Authentication (NONE NEEDED!)\n\n**Previous:** Required session cookies from browser  \n**Now:** Uses `curl-cffi` with `impersonate='chrome120'`\n\n**How it works:**\n- curl-cffi sends real Chrome TLS fingerprints\n- AH's bot detection sees it as a normal browser\n- No cookies, no login, no setup required! ?\n\n**Only needed for:**\n- OAuth mobile API (receipts, personal data) - requires app login\n\n### GraphQL Bonuses API\n\n**Endpoint:** `https:\u002F\u002Fwww.ah.nl\u002Fgql`\n\n**Query:**\n```graphql\nquery FetchBonusPromotions($periodStart: String, $periodEnd: String) {\n  bonusPromotions(\n    filterSet: WEB_BONUS_PAGE\n    input: {\n      periodStart: \"2026-02-01\"\n      periodEnd: \"2026-02-08\"\n      filterUnavailableProducts: false\n      forcePromotionVisibility: true\n    }\n  ) {\n    id title promotionType\n    price { now { amount } }\n    product { title category }\n  }\n}\n```\n\n**Available filters:**\n- `WEB_BONUS_PAGE` - Alle bonussen (326 items!)\n- `APP_PERSONAL` - Persoonlijke aanbiedingen\n- `APP_BONUS_BOX` - Bonus box\n- `COUPON` - Kortingsbonnen\n- `FREE_DELIVERY` - Gratis bezorging\n- `SPOTLIGHT` - Spotlight aanbiedingen\n\n### REST Product Search\n\n**Endpoint:** `https:\u002F\u002Fwww.ah.nl\u002Fzoeken\u002Fapi\u002Fproducts\u002Fsearch`\n\n**Example:**\n```bash\ncurl 'https:\u002F\u002Fwww.ah.nl\u002Fzoeken\u002Fapi\u002Fproducts\u002Fsearch?query=melk' \\\n  -H 'Cookie: SSOC=...; jsessionid_myah=...' \\\n  --user-agent 'Mozilla\u002F5.0 (compatible; AH-Bot\u002F1.0)'\n```\n\n**Response:**\n```json\n{\n  \"cards\": [\n    {\n      \"products\": [\n        {\n          \"id\": 441199,\n          \"title\": \"Campina Halfvolle melk\",\n          \"price\": { \"now\": 1.99, \"unitSize\": \"1,5 l\" }\n        }\n      ]\n    }\n  ]\n}\n```\n\n### OAuth Mobile API\n\n**Authorization:** `https:\u002F\u002Flogin.ah.nl\u002Fsecure\u002Foauth\u002Fauthorize`  \n**Token exchange:** `https:\u002F\u002Fapi.ah.nl\u002Fmobile-auth\u002Fv1\u002Fauth\u002Ftoken`  \n**Token refresh:** `https:\u002F\u002Fapi.ah.nl\u002Fmobile-auth\u002Fv1\u002Fauth\u002Ftoken\u002Frefresh`\n\n**Token lifetime:** 7 days (604798 seconds)\n\n**Known endpoints (from gist):**\n- `\u002Fmobile-services\u002Fv1\u002Freceipts` - All receipts\n- `\u002Fmobile-services\u002Fv2\u002Freceipts\u002F{id}` - Specific receipt\n- `\u002Fmobile-services\u002Fproduct\u002Fsearch\u002Fv2` - Product search\n\n**Note:** Some mobile endpoints currently return 500 errors (infrastructure issues).\n\n### Why curl-cffi?\n\nAH uses **Cloudflare + Akamai bot detection**. Normal `requests` → 403 Access Denied.\n\n**curl-cffi** uses real Chrome TLS fingerprints:\n```python\nfrom curl_cffi import requests\nresponse = requests.get(url, impersonate=\"chrome120\")  # ← Magic!\n```\n\n## Checkjebon Multi-Store Data\n\n**Source:** `https:\u002F\u002Fraw.githubusercontent.com\u002Fsupermarkt\u002Fcheckjebon\u002Fmain\u002Fdata\u002Fsupermarkets.json`\n\n**Stats:**\n- File size: 10.3MB\n- Total products: 106,991\n- Daily updates\n- 24h local cache\n\n**Usage:**\n```bash\n# Find cheapest\n.\u002Fcheckjebon-search.py --compare \"bier\" --top 5\n\n# Specific store\n.\u002Fcheckjebon-search.py --query \"campina\" --store jumbo\n\n# Show stats\n.\u002Fcheckjebon-search.py --stats\n```\n\n## Recipe Features (NEW!) ?\n\n### Scan Fridge → Find Recipes → Shopping List\n\n**1. Scan your fridge:**\n```bash\n.\u002Ffridge-scan.sh\n# Opens camera, captures fridge contents\n# Output: \u002Ftmp\u002Ffridge-scan.jpg\n```\n\n**2. Extract ingredients (via OpenClaw image tool):**\n```bash\n# Ask assistant:\n# \"Analyze \u002Ftmp\u002Ffridge-scan.jpg and list all food items as comma-separated\"\n# → melk, eieren, tomaten, kaas, broccoli\n```\n\n**3. Find recipes:**\n```bash\n.\u002Fah-recipes.py ingredients --ingredients \"melk,eieren,kaas,broccoli\" --pretty\n```\n\n**4. Get recipe details (by ID):**\n```bash\n.\u002Fah-recipes.py details --recipe-id 1187649 --pretty\n```\n\n**Or get recipe from URL directly:**\n```bash\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips\" --pretty\n```\n\n**5. Complete workflow:**\n```bash\n.\u002Fsmart-cook.sh\n# Interactive: scan → analyze → find recipes → shopping list\n```\n\n### Recipe ID Resolution\n\n**How to get recipe IDs:**\n\n1. **From search results:** The `search` action returns titles only. To get full details, you need the recipe ID.\n2. **From URL:** Recipe URLs contain the ID in format `R-R{ID}`:\n   - Example: `https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips`\n   - Extract: `R-R1187649` → ID = `1187649`\n3. **Direct lookup:** Use the `url` action to automatically extract ID and fetch details\n\n**Workflow:**\n```bash\n# Step 1: Search for recipes (returns titles only)\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --pretty\n\n# Step 2: If you have the recipe URL (e.g., from browser or website), extract ID\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R{ID}\u002F{slug}\" --pretty\n\n# Note: Search results don't include recipe IDs (client-side rendered)\n# To get full details, you need either:\n#   - The direct recipe URL (contains R-R{ID})\n#   - The recipe ID number\n```\n\n### Recipe Search Examples\n\n**Search by text (returns IDs + titles):**\n```bash\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --size 10 --pretty\n# Output: {\"recipes\": [{\"id\": 1200422, \"title\": \"Klassieke spaghetti carbonara\"}, ...], \"total\": 49, \"hasMore\": true}\n```\n\n**Search with detailed info (cook time, ratings, images, servings):**\n```bash\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --size 5 --detailed --pretty\n# Output: Full recipe summaries with time, ratings, images, servings\n```\n\n**Search by ingredients:**\n```bash\n.\u002Fah-recipes.py ingredients --ingredients \"tomaat,ui,knoflook\" --size 5 --pretty\n```\n\n**Get recipe from URL:**\n```bash\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips\" --pretty\n# Extracts recipe ID from URL (R-R1187649 → 1187649) and fetches full details\n```\n\n## Examples\n\n**Cheapest melk across all stores:**\n```bash\n.\u002Fcheckjebon-search.py --compare \"melk\" --top 5\n```\n\n**AH bonussen vandaag:**\n```bash\n.\u002Fah-api.py bonuses --filter WEB_BONUS_PAGE --pretty | \\\n  jq '.bonuses[] | select(.title | contains(\"Campina\"))'\n```\n\n**Search AH products:**\n```bash\n.\u002Fah-api.py search --query \"bier\" --limit 20 --pretty\n```\n\n## Troubleshooting\n\n**\"Access Denied\" errors:**\n- Use curl-cffi (not standard requests)\n- Check User-Agent header\n- Refresh cookies (run `.\u002Fsetup-cookies.sh`)\n\n**OAuth code expired:**\n- Codes valid for only 30 seconds!\n- Use curl command immediately after generating code\n- Or use refresh_token to extend session\n\n**GraphQL errors:**\n- Check date format (YYYY-MM-DD)\n- Verify filterSet value (case-sensitive)\n- Ensure cookies are fresh\n\n## Files\n\n```\nah-bonuses\u002F\n├── SKILL.md              # This file\n├── README.md             # Quick start\n├── ah-api.py             # Main CLI tool (bonuses + search)\n├── get-bonuses.py        # Legacy bonus tool\n├── checkjebon-search.py  # Multi-store search\n├── refresh-token.py      # OAuth token refresh\n├── setup-cookies.sh      # Cookie extractor\n└── ~\u002F.ah_cookies.json    # Session cookies (gitignored)\n└── ~\u002F.ah_tokens.json     # OAuth tokens (gitignored)\n```\n\n## Credits\n\n- **AlbertPWN** (userlandkernel) - Original mobile API research\n- **TommasoAmici\u002Fah-bonus-bot** - Rust bot with product search endpoint\n- **jabbink** - Comprehensive API documentation gist\n- **curl-cffi** - Chrome fingerprinting library\n\n## Status\n\n✅ **Bonussen API** (GraphQL) - **100% working WITHOUT login!** (200+ bonussen)  \n✅ **Product search** (REST) - **100% working WITHOUT login!** (20k+ producten)  \n✅ **Recipe search** (GraphQL) - **100% working WITHOUT login!**  \n✅ **Multi-store comparison** (Checkjebon) - **100% working** (107k products, 12 stores)  \n✅ **OAuth token flow** - Working (7-day tokens, voor mobile API)  \n⚠️ **Mobile API endpoints** - Partial (some 500 errors)\n\n## Changelog\n\n**2026-02-02 - MAJOR UPDATE:**\n- ? **Removed cookie requirement!** All APIs now work WITHOUT login\n- ✅ Bonussen: 200+ items, anonymous access\n- ✅ Product search: 20k+ items, anonymous access  \n- ✅ Recipes: Full search, anonymous access\n- ? Uses `curl-cffi` with `impersonate='chrome120'` to bypass bot detection\n- ?️ Deprecated: `setup-cookies.sh` (no longer needed)\n- ⚠️ OAuth still available for mobile API (receipts, personal data)\n\n**2026-02-01:**\n- Added recipe search by ingredients\n- Added fridge scanner workflow\n- Multi-store comparison (Checkjebon.nl)\n\nLast updated: 2026-02-02\n","# Albert Heijn API Skill\n\nComplete AH bonussen + producten + recepten via GraphQL (web) en OAuth (mobile).\n\n## Features\n\n✅ **Bonussen ophalen** (GraphQL, 200+ items, **geen login**)  \n✅ **Producten zoeken** (REST API, 20k+ items, **geen login**)  \n✅ **Recepten zoeken** (GraphQL, **geen login**)  \n✅ **Multi-supermarkt prijsvergelijking** (Checkjebon.nl - 12 supermarkten, 107k producten)  \n✅ **OAuth token flow** (mobile API access - alleen voor persoonlijke data)  \n✅ **Fridge scanner** (vision AI → recepten → shopping list)\n\n## Quick Start\n\n### 1. Bonussen + Producten (GEEN LOGIN NODIG!)\n\n**Bonussen ophalen (200+ items):**\n```bash\n.\u002Fah-api.py bonuses --filter WEB_BONUS_PAGE --pretty\n```\n\n**Producten zoeken (20.000+ items):**\n```bash\n.\u002Fah-api.py search --query \"melk\" --limit 10 --pretty\n```\n\n**Recepten zoeken:**\n```bash\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --pretty\n```\n\n**Recept ophalen via URL:**\n```bash\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips\" --pretty\n```\n\n✨ **Alles werkt zonder cookies!** Gebruikt `curl-cffi` met Chrome fingerprint.\n\n### 2. OAuth Token Flow (mobile API)\n\n**Get initial token:**\n1. Open Appie app\n2. Tap profiel → instellingen → scroll down → \"Developer\" (hidden option)\n3. Tap \"OAuth Code\" → copy code\n4. Run binnen 30 seconden:\n```bash\ncurl -X POST 'https:\u002F\u002Fapi.ah.nl\u002Fmobile-auth\u002Fv1\u002Fauth\u002Ftoken' \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -H 'User-Agent: Appie\u002F8.22.3' \\\n  -d '{\"clientId\":\"appie\",\"code\":\"PASTE_CODE_HERE\"}'\n```\n\n**Response:**\n```json\n{\n  \"access_token\": \"USERID_TOKEN\",\n  \"refresh_token\": \"REFRESH_TOKEN\",\n  \"expires_in\": 604798\n}\n```\n\n**Save to ~\u002F.ah_tokens.json:**\n```bash\necho '{\"access_token\":\"...\",\"refresh_token\":\"...\",\"expires_in\":604798}' > ~\u002F.ah_tokens.json\n```\n\n**Refresh token (na 7 dagen):**\n```bash\n.\u002Frefresh-token.py\n```\n\n### 3. Multi-store price comparison\n\n**Search across 12 supermarkets:**\n```bash\n.\u002Fcheckjebon-search.py --compare \"melk\" --top 10\n```\n\n**Stores:** AH, Jumbo, Lidl, Plus, Dekamarkt, Spar, Dirk, Hoogvliet, Poiesz, Aldi, Vomar, Ekoplaza\n\n## Tools\n\n| Tool | Purpose |\n|------|---------|\n| `ah-api.py` | Cookie-based bonussen + producten (GraphQL + REST) |\n| `ah-recipes.py` | **NEW!** Recipe search by text or ingredients |\n| `fridge-scan.sh` | **NEW!** Scan fridge with camera\u002Fpeekaboo |\n| `smart-cook.sh` | **NEW!** Complete workflow: scan → recipes → shopping |\n| `get-bonuses.py` | Legacy bonus tool (GraphQL only) |\n| `checkjebon-search.py` | Multi-store prijsvergelijking |\n| `refresh-token.py` | OAuth token vernieuwen |\n| `setup-cookies.sh` | Cookie setup helper |\n\n## Technical Details\n\n### Authentication (NONE NEEDED!)\n\n**Previous:** Required session cookies from browser  \n**Now:** Uses `curl-cffi` with `impersonate='chrome120'`\n\n**How it works:**\n- curl-cffi sends real Chrome TLS fingerprints\n- AH's bot detection sees it as a normal browser\n- No cookies, no login, no setup required! ?\n\n**Only needed for:**\n- OAuth mobile API (receipts, personal data) - requires app login\n\n### GraphQL Bonuses API\n\n**Endpoint:** `https:\u002F\u002Fwww.ah.nl\u002Fgql`\n\n**Query:**\n```graphql\nquery FetchBonusPromotions($periodStart: String, $periodEnd: String) {\n  bonusPromotions(\n    filterSet: WEB_BONUS_PAGE\n    input: {\n      periodStart: \"2026-02-01\"\n      periodEnd: \"2026-02-08\"\n      filterUnavailableProducts: false\n      forcePromotionVisibility: true\n    }\n  ) {\n    id title promotionType\n    price { now { amount } }\n    product { title category }\n  }\n}\n```\n\n**Available filters:**\n- `WEB_BONUS_PAGE` - Alle bonussen (326 items!)\n- `APP_PERSONAL` - Persoonlijke aanbiedingen\n- `APP_BONUS_BOX` - Bonus box\n- `COUPON` - Kortingsbonnen\n- `FREE_DELIVERY` - Gratis bezorging\n- `SPOTLIGHT` - Spotlight aanbiedingen\n\n### REST Product Search\n\n**Endpoint:** `https:\u002F\u002Fwww.ah.nl\u002Fzoeken\u002Fapi\u002Fproducts\u002Fsearch`\n\n**Example:**\n```bash\ncurl 'https:\u002F\u002Fwww.ah.nl\u002Fzoeken\u002Fapi\u002Fproducts\u002Fsearch?query=melk' \\\n  -H 'Cookie: SSOC=...; jsessionid_myah=...' \\\n  --user-agent 'Mozilla\u002F5.0 (compatible; AH-Bot\u002F1.0)'\n```\n\n**Response:**\n```json\n{\n  \"cards\": [\n    {\n      \"products\": [\n        {\n          \"id\": 441199,\n          \"title\": \"Campina Halfvolle melk\",\n          \"price\": { \"now\": 1.99, \"unitSize\": \"1,5 l\" }\n        }\n      ]\n    }\n  ]\n}\n```\n\n### OAuth Mobile API\n\n**Authorization:** `https:\u002F\u002Flogin.ah.nl\u002Fsecure\u002Foauth\u002Fauthorize`  \n**Token exchange:** `https:\u002F\u002Fapi.ah.nl\u002Fmobile-auth\u002Fv1\u002Fauth\u002Ftoken`  \n**Token refresh:** `https:\u002F\u002Fapi.ah.nl\u002Fmobile-auth\u002Fv1\u002Fauth\u002Ftoken\u002Frefresh`\n\n**Token lifetime:** 7 days (604798 seconds)\n\n**Known endpoints (from gist):**\n- `\u002Fmobile-services\u002Fv1\u002Freceipts` - All receipts\n- `\u002Fmobile-services\u002Fv2\u002Freceipts\u002F{id}` - Specific receipt\n- `\u002Fmobile-services\u002Fproduct\u002Fsearch\u002Fv2` - Product search\n\n**Note:** Some mobile endpoints currently return 500 errors (infrastructure issues).\n\n### Why curl-cffi?\n\nAH uses **Cloudflare + Akamai bot detection**. Normal `requests` → 403 Access Denied.\n\n**curl-cffi** uses real Chrome TLS fingerprints:\n```python\nfrom curl_cffi import requests\nresponse = requests.get(url, impersonate=\"chrome120\")  # ← Magic!\n```\n\n## Checkjebon Multi-Store Data\n\n**Source:** `https:\u002F\u002Fraw.githubusercontent.com\u002Fsupermarkt\u002Fcheckjebon\u002Fmain\u002Fdata\u002Fsupermarkets.json`\n\n**Stats:**\n- File size: 10.3MB\n- Total products: 106,991\n- Daily updates\n- 24h local cache\n\n**Usage:**\n```bash\n# Find cheapest\n.\u002Fcheckjebon-search.py --compare \"bier\" --top 5\n\n# Specific store\n.\u002Fcheckjebon-search.py --query \"campina\" --store jumbo\n\n# Show stats\n.\u002Fcheckjebon-search.py --stats\n```\n\n## Recipe Features (NEW!) ?\n\n### Scan Fridge → Find Recipes → Shopping List\n\n**1. Scan your fridge:**\n```bash\n.\u002Ffridge-scan.sh\n# Opens camera, captures fridge contents\n# Output: \u002Ftmp\u002Ffridge-scan.jpg\n```\n\n**2. Extract ingredients (via OpenClaw image tool):**\n```bash\n# Ask assistant:\n# \"Analyze \u002Ftmp\u002Ffridge-scan.jpg and list all food items as comma-separated\"\n# → melk, eieren, tomaten, kaas, broccoli\n```\n\n**3. Find recipes:**\n```bash\n.\u002Fah-recipes.py ingredients --ingredients \"melk,eieren,kaas,broccoli\" --pretty\n```\n\n**4. Get recipe details (by ID):**\n```bash\n.\u002Fah-recipes.py details --recipe-id 1187649 --pretty\n```\n\n**Or get recipe from URL directly:**\n```bash\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips\" --pretty\n```\n\n**5. Complete workflow:**\n```bash\n.\u002Fsmart-cook.sh\n# Interactive: scan → analyze → find recipes → shopping list\n```\n\n### Recipe ID Resolution\n\n**How to get recipe IDs:**\n\n1. **From search results:** The `search` action returns titles only. To get full details, you need the recipe ID.\n2. **From URL:** Recipe URLs contain the ID in format `R-R{ID}`:\n   - Example: `https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips`\n   - Extract: `R-R1187649` → ID = `1187649`\n3. **Direct lookup:** Use the `url` action to automatically extract ID and fetch details\n\n**Workflow:**\n```bash\n# Step 1: Search for recipes (returns titles only)\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --pretty\n\n# Step 2: If you have the recipe URL (e.g., from browser or website), extract ID\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R{ID}\u002F{slug}\" --pretty\n\n# Note: Search results don't include recipe IDs (client-side rendered)\n# To get full details, you need either:\n#   - The direct recipe URL (contains R-R{ID})\n#   - The recipe ID number\n```\n\n### Recipe Search Examples\n\n**Search by text (returns IDs + titles):**\n```bash\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --size 10 --pretty\n# Output: {\"recipes\": [{\"id\": 1200422, \"title\": \"Klassieke spaghetti carbonara\"}, ...], \"total\": 49, \"hasMore\": true}\n```\n\n**Search with detailed info (cook time, ratings, images, servings):**\n```bash\n.\u002Fah-recipes.py search --query \"pasta carbonara\" --size 5 --detailed --pretty\n# Output: Full recipe summaries with time, ratings, images, servings\n```\n\n**Search by ingredients:**\n```bash\n.\u002Fah-recipes.py ingredients --ingredients \"tomaat,ui,knoflook\" --size 5 --pretty\n```\n\n**Get recipe from URL:**\n```bash\n.\u002Fah-recipes.py url --url \"https:\u002F\u002Fwww.ah.nl\u002Fallerhande\u002Frecept\u002FR-R1187649\u002Fzoete-tortillachips\" --pretty\n# Extracts recipe ID from URL (R-R1187649 → 1187649) and fetches full details\n```\n\n## Examples\n\n**Cheapest melk across all stores:**\n```bash\n.\u002Fcheckjebon-search.py --compare \"melk\" --top 5\n```\n\n**AH bonussen vandaag:**\n```bash\n.\u002Fah-api.py bonuses --filter WEB_BONUS_PAGE --pretty | \\\n  jq '.bonuses[] | select(.title | contains(\"Campina\"))'\n```\n\n**Search AH products:**\n```bash\n.\u002Fah-api.py search --query \"bier\" --limit 20 --pretty\n```\n\n## Troubleshooting\n\n**\"Access Denied\" errors:**\n- Use curl-cffi (not standard requests)\n- Check User-Agent header\n- Refresh cookies (run `.\u002Fsetup-cookies.sh`)\n\n**OAuth code expired:**\n- Codes valid for only 30 seconds!\n- Use curl command immediately after generating code\n- Or use refresh_token to extend session\n\n**GraphQL errors:**\n- Check date format (YYYY-MM-DD)\n- Verify filterSet value (case-sensitive)\n- Ensure cookies are fresh\n\n## Files\n\n```\nah-bonuses\u002F\n├── SKILL.md              # This file\n├── README.md             # Quick start\n├── ah-api.py             # Main CLI tool (bonuses + search)\n├── get-bonuses.py        # Legacy bonus tool\n├── checkjebon-search.py  # Multi-store search\n├── refresh-token.py      # OAuth token refresh\n├── setup-cookies.sh      # Cookie extractor\n└── ~\u002F.ah_cookies.json    # Session cookies (gitignored)\n└── ~\u002F.ah_tokens.json     # OAuth tokens (gitignored)\n```\n\n## Credits\n\n- **AlbertPWN** (userlandkernel) - Original mobile API research\n- **TommasoAmici\u002Fah-bonus-bot** - Rust bot with product search endpoint\n- **jabbink** - Comprehensive API documentation gist\n- **curl-cffi** - Chrome fingerprinting library\n\n## Status\n\n✅ **Bonussen API** (GraphQL) - **100% working WITHOUT login!** (200+ bonussen)  \n✅ **Product search** (REST) - **100% working WITHOUT login!** (20k+ producten)  \n✅ **Recipe search** (GraphQL) - **100% working WITHOUT login!**  \n✅ **Multi-store comparison** (Checkjebon) - **100% working** (107k products, 12 stores)  \n✅ **OAuth token flow** - Working (7-day tokens, voor mobile API)  \n⚠️ **Mobile API endpoints** - Partial (some 500 errors)\n\n## Changelog\n\n**2026-02-02 - MAJOR UPDATE:**\n- ? **Removed cookie requirement!** All APIs now work WITHOUT login\n- ✅ Bonussen: 200+ items, anonymous access\n- ✅ Product search: 20k+ items, anonymous access  \n- ✅ Recipes: Full search, anonymous access\n- ? Uses `curl-cffi` with `impersonate='chrome120'` to bypass bot detection\n- ?️ Deprecated: `setup-cookies.sh` (no longer needed)\n- ⚠️ OAuth still available for mobile API (receipts, personal data)\n\n**2026-02-01:**\n- Added recipe search by ingredients\n- Added fridge scanner workflow\n- Multi-store comparison (Checkjebon.nl)\n\nLast updated: 2026-02-02\n",{"name":5,"homepage":43,"metadata":44,"description":7},"https:\u002F\u002Fwww.ah.nl",{"openclaw":45},{"emoji":46,"requires":47},"?",{"bins":48},[27,28],"main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fcgnl\u002Fsupermarkt-prijzen",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add kbarbel640-del\u002Fskills --skill supermarkt-prijzen",{"tool":62,"command":63},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill supermarkt-prijzen",{"tool":65,"command":66},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill supermarkt-prijzen","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002FSKILL.md",true,[70,76,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"_meta.json","REFERENCE","参考文档",286,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002F_meta.json",{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"ah-api.py","SCRIPT","脚本",9977,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fah-api.py",{"path":83,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":84,"sourceHtmlUrl":85},"ah-graphql-schema-full.md",259907,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fah-graphql-schema-full.md",{"path":87,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":88,"sourceHtmlUrl":89},"ah-mobile-auth.py",8681,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fah-mobile-auth.py",{"path":91,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":92,"sourceHtmlUrl":93},"ah-oauth-api.py",2794,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fah-oauth-api.py",{"path":95,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":96,"sourceHtmlUrl":97},"ah-recipes.py",7908,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fah-recipes.py",{"path":99,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":100,"sourceHtmlUrl":101},"auto-fetch-cookies.sh",1845,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fauto-fetch-cookies.sh",{"path":103,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":104,"sourceHtmlUrl":105},"card-generator.py",987,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fcard-generator.py",{"path":107,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":108,"sourceHtmlUrl":109},"check-card-offers.py",4374,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fcheck-card-offers.py",{"path":111,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":112,"sourceHtmlUrl":113},"checkjebon-search.py",6087,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fcheckjebon-search.py",{"path":115,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":116,"sourceHtmlUrl":117},"debug-api.py",898,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fdebug-api.py",{"path":119,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":120,"sourceHtmlUrl":121},"exchange-code.py",1559,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fexchange-code.py",{"path":123,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":124,"sourceHtmlUrl":125},"extract-cookies.sh",1843,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fextract-cookies.sh",{"path":127,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":128,"sourceHtmlUrl":129},"find-search-query.py",1840,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ffind-search-query.py",{"path":131,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":132,"sourceHtmlUrl":133},"fridge-scan.sh",1942,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ffridge-scan.sh",{"path":135,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":136,"sourceHtmlUrl":137},"get-bonuses-v2.py",9569,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fget-bonuses-v2.py",{"path":139,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":140,"sourceHtmlUrl":141},"get-bonuses.py",5924,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fget-bonuses.py",{"path":143,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":144,"sourceHtmlUrl":145},"get-product-details.py",8179,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fget-product-details.py",{"path":147,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":148,"sourceHtmlUrl":149},"graphql-fingerprint.txt",2056,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fgraphql-fingerprint.txt",{"path":151,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":152,"sourceHtmlUrl":153},"GRAPHQL-INVESTIGATION.md",5054,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002FGRAPHQL-INVESTIGATION.md",{"path":155,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":156,"sourceHtmlUrl":157},"improved-search.py",608,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fimproved-search.py",{"path":159,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":160,"sourceHtmlUrl":161},"introspect.py",1155,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fintrospect.py",{"path":163,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":164,"sourceHtmlUrl":165},"list-queries.py",1186,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Flist-queries.py",{"path":167,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":168,"sourceHtmlUrl":169},"oauth-flow.py",2570,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Foauth-flow.py",{"path":171,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":172,"sourceHtmlUrl":173},"README.md",2341,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002FREADME.md",{"path":175,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":176,"sourceHtmlUrl":177},"refresh-token.py",1305,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Frefresh-token.py",{"path":179,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":180,"sourceHtmlUrl":181},"setup-cookies.sh",267,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fsetup-cookies.sh",{"path":183,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":184,"sourceHtmlUrl":185},"smart-cook.sh",3637,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Fsmart-cook.sh",{"path":187,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":188,"sourceHtmlUrl":189},"test-allerhande-introspection.py",1704,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-allerhande-introspection.py",{"path":191,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":192,"sourceHtmlUrl":193},"test-bonuses-anonymous.py",1810,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-bonuses-anonymous.py",{"path":195,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":196,"sourceHtmlUrl":197},"test-bonuskaart-detailed.sh",994,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-bonuskaart-detailed.sh",{"path":199,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":200,"sourceHtmlUrl":201},"test-bonuskaart-smart.sh",1353,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-bonuskaart-smart.sh",{"path":203,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":204,"sourceHtmlUrl":205},"test-bonuskaart-validation.sh",897,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-bonuskaart-validation.sh",{"path":207,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":208,"sourceHtmlUrl":209},"test-full-search.py",1017,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-full-search.py",{"path":211,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":212,"sourceHtmlUrl":213},"test-invalid-card.sh",1611,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-invalid-card.sh",{"path":215,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":216,"sourceHtmlUrl":217},"test-personal-bonus.py",2688,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-personal-bonus.py",{"path":219,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":220,"sourceHtmlUrl":221},"test-product-search-graphql.py",1602,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-product-search-graphql.py",{"path":223,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":224,"sourceHtmlUrl":225},"test-products-graphql2.py",2035,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-products-graphql2.py",{"path":227,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":228,"sourceHtmlUrl":229},"test-real-search.py",1062,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-real-search.py",{"path":231,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":232,"sourceHtmlUrl":233},"test-rest-search.py",899,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-rest-search.py",{"path":235,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":236,"sourceHtmlUrl":237},"test-search-full.py",1069,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcgnl\u002Fsupermarkt-prijzen\u002Ftest-search-full.py",[239,266,295,316,322,342],{"skillNo":240,"name":241,"nameZh":6,"description":242,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":243,"categories":244,"keywords":248,"publishedAt":38},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[245],{"categoryNo":246,"categoryName":247,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000036","内容创作者",[249,250,251,37,252,253,254,255,256,257,258,259,260,261,262,263,26,264,265],"crowd prompting","prompting","api","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","content","ai agents",{"skillNo":267,"name":268,"nameZh":6,"description":269,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":270,"categories":271,"keywords":277,"publishedAt":38},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[272],{"categoryNo":273,"categoryName":274,"taxonomyType":275,"taxonomyTypeDesc":276},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[278,251,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,255,294],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":296,"name":297,"nameZh":6,"description":298,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":299,"categories":300,"keywords":304,"publishedAt":38},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[301],{"categoryNo":302,"categoryName":303,"taxonomyType":275,"taxonomyTypeDesc":276},"01JBSEEDCAT000000000000021","资料检索与研究",[305,306,307,308,309,310,311,37,312,292,294,313,251,314,315],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":317,"name":297,"nameZh":6,"description":298,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":318,"categories":319,"keywords":321,"publishedAt":38},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[320],{"categoryNo":302,"categoryName":303,"taxonomyType":275,"taxonomyTypeDesc":276},[308,307,306,305,315,310,311,37,309,292,294,312,313,251,314],{"skillNo":323,"name":324,"nameZh":6,"description":325,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":326,"categories":327,"keywords":328,"publishedAt":38},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[329,330,331,332,333,334,335,336,337,338,339,340,341],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":343,"name":344,"nameZh":6,"description":345,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":346,"categories":347,"keywords":352,"publishedAt":38},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[348,349],{"categoryNo":273,"categoryName":274,"taxonomyType":275,"taxonomyTypeDesc":276},{"categoryNo":350,"categoryName":351,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000037","律师与法务",[353,354,355,356,37,357,358,49,359,313,360,361,362,363,364,26,365,366,367],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]