1.7 KiB
1.7 KiB
Mealie Batch Recipe Import
Authenticate via API and bulk-import recipes from URLs. Mealie's built-in scraper handles ~300+ sites but reliability varies wildly.
API Auth Pattern
import requests
MEALIE = "http://127.0.0.1:9925" # or https://grajmedia.duckdns.org:3449
resp = requests.post(
f"{MEALIE}/api/auth/token",
data={"username": "email@example.com", "password": "password", "grant_type": ""},
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
token = resp.json()["access_token"]
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
Batch Import
urls = ["https://example.com/recipe-1", "https://example.com/recipe-2"]
for url in urls:
resp = requests.post(
f"{MEALIE}/api/recipes/create/url",
json={"url": url},
headers=headers,
timeout=60
)
# 200/201 = success, 400 = scraper failed
Scraper Reliability (as of June 2026)
| Site | Reliability | Notes |
|---|---|---|
| BBC Good Food | High | Consistently works |
| RecipeTin Eats | High | Good parser support |
| Budget Bytes | Medium | HTTPException ~30% of the time, retry helps |
| Damn Delicious | Medium | Intermittent blocks |
| AllRecipes | Low | Frequently blocked (Cloudflare) |
| Simply Recipes | Low | Frequently blocked |
| Gimme Some Oven | Low | Frequently blocked |
Add time.sleep(1.5) between requests to avoid rate limiting.
URL Format
The /api/recipes/create/url endpoint expects a full recipe page URL. It does NOT accept search results, category pages, or non-recipe URLs. The scraper extracts title, ingredients, steps, image, and metadata automatically.