Contents
On this page

Create Package - Plugixa Car Wash

POST /plugixa-carwash/v1/packages

Create a package.

Needs the plugixa_carwash_create capability.

Note. included, addons and vehicle_rules are saved after the package itself. When they are refused, the answer is 422 but the package has already been created without them.

Request

POST https://your-site.example/wp-json/plugixa-carwash/v1/packages

Request body

Content type: application/json

Field Type Required Description
name string Yes At most 190 characters.
tagline string No At most 190 characters. Defaults to empty.
description string No Defaults to empty.
duration integer No Minutes, 1 to 1440. The package’s own time, not the sum of its services. Defaults to 30.
price number No 0 to 1000000. Defaults to 0.
badge string No At most 40 characters. Defaults to empty.
color string No A hex colour, or empty. Defaults to empty.
featured boolean No Defaults to false.
image_id integer No A media library attachment id.
sort_order integer No 0 to 100000. Defaults to 0.
status string No published or unpublished. Defaults to published.
included array No Service ids on its checklist. When sent, replaces the list.
addons array No Service ids offered as extras with it. Empty offers every published add-on. When sent, replaces the list.
vehicle_rules array No Per-vehicle overrides, each {"vehicle_type_id", "location_id", "price", "duration", "available"}. location_id 0 means every location; a rule for one location wins over it. A null price or duration keeps the default arithmetic, available: false hides the item for that vehicle. One rule per vehicle type and location. When sent, it replaces every rule.

Without a rule, a package costs its price plus the vehicle type’s base_fee, and takes its duration times the vehicle type’s duration_factor.

{
  "name": "Deluxe",
  "tagline": "Inside and out",
  "duration": 45,
  "price": 39,
  "badge": "Most popular",
  "featured": true,
  "included": [
    6,
    7
  ],
  "vehicle_rules": [
    {
      "vehicle_type_id": 2,
      "location_id": 0,
      "price": 49,
      "duration": 60
    }
  ]
}

Responses

201 Created. data is the new package.

{
  "success": true,
  "data": {
    "id": 4,
    "name": "Deluxe",
    "tagline": "Inside and out",
    "description": "",
    "duration": 45,
    "price": 39.0,
    "badge": "Most popular",
    "color": "#F59E0B",
    "featured": true,
    "image_id": null,
    "sort_order": 1,
    "status": "published",
    "created_by": 1,
    "modified_by": 1,
    "created_at": "2026-11-10 08:15:00",
    "modified_at": "2026-11-12 09:30:00",
    "deleted_at": null,
    "image_url": null,
    "included": [
      6,
      7
    ],
    "addons": [],
    "vehicle_rules": [
      {
        "vehicle_type_id": 2,
        "location_id": 0,
        "price": 49.0,
        "duration": 60,
        "available": true
      }
    ]
  }
}
Field Type Meaning
data.id integer The package’s id
data.duration integer Minutes, before the vehicle type’s multiplier
data.price number Base price, before the vehicle type’s fee
data.badge string Short ribbon on the card
data.featured boolean Lifted on the booking form
data.image_url string|null Medium-size URL of image_id
data.created_at string UTC datetime
data.modified_at string UTC datetime of the last change. Send it back on an update to be warned about a conflicting edit
data.deleted_at string|null null unless the record is in the trash
data.included array Service ids on the package’s checklist
data.addons array Service ids offered as extras with it. Empty offers every published add-on
data.vehicle_rules array Per-vehicle price and time overrides

Errors

Status Code When
422 plugixa_carwash_missing_name name is missing or empty.
422 plugixa_carwash_too_long_{field} A text field is too long. The code names the field.
422 plugixa_carwash_too_small_{field} / too_large_{field} A number is outside its range. The code names the field.
422 plugixa_carwash_invalid_{field} A choice field has a value that is not one of its choices. The code names the field.
422 plugixa_carwash_invalid_service An id in included or addons is not an existing service.
422 plugixa_carwash_invalid_vehicle_rule A rule has a negative price, or a time outside 0 to 1440.
422 plugixa_carwash_duplicate_vehicle_rule Two rules for the same vehicle type and location.

Plus the errors every endpoint can return.

Examples

curl -s -X POST "https://your-site.example/wp-json/plugixa-carwash/v1/packages" \
  -u "admin:$WP_APP_PASSWORD" \
  -H "Content-Type: application/json" \
  -d '{"name":"Deluxe","tagline":"Inside and out","duration":45,"price":39,"badge":"Most popular","featured":true,"included":[6,7],"vehicle_rules":[{"vehicle_type_id":2,"location_id":0,"price":49,"duration":60}]}'
<?php
$ch = curl_init('https://your-site.example/wp-json/plugixa-carwash/v1/packages');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERPWD        => 'admin:' . getenv('WP_APP_PASSWORD'),
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'name'          => 'Deluxe',
        'tagline'       => 'Inside and out',
        'duration'      => 45,
        'price'         => 39,
        'badge'         => 'Most popular',
        'featured'      => true,
        'included'      => [6, 7],
        'vehicle_rules' => [
            [
                'vehicle_type_id' => 2,
                'location_id'     => 0,
                'price'           => 49,
                'duration'        => 60,
            ],
        ],
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
const auth = Buffer.from(`admin:${process.env.WP_APP_PASSWORD}`).toString('base64');
const response = await fetch('https://your-site.example/wp-json/plugixa-carwash/v1/packages', {
  method: 'POST',
  headers: {
    'Authorization': `Basic ${auth}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Deluxe',
    tagline: 'Inside and out',
    duration: 45,
    price: 39,
    badge: 'Most popular',
    featured: true,
    included: [6, 7],
    vehicle_rules: [{ vehicle_type_id: 2, location_id: 0, price: 49, duration: 60 }],
  }),
});
const { data } = await response.json();

Quick Links

Share