Wahio Developers
Products
PATCH
/v1/products/{id}

Partially update a product in the account associated with your API key. Send at least one non-null supported field: name, description, sku, code, base_price, price, measurement, category_id, custom_category_id, control_inventory, available_online or status. Status accepts only active (reactivate) or disabled (deactivate), exactly lowercase; deletion states and other values are rejected. This changes the product status without deleting it or reversing stock. Omitted/null fields keep their stored values; zero and false are explicit changes. Empty text clears description, SKU, code or measurement; name and category IDs cannot be empty. Account and product ID cannot be changed in the body. Relations, inventory, calculated costs and metrics are not editable through this endpoint. Products loads the stored aggregate and reuses its validations, recalculations and product.updated publication. Changing base_price applies existing cost rules; this does not record a purchase. Updates become visible in search asynchronously.

Path Parameters

id*string

Product ID

Header Parameters

X-Api-Key*string

Your API Key for authentication

Request Body

application/json

Explicit scalar changes in snake_case; at least one non-null field is required. Example: {"status":"disabled"}

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X PATCH "https://example.com/v1/products/string" \  -H "X-Api-Key: string" \  -H "Content-Type: application/json" \  -d '{}'
{  "id": "string",  "account_id": "string",  "name": "string",  "description": "string",  "characteristics": "string",  "sku": "string",  "code": "string",  "reference": "string",  "slug": "string",  "base_price": 0,  "price": 0,  "price_2": 0,  "price_3": 0,  "price_4": 0,  "price_5": 0,  "price_6": 0,  "price_7": 0,  "price_8": 0,  "price_9": 0,  "price_10": 0,  "cost_weighted_average": 0,  "cost_base_weighted_average": 0,  "cost_average": 0,  "cost_base_average": 0,  "cost_last_purchase": 0,  "cost_base_last_purchase": 0,  "last_purchase_date": "2019-08-24T14:15:22Z",  "cost_updated_at": "2019-08-24T14:15:22Z",  "purchase_count": 0,  "purchase_quantity": 0,  "item_width": 0,  "item_length": 0,  "item_height": 0,  "item_weight": 0,  "measurement": "string",  "category_id": "string",  "custom_category_id": "string",  "custom_category": {    "id": "string",    "name": "string",    "sort_index": 0,    "created_at": "2019-08-24T14:15:22Z",    "category_parent_id": "string",    "account_id": "string",    "image": "string"  },  "reference_category": "string",  "status": "string",  "internal_status": "string",  "type": "string",  "ecommerce_status": "string",  "control_inventory": true,  "available_online": true,  "hide_in_catalog": true,  "fast_shipping": true,  "is_raw_material": true,  "variants": [    {      "id": "string",      "code": "string",      "sku": "string",      "base_price": 0,      "price": 0,      "price_2": 0,      "price_3": 0,      "price_4": 0,      "price_5": 0,      "price_6": 0,      "price_7": 0,      "price_8": 0,      "price_9": 0,      "price_10": 0,      "options": [        {          "name": "string",          "value": "string"        }      ]    }  ],  "includes_variants": true,  "includes_serials": true,  "includes_optionals": true,  "includes_features": true,  "hide_childs_in_ecommerce": true,  "variant_image_for_option": "string",  "variants_in_groups": "string",  "variant_options_line": "string",  "profile_picture": "string",  "images": [    {}  ],  "files": [    {}  ],  "custom_fields": {    "property1": "string",    "property2": "string"  },  "search_engine_title": "string",  "search_engine_description": "string",  "total_sale_total_price_sum": 0,  "total_sale_price_sum": 0,  "total_sale_count": 0,  "total_sale_stock_sum": 0,  "sale_weighted_average": 0,  "sale_average_cost": 0,  "last_sale_price": 0,  "last_sale_date": "2019-08-24T14:15:22Z",  "accumulated_sales": 0,  "review_rating": 0,  "review_count": 0,  "supplier_id": "string",  "supplier_estimated_delivery_time": 0,  "is_parent": true,  "has_taxes": true,  "has_discounts": true,  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z",  "created_by": "string",  "updated_by": "string"}

Get Product By Id GET

**Get a product by ID.**

Search products POST

Search products in the account associated with your API key. Supports text search, inventory and price filters, variant attributes, catalogs, collections, sorting and facet counts. Requires `products:read`. The request and response use **camelCase**. ### Parameters All parameters are optional. Send `{}` to list active products across the account's warehouses. Do not send `accountId`: the account comes from the authenticated key. | Parameter | Meaning and default | | --- | --- | | `query` | Text search; default `"*"` matches all. Searches name, SKU, description, indexed content and locations. This is not an exact barcode lookup. | | `warehouseId` | Restrict to one warehouse. Omit to search all warehouses in the account. | | `productCategoryName` | Exact category name, for example `"Clothing"`. | | `measurement` | Exact measurement value. | | `productId` | Restrict to a product ID. Without an explicit status or catalog, this lookup does not apply the default active-only filter. | | `productStatus` | Normally defaults to `"Active"`. Indexed product statuses are `"Active"` and `"Inactive"` (case-sensitive). Catalog and collection searches only accept active products. | | `salesCatalogId` | Active sales catalog belonging to this account; independent of warehouse. | | `collectionId` | Product collection belonging to this account. Can combine with a catalog. | | `filter` | Additional OData conditions; examples below. Field names inside this string are **PascalCase** and case-sensitive. | | `orderBy` | Sort field and direction, for example `"ProductName asc"`, `"Available desc"`, `"Price1 asc"` or `"UpdatedAt desc"`. Omit for search relevance. | | `facets` | Fields whose matching value counts you want, for example `["ProductCategoryName,count:50", "VariantAttributeValues"]`. Counts do not add filters automatically. | | `pageNumber` | Page starting at 1; default 1. | | `pageSize` | Results per page, 1–100; default 20. | ### Filters Use numeric comparisons `eq`, `ne`, `gt`, `ge`, `lt`, `le`; combine conditions with `and`, `or`, `not` and parentheses. Strings use single quotes; escape a quote by doubling it, for example `'Men''s clothing'`. Use the dedicated parameters for account, warehouse, status and product restrictions. | Need | Example `filter` | | --- | --- | | Available inventory | `Available gt 0` | | Out of stock | `Available le 0` | | Minimum physical stock | `Stock ge 10` | | Price list range | `Price1 ge 5000 and Price1 le 50000` | | Base price range | `PriceBase ge 5000 and PriceBase le 50000` | | Category ID | `ProductCategoryId eq 'category-id'` | | Products with variants | `HasVariants eq true` | | Missing images | `HasImage eq false` | | Raw materials | `IsRawMaterial eq true` | | Serial or optional tracking | `IncludesSerials eq true and IncludesOptionals eq false` | | Variant attribute | `VariantAttributeValues/any(v: v eq 'Color:Rojo')` | | Feature | `FeatureKeys/any(f: f eq 'Material:Algodón')` | | Custom field | `CustomFieldKeys/any(f: f eq 'proveedor:sony')` | | With discounts | `DiscountKeys/any()` | | Changed since a date | `UpdatedAt ge 2026-10-01T00:00:00Z` | Collection filters match products. A variant-attribute filter selects matching products; it does not trim the returned variants to that attribute. Catalog and collection memberships do restrict the returned variants. Stock and price filters apply to the indexed document, not to an individual matching variant. ### Examples Search available products with a price range and category counts: ```json { "query": "shirt", "warehouseId": "warehouse-id", "filter": "Available gt 0 and Price1 ge 5000 and Price1 le 50000", "orderBy": "ProductName asc", "facets": ["ProductCategoryName,count:50", "VariantAttributeValues"], "pageNumber": 1, "pageSize": 20 } ``` Discover variant values and features: ```json { "query": "*", "filter": "HasVariants eq true", "facets": ["VariantAttributeValues,count:100", "FeatureKeys,count:50"] } ``` Restrict a catalog to a collection and warehouse: ```json { "salesCatalogId": "catalog-id", "collectionId": "collection-id", "warehouseId": "warehouse-id", "orderBy": "ProductName asc" } ``` ### Facets and catalogs Useful facets include `ProductCategoryName`, `WarehouseId`, `Measurement`, `VariantAttributeNames`, `VariantAttributeValues`, `FeatureKeys`, `CustomFieldKeys` and `DiscountKeys`. Request `count:N` to control the number of returned values. Apply a selection by issuing another request with a `filter`, such as `ProductCategoryName eq 'Clothing'`. With `salesCatalogId` or `collectionId`, allowed facets are `ProductCategoryName`, `WarehouseId`, `Measurement`, `VariantAttributeValues`, `FeatureKeys`, `CustomFieldKeys` and `References`. Allowed sort fields are `ProductName`, `PriceBase`, `Price1`–`Price10`, `TotalSales`, `Available`, `Stock` and `Weight`. An unavailable catalog or collection returns an empty page. Facet counts and filtering use the indexed document's full variant aggregates, even when membership limits returned variants. ### Reading results The response contains `results`, `totalCount`, `pageNumber`, `pageSize`, `totalPages` and `facets`. Each result is a **product/warehouse document**. Without `warehouseId`, the same product can appear in multiple warehouses. Use `productId` for product operations; `id` identifies the search document. Results include `stock`, `reserved`, `available`, `prices` (`base`, `price1`–`price10`), `variants`, taxes and discounts. Variants include `productVariantId`, their stock, attributes and `variantPrices`. Facet keys preserve Search field names such as `ProductCategoryName`. ### Synchronization New products and inventory changes are indexed asynchronously and may take a short interval to appear. There is no guaranteed one-second maximum. An empty result does not prove a product was not created; use GET by product ID to check a recent write. Full index rebuilds can temporarily return partial or empty results.