Bowmark AIdocs

HelloFresh

Meal-kit subscription — this week's menu, plan pricing, delivery availability by ZIP, and the public recipe archive on hellofresh.com.

Domain: hellofresh.com

Also known as: HelloFresh, HelloFresh.com, Hello Fresh

Call it directly

bowmark.providers.hellofresh.getWeeklyMenu(week?: string): Promise<HellofreshMeal[]>
bowmark.providers.hellofresh.checkDeliveryAvailability(zip: string): Promise<HellofreshDeliveryAvailability>
bowmark.providers.hellofresh.getRecipe(recipeUrlOrId: string): Promise<HellofreshRecipeDetail>
bowmark.providers.hellofresh.searchRecipes(query: string, options?: { take?: number; skip?: number }): Promise<HellofreshRecipeSearchPage>

Functions

FunctionWhat it does
getWeeklyMenuReads every meal on offer for one delivery week — name, subtitle, its recipe URL, dietary/preference tags, and any per-serving premium surcharge.
checkDeliveryAvailabilityAnswers whether HelloFresh delivers to a US ZIP code and which delivery days it can choose, without signing up for anything — deliversTo, the distinct weekday windows (options, each…
getRecipeReads one recipe page in full — description, difficulty, total time, cuisines, allergens, the cookware ("utensils") it calls for, per-serving nutrition, the numbered steps (each with its…
searchRecipesSearches HelloFresh's whole public recipe archive by keyword or ingredient ("chicken", "salmon", "thai", "beef tacos") and returns matching recipes with enough identity to pick one: name,…

Types

interface HellofreshTag { name: string; slug: string }

interface HellofreshSurcharge {
  amount: string;        // "$7.99"
  amountCents: number;
  reason: string;
}

interface HellofreshMeal {
  id: string;             // recipe.uuid — stable across weeks a meal repeats
  name: string;
  subtitle: string | null;
  slug: string;
  recipeUrl: string;
  imageUrl: string | null;
  tags: HellofreshTag[];
  surcharge: HellofreshSurcharge | null;   // null on an included (non-premium) meal
  category: string | null;
  cuisines: string[];
  difficulty: number | null;   // the site's own 1-5 scale
  prepTimeMinutes: number | null;
  totalTimeMinutes: number | null;
  calories: number | null;
  isSoldOut: boolean;     // still returned when true, never dropped
}

interface HellofreshDeliveryOption {
  handle: string;         // "US-1-0800-2000", "US-3-0800-2000-AKHI"
  name: string;           // "Mondays: 8AM - 8PM"
  weekday: number;        // ISO: 1 = Monday … 7 = Sunday
  from: string | null;    // "08:00"
  to: string | null;      // "20:00"
  surcharge: HellofreshSurcharge | null;   // null on a free window; AK/HI carry one
}

interface HellofreshDeliverySlot {
  week: string;           // "2026-W33" — the same key getWeeklyMenu takes
  deliveryDate: string;
  cutoffDate: string | null;
  option: HellofreshDeliveryOption;
  isBlocked: boolean;
}

interface HellofreshDeliveryAvailability {
  zip: string;
  deliversTo: boolean;    // false when the site returns no slots at all
  options: HellofreshDeliveryOption[];   // distinct windows, by weekday
  slots: HellofreshDeliverySlot[];
  weeks: string[];
}

interface HellofreshAllergen { name: string; slug: string }
interface HellofreshUtensil { name: string }
interface HellofreshNutrient { name: string; amount: number; unit: string }

interface HellofreshRecipeIngredient {
  id: string;
  name: string;
  amount: number;   // 0 for an unmeasured pantry staple (salt, pepper, oil)
  unit: string;      // "" to match — never invented
}

interface HellofreshRecipeYield {
  servings: number;             // HelloFresh publishes at most 2 and 4
  ingredients: HellofreshRecipeIngredient[];
}

interface HellofreshRecipeStep {
  index: number;
  instructions: string;
  imageUrl: string | null;   // null when the site attached no photo to this step
}

interface HellofreshRecipeDetail {
  id: string;
  name: string;
  headline: string | null;
  slug: string;
  websiteUrl: string;
  description: string | null;
  imageUrl: string | null;
  difficulty: number | null;   // the site's own 1-5 scale
  totalTimeMinutes: number | null;
  cuisines: string[];
  allergens: HellofreshAllergen[];
  utensils: HellofreshUtensil[];
  nutritionPerServing: HellofreshNutrient[];
  yields: HellofreshRecipeYield[];         // ingredients pre-scaled per box size
  steps: HellofreshRecipeStep[];
  averageRating: number | null;
  ratingsCount: number | null;
}

interface HellofreshRecipeSearchResult {
  id: string;              // the 24-hex id — pass straight to getRecipe
  name: string;
  headline: string | null;
  slug: string;
  websiteUrl: string;
  imageUrl: string | null;
  description: string | null;
  difficulty: number | null;     // the site's own 1-5 scale
  totalTimeMinutes: number | null;
  category: string | null;       // "Poultry", "Veggie", …
  cuisines: string[];
  tags: HellofreshTag[];
  allergens: HellofreshAllergen[];
  calories: number | null;
  averageRating: number | null;
  ratingsCount: number | null;
}

interface HellofreshRecipeSearchPage {
  query: string;
  total: number;           // how many the archive holds, not how many came back
  take: number;
  skip: number;
  results: HellofreshRecipeSearchResult[];
}

Examples

// What's on the menu this week that has no premium surcharge and is Pork-free?
const meals = await bowmark.providers.hellofresh.getWeeklyMenu();
return meals
  .filter((m) => !m.surcharge && m.tags.some((t) => t.slug === "pork-free"))
  .map((m) => ({ name: m.name, subtitle: m.subtitle, recipeUrl: m.recipeUrl }));
// Compare this week and next week's premium (surcharge) meals.
const [thisWeek, nextWeek] = await Promise.all([
  bowmark.providers.hellofresh.getWeeklyMenu(),
  bowmark.providers.hellofresh.getWeeklyMenu("2026-W34"),
]);
const premium = (meals) => meals.filter((m) => m.surcharge).map((m) => m.name + " (" + m.surcharge.amount + ")");
return { thisWeek: premium(thisWeek), nextWeek: premium(nextWeek) };