Recipe importing
What you can build
“Save this recipe” buttons, URL importers, catalog browsers that copy into a private library, and post-import normalize/transform pipelines.
1. Create from structured input
When your product already has title, ingredients, and steps, create a tenant-owned recipe. TypeScript exposes recipes.create; Python can call the same REST endpoint today.
const created = await client.recipes.create({
title: "Weeknight Chili",
ingredients: ["1 lb ground beef", "2 tbsp chili powder", "1 onion"],
instructions: ["Brown beef", "Simmer 30 minutes"],
visibility: "PRIVATE",
});
const recipeId = created.recipe.id;
console.log(recipeId, created.recipe.title);Ownership attaches to the authenticated developer. Use visibility to control sharing.
2. Import from a public URL
Both SDKs support URL import. The API fetches the page (honoring robots.txt), parses recipe metadata, and attaches private ownership on success/partial success.
imported = client.recipes.import_url("https://www.example.com/bolognese")
print(
imported.import_status,
imported.recipe_id,
imported.title,
imported.normalized_ingredient_count,
imported.unresolved_ingredient_count,
imported.acquisition_method,
imported.reason,
)
recipe_id = imported.recipe_id{
"import_status": "SUCCESS",
"recipe_id": "…",
"title": "Bolognese",
"normalized_ingredient_count": 12,
"unresolved_ingredient_count": 1,
"acquisition_method": "…"
}Check import_status before assuming recipe_id is usable. Partial imports may still return a recipe with unresolved ingredients.
3. Browse the global catalog
Read the platform corpus with catalog / list filters. List rows may include copied_from_recipe_id when a tenant-owned copy already exists.
catalog = client.recipes.catalog(search="chili", limit=10)
for item in catalog.items:
print(item.id, item.title, item.copied_from_recipe_id, item.owner)
# Tenant-owned copies also appear in discovery lists:
mine = client.recipes.mine(limit=20)Household-scoped copy APIs (copyFromGlobal / copy_from_global) exist under household resources when you are building multi-user household apps — use those instead of personal create/import when the destination is a household library.
4. Inspect, then transform or plan
After import/create, load the recipe and continue into dietary transforms or meal planning.
recipe = client.recipes.get(recipe_id)
print(recipe.title, recipe.source_url, len(recipe.ingredients))
# Normalize a line from the imported recipe for pantry matching
line = recipe.ingredients[0]
# ingredient lines are structured dicts — use your app's display field, or normalize raw text:
n = client.ingredients.normalize("2 tbsp olive oil")
proposal = client.recipes.transform(recipe.id, "VEGETARIAN")
print(proposal.confidence_score)URL import constraints
- The URL must be reachable by the FoodAPI importer (public HTTPS pages).
- Robots.txt is respected by default — disallowed pages fail acquisition rather than being scraped.
- Prefer pages with structured recipe metadata; unsupported layouts may return failed or partial status with a
reason. - Import is rate-limited with the rest of your developer platform quota.
Next
Use the imported recipe