EventIO API Documentation

Welcome to the EventIO API documentation. This API provides read-only access to event management data including events, tickets, bookings, groups, and customers.

Base URL
https://api.eventio.uk/api/v2
API Version

Current version: 2.0.0

Authentication

The EventIO API uses Bearer Token authentication via Laravel Sanctum. All API requests must include a valid access token in the Authorization header.

Obtaining an Access Token

Access tokens are created through the EventIO dashboard or by an administrator. Contact your system administrator to obtain API credentials for your account.

Using Your Token

Include the token in the Authorization header of every request:

Header Authorization
Authorization: Bearer YOUR_API_TOKEN

Example Request

cURL Example authenticated request
curl -X GET "https://api.eventio.uk/api/v2/events" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json"
Important: Keep your API token secure and never share it publicly. Tokens provide access to sensitive data based on your assigned permissions.

Token Expiration

Access tokens may have an expiration date set by your administrator. If your token expires, you will receive a 401 Unauthorized response. Contact your administrator to obtain a new token.

Token Abilities

Tokens can be scoped with specific abilities that limit what actions can be performed. Common abilities include:

  • * - Full access (all permissions)
  • event.read - Read event data
  • bookings.read - Read booking data
  • groups.read - Read group data
  • customers.read - Read customer data
  • roles.read - Read role data
  • users.read - Read user data

Authorization & Permissions

Access to API resources is controlled by a role-based permission system. Each user is assigned roles for specific events, and each role has defined permissions.

Permission Levels

Level Description
read View/read access to resources
write Create and update resources (includes read)
admin Full access including delete (includes write and read)

Permission Areas

Area Controls Access To
event Event details, statistics, and tickets
bookings Booking records and booking tickets
groups Group information
customers Customer data
roles Event roles and permissions
users Event user assignments
Note: Permission checks are performed per-event. You may have different permission levels for different events.

Query Parameters

The API supports flexible querying through filter, sort, and include parameters powered by Spatie Query Builder.

Filtering

Filter results using the filter parameter:

# Exact match
GET /api/v2/events?filter[slug]=conference-2026

# Partial match (where supported)
GET /api/v2/events?filter[name]=Annual

# Multiple filters
GET /api/v2/event/1/bookings?filter[status]=confirmed&filter[booking_type]=participant

Sorting

Sort results using the sort parameter. Prefix with - for descending order:

# Ascending
GET /api/v2/events?sort=start_date

# Descending
GET /api/v2/events?sort=-start_date

# Multiple sorts
GET /api/v2/event/1/bookings?sort=-created_at,status

Including Relations

Include related data using the include parameter:

# Single include
GET /api/v2/events?include=tickets

# Multiple includes
GET /api/v2/event/1/bookings?include=tickets,group

# Nested includes
GET /api/v2/event/1/bookings?include=tickets.ticket,group.customer

Error Handling

The API uses standard HTTP status codes to indicate success or failure:

Status Code Description
200 OK Request successful
401 Unauthorized Missing or invalid authentication token
403 Forbidden Insufficient permissions for the requested resource
404 Not Found Requested resource does not exist
422 Unprocessable Entity Validation error (invalid query parameters)
500 Internal Server Error Server error - contact support

Error Response Format

{
    "message": "Description of the error",
    "errors": {
        "field_name": [
            "Specific error message"
        ]
    }
}

User

Retrieve information about the currently authenticated user.

GET /api/v2/user
Description

Get the authenticated user's profile information.

Query Parameters
Parameter Type Description
eventId integer Optional. Include to get the user's role for a specific event.
Response
{
    "data": {
        "id": 1,
        "name": "John Doe",
        "email": "john@example.com"
    }
}
With Event Role
GET /api/v2/user?eventId=1

{
    "data": {
        "id": 1,
        "name": "John Doe",
        "email": "john@example.com"
    },
    "event_role": {
        "id": 1,
        "title": "Event Manager"
    }
}

Events

Access event information and statistics.

GET /api/v2/events
Description

List all events accessible to the authenticated user.

Filters
  • filter[id] - Exact match by ID
  • filter[slug] - Exact match by slug
  • filter[name] - Partial match by name
  • filter[start_date] - Exact match by start date
  • filter[end_date] - Exact match by end date
Sorts
  • id, slug, name, start_date, end_date
Includes
  • tickets - Include event tickets
  • bookings - Include event bookings
Response
{
    "data": [
        {
            "id": 1,
            "slug": "conference-2026",
            "name": "Annual Conference 2026",
            "start_date": "2026-06-15",
            "end_date": "2026-06-17"
        }
    ]
}
GET /api/v2/event/{eventId} Requires: event.read
Description

Get details for a specific event.

Path Parameters
Parameter Type Description
eventId integer The event ID
Response
{
    "data": {
        "id": 1,
        "slug": "conference-2026",
        "name": "Annual Conference 2026",
        "start_date": "2026-06-15",
        "end_date": "2026-06-17"
    }
}
GET /api/v2/event/{eventId}/stats Requires: event.read
Description

Get booking statistics for an event.

Query Parameters
Parameter Type Description
no-cache flag Force refresh of cached statistics
ticketId integer Filter stats by ticket ID
ticket string Filter stats by ticket title (partial match)
participant_type string Filter stats by participant type
Response
{
    "event_id": 1,
    "event_name": "Annual Conference 2026",
    "stats": [
        {
            "id": 1,
            "participant_type": "adult",
            "title": "Adult Ticket",
            "total_confirmed_tickets_sold": 150,
            "total_provisional_tickets_sold": 25
        }
    ],
    "total_confirmed": 150,
    "total_provisional": 175,
    "generated_at": "2026-01-15T10:30:00+00:00"
}

Tickets

Access ticket information for events.

GET /api/v2/event/{eventId}/tickets Requires: event.read
Description

List all tickets for an event.

Filters
  • filter[id] - Exact match by ID
  • filter[title] - Partial match by title
  • filter[participant_type] - Exact match by participant type
Sorts
  • id, title, price, seq
Includes
  • event - Include parent event
Response
{
    "data": [
        {
            "id": 1,
            "event_id": 1,
            "title": "Adult Ticket",
            "participant_type": "adult",
            "price": "99.00"
        }
    ]
}
GET /api/v2/event/{eventId}/tickets/{ticketId} Requires: event.read
Description

Get a specific ticket.

Response
{
    "data": {
        "id": 1,
        "event_id": 1,
        "title": "Adult Ticket",
        "participant_type": "adult",
        "price": "99.00"
    }
}

Bookings

Access booking information for events.

GET /api/v2/event/{eventId}/bookings Requires: bookings.read
Description

List all active bookings for an event. Returns bookings with status: provisional, confirmed, or waiting_list.

Filters
  • filter[id] - Exact match by ID
  • filter[reference] - Exact match by booking reference
  • filter[status] - Exact match by status (provisional, confirmed, waiting_list)
  • filter[booking_type] - Exact match by booking type
  • filter[group_id] - Exact match by group ID
Sorts
  • id, created_at, status, booking_reference
Includes
  • tickets - Include booking ticket lines
  • tickets.ticket - Include ticket details for each booking ticket
  • group - Include associated group
  • group.customer - Include group's customer
Response
{
    "data": [
        {
            "id": 1,
            "event_id": 1,
            "booking_type": "participant",
            "booking_reference": "EVT-ABC123",
            "status": "confirmed",
            "created_at": "2026-01-10T14:30:00.000000Z"
        }
    ]
}
GET /api/v2/event/{eventId}/bookings/{bookingId} Requires: bookings.read
Description

Get a specific booking.

Example with Includes
GET /api/v2/event/1/bookings/1?include=tickets,group.customer

{
    "data": {
        "id": 1,
        "event_id": 1,
        "booking_type": "participant",
        "booking_reference": "EVT-ABC123",
        "status": "confirmed",
        "created_at": "2026-01-10T14:30:00.000000Z",
        "tickets": [
            {
                "id": 1,
                "booking_id": 1,
                "ticket_id": 1,
                "qty": 2,
                "price": "198.00"
            }
        ],
        "group": {
            "id": 1,
            "name": "ACME Corp",
            "customer": {
                "id": 1,
                "full_name": "Jane Smith",
                "email_address": "jane@acme.com"
            }
        }
    }
}

Booking Tickets

Access individual ticket lines within a booking.

GET /api/v2/event/{eventId}/bookings/{bookingId}/tickets Requires: bookings.read
Description

List all ticket lines for a booking.

Filters
  • filter[id] - Exact match by ID
  • filter[ticket_id] - Exact match by ticket type ID
Sorts
  • id, ticket_id, qty, price
Includes
  • booking - Include parent booking
  • ticket - Include ticket type details
  • ticket.event - Include ticket's event
Response
{
    "data": [
        {
            "id": 1,
            "booking_id": 1,
            "ticket_id": 1,
            "ticket_title": "Adult Ticket",
            "participant_type": "adult",
            "qty": 2,
            "price": "198.00"
        }
    ]
}
GET /api/v2/event/{eventId}/bookings/{bookingId}/tickets/{bookingTicketId} Requires: bookings.read
Description

Get a specific booking ticket line.

Groups

Access group information for events.

GET /api/v2/event/{eventId}/groups Requires: groups.read
Description

List all groups for an event.

Filters
  • filter[id] - Exact match by ID
  • filter[name] - Partial match by name
  • filter[association] - Partial match by association
  • filter[customer_id] - Exact match by customer ID
Sorts
  • id, name, association
Includes
  • customer - Include group's customer
  • bookings - Include group's bookings
  • bookings.tickets - Include booking ticket lines
  • event - Include parent event
Response
{
    "data": [
        {
            "id": 1,
            "event_id": 1,
            "name": "ACME Corporation",
            "association": "Corporate Partner"
        }
    ]
}
GET /api/v2/event/{eventId}/groups/{groupId} Requires: groups.read
Description

Get a specific group.

GET /api/v2/event/{eventId}/groups/{groupId}/bookings Requires: groups.read + bookings.read
Description

List all bookings for a specific group.

Query Parameters
Parameter Type Description
include_cancelled flag Include cancelled bookings in results
Filters
  • filter[id] - Exact match by ID
  • filter[status] - Exact match by status
  • filter[booking_type] - Exact match by booking type
Includes
  • tickets - Include booking tickets
  • tickets.ticket - Include ticket details

Customers

Access customer information.

GET /api/v2/event/{eventId}/customers Requires: customers.read
Description

List all customers associated with an event (via groups).

Filters
  • filter[id] - Exact match by ID
  • filter[email] - Partial match by email
  • filter[first_name] - Partial match by first name
  • filter[last_name] - Partial match by last name
  • filter[post_code] - Partial match by post code
Sorts
  • id, email, first_name, last_name
Includes
  • groups - Include customer's groups
  • groups.event - Include group events
  • groups.bookings - Include group bookings
Response
{
    "data": [
        {
            "id": 1,
            "full_name": "Jane Smith",
            "email_address": "jane@example.com",
            "post_code": "SW1A 1AA"
        }
    ]
}
GET /api/v2/event/{eventId}/customers/{customerId} Requires: customers.read
Description

Get a specific customer.

Event Roles

Access role definitions for events.

GET /api/v2/event/{eventId}/roles Requires: roles.read
Description

List all roles defined for an event.

Filters
  • filter[id] - Exact match by ID
  • filter[title] - Partial match by title
Sorts
  • id, title
Includes
  • event - Include parent event
  • permissions - Include role permissions
  • eventUsers - Include users with this role
  • eventUsers.user - Include user details
Response
{
    "data": [
        {
            "id": 1,
            "title": "Event Manager"
        }
    ]
}
With Permissions
GET /api/v2/event/1/roles?include=permissions

{
    "data": [
        {
            "id": 1,
            "title": "Event Manager",
            "permissions": [
                {
                    "id": 1,
                    "event_role_id": 1,
                    "area": "event",
                    "permission": "admin"
                },
                {
                    "id": 2,
                    "event_role_id": 1,
                    "area": "bookings",
                    "permission": "write"
                }
            ]
        }
    ]
}
GET /api/v2/event/{eventId}/roles/{roleId} Requires: roles.read
Description

Get a specific role.

Event Users

Access user assignments for events.

GET /api/v2/event/{eventId}/users Requires: users.read
Description

List all user assignments for an event.

Filters
  • filter[id] - Exact match by ID
  • filter[user_id] - Exact match by user ID
  • filter[event_role_id] - Exact match by role ID
  • filter[active] - Filter by active status (true/false)
Sorts
  • id, user_id, event_role_id, active
Includes
  • user - Include user details
  • event - Include event details
  • role - Include role details
  • role.permissions - Include role permissions
Response
{
    "data": [
        {
            "id": 1,
            "user_id": 5,
            "event_id": 1,
            "active": true
        }
    ]
}
With User and Role
GET /api/v2/event/1/users?include=user,role

{
    "data": [
        {
            "id": 1,
            "user_id": 5,
            "event_id": 1,
            "active": true,
            "user": {
                "id": 5,
                "name": "John Doe",
                "email": "john@example.com"
            },
            "role": {
                "id": 1,
                "title": "Event Manager"
            }
        }
    ]
}
GET /api/v2/event/{eventId}/users/{eventUserId} Requires: users.read
Description

Get a specific event user assignment.