---
title: "Create a recommendation"
method: POST
path: "/recommendations"
tags: ["Recommendations"]
---

# Create a recommendation

`POST /recommendations`

## Request

- Base URL: `https://api.aisle.wedding/v1`
- URL: `https://api.aisle.wedding/v1/recommendations`
- Auth: HTTP bearer

Category defaults to activity when omitted. New rows may be food, activity, or sight. Difficulty may be non-null only for activity or sight. Create lodging through properties and rooms.

This POST has no idempotency-key store. After a lost response, list before retrying, reconcile the resource, and retry only deliberately.

## Request body

- object
  - `name` string, required
  - `description` string, nullable
  - `details_html` string, nullable
  - `emoji` string, nullable
  - `category` 'food' | 'activity' | 'sight': A new target category: food, activity, or sight. Hotel is legacy response compatibility; create lodging through properties and rooms.
  - `difficulty` 'easy' | 'moderate' | 'challenging', nullable: May be non-null only when the resulting category is activity or sight.
  - `external_url` string, nullable
  - `latitude` union
    - number
    - string
  - `longitude` union
    - number
    - string
  - `place_id` string, nullable
  - `audience_tags` string[]
  - `sort_order` integer

## Response `201`

The requested data.

- RecommendationResult
  - `data` PublicRecommendation, required
    - `id` string, required
    - `name` string, required
    - `description` string, nullable, required
    - `details_html` string, nullable, required
    - `emoji` string, nullable, required
    - `category` 'hotel' | 'food' | 'activity' | 'sight', required: Responses may contain legacy hotel rows. New lodging belongs in properties and rooms; write requests cannot target hotel.
    - `difficulty` 'easy' | 'moderate' | 'challenging', nullable, required: Non-null only for activity or sight recommendations.
    - `external_url` string, nullable, required
    - `latitude` string, nullable, required
    - `longitude` string, nullable, required
    - `place_id` string, nullable, required
    - `audience_tags` string[], required
    - `sort_order` integer, required
    - `created_at` string, date-time, required: An RFC 3339 UTC timestamp with milliseconds.

## Other responses

- `400`: The request itself could not be read, such as a body that is not a JSON object. A field we refuse is validation_failed instead.
- `401`: The API key is missing, malformed, or no longer valid.
- `402`: The operation requires an active Aisle membership for this wedding.
- `403`: The key is valid but not permitted to do this.
- `404`: No such resource inside the key's wedding.
- `405`: That HTTP method is not supported here. See the Allow header.
- `409`: The request collided with the current state of the resource.
- `415`: A request body must be sent as application/json.
- `422`: The request was well-formed but a field was not acceptable. Every field at fault is named in error.details.
- `429`: Too many requests. Retry after the time given in Retry-After.
- `500`: Something went wrong on our side.

---

[API](https://skmtc.dev/aisle/apis/aisle-api.md) · [All operations](https://skmtc.dev/aisle/apis/aisle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/aisle/apis/aisle-api/revisions/689a2f2420cc?raw)
