Integration with «1C», «ERP», CRM systems and CommerceAPI
Automatic order export / Sending POST order data in JSON format
You can enable automatic order export in the site settings, in the «Shop» tab, by specifying the path for data submission.A POST request will be sent to the specified address with all order data, including customer contact information and the list of products. Contact details and order information will be transmitted in JSON format via POST request.
For example, in 1C you can implement order reception via «HTTP Service»->«SiteExchange» -> «POSTData»
If after sending the request your service returns JSON data containing «Number» or «crm_order_id», an external order number will be added to the order.
Automatic sales statistics export / Sending POST order data in JSON format
You can enable automatic sales statistics export in the site settings, in the «Shop» tab, by specifying the path for data submission.A POST request will be sent to the specified address with all order data that changes in Sales Statistics. Information will be transmitted via POST request in JSON format.
For example, in 1C you can implement order reception via «HTTP Service»->«SiteExchange» -> «POSTData»
You can also enable external access to your statistics by specifying a «Sales statistics access key».
Access to sales statistics / JSON
Specify the sales statistics access key in the settings, in the «Shop» tab. If you need to access sales statistics from an external application, you can make a (POST/GET or AJAX) request to «
/ajax.php?statistic_sell» You must specify the key in the request, with MD5 encryption. For example, if your key is «123», in the request it will be «
202cb962ac59075b964b07152d234b70».In this case the request will look like: «
/ajax.php?statistic_sell&key=202cb962ac59075b964b07152d234b70»
In the request you can specify sorting or search data (GET/POST parameters), which can be taken from your sales statistics page in the admin center (
/page.php?p=statistic_sell&mystat). Sorting and parameter selection is done via GET/POST request, for example, «&sort_dateperiod=1week» means that sales statistics for the week will be displayed. Data is displayed in JSON format.
Please note that if you use visitor-accessible page requests, they will be able to access your sales statistics using your key.
Access to store price list / Full CSV price list export
Specify the store price list access key in the settings, in the «Shop» tab. The full price list export is available at «/csv_export_products.csv»
You must specify the key in the request, with MD5 encryption. For example, if your key is «123», in the request it will be «
202cb962ac59075b964b07152d234b70».In this case the request will look like: «
/csv_export_products.csv?key=202cb962ac59075b964b07152d234b70»
In the request you can specify sorting data and field selection, which can be taken from your export page in the admin center (/page.php?p=submit_catalog_page&subpage&export_from_shop). Sorting and parameter selection is done via GET/POST request, for example, «
&export_product_access=export_product_access» means that the field with product access data will be exported. Data is displayed in CSV format.
The export file is cached to reduce load and is updated once a day. You can delete the cache using the «Clear XML/CSV export cache» button.
Example: https://templatedemo437544.boostore.pro/csv_export_products.csv?key=202cb962ac59075b964b07152d234b70
Additionally, a data exchange mechanism via API, similar to WooCommerce API, is implemented. The API allows you to receive and update information about orders, products, and categories. Instructions and settings are in the «Shop» section - «JSON Commerce API Data Exchange».
Commerce API (Products/Categories/Sales Statistics)
Commerce API — Quick Manual on Methods
Access Key
To work with the API, you need an access key (Consumer Secret), which you create in the section "Settings", "Shop", "Sales Statistics Access". The key is generated based on the Sales Statistics Access Key.
Access Key Types
Depending on the key type, the API provides different access levels:
| Key | Description | Access |
|---|---|---|
| 1 | Full access | Read and write all resources |
| 2 | Read all data | Read-only all resources |
| 3 | Read products | Read-only products, categories, producers and collections |
| 4 | Products management | Read all data + write products, categories, producers and collections |
| 5 | Read orders | Read-only orders and sales statistics |
| 6 | Orders management | Read all data + write orders and sales statistics |
| 7 | Blog articles management | Read all data + write blog articles |
| 8 | Pages management | Read all data + write pages |
| 9 | Blocks/Menus management | Read all data + write blocks/menus |
| 10 | Comments and Reviews management | Read all data + write comments and reviews (products, pages, articles, categories) |
The key is generated based on your Sales Statistics Access Key with the corresponding suffix. Create a sales statistics access key in the store settings, and the system will automatically generate all key variants.
API Methods (HTTP)
All requests go to the base URL of your site, for example: https://site.com/api/commerce/
1. Sales Statistics
| Method | URL | Description |
|---|---|---|
| GET | /orders | Get order statistics |
| GET | /orders/{id} | Get statistics of a single order by ID |
| GET | /crm_orders/{id} | Get statistics of a single order by external CRM ID |
| DELETE | /orders/{id} | Delete order by ID |
| DELETE | /crm_orders/{id} | Delete order by external CRM ID |
| POST | /orders | Add a new order |
| UPDATE | /orders/{id} | Update order by ID (PATCH/PUT/UPDATE) |
| UPDATE | /crm_orders/{id} | Update order by external CRM ID (PATCH/PUT/UPDATE) |
2. Products
| Method | URL | Description |
|---|---|---|
| GET | /products | Get product list. Supports pagination, sorting, filtering by category, status, date, language (?lang=ru|ua|en|pl) and search by name |
| GET | /products/{id} | View single product by ID |
| GET | /products/sku/{sku} | View single product by SKU (product code) |
| POST | /products | Mass adding of new products |
| UPDATE | /products/{id} | Update product by ID (PATCH/PUT/UPDATE) |
| UPDATE | /products/sku/{sku} | Update product by SKU (product code) (PATCH/PUT/UPDATE) |
| UPDATE | /products | Mass update of multiple products (PATCH/PUT/UPDATE) |
| DELETE | /products/{id} | Delete product by ID |
| DELETE | /products/sku/{sku} | Delete product by SKU (product code) |
3. Product Categories
| Method | URL | Description |
|---|---|---|
| POST | /products/categories | Bulk add and update categories |
| GET | /products/categories | Get a list of product categories |
| GET | /products/categories/{id} | Get a category by ID |
| GET | /products/categories/name/{name} | Get a category by name |
| UPDATE | /products/categories | Bulk update multiple categories (PATCH/PUT/UPDATE) |
| UPDATE | /products/categories/{id} | Update a category by ID (PATCH/PUT/UPDATE) |
| UPDATE | /products/categories/name/{name} | Update a category by name |
Parent category parameters
| Parameter | Type | Description |
|---|---|---|
category_parent_id |
int | Parent category ID. Used with the highest priority if provided. |
category_parent_name |
string | Latin name (alias / slug, URL for opening the category) of the parent category. Used if category_parent_id is not provided. In case of duplicates, you can specify category_lang. |
category_lang |
string | Category language. Used to resolve conflicts of identical category_parent_name in different languages. |
How it works:
category_parent_idis checked first.- If not provided –
category_parent_nameis used. - If names match – an additional check by
category_langis performed.
Special rule:
To add a category to the root (main) category, you must specify category_parent_name = "main" and also set category_lang – the language of the parent category.
Update and Deletion:
update_exists (bool) – if true, updates the category if it already exists (default false).
delete (bool) – if true, the category will be deleted.
📥 Import/export of shop categories via API:
Mass import and export code for shop categories is available via Commerce API on GitHub.
📥 Download from GitHub
4. Producers
| Method | URL | Description |
|---|---|---|
| POST | /products/producers | Bulk add and update producers |
| GET | /products/producers | Get a list of producers |
| GET | /products/producers/{id} | Get a producer by ID |
| GET | /products/producers/name/{name} | Get a producer by name |
| UPDATE | /products/producers | Bulk update multiple producers (PATCH/PUT/UPDATE) |
| UPDATE | /products/producers/{id} | Update a producer by ID (PATCH/PUT/UPDATE) |
| UPDATE | /products/producers/name/{name} | Update a producer by name |
| DELETE | /products/producers/{id} | Delete a producer by ID (if no products and sub-producers) |
| DELETE | /products/producers/name/{name} | Delete a producer by name |
Producer binding parameters
| Parameter | Type | Description |
|---|---|---|
producer_parent_id |
int | Parent producer (group) ID. Used with the highest priority if provided. |
producer_parent_name |
string | Latin name (alias / slug, URL for opening the producer). Used if producer_parent_id is not provided. In case of duplicates, you can specify producer_lang. |
producer_lang |
string | Producer language. Used to resolve conflicts of identical producer_parent_name in different languages. |
How it works:
producer_parent_idis checked first.- If not provided –
producer_parent_nameis used. - If names match – an additional check by
producer_langis performed.
Special rule:
To add a producer to the root (main) producer group, you must specify producer_parent_name = "main" and also set producer_lang – the language of the parent group.
Update and Deletion:
update_exists (bool) – if true, updates the producer if it already exists (default false).
delete (bool) – if true, the producer will be deleted.
📥 Import/export of producers via API:
Mass import and export code for producers is available via Commerce API on GitHub.
📥 Download from GitHub
5. Collections
| Method | URL | Description |
|---|---|---|
| POST | /products/collections | Bulk add and update collections |
| GET | /products/collections | Get a list of collections |
| GET | /products/collections/{id} | Get a collection by ID |
| GET | /products/collections/name/{name} | Get a collection by name |
| UPDATE | /products/collections | Bulk update multiple collections (PATCH/PUT/UPDATE) |
| UPDATE | /products/collections/{id} | Update a collection by ID (PATCH/PUT/UPDATE) |
| UPDATE | /products/collections/name/{name} | Update a collection by name |
| DELETE | /products/collections/{id} | Delete a collection by ID (if no products and sub-collections) |
| DELETE | /products/collections/name/{name} | Delete a collection by name |
Collection binding parameters
| Parameter | Type | Description |
|---|---|---|
collection_parent_id |
int | Parent collection ID. Used with the highest priority if provided. |
collection_parent_name |
string | Latin name (alias / slug, URL for opening the collection). Used if collection_parent_id is not provided. In case of duplicates, you can specify collection_lang. |
collection_lang |
string | Collection language. Used to resolve conflicts of identical collection_parent_name in different languages. |
How it works:
collection_parent_idis checked first.- If not provided –
collection_parent_nameis used. - If names match – an additional check by
collection_langis performed.
Special rule:
To add a collection to the root (main) collection, you must specify collection_parent_name = "main" and also set collection_lang – the language of the parent collection.
Update and Deletion:
update_exists (bool) – if true, updates the collection if it already exists (default false).
delete (bool) – if true, the collection will be deleted.
📥 Import/export of collections via API:
Mass import and export code for collections is available via Commerce API on GitHub.
📥 Download from GitHub
6. Sorting and Pagination
For the methods /orders, /products, /blog/articles and /pages, parameters for pagination and sorting are available:
Pagination Parameters
| Parameter | Type | Description |
|---|---|---|
page | int | Page number (default 1) |
per_page | int | Items per page. Default: products — 500, others — 200. Max: orders & booking — 2000, products — 5000, all others — 2000. Pages: create — up to 100 pages per request, update — up to 500 pages per request |
Sorting Parameters
| Parameter | Type | Allowed values | Description |
|---|---|---|---|
orderby | string | id, title, price, date, views | Field to sort by |
order | string | asc, desc | Sort direction |
Language options
| Parameter | Тип | Allowed values | Description |
|---|---|---|---|
l | string | ru, ua, en, de, fr, es, it, pl | Language for displaying values |
Additional for Orders
You can filter orders by date and status:
?after=YYYY-MM-DD— Start date (ISO format)?before=YYYY-MM-DD— End date?status=pending|processing|on-hold|completed|cancelled|0|1|2|3|5|6|7|8— Order status (can specify WooCommerce textual status or numeric code)0— Pending1— Processing7— Processing, awaiting shipment (on-hold)3— Completed8— Completed and closed2— Cancelled5— Cancelled: out of stock6— Cancelled: refusal?show_deleted=1— Show hidden orders?id_min=10022— Only orders with ID greater than or equal to the specified value. Useful for incremental imports and reducing load?id_max=15000— Only orders with ID less than or equal to the specified value?limit=50— Limit the number of returned orders (max 2000). Filtering is done on the API side
Examples
GET /orders?page=2&per_page=100&after=2024-06-01&before=2024-06-30
GET /products?orderby=price&order=asc&per_page=50
GET /booking?date_from=2024-06-01&date_to=2024-06-30&type=0
GET /booking?group_id=5&slug_search=yoga-morning
Example of Authorization in Request
Method 1 — via query parameter (simple):
?consumer_secret=YOUR_SECRET
⛔ Do not publish the key publicly!
Method 2 — via Authorization header (OAuth 1.0a):
Authorization: OAuth oauth_consumer_key="YOUR_SECRET"
🔗 Live example — API request:
https://boostore.pro/api/commerce/orders?per_page=5&consumer_secret=your_authorization_token_hereAdd New Order (POST /orders)
To create a new order via API, you need to send a POST request to /orders with a JSON body.
At minimum, you must specify:
email— Customer's email (required!)line_items— List of items to add
Order Parameters
When creating an order, you can specify additional fields, for example:
{
"first_name": "Name",
"last_name": "Surname",
"email": "alex@example.com",
"phone": "+380671112233",
"address": "Full address if address eform is not used",
"buyer_address_eform1": "State",
"buyer_address_eform2": "City",
"buyer_address_eform3": "Street",
"buyer_address_eform4": "House number",
"buyer_address_eform5": "Flat",
"buyer_address_eform7": "Ukraine",
"postcode": "01001",
"total": "999",
"status": "processing",
"status_for_customer": "processing",
"line_items": [ ... ]
}
About the total field:
total— Final order amount (string or number). If specified, this value will be used as the final order price.- If
totalis not specified, the order amount will be automatically calculated based on the sum of the addedline_items. - The
totalfield is optional and can be used for orders without products.
Subscription payment parameters
An order can be marked as a subscription (recurring) payment. To do this, pass the following fields in the JSON request body:
{
"subscribe": 1,
"subscribe_mode": "period",
"subscribe_period": "month"
}
subscribe—0disabled (default),1— enabled.subscribe_mode—buyer(the buyer chooses the period at checkout) orperiod(a fixed billing period).subscribe_period— the billing period forsubscribe_mode=period:day,week,month,year.
line_items Format
The line_items parameter is an array of items. Each item is an object with the following fields:
"line_items": [
{
"product_id": 478734,
"quantity": 1,
"price": 100,
"currency": "USD"
},
{
"product_id": 478268,
"quantity": 10,
"variation": "51"
},
{
"product_id": 478266,
"quantity": 1,
"variation_id": 735302
}
]
- product_id — Product ID (required!).
- quantity — Quantity of units (required!).
- price — (optional) If specified, this price will be used instead of the site's calculated price.
- currency — (optional) Currency for this specific product (e.g.,
USDorUAH). If specified and different from the order's maincurrency, the price will be automatically converted. - variation_id — ID of the product variation — use this to specify a variation if available.
- variation — Name or code of the variation — used if
variation_idis not specified. If both are provided,variation_idtakes priority.
Important: If the main order currency is not specified, the site's default currency will be used.
If an item's currency differs from the main currency — the price will be converted automatically.
Booking Parameters
If the order is linked to a booking, you can specify:
booking— integer (0/1). Flag indicating whether this order has a booking. Can be set to1to mark the order as a booking.booking_data— object. Booking details (used in POST/PUT/PATCH). Fields:
"booking_data": {
"slot_id": 123,
"slot_title": "Slot name",
"group_id": 0,
"start_time": 1710000000,
"end_time": 1710003600,
"duration": 3600,
"factor": 1.0,
"base_price": "100$",
"price": "100$",
"payment_required": true,
"status": 0,
"after_payment_status": 3,
"userid": 0,
"author": 0,
"dates_start_year": "2026",
"dates_start_date": "2026-07-07",
"dates_start_time": "10:00:00",
"dates_end_year": "2026",
"dates_end_date": "2026-07-07",
"dates_end_time": "11:00:00"
}
- slot_id — ID of the booking slot (required).
- slot_title — Slot name/title.
- group_id — Group ID for grouping slots.
- start_time — Start timestamp (Unix).
- end_time — End timestamp (Unix).
- duration — Duration in seconds.
- factor — Multiplier coefficient.
- base_price — Base price (string with currency symbol).
- price — Total price (string with currency symbol).
- payment_required — Whether payment is required (true/false).
- status — Booking status (0-8). Values: 0 — new, 1 — processing, 2 — cancelled, 3 — completed/finished, 4-8 — additional statuses.
- after_payment_status — Status set on the order after successful payment. Same range as status (0-8).
- userid — User ID of the buyer.
- author — Author/manager ID who created the booking.
- dates_start_* / dates_end_* — Human-readable date/time fields (optional).
🛡️ Duplicate protection: When creating or updating an order with booking_data, the system automatically checks if the specified time interval is already occupied by another non-cancelled order (statuses 2, 5, 6 are considered cancelled — slot is free). If the slot is busy, the API returns 409 Conflict.
Payment actions for an order (hold / refund) via API
Updating an order by ID (PATCH/PUT/UPDATE /orders/{id} or /crm_orders/{id}) allows you not only to change order fields but also to perform actions with the online payment. To do this, pass a special parameter in the JSON request body:
{
"payment_action": "hold_finalize"
}
Allowed payment_action values:
hold_finalize— confirm the hold (charge/finalize the funds if the order is in hold status — the money was temporarily frozen by the payment system). Same as the "Finalize hold" button in sales statistics.hold_cancel— cancel the hold (release the buyer's funds). Same as the "Cancel hold" button.refund— refund (cancel) an already completed payment (full or partial).
For refunds you must specify the type — refund_type (required): full (full refund for the paid amount) or partial (partial refund, with the amount refund_amount in 123.45 format).
{
"payment_action": "refund",
"refund_type": "full"
}
{
"payment_action": "refund",
"refund_type": "partial",
"refund_amount": 12.50
}
Restrictions:
- For
refund_type=partialtherefund_amountparameter is required and must be greater than 0. - The partial refund amount cannot exceed the paid order amount — otherwise the API returns an error
400(refund_amount exceeds the paid amount). - Partial refunds are not supported by all payment systems (e.g. NovaPay allows full refunds only).
The action is executed in the payment system assigned to the order (LiqPay, Monobank, WayForPay, Privat24, NovaPay, Stripe, Square, PayPal, iPay, etc.). Success is checked by the payment status in the database. Refunds are available only within 1 week after payment (payment system limitation).
💳 Refund example: PATCH /orders/12345 with body {"payment_action":"refund","refund_type":"full"} or {"payment_action":"refund","refund_type":"partial","refund_amount":12.50}
Refund fields in an order (editable via PATCH/PUT and returned in GET): online_payment_refund_partial (1 — partial refund), online_payment_refund_amount (refund amount), online_payment_amount_left (remaining payment amount).
Updating Products
Product updates are done using the HTTP UPDATE method (or PATCH/PUT) by URL with the product ID or SKU, or multiple products in one request:
/products/{id}— update product by ID/products/sku/{sku}— update product by SKU/products— bulk update multiple products (up to 5000 in one request)
When using bulk update, the path /products does not contain an ID or SKU. In this case, you must send an array of product objects in the products parameter. Each element must contain at least id or sku. If id is specified, it has priority and can replace sku. If id is not specified, the search is done by sku.
The update request must contain the full product data in JSON format. All sent data replaces the existing values, including:
- Main product properties (title, description, prices, status, etc.)
- Attributes
- Variations
- Images
- Categories and tags
- Additional settings and meta fields
Variations are updated using the following logic for each variation in the variations array:
- If
idis specified, the update is done by it. - If
idis missing butskuis specified, the update is done by SKU. - If both
idandskuare missing buttitleis specified, the update is done by title. - If no match is found by these, a new variation is created with the given parameters.
Updating by SKU is convenient when the variation ID is unknown but a unique code is available.
During an update, all fields included in the JSON will overwrite the current product values; to leave a field unchanged, simply omit it from the request.
- Duplicate variations: If the
variationsarray contains duplicates by SKU or title, they will be skipped — the same variation will not be added twice. - Main image: In the
imagesarray, the image at index0is considered the main one. Ifimages[0]is missing or not uploaded, the first successfully uploaded image will be used as the main one. - Maximum images: You can upload up to 10 images for a single product. If you try to upload more, extra files will be ignored.
-
Image handling:
- Delete images: To delete an image by index, set the
imagesarray element to"delete". For example,images[2] = "delete"will remove the file at index 2. You can delete and upload at the same time by setting multiple keys:images[3] = "delete",images[1] = "https://...". - Skipping image indexes: If you specify an empty string or
false, that index will be skipped without an error. - Overwrite images: The
images_replaceparameter: Iftrue, the system will overwrite existing image files for the given indexes (removes old file and cache). Iffalseor not set — overwriting is disabled. - Skip occupied indexes: The
images_skip_indexparameter: Iftrueand the index is occupied but overwriting is disabled, the system will find the next free index and save the file there. Iffalseor not set — the file will be saved strictly to the given index. - Save to new index on conflict: The
images_replace_new_indexparameter: Iftrue, then if the index is occupied and both overwriting and auto-skip are disabled, the file will be saved under the next free index. If all three parameters arefalseor not set and the index is occupied — the file will not be uploaded.
- Delete images: To delete an image by index, set the
Product Parameters
You can see the available values in the example code below. There is also additional explanation of some values that may be useful.
-
Available values for
price_forFor each product, you can specify the
price_forparameter that defines the unit for pricing. You can use a numeric code or text (for example, “Per 1 kg”). Here is the complete list of values:You can use either a numeric value or text — the system will automatically recognize and map it to the correct code.
-
Available values for
stock_statusFor each product, you can set the
stock_statusparameter, which defines the product’s availability status and how it behaves on the site. You can use either a numeric code or a keyword — the system will recognize both.You can use either a number or text — the system will automatically detect it and convert it to the correct code.
If a product is set to
3, it will be hidden from product listings on the site. If it’s set to4, the product will be visible but cannot be added to the cart. Option5shows the buyer that availability needs to be confirmed. -
Promotion and available values for
promotion_expires_jobFor each product, you can set the
promotion_expires_jobparameter, which controls what happens to a promotion after its end date.
You can use either a numeric code or a keyword — the system will recognize both.You can use either a number or text — the system will automatically detect it and convert it to the correct code.
Important: To activate the promotion timer, be sure to set
promotionto1— this means the promotion is active.Also, you must specify the promotion end date in the
promotion_expiresparameter — this can be given as a UNIX timestamp (for example,time()) or in the formatYYYY-MM-DDTHH:MM:SS+00:00(for example,2025-06-28T00:00:00+00:00).
Field aliases (WooCommerce compatibility):
content = description, excerpt = short_description,
cat_id / rubric_id = category_id,
sale_price = price, original_price = regular_price,
menu_order = priority, wholesale_price = price_cost,
slug = name (if both specified, slug takes priority).
📦 Real GET /products/{id} response example
To see the actual fields of your product, run GET /products/{id} or GET /products/sku/{sku}. Below is a sample response for Salomon Quest 4D 3 GTX (ID: 483472):
{
"id": 483472,
"sku": "Q4D3-BLK_ru",
"title": "Salomon Quest 4D 3 GTX",
"permalink": "https://yourdomain.com/ru/pers_shop/demo_ru/salomonquest4d3gtx.htm",
"access": true,
"language": "ru",
"multilangid": 483641,
"price": 220.00,
"regular_price": 280,
"currency": "USD",
"stock_status_value": "In stock",
"stock_status": 0,
"stock_quantity": 0,
"featured": false,
"new": 1,
"reducedprice": false,
"discount": null,
"moq": 0,
"promotion": 0,
"promotion_text": null,
"promotion_expires": null,
"bought_with": null,
"products_synonyms": null,
"categories": [
{ "id": 28143, "name": "demo_ru", "title": "Demo category" }
],
"producer": {
"id": 4806,
"name": "salomon_ru",
"title": "Salomon",
"lang": "ru"
},
"images": [
{ "src": "https://yourdomain.com/upload/shop_catalog/s15992/483472/483472_0.jpg", "name": "483472_0.jpg" },
{ "src": "https://yourdomain.com/upload/shop_catalog/s15992/483472/483472_1.webp", "name": "483472_1.webp" }
],
"type": 0,
"attributes": [
{ "id": 0, "name": "Product type", "options": [""] }
],
"variations_exists": 8,
"variations": [
{ "id": 749582, "sku": "Q4D3-BLK_36", "title": "36", "stock_status": 0, "stock_status_value": "In stock" },
{ "id": 749590, "sku": "Q4D3-BLK_37", "title": "37", "stock_status": 4, "stock_status_value": "Check availability" },
{ "id": 749602, "sku": "Q4D3-BLK_38", "title": "38", "stock_status": 0, "stock_status_value": "In stock" }
],
"weight": 0,
"weight_units": 0,
"dimensions": {
"length": 0, "width": 0, "height": 0, "units": 0
},
"short_description": null,
"description": "Flagship model for multi-day trekking...",
"description_tab_1": "Salomon Quest 4D 3 GTX: Unrivaled Support and Protection...",
"meta_title": null,
"meta_description": null,
"meta_keywords": null,
"video": null,
"priority": 0,
"rating": 0,
"comments": 0,
"views": 569,
"orders": 0,
"shipping_price": 0,
"add_date": "2025-10-25T00:16:09+00:00",
"last_edit": "2026-04-10T18:30:57+00:00"
}
💡 You can get the full example by making a GET request to your store's Products API.
Adding Products
This method allows you to add one or multiple products in a single request (up to 3000 at once).
The request format is exactly the same as for updating: you can send an array of products
or a single product.
- ID check: When adding a new product, the
idfield must be empty or not specified. Ifidis given and a product with that ID already exists, the system will update that product instead of creating a new one. - SKU check: Before adding, the system checks if a product with the given SKU exists. If found, it will be updated instead of creating a duplicate.
You can add new products and update existing ones in a single request.
📥 Import/export products via API:
Mass import and export code for products is available via Commerce API on GitHub.
📥 Download from GitHub
7. Blog Articles
| Method | URL | Description |
|---|---|---|
POST |
/blog/articles |
Mass add and update articles |
GET |
/blog/articles |
Get list of articles. Supports pagination (?page=N&per_page=N), sorting (?orderby=id|name|position|datestamp&order=asc|desc) and filtering (?category_id=N or ?category_id=1,2,3, ?category=name, ?status=0|1, ?date_after=YYYY-MM-DD, ?date_before=YYYY-MM-DD, ?lang=ru|ua|en|pl) |
GET |
/blog/articles/{id} |
View a single article by ID |
UPDATE |
/blog/articles/{id} |
Update an article by ID (PATCH/PUT/UPDATE) |
UPDATE |
/blog/articles |
Mass update multiple articles (PATCH/PUT/UPDATE) |
GET |
/blog/articles/slug/{slug} |
Get article by system name (slug) |
UPDATE |
/blog/articles/slug/{slug} |
Update article by system name (slug) (PATCH/PUT/UPDATE) |
DELETE |
/blog/articles/{id} |
Delete an article by ID |
Article Fields
| Parameter | Type | Description |
|---|---|---|
title |
string | Article title (displayed on the page, H1) |
meta_title |
string | Meta title |
meta_description |
string | Meta description |
meta_keywords |
string | Meta keywords |
description |
text | Full article text |
short_description |
text | Short description (article preview) |
name |
string | URL slug. Latin characters and hyphens (e.g. my-article) |
slug |
string | URL slug. Same as name. Latin characters and hyphens |
language |
string | Article language (ru, en, ua, pl, etc.) |
category_id |
int | Category ID from blog_catalog_value. Required for a new article |
status |
int | Access: 1 — published (public), 0 — hidden (disabled) |
priority |
int | Priority (sorting position, 0–29) |
datestamp |
int (unix) | Publication date (Unix timestamp) or ISO 8601 string |
schema |
int | Schema.org markup type (0–9).0 — WebPage (default)1 — Article6 — BlogPosting7 — NewsArticle2 — AboutPage3 — ContactPage4 — CollectionPage5 — ProfilePage9 — FAQPage8 — No markup
|
planned |
int | Scheduled publication: 0/1 |
settings_comments |
string | Comment settings |
settings_rating |
int | Rating settings: 0/1 |
update_exists |
bool | If true, updates the article on re-add (default false) |
delete |
bool | If true, the article will be deleted (soft delete) |
tags |
string | Article tags, comma-separated (up to 8). Stored in a separate tags table |
multilangid |
string | Article IDs in other languages. Links translations of the same article for multi-language sites |
slug_search |
string | Search article by system name (slug) for update. Alternative to ID. Not stored in DB |
GET List Filtering
When fetching articles (GET /blog/articles), the following filter parameters are supported:
| Parameter | Type | Description |
|---|---|---|
category_id | int/string | Category ID. Single ID or comma-separated list: ?category_id=1,2,3 |
category | string | Category slug/name. Single name or comma-separated list: ?category=sitecreate_ru,blog_news. Alternative to category_id |
status | int | Access filter: 1 — published (public), 0 — hidden (disabled) |
date_after | string | Start publication date (ISO 8601). Example: ?date_after=2026-07-01 |
date_before | string | End publication date (ISO 8601). Example: ?date_before=2026-07-31 |
lang | string | Article language: ru, ua, en, pl and more |
id_min | int | Load only articles with ID greater than or equal to the specified value. Example: ?id_min=10022. Useful for incremental imports and reducing load |
id_max | int | Load only articles with ID less than or equal to the specified value. Example: ?id_max=15000 |
limit | int | Limit the number of returned records (max 2000). Example: ?limit=50. Filtering is done on the API side |
Standard sorting parameters are also available: orderby (id, name, position, datestamp) and order (asc, desc).
Field aliases (WooCommerce compatibility):
content = description, excerpt = short_description,
cat_id / rubric_id / category = category_id,
date / date_created / date_created_gmt = datestamp,
slug = name (if both specified, slug takes priority).
Mass Add and Update
POST/PUT/PATCH on /blog/articles accepts either a single article object or an array of objects in the articles field:
{
"articles": [
{
"title": "My Article",
"slug": "my-article",
"language": "en",
"category_id": 5,
"description": "<p>Article text</p>",
"short_description": "Preview",
"meta_title": "My Article | Site",
"tags": "sneakers, nike, adidas, sport shoes",
"status": 1,
"priority": 5,
"schema": 6
},
{
"title": "Another article",
"slug": "another-article",
"language": "en",
"category_id": 10,
"description": "<p>Article text</p>",
"status": 1
}
]
}
Update and delete:
update_exists (bool) – if true, updates the article on re-add (default false).
delete (bool) – if true, the article will be deleted (soft delete: hidden from lists).
slug_search (string) – search article by system name (slug/name) for update via PUT/PATCH/POST. If id is not provided, the article is looked up by slug_search. If both are provided, ID is tried first, then slug_search as fallback. Respects the article language (language parameter or category language).
On deletion, the article counter in the parent category is automatically recalculated.
📥 Import/export articles via API:
Mass import and export code for blog articles is available via Commerce API on GitHub.
📥 Download from GitHub
8. Site Pages
| Method | URL | Description |
|---|---|---|
POST | /pages | Mass add and update pages |
GET | /pages | Get list of pages. Supports pagination (?page=N&per_page=N), sorting (?orderby=id|name|position|datestamp&order=asc|desc) and filtering (?status=0|1, ?date_after=YYYY-MM-DD, ?date_before=YYYY-MM-DD, ?lang=ru|ua|en|pl) |
GET | /pages/{id} | View a single page by ID |
GET | /pages/slug/{slug} | Get page by system name (slug) |
UPDATE | /pages/{id} | Update a page by ID (PATCH/PUT/UPDATE) |
UPDATE | /pages | Mass update multiple pages (PATCH/PUT/UPDATE) |
DELETE | /pages/{id} | Delete a page by ID |
Page Fields
| Parameter | Type | Description |
|---|---|---|
title | string | Page title (displayed on the page, H1) |
meta_title | string | Meta title |
meta_description | string | Meta description |
meta_keywords | string | Meta keywords |
meta_html | text | Custom HTML code for <head> injection |
description | text | Full page text (HTML) |
short_description | text | Short page description |
name | string | URL slug. Latin characters, digits, hyphens and dots only |
slug | string | URL slug. Same as name |
language | string | Page language (ru, en, ua, pl, etc.) |
status | int | Access: 1 — published (public), 0 — hidden (disabled) |
priority | int | Priority (sorting position) |
datestamp | int (unix) | Publication date (Unix timestamp) or ISO 8601 string |
show_tree | int | Show category tree: 0/1/2 (0 — as settings, 1 — hide, 2 — show) |
show | int | Display: 1/true/show/visible — show, 0/false/hide/hidden — hide |
schema | int | Schema.org markup type (0–9).0 — WebPage (default)1 — Article6 — BlogPosting7 — NewsArticle2 — AboutPage3 — ContactPage4 — CollectionPage5 — ProfilePage9 — FAQPage8 — No markup |
settings_comments | string | Comment settings |
settings_rating | int | Rating settings: 0/1 |
settings_tags | int | Tag settings: 0/1 |
password | string | Password for page access |
multilangid | string | Page IDs in other languages |
slug_search | string | Search page by slug for update. Alternative to ID. Not stored in DB |
tags | string | Page tags, comma-separated (up to 8) |
GET List Filtering
When fetching pages (GET /pages), the following filter parameters are supported:
| Parameter | Type | Description |
|---|---|---|
status | int | Access filter: 1 — published, 0 — hidden |
date_after | string | Start publication date (ISO 8601). Example: ?date_after=2026-07-01 |
date_before | string | End publication date (ISO 8601). Example: ?date_before=2026-07-31 |
lang | string | Page language: ru, ua, en, pl |
id_min | int | Load only pages with ID greater than or equal to the specified value. Example: ?id_min=10022. Useful for incremental imports and reducing load |
id_max | int | Load only pages with ID less than or equal to the specified value. Example: ?id_max=15000 |
limit | int | Limit the number of returned records (max 2000). Example: ?limit=50. Filtering is done on the API side |
Standard sorting: orderby (id, name, position, datestamp) and order (asc, desc).
Field aliases:
content = description, excerpt = short_description,
slug = name (if both specified, slug takes priority).
Mass Add/Update (JSON Example)
{
"pages": [
{
"title": "About Us",
"slug": "about-us",
"language": "en",
"description": "<p>About us page text</p>",
"meta_title": "About Us | Site",
"status": 1,
"priority": 10
},
{
"title": "Contacts",
"slug": "contacts",
"language": "en",
"description": "<p>Contact information</p>",
"status": 1
}
]
}
Update and Deletion:
update_exists (bool) – if true, updates the page on re-add (default false).
delete (bool) – if true, the page will be deleted (soft delete).
slug_search (string) – search page by slug for update via PUT/PATCH/POST.
📥 Import/export pages via API:
Mass import and export code for pages is available via Commerce API on GitHub.
📥 Download from GitHub
9. Blocks/Menus
| Method | URL | Description |
|---|---|---|
POST | /blocks | Mass add and update blocks/menus |
GET | /blocks | Get list of blocks. Supports pagination (?page=N&per_page=N), sorting (?orderby=id|name|title|position|menu_order&order=asc|desc) and filtering (?status=0|1, ?position=header|footer|..., ?lang=ru|ua|en|pl, ?slug=name) |
GET | /blocks/{id} | View a single block by ID |
GET | /blocks/slug/{slug} | Get block by system name (slug) |
UPDATE | /blocks/{id} | Update a block by ID (PATCH/PUT/UPDATE) |
UPDATE | /blocks | Mass update multiple blocks (PATCH/PUT/UPDATE) |
DELETE | /blocks/{id} | Delete a block by ID |
Block Fields
| Parameter | Type | Description |
|---|---|---|
id | int | Block ID |
name | string | System name (slug). Latin chars, digits, hyphens only (e.g. my-block) |
title | string | Block title |
description | text | Block content (HTML, SHORTCODE, BBCODE) |
position | string | Position: left, right, top, buttom, header, header_meta, header_meta_data, header_before_meta_data, footer |
menu_order | int | Sorting order (higher = higher priority) |
language | string | Block language: ru, ua, en, pl, all |
show | int | Visibility: 0 — hidden, 1 — everyone, 2 — users only, 3 — guests only, 4 — admins only, 5 — site admin only, 6 — admin and manager |
show_on_page | int | Page type: 0 — everywhere, 1 — simple pages, 2 — blog, 4 — news, 6 — shop, 7 — not on homepage, 8 — on homepage, 9 — search |
show_on_device | int | Devices: 0 — all, 1 — desktops, 2 — mobile |
access | int | Block access level |
querystring_show | text | URL/paths to show on (line by line, no HTML) |
querystring_hide | text | URL/paths to hide on (line by line, no HTML) |
querystrpos_show | text | URL fragments to show (line by line, no HTML) |
querystrpos_hide | text | URL fragments to hide (line by line, no HTML) |
script | int | Create JS file from text: 0/1 |
script_async | int | Script type: 0 — none, 1 — async, 2 — defer, >2 — CSS file |
div | int | HTML wrapper: 0 — none, 1 — span, 2 — div, 3 — aside, 4 — section, 5 — nav |
GET List Filtering
When fetching blocks (GET /blocks), the following filter parameters are supported:
| Parameter | Type | Description |
|---|---|---|
status | int | Visibility filter: 1 — visible, 0 — hidden |
position | string | Position filter: header, footer, left, etc. |
lang | string | Block language: ru, ua, en, pl |
slug | string | Search by system name |
id_min | int | Load only blocks with ID greater than or equal to the specified value. Example: ?id_min=10022. Useful for incremental imports and reducing load |
id_max | int | Load only blocks with ID less than or equal to the specified value. Example: ?id_max=15000 |
limit | int | Limit the number of returned records (max 2000). Example: ?limit=50. Filtering is done on the API side |
Standard sorting: orderby (id, name, title, position, menu_order) and order (asc, desc).
Field aliases:
content = description, priority = menu_order, slug = name (if both specified, slug takes priority).
Mass Add/Update (JSON Example)
{
"blocks": [
{
"name": "about-sidebar",
"title": "About Us",
"language": "en",
"description": "<p>Block text</p>",
"position": "left",
"menu_order": 10,
"show": 1
},
{
"name": "footer-contacts",
"title": "Contacts",
"language": "en",
"description": "<p>Contact information</p>",
"position": "footer",
"show": 1
}
]
}
Update and Deletion:
update_exists (bool) – if true, updates the block on re-add (default false).
delete (bool) – if true, the block will be deleted.
slug_search (string) – search block by slug for update via PUT/PATCH/POST.
Protected system names:
google — fully excluded from API (not imported or exported).
mobile_menu_widget, footer_widget, main_menu_widget — read-only (GET only).
smart_search_menu, smart_search_menu_select, slide_menu_widget, slider, slider2, slider3, slider_noscript — system blocks with special rules.
📥 Import/export blocks via API:
Mass import and export code for blocks/menus is available via Commerce API on GitHub.
📥 Download from GitHub
Booking API — managing booking slots
API for managing booking slots. Endpoint: /api/commerce/booking.
Important: The /booking endpoint works with the booking_slots table — slot templates/definitions (schedule, recurrence types, prices). Real-time availability (is the slot free right now) is returned by the internal /api_booking.jsonp?action=get_booking_slot_time used by the frontend widget.
Available methods:
GET /booking— get all slot templates (schedule)GET /booking/{id}— get slot template by IDGET /booking/slug/{slug}— get slot template by name (group title)POST /booking— create a new slot templatePUT /booking[/{id}]— update slot template (search priority: ID → group_id → slug_search)PATCH /booking[/{id}]— partial update (same as PUT)DELETE /booking/{id}— delete slot template by IDDELETE /booking/slug/{slug}— delete slot template by name
Booking slot fields (booking_slots):
id | int | Slot ID (auto_increment) |
date | string (Y-m-d) | Slot date |
time_start | string (H:i:s) | Start time |
time_end | string (H:i:s) | End time |
group_id | int | Slot group ID |
group_title | string | Group title (name) |
group_price | float | Group price |
access | int | Access: 0 — everyone, 1 — disabled, 2 — authorized only |
type | int | Type: 0 — once, 1 — daily, 2 — weekly, 3 — monthly |
recurrence_day | string | Weekdays for recurrence, comma-separated (1=Mon..7=Sun). Example: "1,3,5" |
recurrence_month | string | Months for recurrence, comma-separated (1..12). Example: "3,6,9,12" |
description | string | Slot description (HTML) |
author | string | Author |
Full field list: api/api_commerce/booking/api_meta_booking_fields.php.
GET /booking filtering: ?date_from=, ?date_to=, ?group_id=, ?type=, ?access=, ?slug_search=, ?id_min= (only ID ≥), ?id_max= (only ID ≤), ?limit= (record limit, max 2000).
🔗 Request examples:
GET /booking?date_from=2024-06-01&date_to=2024-06-30&type=0GET /booking?group_id=5&slug_search=yoga-morning
Slot search priority for update/delete (PUT/PATCH/DELETE):
id(from URL or request body) — slot IDgroup_id(from request body) — group ID (if the group contains exactly 1 slot)slug_search(from request body) — search by name (group_title)
If the slot is not found by slug_search — a new one is created (upsert).
Example one-time slot (POST, type=0):
{
"date": "2026-07-15",
"time_start": "10:00:00",
"time_end": "11:00:00",
"group_title": "yoga-morning",
"group_price": 25.00,
"type": 0,
"access": 0
}
Example weekly slot (POST, type=2):
{
"time_start": "09:00:00",
"time_end": "18:00:00",
"group_title": "work-hours",
"group_price": 50.00,
"type": 2,
"recurrence_day": "1,2,3,4,5",
"access": 0
}
Example update by group_id (PUT):
{
"group_id": 5,
"group_price": 30.00,
"description": "<p>Updated description</p>"
}
Example update by slug_search (PUT):
{
"slug_search": "yoga-morning",
"group_price": 35.00
}
Comments and Reviews
The /comments methods allow you to read, add, update and delete comments and reviews for products, pages, blog articles and categories. The system automatically recalculates the average rating and review count for the object (same as the web version), including multilingual (multilang) versions.
The type parameter determines which system you work with: product reviews (type=shop) or comments for pages, blog articles and categories (type=pages, page_type is required).
The object (page/product) is set with the unified field page_id — the ID of the page (for products — the product ID) the review belongs to. Site binding is verified on the API side; you do not need to pass it.
Multilang is resolved automatically. The multilang parameter is not accepted from the client: the list of language versions is taken from the object's multilangid group, and the rating is recalculated across all versions.
| Method | URL | Description |
|---|---|---|
| GET | /comments | List of comments (with filters) |
| GET | /comments/{id} | Get a single comment by ID |
| POST | /comments | Add a new comment/review |
| PUT / PATCH | /comments | Update an existing comment (pass id) |
| DELETE | /comments/{id} | Delete a comment (and all its replies) |
Parameters
The comment system is defined by the type parameter, and for pages/articles/categories additionally by page_type:
| type | page_type (for type=pages) | Object |
|---|---|---|
| shop | product_page | Products (page_id) |
| pages | page | Site pages |
| pages | blog_page | Blog articles |
| pages | blog_category | Blog categories |
| pages | shop_category | Shop categories |
| pages | shop_producer | Producers |
| pages | shop_collection | Collections |
List filtering (GET /comments)
The following filtering parameters are available when getting a list of comments:
| Parameter | Type | Description |
|---|---|---|
page_id | int | Page/product ID — only reviews for this object |
parent_id | int | Only replies to the specified comment |
hide | int | 0 — published, 1 — hidden/moderated |
rating | int | Only reviews with the specified rating (1–5) |
author_email | string | Only reviews of the specified author (by email) |
id_min | int | Only reviews with ID greater than or equal to the specified value. Example: ?id_min=10022. Useful for incremental imports and reducing load |
id_max | int | Only reviews with ID less than or equal to the specified value. Example: ?id_max=15000 |
limit | int | Limit the number of returned records (max 2000). Example: ?limit=50. Filtering is done on the API side |
Comment fields
| Field | Type | Description |
|---|---|---|
| id | int | Comment ID |
| page_id | int | Page ID (for products — the product ID) the review belongs to (required) |
| page_type | string | Object type: product_page (product) or page/blog_page/blog_category/shop_category/shop_producer/shop_collection for type=pages |
| parent_id | int | Parent review ID (0 = root, otherwise a reply) |
| author_name | string | Author name (required) |
| author_email | string | Author email |
| author_userid | int | Author user ID (0 — guest) |
| rating | int | Rating 1–5 (required for root reviews) |
| text | string | Review text (up to 5000 chars) |
| text_good | string | Pros (up to 2000 chars, product reviews only) |
| text_bad | string | Cons (up to 2000 chars, product reviews only) |
| hide | int | 0 — published, 1 — moderated/hidden |
Example: get product reviews (GET)
GET https://site.com/api/commerce/comments?type=product_page&page_id=489311
Authorization: Bearer YOUR_KEY
Example: get article comments (GET)
GET https://site.com/api/commerce/comments?type=pages&page_type=blog_page&page_id=14093
Authorization: Bearer YOUR_KEY
Example: add a product review (POST)
{
"comments": [
{
"type": "product_page",
"page_type": "product_page",
"page_id": 489311,
"author_name": "John",
"author_email": "john@example.com",
"rating": 5,
"text": "Great product, I recommend it!",
"text_good": "Quality",
"text_bad": "None"
}
]
}
Request: POST https://site.com/api/commerce/comments?type=product_page
After adding, the product rating is recalculated automatically (average of all published reviews with a rating, including all multilingual versions — resolved automatically from the product's multilangid group).
Example: add an article comment (POST)
{
"comments": [
{
"type": "pages",
"page_type": "blog_page",
"page_id": 14093,
"author_name": "Mary",
"author_email": "mary@example.com",
"rating": 4,
"text": "Useful article, thank you!",
"hide": 0
}
]
}
Request: POST https://site.com/api/commerce/comments?type=pages&page_type=blog_page
Example: update a review (PUT)
{
"comments": [
{
"id": 2982,
"type": "product_page",
"page_type": "product_page",
"rating": 3,
"text": "Updated review text"
}
]
}
Request: PUT https://site.com/api/commerce/comments?type=product_page
Example response (add)
{
"code": "success",
"message": "Comment added successfully",
"comments": {
"code": "success",
"added": 2982,
"updated": "",
"id": 2982,
"hash": "7243df3f8ca25d057750284c7b536097",
"type": "product_page",
"skipped": [],
"errors": [],
"errors_global": []
}
}
Example response (list)
{
"comments": [
{
"id": 2982,
"parent_id": 0,
"author_name": "John",
"author_email": "john@example.com",
"rating": 5,
"text": "Great product, I recommend it!",
"hide": 0,
"page_id": 489311,
"page_type": "product_page",
"producer_extend": 9360
}
],
"type": "product_page",
"page": 1,
"per_page": 200,
"total": 124,
"total_pages": 1
}
Delete a review (DELETE)
DELETE https://site.com/api/commerce/comments/2982?type=product_page
Authorization: Bearer YOUR_KEY
When deleting, all replies to the review are removed and the rating and review count are recalculated.
Security notes
- Text is sanitized with the same filters as the web version (HTML tags removed, special characters escaped).
- All values pass through SQL escaping (
mysqrelescstr), numeric fields throughintval. - Rating for a root review is required (1–5); replies do not have a rating.
- Site binding is performed automatically on the API side.
- Before adding/updating, the existence of the page (product) with the given
page_idandpage_typeand its site ownership are verified; otherwise the review is not created. text_good/text_bad(Pros/Cons) are used for product reviews only; for pages/articles/categories they are ignored.- Multilingual (
multilang) is resolved automatically from the object'smultilangidgroup and is not accepted from the client. - Rating and review-count recalculation is performed for all supported page types (products, pages, articles, blog categories, shop categories, producers, collections) where rating is enabled.
- Page types
announcement_*andnews_*are not managed through this API (comments for them are not used).
This is a basic overview of the main methods for working with the Commerce API / WooCommerce API v3 for orders, products, and categories.
Below are example scripts to help you properly use the API methods in practice.