# WooCommerce

> Run a WooCommerce store from a workflow: search and edit the catalogue, place and progress orders, add notes to them, manage customers and their saved addresses, and create the discount coupons shoppers check out with. Works with any self-hosted WooCommerce store.

App · E-Commerce · 20 actions. Web page: https://docs.lodol.com/docs/integrations/woocommerce

## Actions

### Add order note

Attach a note to an order. A private note is only ever seen in wp-admin; turning on 'Send to customer' makes WooCommerce email it to the buyer instead, so use that one deliberately.

**Inputs**

- Order ID (`order_id`, text, required): The order to attach the note to.
- Note (`note`, text, required): What the note says.
- Send to customer (`customer_note`, true/false): Email the note to the buyer as well as recording it. Off by default, which keeps the note private. Default: `false`.
- Attribute to the API key's user (`added_by_user`, true/false): Credit the note to the WordPress user the API key belongs to instead of to the system. Default: `false`.

**Outputs**

- `added_by_user` (true/false)
- `author` (text)
- `customer_note` (true/false)
- `date_created` (text)
- `date_created_gmt` (text)
- `id` (number)
- `note` (text)

**Example output**

```json
{
  "added_by_user": false,
  "author": "system",
  "customer_note": false,
  "date_created": "2026-08-30T11:06:19",
  "date_created_gmt": "2026-08-30T10:06:19",
  "id": 2201,
  "note": "Packed and ready for collection."
}
```

### Create coupon

Create a discount coupon: a percentage off, a fixed amount off the cart, or a fixed amount off each product. Set an expiry date, a spend range, usage limits, free shipping, and which products, categories or email addresses it applies to.

**Inputs**

- Code (`code`, text, required): What shoppers type at checkout. WooCommerce stores it in lower case and refuses a code the store already has.
- Discount type (`discount_type`, text): How the discount is worked out. A fixed cart discount when left blank. One of: `fixed_cart` (Fixed cart discount), `percent` (Percentage discount), `fixed_product` (Fixed product discount).
- Amount (`amount`, text): How much the discount is worth, as a plain number. For a percentage discount this is the percentage: 10 means 10% off, not 0.1.
- Description (`description`, text): A note about the coupon, seen only in wp-admin.
- Expires on (`expires_on`, date): The last day the coupon works, in the store's own time zone. Never expires when left blank.
- Individual use only (`individual_use`, true/false): Stop this coupon being combined with any other.
- Grants free shipping (`free_shipping`, true/false): Let this coupon unlock free shipping. Only has an effect if a free-shipping method is set up to require a coupon.
- Exclude sale items (`exclude_sale_items`, true/false): Stop the coupon applying to products already on sale.
- Minimum spend (`minimum_amount`, text): The smallest cart total the coupon applies to.
- Maximum spend (`maximum_amount`, text): The largest cart total the coupon applies to.
- Usage limit (`usage_limit`, number): How many times the coupon can be used in total. At least 1.
- Usage limit per customer (`usage_limit_per_user`, number): How many times one customer can use the coupon. At least 1.
- Limit to this many items (`limit_usage_to_x_items`, number): For a fixed product discount, the most items in the cart it can be applied to. At least 1.
- Only these products (`product_ids`, list): Product IDs the coupon applies to.
- Except these products (`excluded_product_ids`, list): Product IDs the coupon must not apply to.
- Only these categories (`product_category_ids`, list): Categories the coupon applies to.
- Except these categories (`excluded_product_category_ids`, list): Categories the coupon must not apply to.
- Only these email addresses (`email_restrictions`, list): Email addresses allowed to use the coupon. Anyone may use it when left blank.

**Outputs**

- `amount` (text)
- `code` (text)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_expires` (text)
- `date_expires_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `description` (text)
- `discount_type` (text)
- `email_restrictions` (list)
- `exclude_sale_items` (true/false)
- `excluded_product_categories` (list)
- `excluded_product_ids` (list)
- `free_shipping` (true/false)
- `id` (number)
- `individual_use` (true/false)
- `limit_usage_to_x_items` (number)
- `maximum_amount` (text)
- `meta_data` (list)
- `minimum_amount` (text)
- `product_categories` (list)
- `product_ids` (list)
- `usage_count` (number)
- `usage_limit` (number)
- `usage_limit_per_user` (number)
- `used_by` (list)

**Example output**

```json
{
  "amount": "10.00",
  "code": "autumn10",
  "date_created": "2026-09-01T08:00:00",
  "date_created_gmt": "2026-09-01T07:00:00",
  "date_expires": "2026-10-31",
  "description": "10% off everything for the autumn sale.",
  "discount_type": "percent",
  "email_restrictions": [],
  "exclude_sale_items": true,
  "excluded_product_categories": [],
  "excluded_product_ids": [],
  "free_shipping": false,
  "id": 1180,
  "individual_use": false,
  "maximum_amount": "0.00",
  "meta_data": [],
  "minimum_amount": "25.00",
  "product_categories": [],
  "product_ids": [],
  "usage_count": 4,
  "usage_limit": 500,
  "usage_limit_per_user": 1,
  "used_by": []
}
```

### Create customer

Register a customer account on the store, with an email address and optionally a name, username, password and saved addresses. A WooCommerce customer is a WordPress user, so the email must not already have an account - WooCommerce refuses a duplicate rather than returning the existing one.

**Inputs**

- Email (`email`, text, required): The customer's email address. Must be unique.
- First name (`first_name`, text): The customer's first name.
- Last name (`last_name`, text): The customer's last name.
- Username (`username`, text): The login name for the account. WordPress generates one from the email when left blank, and it can never be changed afterwards.
- Password (`password`, text): A password for the account. WordPress generates one and emails the customer when left blank.
- Billing first name (`billing_first_name`, text): First name on the billing address.
- Billing last name (`billing_last_name`, text): Last name on the billing address.
- Billing company (`billing_company`, text): Company name on the billing address.
- Billing address line 1 (`billing_address_1`, text): Street address on the billing address.
- Billing address line 2 (`billing_address_2`, text): Apartment, suite or unit on the billing address.
- Billing city (`billing_city`, text): City on the billing address.
- Billing state (`billing_state`, text): State, province or district on the billing address, as its ISO code or its name - 'CA' or 'California'.
- Billing postcode (`billing_postcode`, text): Postal or ZIP code on the billing address.
- Billing country (`billing_country`, text): Country on the billing address, as a two-letter ISO 3166-1 code such as US, GB or DE.
- Billing email (`billing_email`, text): Email address on the billing address.
- Billing phone (`billing_phone`, text): Phone number on the billing address.
- Shipping address (`shipping_address`, object): The delivery address, as an object with any of 'first_name', 'last_name', 'company', 'address_1', 'address_2', 'city', 'state', 'postcode' and 'country'. There is no email or phone on a shipping address - those belong to billing.

**Outputs**

- `avatar_url` (text)
- `billing` (object)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `email` (text)
- `first_name` (text)
- `id` (number)
- `is_paying_customer` (true/false)
- `last_name` (text)
- `meta_data` (list)
- `role` (text)
- `shipping` (object)
- `username` (text)

**Example output**

```json
{
  "avatar_url": "https://secure.gravatar.com/avatar/0f1e2d",
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "date_created": "2026-05-02T15:31:07",
  "date_created_gmt": "2026-05-02T14:31:07",
  "email": "ada@example.com",
  "first_name": "Ada",
  "id": 214,
  "is_paying_customer": true,
  "last_name": "Lovelace",
  "meta_data": [],
  "role": "customer",
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "username": "ada"
}
```

### Create order

Place an order in the store for one or more products, with a billing address, an optional shipping address, a status and a payment method. Leave the customer blank for a guest order, which is what a checkout by someone without an account produces.

**Inputs**

- Line items (`line_items`, list, required): What the order is for: a list of objects, each with a 'product_id' and a 'quantity'. Add 'variation_id' for a specific variation, or 'total' to override the price WooCommerce would work out.
- Customer ID (`customer_id`, text): Whose order this is. Leave blank to record it as a guest order.
- Status (`status`, text): What state to create the order in. WooCommerce uses 'pending' when left blank. One of: `pending` (Pending payment), `processing`, `on-hold` (On hold), `completed`, `cancelled`, `refunded`, `failed`.
- Currency (`currency`, text): The order's currency as a three-letter ISO code such as USD or GBP. The store's own currency when left blank.
- Customer note (`customer_note`, text): A note from the buyer, as left at checkout.
- Payment method ID (`payment_method`, text): The payment gateway's ID, such as 'bacs', 'cheque' or 'cod'.
- Payment method name (`payment_method_title`, text): How the payment method is described to the customer, such as 'Direct bank transfer'.
- Mark as paid (`set_paid`, true/false): Record the order as paid. WooCommerce then moves it to 'processing' and takes the items out of stock.
- Billing first name (`billing_first_name`, text): First name on the billing address.
- Billing last name (`billing_last_name`, text): Last name on the billing address.
- Billing company (`billing_company`, text): Company name on the billing address.
- Billing address line 1 (`billing_address_1`, text): Street address on the billing address.
- Billing address line 2 (`billing_address_2`, text): Apartment, suite or unit on the billing address.
- Billing city (`billing_city`, text): City on the billing address.
- Billing state (`billing_state`, text): State, province or district on the billing address, as its ISO code or its name - 'CA' or 'California'.
- Billing postcode (`billing_postcode`, text): Postal or ZIP code on the billing address.
- Billing country (`billing_country`, text): Country on the billing address, as a two-letter ISO 3166-1 code such as US, GB or DE.
- Billing email (`billing_email`, text): Email address on the billing address.
- Billing phone (`billing_phone`, text): Phone number on the billing address.
- Shipping address (`shipping_address`, object): The delivery address, as an object with any of 'first_name', 'last_name', 'company', 'address_1', 'address_2', 'city', 'state', 'postcode' and 'country'. There is no email or phone on a shipping address - those belong to billing.

**Outputs**

- `billing` (object)
- `cart_hash` (text)
- `cart_tax` (text)
- `coupon_lines` (list)
- `created_via` (text)
- `currency` (text)
- `customer_id` (number)
- `customer_ip_address` (text)
- `customer_note` (text)
- `customer_user_agent` (text)
- `date_completed` (text)
- `date_completed_gmt` (text)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_paid` (text)
- `date_paid_gmt` (text)
- `discount_tax` (text)
- `discount_total` (text)
- `fee_lines` (list)
- `id` (number)
- `line_items` (list)
- `meta_data` (list)
- `number` (text)
- `order_key` (text)
- `parent_id` (number)
- `payment_method` (text)
- `payment_method_title` (text)
- `prices_include_tax` (true/false)
- `refunds` (list)
- `shipping` (object)
- `shipping_lines` (list)
- `shipping_tax` (text)
- `shipping_total` (text)
- `status` (text)
- `tax_lines` (list)
- `total` (text)
- `total_tax` (text)
- `transaction_id` (text)
- `version` (text)

**Example output**

```json
{
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "coupon_lines": [],
  "created_via": "rest-api",
  "currency": "USD",
  "customer_id": 214,
  "customer_note": "Please leave with a neighbour.",
  "date_created": "2026-08-30T11:04:02",
  "date_created_gmt": "2026-08-30T10:04:02",
  "discount_total": "0.00",
  "fee_lines": [],
  "id": 5142,
  "line_items": [
    {
      "id": 91,
      "meta_data": [],
      "name": "Hand-thrown mug",
      "price": "24.00",
      "product_id": 799,
      "quantity": 2,
      "sku": "MUG-350",
      "subtotal": "48.00",
      "total": "48.00",
      "variation_id": 0
    }
  ],
  "meta_data": [],
  "number": "5142",
  "order_key": "wc_order_9Kd2mQpLxA1bZ",
  "parent_id": 0,
  "payment_method": "bacs",
  "payment_method_title": "Direct bank transfer",
  "prices_include_tax": false,
  "refunds": [],
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "shipping_lines": [],
  "shipping_total": "4.50",
  "status": "processing",
  "tax_lines": [],
  "total": "52.50",
  "total_tax": "0.00",
  "transaction_id": "",
  "version": "9.8.1"
}
```

### Create product

Add a product to the catalogue: name, description, SKU, regular and sale price with an optional sale window, categories, images, stock tracking, weight, tax status and visibility. Published straight away unless you choose a different status.

**Inputs**

- Name (`name`, text, required): The product's name, as shoppers see it.
- Type (`product_type`, text): What kind of product this is. 'Simple' is a single item with one price. 'Variable' and 'Grouped' need variations or child products set up in wp-admin before they can be bought. One of: `simple`, `grouped`, `external` (External/Affiliate), `variable`.
- Status (`status`, text): Whether the product is live in the shop. New products are published unless you choose otherwise. One of: `publish` (Published), `draft`, `pending` (Pending review), `private`.
- Description (`description`, text): The full product description. HTML is allowed.
- Short description (`short_description`, text): The summary shown beside the price. HTML is allowed.
- SKU (`sku`, text): Your own stock-keeping code. WooCommerce refuses a duplicate, so it has to be unique across the store.
- Regular price (`regular_price`, text): The normal price, as a plain number in the store's own currency - 19.99, not $19.99.
- Sale price (`sale_price`, text): The discounted price. Takes effect immediately unless a sale window is set below.
- Sale starts (`sale_starts_at`, date and time): When the sale price begins. Leave blank to start now.
- Sale ends (`sale_ends_at`, date and time): When the sale price stops. Leave blank to keep it until the sale price is removed.
- Categories (`category_ids`, list): Which categories to file the product under. Pick from the store's categories, or type a category ID.
- Image URLs (`image_urls`, list): Publicly reachable image URLs. WooCommerce downloads each one into the store's media library; the first becomes the main product image.
- Featured (`featured`, true/false): Mark the product as featured.
- Catalog visibility (`catalog_visibility`, text): Where in the store the product can be found. One of: `visible` (Shop and search results), `catalog` (Shop only), `search` (Search results only), `hidden`.
- Virtual (`virtual`, true/false): Turn on for something that is not shipped, such as a service or a booking.
- Track stock (`manage_stock`, true/false): Let WooCommerce count this product's stock. The stock quantity and backorder settings below only apply when this is on.
- Stock quantity (`stock_quantity`, number): How many are in stock. Needs stock tracking to be on. At least 0.
- Stock status (`stock_status`, text): Whether the product can be bought. Set directly when stock is not tracked; WooCommerce works it out from the quantity when it is. One of: `instock` (In stock), `outofstock` (Out of stock), `onbackorder` (On backorder).
- Backorders (`backorders`, text): Whether the product can be bought once stock runs out. Needs stock tracking to be on. One of: `no` (Do not allow), `notify` (Allow, but notify customer), `yes` (Allow).
- Weight (`weight`, text): The product's weight, as a plain number in the store's own weight unit.
- Tax status (`tax_status`, text): What part of this product's price is taxed. One of: `taxable`, `shipping` (Shipping only), `none`.
- Menu order (`menu_order`, number): A custom sort position in the shop. Lower comes first.

**Outputs**

- `attributes` (list)
- `average_rating` (text)
- `backordered` (true/false)
- `backorders` (text)
- `backorders_allowed` (true/false)
- `brands` (list)
- `button_text` (text)
- `catalog_visibility` (text)
- `categories` (list)
- `cross_sell_ids` (list)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_on_sale_from` (text)
- `date_on_sale_from_gmt` (text)
- `date_on_sale_to` (text)
- `date_on_sale_to_gmt` (text)
- `default_attributes` (list)
- `description` (text)
- `dimensions` (object)
- `download_expiry` (number)
- `download_limit` (number)
- `downloadable` (true/false)
- `downloads` (list)
- `external_url` (text)
- `featured` (true/false)
- `global_unique_id` (text)
- `grouped_products` (list)
- `id` (number)
- `images` (list)
- `manage_stock` (true/false)
- `menu_order` (number)
- `meta_data` (list)
- `name` (text)
- `on_sale` (true/false)
- `parent_id` (number)
- `permalink` (text)
- `price` (text)
- `price_html` (text)
- `purchasable` (true/false)
- `purchase_note` (text)
- `rating_count` (number)
- `regular_price` (text)
- `related_ids` (list)
- `reviews_allowed` (true/false)
- `sale_price` (text)
- `shipping_class` (text)
- `shipping_class_id` (number)
- `shipping_required` (true/false)
- `shipping_taxable` (true/false)
- `short_description` (text)
- `sku` (text)
- `slug` (text)
- `sold_individually` (true/false)
- `status` (text)
- `stock_quantity` (number)
- `stock_status` (text)
- `tags` (list)
- `tax_class` (text)
- `tax_status` (text)
- `total_sales` (number)
- `type` (text)
- `upsell_ids` (list)
- `variations` (list)
- `virtual` (true/false)
- `weight` (text)

**Example output**

```json
{
  "average_rating": "4.80",
  "backorders": "no",
  "catalog_visibility": "visible",
  "categories": [
    {
      "id": 31,
      "name": "Kitchen",
      "slug": "kitchen"
    }
  ],
  "date_created": "2026-08-14T09:12:44",
  "date_created_gmt": "2026-08-14T08:12:44",
  "description": "<p>Stoneware, glazed inside and out.</p>",
  "dimensions": {
    "height": "9",
    "length": "12",
    "width": "9"
  },
  "downloadable": false,
  "featured": false,
  "id": 799,
  "images": [
    {
      "alt": "A stoneware mug",
      "id": 812,
      "name": "mug",
      "src": "https://shop.example.com/wp-content/uploads/mug.jpg"
    }
  ],
  "manage_stock": true,
  "menu_order": 0,
  "meta_data": [],
  "name": "Hand-thrown mug",
  "on_sale": true,
  "permalink": "https://shop.example.com/product/hand-thrown-mug/",
  "price": "24.00",
  "purchasable": true,
  "rating_count": 15,
  "regular_price": "28.00",
  "sale_price": "24.00",
  "short_description": "<p>Stoneware mug, 350ml.</p>",
  "sku": "MUG-350",
  "slug": "hand-thrown-mug",
  "status": "publish",
  "stock_quantity": 18,
  "stock_status": "instock",
  "tags": [],
  "tax_status": "taxable",
  "total_sales": 63,
  "type": "simple",
  "virtual": false,
  "weight": "0.4"
}
```

### Delete coupon

Move a coupon to the WordPress trash, where it stops working but can still be restored - or erase it for good by turning on 'Delete permanently'. Returns the coupon as it was.

**Inputs**

- Coupon ID (`coupon_id`, text, required): The coupon's numeric ID. 'List coupons' returns it as 'id'.
- Delete permanently (`permanently`, true/false): Leave off to move the coupon to the WordPress trash, where it can be restored. Turn on to erase it for good. Default: `false`.

**Outputs**

- `amount` (text)
- `code` (text)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_expires` (text)
- `date_expires_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `description` (text)
- `discount_type` (text)
- `email_restrictions` (list)
- `exclude_sale_items` (true/false)
- `excluded_product_categories` (list)
- `excluded_product_ids` (list)
- `free_shipping` (true/false)
- `id` (number)
- `individual_use` (true/false)
- `limit_usage_to_x_items` (number)
- `maximum_amount` (text)
- `meta_data` (list)
- `minimum_amount` (text)
- `product_categories` (list)
- `product_ids` (list)
- `usage_count` (number)
- `usage_limit` (number)
- `usage_limit_per_user` (number)
- `used_by` (list)

**Example output**

```json
{
  "amount": "10.00",
  "code": "autumn10",
  "date_created": "2026-09-01T08:00:00",
  "date_created_gmt": "2026-09-01T07:00:00",
  "date_expires": "2026-10-31",
  "description": "10% off everything for the autumn sale.",
  "discount_type": "percent",
  "email_restrictions": [],
  "exclude_sale_items": true,
  "excluded_product_categories": [],
  "excluded_product_ids": [],
  "free_shipping": false,
  "id": 1180,
  "individual_use": false,
  "maximum_amount": "0.00",
  "meta_data": [],
  "minimum_amount": "25.00",
  "product_categories": [],
  "product_ids": [],
  "usage_count": 4,
  "usage_limit": 500,
  "usage_limit_per_user": 1,
  "used_by": []
}
```

### Delete customer

Delete a customer account for good. There is no trash for this one: a customer is a WordPress user, and WordPress does not trash users. Their past orders survive and simply become guest orders, since an order keeps its own billing details.

**Inputs**

- Customer ID (`customer_id`, text, required): The customer's numeric ID.
- Reassign posts to (`reassign_to`, text): Hand any posts this user wrote to another user ID. Their orders are unaffected either way.

**Outputs**

- `avatar_url` (text)
- `billing` (object)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `email` (text)
- `first_name` (text)
- `id` (number)
- `is_paying_customer` (true/false)
- `last_name` (text)
- `meta_data` (list)
- `role` (text)
- `shipping` (object)
- `username` (text)

**Example output**

```json
{
  "avatar_url": "https://secure.gravatar.com/avatar/0f1e2d",
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "date_created": "2026-05-02T15:31:07",
  "date_created_gmt": "2026-05-02T14:31:07",
  "email": "ada@example.com",
  "first_name": "Ada",
  "id": 214,
  "is_paying_customer": true,
  "last_name": "Lovelace",
  "meta_data": [],
  "role": "customer",
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "username": "ada"
}
```

### Delete order

Move an order to the WordPress trash, where it can still be restored - or erase it for good by turning on 'Delete permanently', which also takes it out of the store's sales figures. Returns the order as it was.

**Inputs**

- Order ID (`order_id`, text, required): The order's numeric ID.
- Delete permanently (`permanently`, true/false): Leave off to move the order to the WordPress trash, where it can be restored. Turn on to erase it for good. Default: `false`.

**Outputs**

- `billing` (object)
- `cart_hash` (text)
- `cart_tax` (text)
- `coupon_lines` (list)
- `created_via` (text)
- `currency` (text)
- `customer_id` (number)
- `customer_ip_address` (text)
- `customer_note` (text)
- `customer_user_agent` (text)
- `date_completed` (text)
- `date_completed_gmt` (text)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_paid` (text)
- `date_paid_gmt` (text)
- `discount_tax` (text)
- `discount_total` (text)
- `fee_lines` (list)
- `id` (number)
- `line_items` (list)
- `meta_data` (list)
- `number` (text)
- `order_key` (text)
- `parent_id` (number)
- `payment_method` (text)
- `payment_method_title` (text)
- `prices_include_tax` (true/false)
- `refunds` (list)
- `shipping` (object)
- `shipping_lines` (list)
- `shipping_tax` (text)
- `shipping_total` (text)
- `status` (text)
- `tax_lines` (list)
- `total` (text)
- `total_tax` (text)
- `transaction_id` (text)
- `version` (text)

**Example output**

```json
{
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "coupon_lines": [],
  "created_via": "rest-api",
  "currency": "USD",
  "customer_id": 214,
  "customer_note": "Please leave with a neighbour.",
  "date_created": "2026-08-30T11:04:02",
  "date_created_gmt": "2026-08-30T10:04:02",
  "discount_total": "0.00",
  "fee_lines": [],
  "id": 5142,
  "line_items": [
    {
      "id": 91,
      "meta_data": [],
      "name": "Hand-thrown mug",
      "price": "24.00",
      "product_id": 799,
      "quantity": 2,
      "sku": "MUG-350",
      "subtotal": "48.00",
      "total": "48.00",
      "variation_id": 0
    }
  ],
  "meta_data": [],
  "number": "5142",
  "order_key": "wc_order_9Kd2mQpLxA1bZ",
  "parent_id": 0,
  "payment_method": "bacs",
  "payment_method_title": "Direct bank transfer",
  "prices_include_tax": false,
  "refunds": [],
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "shipping_lines": [],
  "shipping_total": "4.50",
  "status": "processing",
  "tax_lines": [],
  "total": "52.50",
  "total_tax": "0.00",
  "transaction_id": "",
  "version": "9.8.1"
}
```

### Delete product

Move a product to the WordPress trash, where it stops being sold but can still be restored - or erase it for good by turning on 'Delete permanently'. Returns the product as it was.

**Inputs**

- Product ID (`product_id`, text, required): The product's numeric ID. 'List products' returns it as 'id', and it is the 'post' number in the wp-admin URL when you edit a product.
- Delete permanently (`permanently`, true/false): Leave off to move the product to the WordPress trash, where it can be restored. Turn on to erase it for good. Default: `false`.

**Outputs**

- `attributes` (list)
- `average_rating` (text)
- `backordered` (true/false)
- `backorders` (text)
- `backorders_allowed` (true/false)
- `brands` (list)
- `button_text` (text)
- `catalog_visibility` (text)
- `categories` (list)
- `cross_sell_ids` (list)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_on_sale_from` (text)
- `date_on_sale_from_gmt` (text)
- `date_on_sale_to` (text)
- `date_on_sale_to_gmt` (text)
- `default_attributes` (list)
- `description` (text)
- `dimensions` (object)
- `download_expiry` (number)
- `download_limit` (number)
- `downloadable` (true/false)
- `downloads` (list)
- `external_url` (text)
- `featured` (true/false)
- `global_unique_id` (text)
- `grouped_products` (list)
- `id` (number)
- `images` (list)
- `manage_stock` (true/false)
- `menu_order` (number)
- `meta_data` (list)
- `name` (text)
- `on_sale` (true/false)
- `parent_id` (number)
- `permalink` (text)
- `price` (text)
- `price_html` (text)
- `purchasable` (true/false)
- `purchase_note` (text)
- `rating_count` (number)
- `regular_price` (text)
- `related_ids` (list)
- `reviews_allowed` (true/false)
- `sale_price` (text)
- `shipping_class` (text)
- `shipping_class_id` (number)
- `shipping_required` (true/false)
- `shipping_taxable` (true/false)
- `short_description` (text)
- `sku` (text)
- `slug` (text)
- `sold_individually` (true/false)
- `status` (text)
- `stock_quantity` (number)
- `stock_status` (text)
- `tags` (list)
- `tax_class` (text)
- `tax_status` (text)
- `total_sales` (number)
- `type` (text)
- `upsell_ids` (list)
- `variations` (list)
- `virtual` (true/false)
- `weight` (text)

**Example output**

```json
{
  "average_rating": "4.80",
  "backorders": "no",
  "catalog_visibility": "visible",
  "categories": [
    {
      "id": 31,
      "name": "Kitchen",
      "slug": "kitchen"
    }
  ],
  "date_created": "2026-08-14T09:12:44",
  "date_created_gmt": "2026-08-14T08:12:44",
  "description": "<p>Stoneware, glazed inside and out.</p>",
  "dimensions": {
    "height": "9",
    "length": "12",
    "width": "9"
  },
  "downloadable": false,
  "featured": false,
  "id": 799,
  "images": [
    {
      "alt": "A stoneware mug",
      "id": 812,
      "name": "mug",
      "src": "https://shop.example.com/wp-content/uploads/mug.jpg"
    }
  ],
  "manage_stock": true,
  "menu_order": 0,
  "meta_data": [],
  "name": "Hand-thrown mug",
  "on_sale": true,
  "permalink": "https://shop.example.com/product/hand-thrown-mug/",
  "price": "24.00",
  "purchasable": true,
  "rating_count": 15,
  "regular_price": "28.00",
  "sale_price": "24.00",
  "short_description": "<p>Stoneware mug, 350ml.</p>",
  "sku": "MUG-350",
  "slug": "hand-thrown-mug",
  "status": "publish",
  "stock_quantity": 18,
  "stock_status": "instock",
  "tags": [],
  "tax_status": "taxable",
  "total_sales": 63,
  "type": "simple",
  "virtual": false,
  "weight": "0.4"
}
```

### Get customer

Read one customer by their ID: name, email, username, role, avatar, billing and shipping addresses, when they registered, and whether they have ever paid for an order.

**Inputs**

- Customer ID (`customer_id`, text, required): The customer's numeric ID. 'List customers' returns it as 'id', and an order carries it as 'customer_id'.

**Outputs**

- `avatar_url` (text)
- `billing` (object)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `email` (text)
- `first_name` (text)
- `id` (number)
- `is_paying_customer` (true/false)
- `last_name` (text)
- `meta_data` (list)
- `role` (text)
- `shipping` (object)
- `username` (text)

**Example output**

```json
{
  "avatar_url": "https://secure.gravatar.com/avatar/0f1e2d",
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "date_created": "2026-05-02T15:31:07",
  "date_created_gmt": "2026-05-02T14:31:07",
  "email": "ada@example.com",
  "first_name": "Ada",
  "id": 214,
  "is_paying_customer": true,
  "last_name": "Lovelace",
  "meta_data": [],
  "role": "customer",
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "username": "ada"
}
```

### Get order

Read one order by its ID: status, currency and every total, the billing and shipping addresses, payment method and transaction ID, the customer note, each line item with its product and quantity, and any shipping, fee, tax, coupon and refund lines.

**Inputs**

- Order ID (`order_id`, text, required): The order's numeric ID. 'List orders' returns it as 'id'.

**Outputs**

- `billing` (object)
- `cart_hash` (text)
- `cart_tax` (text)
- `coupon_lines` (list)
- `created_via` (text)
- `currency` (text)
- `customer_id` (number)
- `customer_ip_address` (text)
- `customer_note` (text)
- `customer_user_agent` (text)
- `date_completed` (text)
- `date_completed_gmt` (text)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_paid` (text)
- `date_paid_gmt` (text)
- `discount_tax` (text)
- `discount_total` (text)
- `fee_lines` (list)
- `id` (number)
- `line_items` (list)
- `meta_data` (list)
- `number` (text)
- `order_key` (text)
- `parent_id` (number)
- `payment_method` (text)
- `payment_method_title` (text)
- `prices_include_tax` (true/false)
- `refunds` (list)
- `shipping` (object)
- `shipping_lines` (list)
- `shipping_tax` (text)
- `shipping_total` (text)
- `status` (text)
- `tax_lines` (list)
- `total` (text)
- `total_tax` (text)
- `transaction_id` (text)
- `version` (text)

**Example output**

```json
{
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "coupon_lines": [],
  "created_via": "rest-api",
  "currency": "USD",
  "customer_id": 214,
  "customer_note": "Please leave with a neighbour.",
  "date_created": "2026-08-30T11:04:02",
  "date_created_gmt": "2026-08-30T10:04:02",
  "discount_total": "0.00",
  "fee_lines": [],
  "id": 5142,
  "line_items": [
    {
      "id": 91,
      "meta_data": [],
      "name": "Hand-thrown mug",
      "price": "24.00",
      "product_id": 799,
      "quantity": 2,
      "sku": "MUG-350",
      "subtotal": "48.00",
      "total": "48.00",
      "variation_id": 0
    }
  ],
  "meta_data": [],
  "number": "5142",
  "order_key": "wc_order_9Kd2mQpLxA1bZ",
  "parent_id": 0,
  "payment_method": "bacs",
  "payment_method_title": "Direct bank transfer",
  "prices_include_tax": false,
  "refunds": [],
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "shipping_lines": [],
  "shipping_total": "4.50",
  "status": "processing",
  "tax_lines": [],
  "total": "52.50",
  "total_tax": "0.00",
  "transaction_id": "",
  "version": "9.8.1"
}
```

### Get product

Read one product by its ID: name, description, SKU, prices and sale window, stock, weight and dimensions, categories, tags, images, attributes, variations and ratings.

**Inputs**

- Product ID (`product_id`, text, required): The product's numeric ID. 'List products' returns it as 'id', and it is the 'post' number in the wp-admin URL when you edit a product.

**Outputs**

- `attributes` (list)
- `average_rating` (text)
- `backordered` (true/false)
- `backorders` (text)
- `backorders_allowed` (true/false)
- `brands` (list)
- `button_text` (text)
- `catalog_visibility` (text)
- `categories` (list)
- `cross_sell_ids` (list)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_on_sale_from` (text)
- `date_on_sale_from_gmt` (text)
- `date_on_sale_to` (text)
- `date_on_sale_to_gmt` (text)
- `default_attributes` (list)
- `description` (text)
- `dimensions` (object)
- `download_expiry` (number)
- `download_limit` (number)
- `downloadable` (true/false)
- `downloads` (list)
- `external_url` (text)
- `featured` (true/false)
- `global_unique_id` (text)
- `grouped_products` (list)
- `id` (number)
- `images` (list)
- `manage_stock` (true/false)
- `menu_order` (number)
- `meta_data` (list)
- `name` (text)
- `on_sale` (true/false)
- `parent_id` (number)
- `permalink` (text)
- `price` (text)
- `price_html` (text)
- `purchasable` (true/false)
- `purchase_note` (text)
- `rating_count` (number)
- `regular_price` (text)
- `related_ids` (list)
- `reviews_allowed` (true/false)
- `sale_price` (text)
- `shipping_class` (text)
- `shipping_class_id` (number)
- `shipping_required` (true/false)
- `shipping_taxable` (true/false)
- `short_description` (text)
- `sku` (text)
- `slug` (text)
- `sold_individually` (true/false)
- `status` (text)
- `stock_quantity` (number)
- `stock_status` (text)
- `tags` (list)
- `tax_class` (text)
- `tax_status` (text)
- `total_sales` (number)
- `type` (text)
- `upsell_ids` (list)
- `variations` (list)
- `virtual` (true/false)
- `weight` (text)

**Example output**

```json
{
  "average_rating": "4.80",
  "backorders": "no",
  "catalog_visibility": "visible",
  "categories": [
    {
      "id": 31,
      "name": "Kitchen",
      "slug": "kitchen"
    }
  ],
  "date_created": "2026-08-14T09:12:44",
  "date_created_gmt": "2026-08-14T08:12:44",
  "description": "<p>Stoneware, glazed inside and out.</p>",
  "dimensions": {
    "height": "9",
    "length": "12",
    "width": "9"
  },
  "downloadable": false,
  "featured": false,
  "id": 799,
  "images": [
    {
      "alt": "A stoneware mug",
      "id": 812,
      "name": "mug",
      "src": "https://shop.example.com/wp-content/uploads/mug.jpg"
    }
  ],
  "manage_stock": true,
  "menu_order": 0,
  "meta_data": [],
  "name": "Hand-thrown mug",
  "on_sale": true,
  "permalink": "https://shop.example.com/product/hand-thrown-mug/",
  "price": "24.00",
  "purchasable": true,
  "rating_count": 15,
  "regular_price": "28.00",
  "sale_price": "24.00",
  "short_description": "<p>Stoneware mug, 350ml.</p>",
  "sku": "MUG-350",
  "slug": "hand-thrown-mug",
  "status": "publish",
  "stock_quantity": 18,
  "stock_status": "instock",
  "tags": [],
  "tax_status": "taxable",
  "total_sales": 63,
  "type": "simple",
  "virtual": false,
  "weight": "0.4"
}
```

### List coupons

Search the store's discount coupons by keyword, exact code or when they were created. Returns each coupon with its code, discount type and amount, expiry date, usage limits and how many times it has been used.

**Inputs**

- Search (`search`, text): Only coupons matching this text.
- Code (`code`, text): Only the coupon with this exact code. WooCommerce stores codes in lower case.
- Created after (`created_after`, date and time): Only coupons created after this moment.
- Created before (`created_before`, date and time): Only coupons created before this moment.
- Sort by (`orderby`, text): What to sort by. Defaults to date created. One of: `date` (Date created), `modified` (Date modified), `id`, `title` (Code), `slug`.
- Sort direction (`order`, text): Which way round to sort. One of: `desc` (Newest/highest first), `asc` (Oldest/lowest first).
- Page (`page`, number): Which page of results to read, starting at 1. Read 'has_more' from the result to know whether to ask for another. At least 1.
- Results per page (`per_page`, number): How many records to return, 1-100. Defaults to 20. From 1 to 100.
- Skip (`offset`, number): Skip this many records before the page begins. At least 0.

**Outputs**

- `count` (number): How many records this page holds.
- `coupons` (list): The coupons on this page
- `has_more` (true/false): Whether another page is worth asking for.
- `page` (number): Which page this is.
- `total` (number): How many records match in total, when the store reports it.
- `total_pages` (number): How many pages there are in total, when the store reports it.

**Example output**

```json
{
  "count": 1,
  "coupons": [
    {
      "amount": "10.00",
      "code": "autumn10",
      "date_created": "2026-09-01T08:00:00",
      "date_created_gmt": "2026-09-01T07:00:00",
      "date_expires": "2026-10-31",
      "description": "10% off everything for the autumn sale.",
      "discount_type": "percent",
      "email_restrictions": [],
      "exclude_sale_items": true,
      "excluded_product_categories": [],
      "excluded_product_ids": [],
      "free_shipping": false,
      "id": 1180,
      "individual_use": false,
      "maximum_amount": "0.00",
      "meta_data": [],
      "minimum_amount": "25.00",
      "product_categories": [],
      "product_ids": [],
      "usage_count": 4,
      "usage_limit": 500,
      "usage_limit_per_user": 1,
      "used_by": []
    }
  ],
  "has_more": false,
  "page": 1,
  "total": 12,
  "total_pages": 1
}
```

### List customers

Search the store's customers by keyword, exact email address or WordPress role. Returns each customer with their name, email, username, billing and shipping addresses, and whether they have ever paid for an order.

**Inputs**

- Search (`search`, text): Only customers matching this text.
- Email (`email`, text): Only the customer with this exact email address.
- Role (`role`, text): Only customers with this WordPress role. WooCommerce returns only the 'customer' role when left blank; pass 'all' to include administrators and shop managers.
- Sort by (`orderby`, text): What to sort by. Defaults to name. One of: `name`, `id`, `registered_date` (Date registered), `include` (Order of the ids given).
- Sort direction (`order`, text): Which way round to sort. One of: `desc` (Newest/highest first), `asc` (Oldest/lowest first).
- Page (`page`, number): Which page of results to read, starting at 1. Read 'has_more' from the result to know whether to ask for another. At least 1.
- Results per page (`per_page`, number): How many records to return, 1-100. Defaults to 20. From 1 to 100.
- Skip (`offset`, number): Skip this many records before the page begins. At least 0.

**Outputs**

- `count` (number): How many records this page holds.
- `customers` (list): The customers on this page
- `has_more` (true/false): Whether another page is worth asking for.
- `page` (number): Which page this is.
- `total` (number): How many records match in total, when the store reports it.
- `total_pages` (number): How many pages there are in total, when the store reports it.

**Example output**

```json
{
  "count": 1,
  "customers": [
    {
      "avatar_url": "https://secure.gravatar.com/avatar/0f1e2d",
      "billing": {
        "address_1": "12 Bridge Street",
        "address_2": "",
        "city": "Cambridge",
        "company": "",
        "country": "GB",
        "email": "ada@example.com",
        "first_name": "Ada",
        "last_name": "Lovelace",
        "phone": "+44 1223 000000",
        "postcode": "CB2 1UJ",
        "state": "CAM"
      },
      "date_created": "2026-05-02T15:31:07",
      "date_created_gmt": "2026-05-02T14:31:07",
      "email": "ada@example.com",
      "first_name": "Ada",
      "id": 214,
      "is_paying_customer": true,
      "last_name": "Lovelace",
      "meta_data": [],
      "role": "customer",
      "shipping": {
        "address_1": "12 Bridge Street",
        "address_2": "",
        "city": "Cambridge",
        "company": "",
        "country": "GB",
        "first_name": "Ada",
        "last_name": "Lovelace",
        "postcode": "CB2 1UJ",
        "state": "CAM"
      },
      "username": "ada"
    }
  ],
  "has_more": false,
  "page": 1,
  "total": 57,
  "total_pages": 1
}
```

### List orders

Search the store's orders. Filter by keyword, one or several statuses, customer, product ordered, and when the order was placed. Returns each order with its number, status, totals, currency, billing and shipping addresses, payment method and line items. Newest first.

**Inputs**

- Search (`search`, text): Only orders matching this text.
- Statuses (`status`, list): Only orders with any of these statuses. All statuses when left blank. One or more of: `any` (Any status), `pending` (Pending payment), `processing`, `on-hold` (On hold), `completed`, `cancelled`, `refunded`, `failed`, `trash` (Trashed).
- Customer ID (`customer_id`, text): Only orders belonging to this customer. Guest orders have no customer, so this never matches one.
- Product ID (`product_id`, text): Only orders containing this product.
- Created after (`created_after`, date and time): Only orders created after this moment.
- Created before (`created_before`, date and time): Only orders created before this moment.
- Sort by (`orderby`, text): What to sort by. Defaults to date created. One of: `date` (Date created), `modified` (Date modified), `id`, `title`, `slug`.
- Sort direction (`order`, text): Which way round to sort. One of: `desc` (Newest/highest first), `asc` (Oldest/lowest first).
- Page (`page`, number): Which page of results to read, starting at 1. Read 'has_more' from the result to know whether to ask for another. At least 1.
- Results per page (`per_page`, number): How many records to return, 1-100. Defaults to 20. From 1 to 100.
- Skip (`offset`, number): Skip this many records before the page begins. At least 0.

**Outputs**

- `count` (number): How many records this page holds.
- `has_more` (true/false): Whether another page is worth asking for.
- `orders` (list): The orders on this page
- `page` (number): Which page this is.
- `total` (number): How many records match in total, when the store reports it.
- `total_pages` (number): How many pages there are in total, when the store reports it.

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "orders": [
    {
      "billing": {
        "address_1": "12 Bridge Street",
        "address_2": "",
        "city": "Cambridge",
        "company": "",
        "country": "GB",
        "email": "ada@example.com",
        "first_name": "Ada",
        "last_name": "Lovelace",
        "phone": "+44 1223 000000",
        "postcode": "CB2 1UJ",
        "state": "CAM"
      },
      "coupon_lines": [],
      "created_via": "rest-api",
      "currency": "USD",
      "customer_id": 214,
      "customer_note": "Please leave with a neighbour.",
      "date_created": "2026-08-30T11:04:02",
      "date_created_gmt": "2026-08-30T10:04:02",
      "discount_total": "0.00",
      "fee_lines": [],
      "id": 5142,
      "line_items": [
        {
          "id": 91,
          "meta_data": [],
          "name": "Hand-thrown mug",
          "price": "24.00",
          "product_id": 799,
          "quantity": 2,
          "sku": "MUG-350",
          "subtotal": "48.00",
          "total": "48.00",
          "variation_id": 0
        }
      ],
      "meta_data": [],
      "number": "5142",
      "order_key": "wc_order_9Kd2mQpLxA1bZ",
      "parent_id": 0,
      "payment_method": "bacs",
      "payment_method_title": "Direct bank transfer",
      "prices_include_tax": false,
      "refunds": [],
      "shipping": {
        "address_1": "12 Bridge Street",
        "address_2": "",
        "city": "Cambridge",
        "company": "",
        "country": "GB",
        "first_name": "Ada",
        "last_name": "Lovelace",
        "postcode": "CB2 1UJ",
        "state": "CAM"
      },
      "shipping_lines": [],
      "shipping_total": "4.50",
      "status": "processing",
      "tax_lines": [],
      "total": "52.50",
      "total_tax": "0.00",
      "transaction_id": "",
      "version": "9.8.1"
    }
  ],
  "page": 1,
  "total": 340,
  "total_pages": 1
}
```

### List product categories

The categories the catalogue is filed under, each with its ID, name, slug, parent, description and how many products it holds. Use it to turn a category name into the numeric ID the product actions file a product under.

**Inputs**

- Search (`search`, text): Only categories matching this text.
- Parent category (`parent_id`, text): Only categories directly under this one.
- Product ID (`product_id`, text): Only the categories this product is filed under.
- Slug (`slug`, text): Only the category with this exact slug.
- Hide empty categories (`hide_empty`, true/false): Leave out categories that hold no products.
- Sort by (`orderby`, text): What to sort by. Defaults to name. One of: `name`, `id`, `slug`, `description`, `count` (Product count), `term_group` (Term group), `include` (Order of the ids given).
- Sort direction (`order`, text): Which way round to sort. One of: `desc` (Newest/highest first), `asc` (Oldest/lowest first).
- Page (`page`, number): Which page of results to read, starting at 1. Read 'has_more' from the result to know whether to ask for another. At least 1.
- Results per page (`per_page`, number): How many records to return, 1-100. Defaults to 20. From 1 to 100.
- Skip (`offset`, number): Skip this many records before the page begins. At least 0.

**Outputs**

- `categories` (list): The product categories on this page
- `count` (number): How many records this page holds.
- `has_more` (true/false): Whether another page is worth asking for.
- `page` (number): Which page this is.
- `total` (number): How many records match in total, when the store reports it.
- `total_pages` (number): How many pages there are in total, when the store reports it.

**Example output**

```json
{
  "categories": [
    {
      "count": 42,
      "description": "Everything for the kitchen table.",
      "display": "default",
      "id": 31,
      "image": null,
      "menu_order": 0,
      "name": "Kitchen",
      "parent": 0,
      "slug": "kitchen"
    }
  ],
  "count": 1,
  "has_more": false,
  "page": 1,
  "total": 9,
  "total_pages": 1
}
```

### List products

Search the store's catalogue. Filter by keyword, status, type, SKU, category, price range, stock status, whether a product is featured or on sale, and when it was created. Returns each product with its name, SKU, prices, stock, categories, images and ratings. With no filters at all this is the whole catalogue, newest first.

**Inputs**

- Search (`search`, text): Only products matching this text.
- Status (`status`, text): Only products with this status. One of: `publish` (Published), `draft`, `pending` (Pending review), `private`.
- Type (`product_type`, text): Only products of this type. One of: `simple`, `grouped`, `external` (External/Affiliate), `variable`.
- SKU (`sku`, text): Only the product with this exact SKU.
- Category (`category_id`, text): Only products in this category.
- Featured only (`featured`, true/false): Only products marked as featured.
- On sale only (`on_sale`, true/false): Only products currently on sale.
- Stock status (`stock_status`, text): Only products with this stock status. One of: `instock` (In stock), `outofstock` (Out of stock), `onbackorder` (On backorder).
- Minimum price (`min_price`, text): Only products at or above this price, as a plain number in the store's own currency.
- Maximum price (`max_price`, text): Only products at or below this price, as a plain number in the store's own currency.
- Created after (`created_after`, date and time): Only products created after this moment.
- Created before (`created_before`, date and time): Only products created before this moment.
- Sort by (`orderby`, text): What to sort by. Defaults to date created. One of: `date` (Date created), `modified` (Date modified), `id`, `title` (Name), `slug`, `price`, `popularity`, `rating`, `menu_order` (Menu order).
- Sort direction (`order`, text): Which way round to sort. One of: `desc` (Newest/highest first), `asc` (Oldest/lowest first).
- Page (`page`, number): Which page of results to read, starting at 1. Read 'has_more' from the result to know whether to ask for another. At least 1.
- Results per page (`per_page`, number): How many records to return, 1-100. Defaults to 20. From 1 to 100.
- Skip (`offset`, number): Skip this many records before the page begins. At least 0.

**Outputs**

- `count` (number): How many records this page holds.
- `has_more` (true/false): Whether another page is worth asking for.
- `page` (number): Which page this is.
- `products` (list): The products on this page
- `total` (number): How many records match in total, when the store reports it.
- `total_pages` (number): How many pages there are in total, when the store reports it.

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "page": 1,
  "products": [
    {
      "average_rating": "4.80",
      "backorders": "no",
      "catalog_visibility": "visible",
      "categories": [
        {
          "id": 31,
          "name": "Kitchen",
          "slug": "kitchen"
        }
      ],
      "date_created": "2026-08-14T09:12:44",
      "date_created_gmt": "2026-08-14T08:12:44",
      "description": "<p>Stoneware, glazed inside and out.</p>",
      "dimensions": {
        "height": "9",
        "length": "12",
        "width": "9"
      },
      "downloadable": false,
      "featured": false,
      "id": 799,
      "images": [
        {
          "alt": "A stoneware mug",
          "id": 812,
          "name": "mug",
          "src": "https://shop.example.com/wp-content/uploads/mug.jpg"
        }
      ],
      "manage_stock": true,
      "menu_order": 0,
      "meta_data": [],
      "name": "Hand-thrown mug",
      "on_sale": true,
      "permalink": "https://shop.example.com/product/hand-thrown-mug/",
      "price": "24.00",
      "purchasable": true,
      "rating_count": 15,
      "regular_price": "28.00",
      "sale_price": "24.00",
      "short_description": "<p>Stoneware mug, 350ml.</p>",
      "sku": "MUG-350",
      "slug": "hand-thrown-mug",
      "status": "publish",
      "stock_quantity": 18,
      "stock_status": "instock",
      "tags": [],
      "tax_status": "taxable",
      "total_sales": 63,
      "type": "simple",
      "virtual": false,
      "weight": "0.4"
    }
  ],
  "total": 128,
  "total_pages": 1
}
```

### Update customer

Change a customer's name, email, password or saved addresses. Only the fields you fill in are sent, so everything you leave blank keeps its current value. The username cannot be changed - WordPress fixes it when the account is created.

**Inputs**

- Customer ID (`customer_id`, text, required): The customer's numeric ID.
- Email (`email`, text): A new email address for the account.
- First name (`first_name`, text): The customer's first name.
- Last name (`last_name`, text): The customer's last name.
- Password (`password`, text): Set a new password for the account.
- Billing first name (`billing_first_name`, text): First name on the billing address.
- Billing last name (`billing_last_name`, text): Last name on the billing address.
- Billing company (`billing_company`, text): Company name on the billing address.
- Billing address line 1 (`billing_address_1`, text): Street address on the billing address.
- Billing address line 2 (`billing_address_2`, text): Apartment, suite or unit on the billing address.
- Billing city (`billing_city`, text): City on the billing address.
- Billing state (`billing_state`, text): State, province or district on the billing address, as its ISO code or its name - 'CA' or 'California'.
- Billing postcode (`billing_postcode`, text): Postal or ZIP code on the billing address.
- Billing country (`billing_country`, text): Country on the billing address, as a two-letter ISO 3166-1 code such as US, GB or DE.
- Billing email (`billing_email`, text): Email address on the billing address.
- Billing phone (`billing_phone`, text): Phone number on the billing address.
- Shipping address (`shipping_address`, object): The delivery address, as an object with any of 'first_name', 'last_name', 'company', 'address_1', 'address_2', 'city', 'state', 'postcode' and 'country'. There is no email or phone on a shipping address - those belong to billing.

**Outputs**

- `avatar_url` (text)
- `billing` (object)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `email` (text)
- `first_name` (text)
- `id` (number)
- `is_paying_customer` (true/false)
- `last_name` (text)
- `meta_data` (list)
- `role` (text)
- `shipping` (object)
- `username` (text)

**Example output**

```json
{
  "avatar_url": "https://secure.gravatar.com/avatar/0f1e2d",
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "date_created": "2026-05-02T15:31:07",
  "date_created_gmt": "2026-05-02T14:31:07",
  "email": "ada@example.com",
  "first_name": "Ada",
  "id": 214,
  "is_paying_customer": true,
  "last_name": "Lovelace",
  "meta_data": [],
  "role": "customer",
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "username": "ada"
}
```

### Update order

Change an order - most often to move it to its next status, such as marking a processing order completed. Only the fields you fill in are sent, so everything you leave blank keeps its current value.

**Inputs**

- Order ID (`order_id`, text, required): The order's numeric ID.
- Status (`status`, text): The status to move the order to. Changing this is what sends WooCommerce's own customer emails. One of: `pending` (Pending payment), `processing`, `on-hold` (On hold), `completed`, `cancelled`, `refunded`, `failed`.
- Customer ID (`customer_id`, text): Reassign the order to this customer.
- Customer note (`customer_note`, text): Replace the note left by the buyer.
- Payment method ID (`payment_method`, text): The payment gateway's ID, such as 'bacs'.
- Payment method name (`payment_method_title`, text): How the payment method is described.
- Transaction ID (`transaction_id`, text): The payment processor's reference for this order.
- Mark as paid (`set_paid`, true/false): Record the order as paid, moving it to 'processing' and taking the items out of stock.
- Billing first name (`billing_first_name`, text): First name on the billing address.
- Billing last name (`billing_last_name`, text): Last name on the billing address.
- Billing company (`billing_company`, text): Company name on the billing address.
- Billing address line 1 (`billing_address_1`, text): Street address on the billing address.
- Billing address line 2 (`billing_address_2`, text): Apartment, suite or unit on the billing address.
- Billing city (`billing_city`, text): City on the billing address.
- Billing state (`billing_state`, text): State, province or district on the billing address, as its ISO code or its name - 'CA' or 'California'.
- Billing postcode (`billing_postcode`, text): Postal or ZIP code on the billing address.
- Billing country (`billing_country`, text): Country on the billing address, as a two-letter ISO 3166-1 code such as US, GB or DE.
- Billing email (`billing_email`, text): Email address on the billing address.
- Billing phone (`billing_phone`, text): Phone number on the billing address.
- Shipping address (`shipping_address`, object): The delivery address, as an object with any of 'first_name', 'last_name', 'company', 'address_1', 'address_2', 'city', 'state', 'postcode' and 'country'. There is no email or phone on a shipping address - those belong to billing.

**Outputs**

- `billing` (object)
- `cart_hash` (text)
- `cart_tax` (text)
- `coupon_lines` (list)
- `created_via` (text)
- `currency` (text)
- `customer_id` (number)
- `customer_ip_address` (text)
- `customer_note` (text)
- `customer_user_agent` (text)
- `date_completed` (text)
- `date_completed_gmt` (text)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_paid` (text)
- `date_paid_gmt` (text)
- `discount_tax` (text)
- `discount_total` (text)
- `fee_lines` (list)
- `id` (number)
- `line_items` (list)
- `meta_data` (list)
- `number` (text)
- `order_key` (text)
- `parent_id` (number)
- `payment_method` (text)
- `payment_method_title` (text)
- `prices_include_tax` (true/false)
- `refunds` (list)
- `shipping` (object)
- `shipping_lines` (list)
- `shipping_tax` (text)
- `shipping_total` (text)
- `status` (text)
- `tax_lines` (list)
- `total` (text)
- `total_tax` (text)
- `transaction_id` (text)
- `version` (text)

**Example output**

```json
{
  "billing": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "phone": "+44 1223 000000",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "coupon_lines": [],
  "created_via": "rest-api",
  "currency": "USD",
  "customer_id": 214,
  "customer_note": "Please leave with a neighbour.",
  "date_created": "2026-08-30T11:04:02",
  "date_created_gmt": "2026-08-30T10:04:02",
  "discount_total": "0.00",
  "fee_lines": [],
  "id": 5142,
  "line_items": [
    {
      "id": 91,
      "meta_data": [],
      "name": "Hand-thrown mug",
      "price": "24.00",
      "product_id": 799,
      "quantity": 2,
      "sku": "MUG-350",
      "subtotal": "48.00",
      "total": "48.00",
      "variation_id": 0
    }
  ],
  "meta_data": [],
  "number": "5142",
  "order_key": "wc_order_9Kd2mQpLxA1bZ",
  "parent_id": 0,
  "payment_method": "bacs",
  "payment_method_title": "Direct bank transfer",
  "prices_include_tax": false,
  "refunds": [],
  "shipping": {
    "address_1": "12 Bridge Street",
    "address_2": "",
    "city": "Cambridge",
    "company": "",
    "country": "GB",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "postcode": "CB2 1UJ",
    "state": "CAM"
  },
  "shipping_lines": [],
  "shipping_total": "4.50",
  "status": "processing",
  "tax_lines": [],
  "total": "52.50",
  "total_tax": "0.00",
  "transaction_id": "",
  "version": "9.8.1"
}
```

### Update product

Change an existing product. Only the fields you fill in are sent, so everything you leave blank keeps its current value - which makes this safe for changing one thing, such as a price or a stock level, without restating the rest of the product.

**Inputs**

- Product ID (`product_id`, text, required): The product's numeric ID. 'List products' returns it as 'id', and it is the 'post' number in the wp-admin URL when you edit a product.
- Name (`name`, text): The product's name, as shoppers see it.
- Type (`product_type`, text): What kind of product this is. 'Simple' is a single item with one price. 'Variable' and 'Grouped' need variations or child products set up in wp-admin before they can be bought. One of: `simple`, `grouped`, `external` (External/Affiliate), `variable`.
- Status (`status`, text): Whether the product is live in the shop. New products are published unless you choose otherwise. One of: `publish` (Published), `draft`, `pending` (Pending review), `private`.
- Description (`description`, text): The full product description. HTML is allowed.
- Short description (`short_description`, text): The summary shown beside the price. HTML is allowed.
- SKU (`sku`, text): Your own stock-keeping code. WooCommerce refuses a duplicate, so it has to be unique across the store.
- Regular price (`regular_price`, text): The normal price, as a plain number in the store's own currency - 19.99, not $19.99.
- Sale price (`sale_price`, text): The discounted price. Takes effect immediately unless a sale window is set below.
- Sale starts (`sale_starts_at`, date and time): When the sale price begins. Leave blank to start now.
- Sale ends (`sale_ends_at`, date and time): When the sale price stops. Leave blank to keep it until the sale price is removed.
- Categories (`category_ids`, list): Which categories to file the product under. Pick from the store's categories, or type a category ID.
- Image URLs (`image_urls`, list): Publicly reachable image URLs. WooCommerce downloads each one into the store's media library; the first becomes the main product image.
- Featured (`featured`, true/false): Mark the product as featured.
- Catalog visibility (`catalog_visibility`, text): Where in the store the product can be found. One of: `visible` (Shop and search results), `catalog` (Shop only), `search` (Search results only), `hidden`.
- Virtual (`virtual`, true/false): Turn on for something that is not shipped, such as a service or a booking.
- Track stock (`manage_stock`, true/false): Let WooCommerce count this product's stock. The stock quantity and backorder settings below only apply when this is on.
- Stock quantity (`stock_quantity`, number): How many are in stock. Needs stock tracking to be on. At least 0.
- Stock status (`stock_status`, text): Whether the product can be bought. Set directly when stock is not tracked; WooCommerce works it out from the quantity when it is. One of: `instock` (In stock), `outofstock` (Out of stock), `onbackorder` (On backorder).
- Backorders (`backorders`, text): Whether the product can be bought once stock runs out. Needs stock tracking to be on. One of: `no` (Do not allow), `notify` (Allow, but notify customer), `yes` (Allow).
- Weight (`weight`, text): The product's weight, as a plain number in the store's own weight unit.
- Tax status (`tax_status`, text): What part of this product's price is taxed. One of: `taxable`, `shipping` (Shipping only), `none`.
- Menu order (`menu_order`, number): A custom sort position in the shop. Lower comes first.

**Outputs**

- `attributes` (list)
- `average_rating` (text)
- `backordered` (true/false)
- `backorders` (text)
- `backorders_allowed` (true/false)
- `brands` (list)
- `button_text` (text)
- `catalog_visibility` (text)
- `categories` (list)
- `cross_sell_ids` (list)
- `date_created` (text)
- `date_created_gmt` (text)
- `date_modified` (text)
- `date_modified_gmt` (text)
- `date_on_sale_from` (text)
- `date_on_sale_from_gmt` (text)
- `date_on_sale_to` (text)
- `date_on_sale_to_gmt` (text)
- `default_attributes` (list)
- `description` (text)
- `dimensions` (object)
- `download_expiry` (number)
- `download_limit` (number)
- `downloadable` (true/false)
- `downloads` (list)
- `external_url` (text)
- `featured` (true/false)
- `global_unique_id` (text)
- `grouped_products` (list)
- `id` (number)
- `images` (list)
- `manage_stock` (true/false)
- `menu_order` (number)
- `meta_data` (list)
- `name` (text)
- `on_sale` (true/false)
- `parent_id` (number)
- `permalink` (text)
- `price` (text)
- `price_html` (text)
- `purchasable` (true/false)
- `purchase_note` (text)
- `rating_count` (number)
- `regular_price` (text)
- `related_ids` (list)
- `reviews_allowed` (true/false)
- `sale_price` (text)
- `shipping_class` (text)
- `shipping_class_id` (number)
- `shipping_required` (true/false)
- `shipping_taxable` (true/false)
- `short_description` (text)
- `sku` (text)
- `slug` (text)
- `sold_individually` (true/false)
- `status` (text)
- `stock_quantity` (number)
- `stock_status` (text)
- `tags` (list)
- `tax_class` (text)
- `tax_status` (text)
- `total_sales` (number)
- `type` (text)
- `upsell_ids` (list)
- `variations` (list)
- `virtual` (true/false)
- `weight` (text)

**Example output**

```json
{
  "average_rating": "4.80",
  "backorders": "no",
  "catalog_visibility": "visible",
  "categories": [
    {
      "id": 31,
      "name": "Kitchen",
      "slug": "kitchen"
    }
  ],
  "date_created": "2026-08-14T09:12:44",
  "date_created_gmt": "2026-08-14T08:12:44",
  "description": "<p>Stoneware, glazed inside and out.</p>",
  "dimensions": {
    "height": "9",
    "length": "12",
    "width": "9"
  },
  "downloadable": false,
  "featured": false,
  "id": 799,
  "images": [
    {
      "alt": "A stoneware mug",
      "id": 812,
      "name": "mug",
      "src": "https://shop.example.com/wp-content/uploads/mug.jpg"
    }
  ],
  "manage_stock": true,
  "menu_order": 0,
  "meta_data": [],
  "name": "Hand-thrown mug",
  "on_sale": true,
  "permalink": "https://shop.example.com/product/hand-thrown-mug/",
  "price": "24.00",
  "purchasable": true,
  "rating_count": 15,
  "regular_price": "28.00",
  "sale_price": "24.00",
  "short_description": "<p>Stoneware mug, 350ml.</p>",
  "sku": "MUG-350",
  "slug": "hand-thrown-mug",
  "status": "publish",
  "stock_quantity": 18,
  "stock_status": "instock",
  "tags": [],
  "tax_status": "taxable",
  "total_sales": 63,
  "type": "simple",
  "virtual": false,
  "weight": "0.4"
}
```
