Portal
SandboxAPI v1Not signed inExternal user: —

Recipe importing

Bring recipes into your developer tenancy so you can transform, plan, and cook against them.

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