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 to | Use |
|---|---|
| Show a list of upcoming events | GET /v1/events |
| Show one event's full details | GET /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:
startAtandendAtare the next upcoming date.occurrenceCountis how many upcoming dates the event has, so you can show "4 dates" for a weekly class.- Times are in UTC. Use
timezoneto show them in the event's local time. fromCentsis the cheapest ticket, in cents.0means free.locationisphysicalorvirtual.cityandstateare only set for physical events.attendeeCountisnullunless 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:
descriptionHtmlis HTML written in your event editor. Render it as HTML, not as text.occurrenceslists the upcoming dates only. A date can havestatus: "cancelled"orsalesClosed: true. Show those as unavailable.remainingis how many tickets are left, ornullwhen 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.cityandstateare 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
404with{"_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
remainingfresh if you show "3 spots left".
Every field is described under Events in the API reference.