---
title: "Create recipe"
method: POST
path: "/api/businesses/{business_id}/recipes"
tags: ["businesses"]
---

# Create recipe

`POST /api/businesses/{business_id}/recipes`

## Request

- Base URL: `https://api.mymarky.ai`
- URL: `https://api.mymarky.ai/api/businesses/{business_id}/recipes`
- Auth: HTTP bearer

Save a new generation recipe (preset) for a business.

Errors:
    400 invalid_value: The business_id is not a valid UUID.
    401 authentication_required: API key or token is missing, invalid, or revoked.
    403 permission_denied: Your plan does not include API access, or this business is not in your org.
    404 resource_not_found: No business with that ID exists.
    429 rate_limit_exceeded: You sent too many requests this minute.

## Path parameters

- `business_id` string, required: A UUID identifier.

## Headers

- `Idempotency-Key` string, nullable: Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.
- `Marky-Version` '2026-04-08' | '2026-07-17' | '2026-08-02' | '2026-08-04' | '2026-08-06'

## Request body

- RecipeCreateRequest
  - `name` string, required: Recipe name
  - `saved` boolean, nullable: Whether the preset is saved/pinned.
  - `prompt` string, nullable: Freeform brief the preset generates from.
  - `creative_type` string, nullable: Default creative type (e.g. 'design', 'carousel', 'meme').
  - `template_ids` string[], nullable: Templates the preset generates with.
  - `aspect_ratio` string, nullable: Aspect ratio, e.g. '1:1', '9:16', '4:5'.
  - `palettes` Palette[], nullable: Color palettes for generated designs.
    - `name` string: Label for this palette
    - `colors` string[]: Hex color codes in the palette, e.g. ['#0d0c0c', '#FFFFFF', '#121212'].
    - `text_color` string, nullable: Hex color used for body text on designs
    - `accent_color` string, nullable: Hex accent/brand color
    - `background_color` string, nullable: Hex background color for designs
  - `voice` string, nullable: Brand voice override for this preset.
  - `caption_suffix` string, nullable: Text appended to every generated caption.
  - `caption_instructions` string, nullable: Extra caption-writing instructions.
  - `custom_caption_prompt` string, nullable: Custom caption-generation prompt.
  - `custom_meme_prompt` string, nullable: Custom meme-generation prompt.
  - `custom_carousel_prompt` string, nullable: Custom carousel-generation prompt.
  - `ctas` string[], nullable: Call-to-action phrases for designs.
  - `include_stock` boolean, nullable: Whether stock photos may be used.
  - `logo_enabled` boolean, nullable: Whether the logo is placed on designs.
  - `header_font` FontSetting
    - `name` string, required: Font family name, e.g. 'Montserrat'. Must be a font Marky can load (a Google Font, or one with a direct url below).
    - `url` string, nullable: Direct font file URL. Leave null for a Google Font (Marky resolves it by name).
  - `body_font` FontSetting
    - `name` string, required: Font family name, e.g. 'Montserrat'. Must be a font Marky can load (a Google Font, or one with a direct url below).
    - `url` string, nullable: Direct font file URL. Leave null for a Google Font (Marky resolves it by name).
  - `audio_tags` string[], nullable: Audio tags for video generation.
  - `ai_image_model` string, nullable: AI image model to use.
  - `post_count` integer, nullable: How many posts a run generates.
  - `auto_context_enabled` boolean, nullable: Whether auto-context is on.

## Response `201`

Successful Response

- RecipeResponse
  - `name` string, nullable: Recipe name.
  - `saved` boolean, nullable: Whether the preset is saved/pinned.
  - `prompt` string, nullable: Freeform brief the preset generates from.
  - `creative_type` string, nullable: Default creative type (e.g. 'design', 'carousel', 'meme').
  - `template_ids` string[], nullable: Templates the preset generates with.
  - `aspect_ratio` string, nullable: Aspect ratio, e.g. '1:1', '9:16', '4:5'.
  - `palettes` Palette[], nullable: Color palettes for generated designs.
    - `name` string: Label for this palette
    - `colors` string[]: Hex color codes in the palette, e.g. ['#0d0c0c', '#FFFFFF', '#121212'].
    - `text_color` string, nullable: Hex color used for body text on designs
    - `accent_color` string, nullable: Hex accent/brand color
    - `background_color` string, nullable: Hex background color for designs
  - `voice` string, nullable: Brand voice override for this preset.
  - `caption_suffix` string, nullable: Text appended to every generated caption.
  - `caption_instructions` string, nullable: Extra caption-writing instructions.
  - `custom_caption_prompt` string, nullable: Custom caption-generation prompt.
  - `custom_meme_prompt` string, nullable: Custom meme-generation prompt.
  - `custom_carousel_prompt` string, nullable: Custom carousel-generation prompt.
  - `ctas` string[], nullable: Call-to-action phrases for designs.
  - `include_stock` boolean, nullable: Whether stock photos may be used.
  - `logo_enabled` boolean, nullable: Whether the logo is placed on designs.
  - `header_font` FontSetting
    - `name` string, required: Font family name, e.g. 'Montserrat'. Must be a font Marky can load (a Google Font, or one with a direct url below).
    - `url` string, nullable: Direct font file URL. Leave null for a Google Font (Marky resolves it by name).
  - `body_font` FontSetting
    - `name` string, required: Font family name, e.g. 'Montserrat'. Must be a font Marky can load (a Google Font, or one with a direct url below).
    - `url` string, nullable: Direct font file URL. Leave null for a Google Font (Marky resolves it by name).
  - `audio_tags` string[], nullable: Audio tags for video generation.
  - `ai_image_model` string, nullable: AI image model to use.
  - `post_count` integer, nullable: How many posts a run generates.
  - `auto_context_enabled` boolean, nullable: Whether auto-context is on.
  - `id` string, required: Recipe ID
  - `business_id` string, nullable: Business this recipe belongs to
  - `created_at` string, required: When the recipe was created
  - `updated_at` string, nullable: Last update time

## Other responses

- `400`: Bad request — the input was malformed or otherwise invalid.
- `401`: Authentication failed — the API key is missing or invalid.
- `403`: Forbidden — the key is valid but may not access this resource.
- `404`: Not found — no resource matches the id in the path.
- `422`: Validation error — one or more fields failed validation.
- `429`: Rate limited — retry after the window resets (see Retry-After).
- `500`: Server error — something failed on our side; retry or quote X-Request-Id.

---

[API](https://skmtc.dev/mymarky/apis/marky-public-api.md) · [All operations](https://skmtc.dev/mymarky/apis/marky-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mymarky/apis/marky-public-api/revisions/25aeacae455c?raw)
