API reference

Endpoints

Generated from the same OpenAPI 3.1 document served at /api/v1/openapi.json — this page can never drift from the contract.

POSThttps://curatedlove.party/api/v1/bookings

Create a booking

Creates a booking for one of the key's own events (eventId is the API-facing identifier; the event must belong to the caller's org). Reuses the exact public-booking availability and validation path. Free events (priceCents 0) confirm instantly and return `booking`; paid events return a Stripe `checkoutUrl` and the booking is confirmed once checkout completes — the API never touches card data.

Request body

  • eventId · string · required
  • name · string · required
  • email · string · required
  • seats · integer · required
  • notes · string

Responses

  • 201 · Either an instantly confirmed free booking, or a Stripe checkout URL for a paid event
  • 400 · The request body or query parameters failed validation
  • 401 · Invalid or missing API key
  • 404 · Unknown event for this org (`not_found`), or the event isn't accepting reservations (`validation_failed`)
  • 409 · The event is fully booked
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
POSThttps://curatedlove.party/api/v1/compose

AI-compose an event draft

Generates a draft event (title, description, menu theme, suggested price, FAQs, tags) from a one-sentence prompt. Requires the org's plan to include the `aiMenu` entitlement in addition to API access (entitlement_required 403 otherwise). Model output is sanitized and bounded before it is returned — nothing from the model reaches the caller unchecked, and nothing is persisted automatically.

Request body

  • prompt · string · required

Responses

  • 200 · The generated draft
  • 400 · The request body or query parameters failed validation
  • 401 · Invalid or missing API key
  • 403 · The org's plan doesn't include this capability
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
GEThttps://curatedlove.party/api/v1/events

List events

Events for the authenticated key's org, newest-agnostic order as stored, optionally filtered by status and paginated.

Parameters

  • status · query · string
  • limit · query · integer
  • offset · query · integer

Responses

  • 200 · Events for the key's org
  • 401 · Invalid or missing API key
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
POSThttps://curatedlove.party/api/v1/events

Create an event

Creates a draft event for the key's org. Identity/ownership fields (id, orgId, slug, createdAt, status) are never client-settable — status always starts at `draft`; use POST /v1/events/{id}/publish to publish. Subject to the org's plan dinners-per-month limit (entitlement_required 403 if exceeded).

Request body

  • title · string · required
  • date · string · required
  • description · string
  • menuTheme · string
  • venueName · string
  • venueAddress · string
  • capacity · integer
  • priceCents · integer
  • depositCents · integer | null
  • durationMin · integer
  • isPrivate · boolean
  • faqs · array
  • tags · array

Responses

  • 201 · The created event
  • 400 · The request body or query parameters failed validation
  • 401 · Invalid or missing API key
  • 403 · The org's plan doesn't include this capability
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
GEThttps://curatedlove.party/api/v1/events/{id}

Get an event

Fetches one event owned by the key's org.

Parameters

  • id · path · string · required

Responses

  • 200 · The event
  • 401 · Invalid or missing API key
  • 404 · The resource does not exist, or does not belong to this org
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
PATCHhttps://curatedlove.party/api/v1/events/{id}

Update an event

Partially updates an event owned by the key's org. `status` cannot be set through this endpoint — attempting to include it in the body returns 400 validation_failed; use POST /v1/events/{id}/publish to move a draft to published.

Parameters

  • id · path · string · required

Request body

  • title · string
  • date · string
  • description · string
  • menuTheme · string
  • venueName · string
  • venueAddress · string
  • capacity · integer
  • priceCents · integer
  • depositCents · integer | null
  • durationMin · integer
  • isPrivate · boolean
  • faqs · array
  • tags · array

Responses

  • 200 · The updated event
  • 400 · The request body or query parameters failed validation
  • 401 · Invalid or missing API key
  • 404 · The resource does not exist, or does not belong to this org
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
GEThttps://curatedlove.party/api/v1/events/{id}/bookings

List bookings for an event

All bookings (any status) for one event owned by the key's org, newest first.

Parameters

  • id · path · string · required

Responses

  • 200 · Bookings for the event
  • 401 · Invalid or missing API key
  • 404 · The resource does not exist, or does not belong to this org
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
POSThttps://curatedlove.party/api/v1/events/{id}/publish

Publish a draft event

Moves a `draft` event to `published`. Only draft events may be published — anything else returns 400 validation_failed. This is the only supported way to change an event's status via the API.

Parameters

  • id · path · string · required

Responses

  • 200 · The published event
  • 400 · The request body or query parameters failed validation
  • 401 · Invalid or missing API key
  • 404 · The resource does not exist, or does not belong to this org
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
GEThttps://curatedlove.party/api/v1/guests

List the org's Guest Book

Every distinct guest (by email) across the org's confirmed bookings. This is first-party data returned only to the org that owns it — the same data wall enforced on the dashboard; guest PII never crosses org boundaries.

Responses

  • 200 · The org's guests
  • 401 · Invalid or missing API key
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
POSThttps://curatedlove.party/api/v1/links

Create a short link

Creates a short link for the key's org, pointing at either one of the org's own events (eventId) or an external https URL (url) — exactly one of the two. Identity/ownership fields (id, orgId, code, clickCount, createdAt) are never client-settable; a unique short code is generated server-side.

Request body

  • eventId · string
  • url · string
  • label · string

Responses

  • 201 · The created link
  • 400 · The request body or query parameters failed validation
  • 401 · Invalid or missing API key
  • 404 · The resource does not exist, or does not belong to this org
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
GEThttps://curatedlove.party/api/v1/org

Get the org profile

The organization profile for the authenticated key.

Responses

  • 200 · The organization
  • 401 · Invalid or missing API key
  • 404 · The resource does not exist, or does not belong to this org
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.
GEThttps://curatedlove.party/api/v1/stats

Get org stats

Revenue and totals for the authenticated key's org over a period: money made (revenueCents), plus confirmed bookings, distinct guests, and distinct events.

Parameters

  • period · query · string

Responses

  • 200 · Stats for the key's org over the requested period
  • 401 · Invalid or missing API key
  • 429 · Rate limit exceeded (60 req/min standard, 300 req/min elevated). Retry-After header included.