Install
openclaw skills install gousto-meal-pickerAutomate weekly Gousto meal kit selection via REST API with configurable dietary rules (allergens, cook time, protein variety). Handles order updates, menu scoring, and token refresh via browser automation.
openclaw skills install gousto-meal-pickerAutomates weekly Gousto recipe selection via their REST API. No browser needed for picking — only for initial auth and token refresh.
Use agent-browser to log into Gousto and save session state:
agent-browser open "https://www.gousto.co.uk/my-gousto" --headed
# User logs in manually (CAPTCHA blocks automated login)
agent-browser state save <workspace>/gousto/gousto-auth.json
agent-browser close
Create <workspace>/gousto/config.json:
{
"userId": "<auth_user_id from /user/current>",
"numericUserId": "<numeric id>",
"deviceId": "<from gousto_session_id cookie>",
"subscriptionId": "<from subscription endpoint>",
"shippingAddressId": "<from order>",
"deliveryTariffId": "<from order>",
"plan": {
"mealsPerWeek": 4,
"portions": 2
},
"rules": {
"maxCookTimeMins": 45,
"maxMealsOver40Mins": 1,
"noNuts": true,
"noFish": true,
"maxPastaPerWeek": 1,
"maxRicePerWeek": 1,
"preferHealthy": true
}
}
No passwords or credentials are stored in config.json. Auth is handled entirely via browser cookies saved in gousto-auth.json (from the login step above). The config only contains Gousto account IDs and selection rules.
To discover IDs: log in via browser, then call GET /user/current and inspect a pending order via GET /order/v2/orders/<id>. See references/api.md for endpoint details.
Create <workspace>/gousto/selections.json:
{ "selections": {} }
node <skill-dir>/scripts/gousto-pick.mjs [--dry-run] [--week ORDER_ID]
--dry-run — show what would be selected without updating the order--week ORDER_ID — target a specific order instead of auto-detectingGousto menus open on Tuesdays at 12pm UK, 13 days before Monday delivery. Schedule the picker for Tuesdays at 1pm UK:
cron: "0 13 * * 2" (Europe/London)
Auth tokens expire ~10 hours after login. When the token expires, the agent should:
agent-browser state save <workspace>/gousto/gousto-auth.jsonAuth endpoints are WAF-protected — curl cannot hit /oauth/access-token or /login directly. Browser-based refresh is the only reliable method.
All rules are set in config.json under "rules". Every filter can be toggled on/off.
true to exclude)| Rule | Default | Description |
|---|---|---|
noNuts | true | Exclude recipes containing nuts (checks allergens + name) |
noFish | true | Exclude fish dishes |
fishAndChipsException | false | Allow fish & chips even when noFish is true |
noSeafood | false | Exclude all seafood (broader: crab, lobster, squid, etc.) |
noVegetarian | true | Exclude vegetarian meals |
noPlantBased | true | Exclude plant-based/vegan meals |
noDairy | false | Exclude dairy-containing meals |
noGluten | false | Exclude gluten-containing meals |
maxCookTimeMins | 45 | Exclude recipes over this cook time |
excludeAllergens | [] | Array of Gousto allergen slugs to exclude (e.g. ["sesame", "celery"]) |
excludeKeywords | [] | Exclude recipes whose name contains any of these strings |
| Rule | Default | Description |
|---|---|---|
maxMealsOver40Mins | 1 | Max meals with 40+ min cook time |
maxPastaPerWeek | 1 | Max pasta dishes |
maxRicePerWeek | 1 | Max rice dishes |
maxSameProtein | 2 | Max meals with the same protein |
| Rule | Default | Description |
|---|---|---|
preferHealthy | true | Boost healthy/low-cal recipes, penalise high-cal |
preferQuicker | true | Boost faster cook times |
{
"rules": {
"noNuts": true,
"noFish": false,
"noVegetarian": false,
"maxCookTimeMins": 30,
"maxPastaPerWeek": 2,
"excludeKeywords": ["spicy", "chilli"],
"excludeAllergens": ["sesame"],
"preferHealthy": false
}
}
gousto-auth.json)gousto-auth.json as sensitive — it contains OAuth tokens. Restrict file permissions (chmod 600)production-api.gousto.co.uk--dry-run first — verify selections before enabling automated orderinggousto/
├── config.json — User config, API IDs, dietary rules
├── gousto-auth.json — Browser state (cookies with Bearer token)
├── selections.json — History of selections made