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
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 10 | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
start | string (ISO 8601 date) | Yes | Range start date |
end | string (ISO 8601 date) | Yes | Range 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+endto get all occurrences in the window - List/grid mode - supply
page+per_pagefor pagination
Auth: Public
| Parameter | Type | Default | Description |
|---|---|---|---|
start | string (ISO 8601) | - | Calendar range start (activates calendar mode) |
end | string (ISO 8601) | - | Calendar range end |
page | integer | 1 | Page number (list mode) |
per_page | integer | 12 | Results per page, max 100 |
category | integer or array | - | Filter by category ID(s) |
search | string | - | Full-text search on event title |
upcoming | boolean | true | Return only future occurrences |
past | boolean | false | Return 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | - |
per_page | integer | 20 | Max 100 |
status | string | - | Filter by event status |
search | string | - | Search by title |
orderby | string | created_at | id, title, created_at, updated_at, status |
order | string | desc | asc 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
occurrence_id | integer | Yes | Filter by occurrence |
status | string | - | Filter by registration status |
search | string | - | 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.
| Parameter | Type | Description |
|---|---|---|
occurrence_id | integer | Filter by occurrence |
event_id | integer | Filter by event |
scope | string | occurrence, event, or template |
status | string | Filter 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
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search 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
| Parameter | Type | Required | Description |
|---|---|---|---|
ticket_code | string | Yes | Format: XXXX-XXXX-XXXX-XXXX |
occurrence_id | integer | Yes | - |
checkin_token | string | - | Kiosk token (public access) |
auto_checkin | boolean | false | Check 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
| Parameter | Type | Required | Description |
|---|---|---|---|
count | integer | Yes | New 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
occurrence_id | integer | Yes | - |
email | string | Yes | - |
name | string | Yes | - |
phone | string | - | - |
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
occurrence_id | integer | Yes | - |
email | string | Yes | - |
Response: JSON object with on_waitlist (boolean) and position (integer) if on the list.
POST /waitlist/leave
Remove an email from the waitlist.
| Parameter | Type | Required | Description |
|---|---|---|---|
occurrence_id | integer | Yes | - |
email | string | Yes | - |
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
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 100 | Events to include (1-500) |
start_from | string (ISO 8601) | today | Earliest start date |
category | integer 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)
| Parameter | Type | Required | Description |
|---|---|---|---|
content | string | Yes | Raw iCal file content |
status | string | draft | draft or published |
skip_duplicates | boolean | true | Skip 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