Events on your site

List your upcoming events on your own website and show the details of one, with registration on Lahuta's event page.

Use these endpoints to put an "Upcoming classes" section on your website that stays in sync with the events you manage in Lahuta. You create and edit events in the dashboard. Your site reads them, and each event links to its Lahuta event page, where people register and pay.

You want toUse
Show a list of upcoming eventsGET /v1/events
Show one event's full detailsGET /v1/events/{shortCode}

List upcoming events

GET /v1/events returns your upcoming events, soonest first, 25 at a time. See Pagination for limit and offset.

curl "https://api.lahuta.org/v1/events?limit=6" \
  -H "X-Api-Key: $LAHUTA_API_KEY"
{
  "items": [
    {
      "id": "0197a4d2-3c81-7e0f-9b2a-6d1e8c4f7a35",
      "shortCode": "k7Qm2x",
      "name": "Intro to the wheel",
      "image": {
        "id": "0197a4d2-3c90-7a14-8e5b-2f9c1d6a3b08",
        "type": "image",
        "url": "https://media.lahuta.io/images/0197a3c2-5b1e-7d40-9f2a-3c8e1b6d4f70/0197a4d2-3c90-7a14-8e5b-2f9c1d6a3b08.jpg",
        "alt": "Hands shaping clay on a wheel",
        "width": 1600,
        "height": 900,
        "thumbnail": null
      },
      "startAt": "2026-10-17T17:00:00.000Z",
      "endAt": "2026-10-17T19:00:00.000Z",
      "timezone": "America/Los_Angeles",
      "location": "physical",
      "city": "Portland",
      "state": "OR",
      "fromCents": 4500,
      "occurrenceCount": 4,
      "attendeeCount": null,
      "organizer": {
        "orgId": "0197a3c2-5b1e-7d40-9f2a-3c8e1b6d4f70",
        "name": "Northside Pottery",
        "slug": "northside-pottery",
        "image": null
      }
    }
  ],
  "total": 9,
  "limit": 6,
  "offset": 0
}

What the fields mean:

  • startAt and endAt are the next upcoming date. occurrenceCount is how many upcoming dates the event has, so you can show "4 dates" for a weekly class.
  • Times are in UTC. Use timezone to show them in the event's local time.
  • fromCents is the cheapest ticket, in cents. 0 means free.
  • location is physical or virtual. city and state are only set for physical events.
  • attendeeCount is null unless you turned on Show how many are coming for that event.

Which events are listed

  • Events whose Visibility is Public, with at least one upcoming date. Private and Third-party events never appear here.
  • Events you cohost, when you've turned on Show on your feed for them. See Cohosting.

Past dates and cancelled dates don't count, so an event drops off the list once its last date has started.

Show one event

GET /v1/events/{shortCode} returns everything an event page needs. The short code is the last part of the event's link: for lahuta.org/events/k7Qm2x, it's k7Qm2x.

curl https://api.lahuta.org/v1/events/k7Qm2x \
  -H "X-Api-Key: $LAHUTA_API_KEY"
{
  "id": "0197a4d2-3c81-7e0f-9b2a-6d1e8c4f7a35",
  "shortCode": "k7Qm2x",
  "name": "Intro to the wheel",
  "descriptionHtml": "<p>Two hours, one wheel each, all clay and glazes included.</p>",
  "organizer": { "name": "Northside Pottery", "slug": "northside-pottery" },
  "location": {
    "_tag": "physical",
    "fullAddress": "2210 N Williams Ave, Portland, OR 97227",
    "city": "Portland",
    "state": "OR",
    "country": "US",
    "googleMapsUrl": "https://maps.google.com/?cid=4821937465019283746",
    "latitude": 45.5398,
    "longitude": -122.6668
  },
  "timezone": "America/Los_Angeles",
  "occurrences": [
    {
      "id": "0197a4d2-3d02-7b61-a4c8-9e3f2a1d5c70",
      "startAt": "2026-10-17T17:00:00.000Z",
      "endAt": "2026-10-17T19:00:00.000Z",
      "label": null,
      "status": "scheduled",
      "salesClosed": false,
      "tickets": [
        {
          "id": "0197a4d2-3d11-7c05-8b9e-4f2a6d1c3e87",
          "name": "Wheel seat",
          "description": "Clay, glazes and firing included",
          "priceCents": 4500,
          "minQuantity": null,
          "remaining": 3
        }
      ]
    }
  ],
  "defaultOccurrenceId": "0197a4d2-3d02-7b61-a4c8-9e3f2a1d5c70"
}

The response is trimmed here. It also has the event's image, questions, cohosts, a few guests who are going, and registration settings under form.

Things to handle:

  • descriptionHtml is HTML written in your event editor. Render it as HTML, not as text.
  • occurrences lists the upcoming dates only. A date can have status: "cancelled" or salesClosed: true. Show those as unavailable.
  • remaining is how many tickets are left, or null when there's no limit.
  • The street address is null, along with the map link and coordinates, when the event is set to Street address shown after registering. city and state are still there.
  • Virtual events have location: { "_tag": "virtual" }. The meeting link is never in the response. People get it after they register.

Send people to register

Registration and payment happen on the Lahuta event page, not through the API. Link each event to:

https://lahuta.org/events/<shortCode>

The shorter https://luta.co/e/<shortCode> works too. The event page takes care of tickets, questions, approvals and payment, and the person lands in your CRM like any other guest.

Edge cases

  • Not found. An unknown short code, or one that belongs to another organization, returns 404 with {"_tag":"NotFound","resource":"event","id":"k7Qm2x"}. Show your own "event not found" page.
  • Cohosted events. They can appear in the list, but GET /v1/events/{shortCode} only returns events your organization runs. For a cohosted event, link straight to its event page instead.
  • Private events. A Private event isn't listed, but you can still fetch it by its short code, the same way anyone with the link can open it.
  • Caching. Event data changes when you edit an event or someone registers. Caching the list for a few minutes is fine. Read remaining fresh if you show "3 spots left".

Every field is described under Events in the API reference.

On this page