Contents
On this page

List Bookings - Plugixa Car Wash

GET /plugixa-carwash/v1/bookings

List bookings, one page at a time, with search, sorting and filters.

Needs the plugixa_carwash_view capability.

Request

GET https://your-site.example/wp-json/plugixa-carwash/v1/bookings?start_at__between=2026-11-14,2026-11-20&status__in=confirmed&orderby=start_at&order=asc

Query parameters

Name Type Default Description
start_at__between string Appointments from one day to another, from,to as Y-m-d. Days are your site’s days.
status__in string Comma-separated statuses: hold, pending, confirmed, in_progress, completed, cancelled, no_show.
location_id__in string Comma-separated location ids.
resource_id__in string Comma-separated bay or team ids.
payment_status__in string Comma-separated: unpaid, paid, partially_paid, refunded.

Plus the list parameters every paged list accepts. search matches the booking number, first and last name, e-mail, phone and plate. orderby accepts id, number, start_at, status, total, last_name, created_at and modified_at. Every filter is a field and a comparison joined by two underscores, so start_at also takes __gte, __lte, __eq and the rest, and created_at and modified_at can be filtered too: see Filters.

Responses

200 OK. data is one page of bookings.

{
  "success": true,
  "data": [
    {
      "id": 42,
      "number": "CW2026-0042",
      "form_id": null,
      "location_id": 3,
      "resource_id": 5,
      "customer_id": 25,
      "customer_vehicle_id": 31,
      "vehicle_type_id": 2,
      "package_id": 4,
      "start_at": "2026-11-14 15:00:00",
      "end_at": "2026-11-14 16:00:00",
      "blocked_until": "2026-11-14 16:10:00",
      "duration": 60,
      "status": "confirmed",
      "hold_expires_at": null,
      "first_name": "Lucas",
      "last_name": "Bernard",
      "email": "lucas@example.com",
      "phone": "+1 217 555 0199",
      "company": "",
      "vehicle_make": "Toyota RAV4",
      "vehicle_plate": "ABC1234",
      "address": "",
      "message": "",
      "agreements": [],
      "currency": "USD",
      "subtotal": 49.0,
      "discount": 0.0,
      "coupon_code": "",
      "tax": 3.06,
      "total": 52.06,
      "payment_method": "cash",
      "payment_status": "unpaid",
      "source": "staff",
      "page_url": "",
      "staff_notes": "Regular customer",
      "created_by": 1,
      "modified_by": 1,
      "created_at": "2026-11-12 09:30:00",
      "modified_at": "2026-11-12 09:30:00",
      "deleted_at": null
    }
  ],
  "meta": {
    "total": 18,
    "pages": 1
  }
}
Field Type Meaning
data[].id integer The booking’s id
data[].number string The booking reference, CW + year + id, for example CW2026-0042
data[].location_id integer The location
data[].resource_id integer|null The bay or mobile team it is booked on
data[].customer_id integer|null The customer record it belongs to
data[].vehicle_type_id integer|null The vehicle type chosen
data[].package_id integer|null The package chosen, null for services only
data[].start_at string UTC datetime the wash starts
data[].end_at string UTC datetime the wash ends
data[].blocked_until string UTC datetime the bay is free again: end_at plus the location’s buffer
data[].duration integer Minutes
data[].status string hold, pending, confirmed, in_progress, completed, cancelled or no_show
data[].hold_expires_at string|null For a hold (waiting for an online payment): when it is cancelled if still unpaid
data[].agreements array The booking form’s agreements as {text, accepted}. Empty for a staff booking
data[].subtotal number Sum of the lines, discounts included
data[].discount number Total of the discount lines
data[].coupon_code string The coupon used, or empty
data[].tax number Tax, at the location’s rate
data[].total number What the booking costs
data[].payment_status string unpaid, paid, partially_paid or refunded
data[].source string online or staff
data[].staff_notes string|null Internal notes, never shown to the customer
data[].modified_at string UTC datetime of the last change
meta.total integer Bookings matching the search and filters, before paging
meta.pages integer Number of pages at this per_page

A list row is the stored booking. Get Booking adds its lines, status history, payments and local date and time.

Errors

Status Code When
400 plugixa_carwash_unknown_filter A filter names a field bookings cannot be filtered on.
400 plugixa_carwash_unknown_operator A comparison that does not work on that field.
400 plugixa_carwash_invalid_date A date filter value is not a date.

Plus the errors every endpoint can return.

Examples

curl -s "https://your-site.example/wp-json/plugixa-carwash/v1/bookings?start_at__between=2026-11-14,2026-11-20&status__in=confirmed&orderby=start_at&order=asc" \
  -u "admin:$WP_APP_PASSWORD"
<?php
$query = http_build_query([
    'start_at__between' => '2026-11-14,2026-11-20',
    'status__in'        => 'confirmed',
    'orderby'           => 'start_at',
    'order'             => 'asc',
]);
$ch = curl_init('https://your-site.example/wp-json/plugixa-carwash/v1/bookings?' . $query);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERPWD        => 'admin:' . getenv('WP_APP_PASSWORD'),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
const auth = Buffer.from(`admin:${process.env.WP_APP_PASSWORD}`).toString('base64');
const query = new URLSearchParams({
  start_at__between: '2026-11-14,2026-11-20',
  status__in: 'confirmed',
  orderby: 'start_at',
  order: 'asc',
});
const response = await fetch(`https://your-site.example/wp-json/plugixa-carwash/v1/bookings?${query}`, {
  headers: {
    'Authorization': `Basic ${auth}`,
  },
});
const { data, meta } = await response.json();

Quick Links

Share