Skip to main content
NetterTech
Event management for WordPress, done right.

REST API

For developers building integrations, headless applications, or custom dashboards.

All endpoints are under the namespace nettertech-events/v1. The base URL for your site is:

https://yoursite.com/wp-json/nettertech-events/v1/

All endpoints apply rate limiting. Authenticated admins bypass the limit; unauthenticated requests are subject to it. When the limit is exceeded the response is 429 with a Retry-After header.


Events

GET /events/upcoming

Returns the next N upcoming occurrences with event details and ticket availability.

Auth: Public

ParameterTypeDefaultDescription
limitinteger10Number of occurrences to return (1-100)

Response: JSON array of occurrence objects, each with id, event_id, start_datetime, end_datetime, event details (title, slug, venue, permalink, image), and ticket availability.


GET /events/range

Returns all occurrences in a date window. Useful for calendar views.

Auth: Public

ParameterTypeRequiredDescription
startstring (ISO 8601 date)YesRange start date
endstring (ISO 8601 date)YesRange end date

Response: JSON array of occurrence objects within the date window, same structure as /events/upcoming.


GET /events/(?P<id>\d+)

Returns a single occurrence by ID, with its parent event and ticket availability.

Auth: Public

Response: JSON occurrence object with full event details including venue, ticket types, and availability.


GET /occurrences

Paginated or date-range occurrence listing with filtering. Supports two modes:

  • Calendar mode - supply start + end to get all occurrences in the window
  • List/grid mode - supply page + per_page for pagination

Auth: Public

ParameterTypeDefaultDescription
startstring (ISO 8601)-Calendar range start (activates calendar mode)
endstring (ISO 8601)-Calendar range end
pageinteger1Page number (list mode)
per_pageinteger12Results per page, max 100
categoryinteger or array-Filter by category ID(s)
searchstring-Full-text search on event title
upcomingbooleantrueReturn only future occurrences
pastbooleanfalseReturn only past occurrences (overrides upcoming)

Response (list mode) includes events, total, total_pages, page, per_page.

Each occurrence object contains: id, event_id, start_datetime, end_datetime, all_day, status, a formatted object (date, time, date_range), an event object (title, slug, venue, permalink, image), and a tickets object (availability, price range, per-type breakdown).


Admin - Events

All endpoints under /admin/events require manage_options capability (Administrators only).

GET /admin/events

Paginated event list.

ParameterTypeDefaultDescription
pageinteger1-
per_pageinteger20Max 100
statusstring-Filter by event status
searchstring-Search by title
orderbystringcreated_atid, title, created_at, updated_at, status
orderstringdescasc or desc

Response: JSON object with pagination: { items: [...], total: N, page: N, per_page: N }. Each item includes full event fields.

POST /admin/events

Create an event. Required: title. Notable optional fields: status, event_type, venue_name, venue_address, recurrence_rule (RFC 5545 RRULE), recurrence_end_date, is_virtual, virtual_url.

Response: JSON object of the newly created event with all fields.

GET /admin/events/(?P<id>\d+)

Get a single event including all fields, recurrence data, and layout config.

Response: JSON event object with full details.

PUT /admin/events/(?P<id>\d+)

Update an event. All fields are optional.

Response: JSON object of the updated event with all fields.

DELETE /admin/events/(?P<id>\d+)

Delete an event permanently.

Response: 204 No Content on success.


Admin - attendees

All endpoints require edit_posts capability (Editors and above).

GET /admin/attendees

List attendees for an occurrence.

ParameterTypeRequiredDescription
occurrence_idintegerYesFilter by occurrence
statusstring-Filter by registration status
searchstring-Search by name or email

Response: JSON array of attendee objects with name, email, status, ticket type, and check-in state.

POST /admin/attendees

Create an attendee manually. Required: occurrence_id, name, email. Optional: phone, quantity, status, ticket_type_id, notes, accessibility_notes.

Response: JSON object of the newly created attendee.

GET /admin/attendees/(?P<id>\d+)

Get a single attendee.

Response: JSON attendee object with full details.

PUT /admin/attendees/(?P<id>\d+)

Update an attendee.

Response: JSON object of the updated attendee.

DELETE /admin/attendees/(?P<id>\d+)

Delete an attendee. Returns 204 No Content.


Admin - ticket types

All endpoints require edit_posts capability (Editors and above).

GET /admin/ticket-types

List ticket types for an occurrence or event. Requires either occurrence_id or event_id.

ParameterTypeDescription
occurrence_idintegerFilter by occurrence
event_idintegerFilter by event
scopestringoccurrence, event, or template
statusstringFilter by status

Response: JSON array of ticket type objects with name, price, capacity, availability, and status.

POST /admin/ticket-types

Create a ticket type. Required: name and either occurrence_id (scope occurrence) or event_id. Notable fields: price, capacity_type (fixed, unlimited, shared), capacity, sale_start, sale_end, min_per_order, max_per_order.

Response: JSON object of the newly created ticket type.

GET /admin/ticket-types/(?P<id>\d+)

Get a single ticket type including sold_count, stock_status, and WooCommerce product/variation IDs.

Response: JSON ticket type object with full details including sales and stock data.

PUT /admin/ticket-types/(?P<id>\d+)

Update a ticket type.

Response: JSON object of the updated ticket type.

DELETE /admin/ticket-types/(?P<id>\d+)

Delete a ticket type. Returns 400 if tickets have been sold; deactivate instead.


Check-In

Check-in endpoints use the /check-in base. Most require edit_posts capability. The lookup endpoint additionally accepts a token-based checkin_token for self-service kiosk use.

GET /check-in/(?P<occurrence_id>\d+)

Get the attendee list for check-in. Optional search parameter.

Auth: edit_posts

Response: JSON array of attendee objects with name, ticket type, and current check-in status.

GET /check-in/(?P<occurrence_id>\d+)/stats

Check-in statistics for an occurrence (total, checked in, remaining).

Auth: edit_posts

Response: JSON object with total, checked_in, and remaining counts.

GET /check-in/(?P<occurrence_id>\d+)/search

Search attendees by name or email within an occurrence.

Auth: edit_posts

ParameterTypeRequiredDescription
qstringYesSearch query

Response: JSON array of matching attendee objects.

POST /check-in/lookup

Look up an attendee by ticket code (for QR scan or manual entry). Optionally performs auto check-in.

Auth: edit_posts or valid checkin_token

ParameterTypeRequiredDescription
ticket_codestringYesFormat: XXXX-XXXX-XXXX-XXXX
occurrence_idintegerYes-
checkin_tokenstring-Kiosk token (public access)
auto_checkinbooleanfalseCheck in immediately on match

Response: JSON object with check-in status, attendee name, and ticket type. Returns 404 if the code is not found; 409 if already checked in.

POST /check-in/(?P<id>\d+)/toggle

Toggle an attendee’s checked-in state.

Auth: edit_posts

Response: JSON object with the attendee’s updated check-in status.

POST /check-in/(?P<id>\d+)/check-in

Mark an attendee as fully checked in.

Auth: edit_posts

Response: JSON object with the attendee’s updated check-in status.

DELETE /check-in/(?P<id>\d+)/check-in

Reset an attendee to not checked in.

Auth: edit_posts

Response: JSON object with the attendee’s updated check-in status.

POST /check-in/(?P<id>\d+)/increment

Increment an attendee’s checked-in count by one.

Auth: edit_posts

Response: JSON object with the attendee’s updated count.

POST /check-in/(?P<id>\d+)/decrement

Decrement an attendee’s checked-in count by one.

Auth: edit_posts

Response: JSON object with the attendee’s updated count.

PUT /check-in/(?P<id>\d+)/count

Set an attendee’s checked-in count to an exact value.

Auth: edit_posts

ParameterTypeRequiredDescription
countintegerYesNew count (minimum 0)

Response: JSON object with the attendee’s updated count.


Waitlist

All three waitlist endpoints are public (no authentication required).

POST /waitlist/join

Add an email to the waitlist for a sold-out occurrence.

ParameterTypeRequiredDescription
occurrence_idintegerYes-
emailstringYes-
namestringYes-
phonestring--

Response: JSON object with position (integer) indicating the waitlist position. Returns 409 if the email is already on the waitlist.

GET /waitlist/status

Check whether an email is on the waitlist and its current position.

ParameterTypeRequiredDescription
occurrence_idintegerYes-
emailstringYes-

Response: JSON object with on_waitlist (boolean) and position (integer) if on the list.

POST /waitlist/leave

Remove an email from the waitlist.

ParameterTypeRequiredDescription
occurrence_idintegerYes-
emailstringYes-

Response: 204 No Content on success.


iCal / calendar feeds

GET /ical/feed

Public iCal feed of published events. Returns text/calendar content suitable for calendar subscriptions.

Auth: Public

ParameterTypeDefaultDescription
limitinteger100Events to include (1-500)
start_fromstring (ISO 8601)todayEarliest start date
categoryinteger or array-Filter by category ID(s)

Response: text/calendar file (.ics format) compatible with Google Calendar, Apple Calendar, and Outlook.

GET /ical/event/(?P<id>\d+)

Download all occurrences of a single event as .ics.

Auth: Public. Returns 403 if the event is not published.

Response: .ics file with all occurrences of the event.

GET /ical/occurrence/(?P<id>\d+)

Download a single occurrence as .ics.

Auth: Public. Returns 403 if the parent event is not published.

Response: .ics file for the single occurrence.

POST /ical/import

Import events from iCal content.

Auth: manage_options (Administrators only)

ParameterTypeRequiredDescription
contentstringYesRaw iCal file content
statusstringdraftdraft or published
skip_duplicatesbooleantrueSkip events that already exist

Response: JSON object with imported, skipped, and errors counts.


Attendee fields

Custom attendee field definitions and values.

GET /events/(?P<event_id>\d+)/attendee-fields

List custom field definitions for an event.

Auth: Public

POST /events/(?P<event_id>\d+)/attendee-fields

Create a custom field. Required: label. Optional: field_type (default text), is_required, placeholder, description, options (array, for select/checkbox fields).

Auth: edit_posts

PUT /events/(?P<event_id>\d+)/attendee-fields/(?P<id>\d+)

Update a field definition.

Auth: edit_posts

DELETE /events/(?P<event_id>\d+)/attendee-fields/(?P<id>\d+)

Delete a field definition and all associated values.

Auth: edit_posts

GET /attendees/(?P<attendee_id>\d+)/custom-fields

Get all custom field values recorded for an attendee.

Auth: edit_posts


See also: Hooks reference | Getting started | Templates