JoomShopping REST API — Full Reference
Base URL: http://site.com/api/index.php/v1/shop
Authentication
All requests require a Joomla API Token:
Authorization: Bearer <Joomla API Token>
Content-Type: application/json
Response format (JSON:API)
{
"data": {
"type": "resource-type",
"id": "1",
"attributes": { ... }
}
}
List response wraps items in "data": [...].
HTTP status codes
| Code |
Meaning |
| 200 |
OK |
| 204 |
Deleted successfully (no body) |
| 400 |
Validation error — missing required fields |
| 401 |
Unauthorized — invalid or missing token |
| 404 |
Resource not found |
Endpoints overview
Multilang note: Fields marked *multilang* are stored per language in the DB (e.g. name_en-GB). The API returns/accepts them as name, description, alias, etc. based on the active site language.
taxs
DB table: #__jshopping_taxes | PK: tax_id
Response fields
| Field |
Type |
Description |
id |
int |
Tax ID |
tax_name |
string |
Tax name |
tax_value |
float |
Tax rate (%) |
ordering |
int |
Sort order |
GET /taxs
GET /taxs
Authorization: Bearer <token>
GET /taxs/{id}
GET /taxs/1
Authorization: Bearer <token>
POST /taxs
POST /taxs
Authorization: Bearer <token>
Content-Type: application/json
{
"tax_name": "VAT 20%",
"tax_value": 20.00,
"ordering": 1
}
| Field |
Required |
tax_name |
yes |
tax_value |
yes |
ordering |
no |
PATCH /taxs/{id}
PATCH /taxs/1
Authorization: Bearer <token>
Content-Type: application/json
{
"tax_name": "VAT 22%"
}
At least one of tax_name or tax_value required.
DELETE /taxs/{id}
DELETE /taxs/1
Authorization: Bearer <token>
categories
DB table: #__jshopping_categories | PK: category_id
Response fields
| Field |
Type |
Description |
id |
int |
Category ID |
name |
string |
multilang Name |
alias |
string |
multilang Alias (slug) |
short_description |
string |
multilang Short description |
description |
string |
multilang Full description |
meta_title |
string |
multilang Meta title |
meta_description |
string |
multilang Meta description |
meta_keyword |
string |
multilang Meta keywords |
category_parent_id |
int |
Parent category ID (0 = top level) |
category_publish |
int |
Published: 1/0 |
category_template |
string |
Template override |
ordering |
int |
Sort order |
category_image |
string |
Image filename |
img_alt |
string |
Image alt text |
img_title |
string |
Image title text |
access |
int |
Joomla access level |
category_add_date |
datetime |
Created date |
products_page |
int |
Products per page |
products_row |
int |
Products per row |
product_sorting |
string |
Default sorting field |
product_sorting_direction |
int |
Sort direction: 1=asc, -1=desc |
GET /categories
GET /categories
Authorization: Bearer <token>
GET /categories/{id}
GET /categories/5
Authorization: Bearer <token>
POST /categories
POST /categories
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Electronics",
"category_parent_id": 0,
"category_publish": 1,
"ordering": 1
}
| Field |
Required |
name |
yes |
category_parent_id |
no (default 0) |
category_publish |
no (default 1) |
ordering |
no |
category_image |
no |
PATCH /categories/{id}
PATCH /categories/5
Authorization: Bearer <token>
Content-Type: application/json
{
"category_publish": 0
}
DELETE /categories/{id}
DELETE /categories/5
Authorization: Bearer <token>
attributes
DB table: #__jshopping_attr | PK: attr_id
Response fields
| Field |
Type |
Description |
id |
int |
Attribute ID |
name |
string |
multilang Name |
attr_type |
int |
Type |
attr_ordering |
int |
Sort order |
independent |
int |
Independent attribute: 1/0 |
allcats |
int |
Show in all categories: 1/0 |
cats |
string |
JSON category IDs (when allcats=0) |
group |
int |
Group ID |
publish |
int |
Published: 1/0 |
required |
int |
Required: 1/0 |
POST /attributes
POST /attributes
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Color",
"attr_type": 1,
"publish": 1
}
| Field |
Required |
name |
yes |
attr_type |
no |
publish |
no |
group |
no |
PATCH /attributes/{id}
Send any field(s) to update.
DELETE /attributes/{id} / GET /attributes / GET /attributes/{id}
Standard pattern — see taxs.
attributesgroups
DB table: #__jshopping_attr_groups | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Group ID |
name |
string |
multilang Name |
ordering |
int |
Sort order |
POST /attributesgroups
POST /attributesgroups
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Specifications",
"ordering": 1
}
| Field |
Required |
name |
yes |
ordering |
no |
attributesvalues
DB table: #__jshopping_attr_values | PK: value_id
Response fields
| Field |
Type |
Description |
id |
int |
Value ID |
name |
string |
multilang Value label |
attr_id |
int |
Parent attribute ID |
value_ordering |
int |
Sort order |
publish |
int |
Published: 1/0 |
image |
string |
Image filename |
POST /attributesvalues
POST /attributesvalues
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Red",
"attr_id": 3,
"publish": 1
}
| Field |
Required |
Notes |
name | yes | |
attr_id | yes | |
publish | no | |
value_ordering | no | |
image | no | Existing image filename |
image.base64 | no | Base64 data URI: data:image/jpeg;base64,... |
image.url | no | URL to download the image from |
countries
DB table: #__jshopping_countries | PK: country_id
Response fields
| Field |
Type |
Description |
id |
int |
Country ID |
name |
string |
multilang Country name |
country_publish |
int |
Published: 1/0 |
ordering |
int |
Sort order |
country_code |
string |
3-letter code (e.g. DEU) |
country_code_2 |
string |
2-letter code (e.g. DE) |
POST /countries
POST /countries
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Germany",
"country_code": "DEU",
"country_code_2": "DE",
"country_publish": 1
}
| Field |
Required |
name |
yes |
country_code |
yes |
country_code_2 |
no |
country_publish |
no |
coupons
DB table: #__jshopping_coupons | PK: coupon_id
Response fields
| Field |
Type |
Description |
id |
int |
Coupon ID |
coupon_code |
string |
Coupon code |
coupon_type |
int |
Type: 1=fixed, 0=percent |
coupon_value |
float |
Discount value |
tax_id |
int |
Tax ID applied to coupon |
used |
int |
Times used |
for_user_id |
int |
Restricted to user ID (0 = all) |
coupon_start_date |
date |
Valid from date |
coupon_expire_date |
date |
Expiry date |
finished_after_used |
int |
Max uses (0 = unlimited) |
coupon_publish |
int |
Active: 1/0 |
POST /coupons
POST /coupons
Authorization: Bearer <token>
Content-Type: application/json
{
"coupon_code": "SAVE10",
"coupon_type": 2,
"coupon_value": 10.00,
"coupon_expire_date": "2026-12-31 23:59:59",
"coupon_publish": 1
}
| Field |
Required |
coupon_code |
yes |
coupon_type |
yes |
coupon_value |
yes |
coupon_expire_date |
no |
for_user_id |
no |
coupon_publish |
no |
currencies
DB table: #__jshopping_currencies | PK: currency_id
Response fields
| Field |
Type |
Description |
id |
int |
Currency ID |
currency_name |
string |
Name (e.g. Euro) |
currency_code |
string |
Symbol (e.g. €) |
currency_code_iso |
string |
ISO alpha-3 code (e.g. EUR) |
currency_code_num |
string |
ISO numeric code (e.g. 978) |
currency_value |
float |
Exchange rate |
currency_publish |
int |
Published: 1/0 |
currency_ordering |
int |
Sort order |
POST /currencies
POST /currencies
Authorization: Bearer <token>
Content-Type: application/json
{
"currency_name": "Euro",
"currency_code": "€",
"currency_code_iso": "EUR",
"currency_value": 1.00,
"currency_publish": 1
}
| Field |
Required |
currency_name |
yes |
currency_code |
yes |
currency_code_iso |
no |
currency_value |
no |
currency_publish |
no |
deliverytimes
DB table: #__jshopping_delivery_times | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Delivery time ID |
name |
string |
multilang Label (e.g. 1-3 days) |
days |
int |
Number of days |
POST /deliverytimes
POST /deliverytimes
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "1-3 days",
"days": 3
}
| Field |
Required |
name |
yes |
days |
no |
exttaxes
DB table: #__jshopping_taxes_ext | PK: id
Extended tax rules with zone-based overrides.
Response fields
| Field |
Type |
Description |
id |
int |
Rule ID |
tax_id |
int |
Parent tax ID |
zones |
string |
JSON zone list |
tax |
float |
Tax rate for individuals (%) |
firma_tax |
float |
Tax rate for companies (%) |
POST /exttaxes
POST /exttaxes
Authorization: Bearer <token>
Content-Type: application/json
{
"tax_id": 1,
"tax": 20.00,
"firma_tax": 0.00,
"zones": "[1,2,3]"
}
| Field |
Required |
tax_id |
yes |
tax |
yes |
firma_tax |
no |
zones |
no |
freeattributes
DB table: #__jshopping_free_attr | PK: id
Free (custom) attributes for products.
Response fields
| Field |
Type |
Description |
id |
int |
Attribute ID |
name |
string |
multilang Name |
ordering |
int |
Sort order |
required |
int |
Required: 1/0 |
type |
int |
Input type |
publish |
int |
Published: 1/0 |
POST /freeattributes
POST /freeattributes
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Engraving",
"type": 1,
"required": 0,
"publish": 1
}
| Field |
Required |
name |
yes |
type |
no |
required |
no |
publish |
no |
manufacturers
DB table: #__jshopping_manufacturers | PK: manufacturer_id
Response fields
| Field |
Type |
Description |
id |
int |
Manufacturer ID |
name |
string |
multilang Name |
alias |
string |
multilang Alias (slug) |
short_description |
string |
multilang Short description |
description |
string |
multilang Full description |
manufacturer_url |
string |
Website URL |
manufacturer_logo |
string |
Logo filename |
manufacturer_publish |
int |
Published: 1/0 |
products_page |
int |
Products per page |
products_row |
int |
Products per row |
ordering |
int |
Sort order |
img_alt |
string |
Logo alt text |
img_title |
string |
Logo title text |
POST /manufacturers
POST /manufacturers
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Apple",
"manufacturer_url": "https://apple.com",
"manufacturer_publish": 1
}
| Field |
Required |
Notes |
name | yes | |
manufacturer_url | no | |
manufacturer_logo | no | Existing logo filename |
image.base64 | no | Base64 data URI — saves and stores in manufacturer_logo |
image.url | no | URL to download — saves and stores in manufacturer_logo |
manufacturer_publish | no | |
orders
DB table: #__jshopping_orders | PK: order_id
Response fields
| Field |
Type |
Description |
id |
int |
Order ID |
order_number |
string |
Order number |
user_id |
int |
Customer user ID |
order_total |
float |
Total amount |
order_subtotal |
float |
Subtotal |
order_tax |
float |
Tax amount |
order_shipping |
float |
Shipping cost |
order_status |
int |
Status ID |
order_created |
datetime |
Created date |
currency_code |
string |
Currency symbol |
POST /orders
POST /orders
Authorization: Bearer <token>
Content-Type: application/json
{
"user_id": 42,
"order_status": 1,
"currency_code": "₴"
}
| Field |
Required |
user_id |
yes |
order_status |
no |
currency_code |
no |
PATCH /orders/{id}
PATCH /orders/100
Authorization: Bearer <token>
Content-Type: application/json
{
"order_status": 3
}
orderstatus
DB table: #__jshopping_order_status | PK: status_id
Response fields
| Field |
Type |
Description |
id |
int |
Status ID |
name |
string |
multilang Status label |
status_code |
string |
Code (e.g. pending, shipped) |
ordering |
int |
Sort order |
POST /orderstatus
POST /orderstatus
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Pending payment",
"status_code": "pending",
"ordering": 1
}
| Field |
Required |
name |
yes |
status_code |
yes |
ordering |
no |
payments
DB table: #__jshopping_payment_method | PK: payment_id
Response fields
| Field |
Type |
Description |
id |
int |
Payment method ID |
name |
string |
multilang Name |
description |
string |
multilang Description |
payment_code |
string |
Plugin code |
payment_class |
string |
Plugin class name |
scriptname |
string |
Plugin script filename |
payment_publish |
int |
Published: 1/0 |
access |
int |
Joomla access level |
payment_ordering |
int |
Sort order |
payment_params |
string |
JSON plugin parameters |
payment_type |
int |
Type |
price |
float |
Extra fee |
price_type |
int |
Fee type: 0=fixed, 1=percent |
tax_id |
int |
Tax ID for fee |
image |
string |
Logo filename |
show_descr_in_email |
int |
Show description in email: 1/0 |
show_bank_in_order |
int |
Show bank details in order: 1/0 |
order_description |
string |
Text shown in order |
POST /payments
POST /payments
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Card payment",
"payment_code": "liqpay",
"payment_publish": 1
}
| Field |
Required |
name |
yes |
payment_code |
yes |
payment_publish |
no |
payment_ordering |
no |
fields
DB table: #__jshopping_products_extra_fields | PK: id
Extra fields for products.
Response fields
| Field |
Type |
Description |
id |
int |
Field ID |
name |
string |
multilang Field label |
type |
int |
Input type |
multilist |
int |
Allow multiple values: 1/0 |
group |
int |
Group ID |
ordering |
int |
Sort order |
publish |
int |
Published: 1/0 |
allcats |
int |
Show in all categories: 1/0 |
cats |
string |
JSON category IDs (when allcats=0) |
POST /fields
POST /fields
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Material",
"type": 1,
"publish": 1,
"allcats": 1
}
| Field |
Required |
name |
yes |
type |
no |
publish |
no |
allcats |
no |
fieldvalues
DB table: #__jshopping_products_extra_field_values | PK: id
Predefined values for list-type product extra fields.
Response fields
| Field |
Type |
Description |
id |
int |
Value ID |
name |
string |
multilang Value label |
field_id |
int |
Parent field ID |
ordering |
int |
Sort order |
publish |
int |
Published: 1/0 |
POST /fieldvalues
POST /fieldvalues
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Cotton",
"field_id": 2,
"publish": 1
}
| Field |
Required |
name |
yes |
field_id |
yes |
ordering |
no |
publish |
no |
productimages
DB table: #__jshopping_products_images | PK: image_id
Additional product images.
Response fields
| Field |
Type |
Description |
id |
int |
Image ID |
product_id |
int |
Product ID |
image_name |
string |
Image filename |
name |
string |
Alt text |
title |
string |
Title text |
ordering |
int |
Sort order |
attrs |
string |
Additional attributes (JSON) |
POST /productimages
Two upload modes are supported.
Mode 1 — existing file by name
POST /productimages
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 15,
"image_name": "product_15_2.jpg",
"name": "Front view",
"ordering": 2
}
Mode 2 — base64 upload
Pass the image as a base64 data URI in the image.base64 field. The server saves the file, generates thumbnails according to shop settings, and stores the resulting filename in image_name.
POST /productimages
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 15,
"image.base64": "data:image/jpeg;base64,/9j/4AAQSkZ...",
"name": "Front view",
"ordering": 2
}
Optionally provide image_name together with image.base64 to control the saved filename (the extension is always taken from the data URI):
{
"product_id": 15,
"image_name": "front",
"image.base64": "data:image/jpeg;base64,/9j/4AAQSkZ...",
"ordering": 1
}
Mode 3 — upload from URL
Pass a URL in the image.url field. The server downloads the file, generates thumbnails, and stores the filename in image_name.
POST /productimages
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 15,
"image.url": "http://www.site.com/img.jpg",
"name": "Front view",
"ordering": 2
}
| Field |
Required |
Notes |
product_id | yes | |
image_name | yes* | *Required if image.base64 and image.url are not provided |
image.base64 | yes* | *Required if image_name and image.url are not provided. Base64 data URI: data:image/jpeg;base64,... |
image.url | yes* | *Required if image_name and image.base64 are not provided. URL to download the image from |
name | no | Alt text |
title | no | Title text |
ordering | no | |
Processing on image.base64 / image.url upload:
- Supported formats:
jpeg/jpg, png, gif, webp
- Three variants are saved:
full_<name>, thumb_<name>, <name> — resized according to shop image settings
- If
image_name is omitted, a unique random name is generated
productlabels
DB table: #__jshopping_product_labels | PK: id
Labels/badges for products (e.g. "New", "Sale").
Response fields
| Field |
Type |
Description |
id |
int |
Label ID |
name |
string |
multilang Label name |
image |
string |
Image filename |
POST /productlabels
POST /productlabels
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "New",
"image": "label_new.png"
}
| Field |
Required |
Notes |
name | yes | |
image | no | Existing image filename |
image.base64 | no | Base64 data URI: data:image/jpeg;base64,... |
image.url | no | URL to download the image from |
products
DB table: #__jshopping_products | PK: product_id
Response fields
| Field |
Type |
Description |
id |
int |
Product ID |
parent_id |
int |
Parent product ID (0 = standalone) |
name |
string |
multilang Name |
alias |
string |
multilang Alias (slug) |
short_description |
string |
multilang Short description |
description |
string |
multilang Full description |
meta_title |
string |
multilang Meta title |
meta_description |
string |
multilang Meta description |
meta_keyword |
string |
multilang Meta keywords |
product_publish |
int |
Published: 1/0 |
product_price |
float |
Price |
product_old_price |
float |
Old (crossed-out) price |
product_buy_price |
float |
Purchase (buy) price |
min_price |
float |
Minimum price |
different_prices |
int |
Has variant prices: 1/0 |
product_quantity |
float |
Stock quantity |
unlimited |
int |
Unlimited stock: 1/0 |
product_availability |
string |
Availability code |
product_weight |
float |
Weight |
weight_volume_units |
float |
Volumetric weight |
product_ean |
string |
EAN / barcode |
manufacturer_code |
string |
Manufacturer article number |
real_ean |
string |
Real EAN |
product_manufacturer_id |
int |
Manufacturer ID |
main_category_id |
int |
Main category ID |
product_tax_id |
int |
Tax ID |
currency_id |
int |
Currency ID |
product_is_add_price |
int |
Has additional price: 1/0 |
add_price_unit_id |
int |
Additional price unit ID |
basic_price_unit_id |
int |
Basic price unit ID |
label_id |
int |
Label ID |
vendor_id |
int |
Vendor ID |
delivery_times_id |
int |
Delivery time ID |
product_template |
string |
Template override |
product_url |
string |
External product URL |
image |
string |
Main image filename |
average_rating |
float |
Average review rating |
reviews_count |
int |
Number of reviews |
hits |
int |
View count |
product_date_added |
datetime |
Created date |
date_modify |
datetime |
Last modified date |
access |
int |
Joomla access level |
ordering |
int |
Sort order |
categories |
int[] |
Category IDs (array of ints) |
images |
object[] |
Product images — see fields below |
attrs |
object[] |
Attribute combinations — see fields below |
attr2s |
object[] |
Attribute2 values — see fields below |
files |
object[] |
Downloadable files — see fields below |
freeattrs |
object[] |
Free attribute links — see fields below |
options |
object[] |
Product options — see fields below |
prices |
object[] |
Group/volume prices — see fields below |
relations |
object[] |
Related products — see fields below |
videos |
object[] |
Videos — see fields below |
fields |
object |
Extra product fields — see fields below |
Note: Sub-resource arrays (images, attrs, etc.) and fields are returned only for GET item (/products/{id}). They are not included in the list response (GET /products). Use list[display]=short to get a minimal list without some optional fields.
images fields
| Field | Type | Description |
id | int | Image ID |
image_name | string | Image filename |
name | string | Alt name |
title | string | Title attribute |
ordering | int | Sort order |
attrs | string | Extra attributes |
attrs fields (attribute combinations)
| Field | Type | Description |
id | int | Attr record ID |
buy_price | float | Purchase price |
price | float | Sell price |
old_price | float | Old price |
count | float | Stock count |
ean | string | EAN |
manufacturer_code | string | Manufacturer code |
real_ean | string | Real EAN |
weight | float | Weight |
weight_volume_units | float | Volumetric weight |
ext_attribute_product_id | int | External attribute product ID |
attrs | object | Attribute values map: {"attr_id": value_id, ...} |
Example attrs item:
{
"price": "90.0000",
"count": "1.0000",
"ean": "A1",
"attrs": {
"4": 6
}
}
attr2s fields (attribute2 values)
| Field | Type | Description |
id | int | Record ID |
attr_id | int | Attribute ID |
attr_value_id | int | Attribute value ID |
price_mod | string | Price modifier sign (+ / -) |
addprice | float | Additional price |
Example attr2s item:
{"attr_id": "1", "attr_value_id": "1", "price_mod": "+", "addprice": 20}
files fields
| Field | Type | Description |
id | int | File ID |
demo | string | Demo file name |
demo_descr | string | Demo file description |
file | string | Full file name |
file_descr | string | File description |
ordering | int | Sort order |
freeattrs fields
| Field | Type | Description |
id | int | Record ID |
attr_id | int | Free attribute ID |
options fields
| Field | Type | Description |
id | int | Option ID |
key | string | Option key |
value | string | Option value |
prices fields (group/volume prices)
| Field | Type | Description |
id | int | Price record ID |
discount | float | Discount value |
product_quantity_start | float | Quantity range start |
product_quantity_finish | float | Quantity range end |
relations fields
| Field | Type | Description |
id | int | Record ID |
product_related_id | int | Related product ID |
videos fields
| Field | Type | Description |
id | int | Video ID |
video_name | string | Video filename |
video_code | string | Embed code |
video_preview | string | Preview image filename |
fields (extra product fields)
Object with extra product field values. Keys are field IDs (strings). Each value is either an ID from fieldvalues (current) or a raw string value (legacy).
"fields": {
"1": "4",
"2": "165",
"4": 0,
"60": 0
}
See productfields for managing these values directly.
GET /products — List filters & sorting
Query parameters for the list endpoint:
| Parameter | Type | Description | Example |
filter[category] | int | Filter by category ID | filter[category]=5 |
list[ordering] | string | Sort field. Allowed: product_id, p.product_id, product_price, p.product_price, product_date_added, p.product_date_added, hits, p.hits, average_rating, p.average_rating | list[ordering]=product_price |
list[direction] | string | Sort direction: ASC or DESC | list[direction]=DESC |
list[display] | string | Field set: omit for full, short for minimal set | list[display]=short |
page[limit] | int | Items per page (Joomla pagination) | page[limit]=20 |
page[offset] | int | Offset (Joomla pagination) | page[offset]=40 |
Example — published products in category 5, sorted by price descending, 20 per page:
GET /products?filter[category]=5&list[ordering]=product_price&list[direction]=DESC&page[limit]=20
list[display]=short returns only: id, name, alias, short_description, product_ean, manufacturer_code, real_ean, product_quantity, unlimited, product_availability, product_date_added, date_modify, product_publish, product_price, min_price, product_weight, image, product_manufacturer_id, hits, label_id, vendor_id, main_category_id.
POST /products
POST /products
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "iPhone 15",
"product_price": 29999.00,
"product_quantity": 10,
"product_publish": 1,
"main_category_id": 5,
"product_manufacturer_id": 2
}
| Field |
Required |
name |
yes |
product_price |
no |
product_quantity |
no |
product_publish |
no |
main_category_id |
no |
product_manufacturer_id |
no |
PATCH /products/{id}
PATCH /products/15
Authorization: Bearer <token>
Content-Type: application/json
{
"product_price": 27999.00,
"product_publish": 1
}
Multilang fields
Fields name, alias, short_description, description, meta_title, meta_description, meta_keyword can be passed without a language suffix — they are automatically mapped to the active language (e.g., name → name_en).
The description and images fields are not HTML-stripped (raw mode).
Nested fields
When creating or editing a product, related data can be embedded directly in the request body. Each nested item accepts the same fields as the corresponding standalone API endpoint — product_id is set automatically and must not be included.
Full POST example
POST /products
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Product new <b>test</b>",
"description": "descr <b>Bold</b>",
"product_price": 10.00,
"categories": [1, 2],
"attrs2": [
{"attr_id": "1", "attr_value_id": "1", "price_mod": "+", "addprice": 20}
],
"attrs": [
{
"price": 90.00,
"count": 1,
"ean": "A1",
"attrs": {"4": 6}
},
{
"price": 95.00,
"count": 1,
"ean": "A2",
"attrs": {"4": 7}
}
],
"files": [
{"demo": "1.mp3", "demo_descr": "descr"}
],
"videos": [
{"video_name": "1.mp4"}
],
"relations": [
{"product_related_id": 1},
{"product_related_id": 2}
],
"freeattrs": [
{"attr_id": 1}
],
"images": [
{"image.base64": "data:image/jpeg;base64,/9j/4AAQ...="},
{"image_name": "front.jpg", "image.url": "http://www.site.com/img.jpg"}
]
}
Nested arrays are processed independently — if a nested item already exists (matched by its unique keys), it is updated; otherwise it is created. On PATCH, only the nested keys that are present in the request are touched; omitted keys are left unchanged.
reviews
DB table: #__jshopping_products_reviews | PK: review_id
Response fields
| Field |
Type |
Description |
id |
int |
Review ID |
product_id |
int |
Product ID |
user_id |
int |
Joomla user ID |
user_name |
string |
Display name |
user_email |
string |
Email |
mark |
int |
Rating (1–5) |
review |
string |
Review text |
time |
datetime |
Posted date |
publish |
int |
Published: 1/0 |
ip |
string |
IP address of reviewer |
POST /reviews
POST /reviews
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 15,
"user_name": "John",
"user_email": "john@example.com",
"review": "Great product!",
"mark": 5,
"publish": 1
}
| Field |
Required |
product_id |
yes |
review |
yes |
mark |
yes |
user_name |
no |
user_email |
no |
publish |
no |
shippings
DB table: #__jshopping_shipping_method | PK: shipping_id
Response fields
| Field |
Type |
Description |
id |
int |
Shipping method ID |
name |
string |
multilang Name |
description |
string |
multilang Description |
alias |
string |
Plugin alias/code |
published |
int |
Published: 1/0 |
access |
int |
Joomla access level |
payments |
string |
Allowed payment method IDs (comma-separated) |
image |
string |
Image filename |
ordering |
int |
Sort order |
params |
string |
JSON plugin parameters |
POST /shippings
POST /shippings
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Nova Post",
"alias": "novaposhta",
"published": 1
}
| Field |
Required |
name |
yes |
alias |
no |
published |
no |
ordering |
no |
shippingsprices
DB table: #__jshopping_shipping_method_price | PK: sh_pr_method_id
Price rules for shipping methods.
Response fields
| Field |
Type |
Description |
id |
int |
Rule ID |
shipping_method_id |
int |
Shipping method ID |
shipping_tax_id |
int |
Tax ID for shipping cost |
shipping_stand_price |
float |
Standard shipping price |
package_tax_id |
int |
Tax ID for package cost |
package_stand_price |
float |
Standard package price |
delivery_times_id |
int |
Delivery time ID |
params |
string |
JSON additional parameters |
POST /shippingsprices
POST /shippingsprices
Authorization: Bearer <token>
Content-Type: application/json
{
"shipping_method_id": 2,
"shipping_stand_price": 60.00,
"shipping_tax_id": 0,
"delivery_times_id": 1
}
| Field |
Required |
shipping_method_id |
yes |
shipping_stand_price |
no |
shipping_tax_id |
no |
delivery_times_id |
no |
units
DB table: #__jshopping_unit | PK: id
Units of measure.
Response fields
| Field |
Type |
Description |
id |
int |
Unit ID |
name |
string |
multilang Unit name |
qty |
float |
Default quantity step |
POST /units
POST /units
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "pcs",
"qty": 1
}
| Field |
Required |
name |
yes |
qty |
no |
usergroups
DB table: #__jshopping_usergroups | PK: usergroup_id
Response fields
| Field |
Type |
Description |
id |
int |
Group ID |
name |
string |
multilang Name |
usergroup_name |
string |
Internal group name |
usergroup_discount |
float |
Default discount (%) |
usergroup_description |
string |
Description |
usergroup_is_default |
int |
Default group: 1/0 |
POST /usergroups
POST /usergroups
Authorization: Bearer <token>
Content-Type: application/json
{
"usergroup_name": "VIP",
"usergroup_discount": 15.00,
"usergroup_is_default": 0
}
| Field |
Required |
usergroup_name |
yes |
usergroup_discount |
no |
usergroup_description |
no |
usergroup_is_default |
no |
users
DB table: #__jshopping_users | PK: user_id
Shop customer profiles (linked to Joomla users).
Response fields
| Field |
Type |
Description |
id |
int |
User ID (= Joomla user ID) |
usergroup_id |
int |
Shop user group ID |
payment_id |
int |
Default payment method ID |
shipping_id |
int |
Default shipping method ID |
u_name |
string |
Username |
number |
string |
Customer number |
title |
int |
Title (0=Mr, 1=Mrs, etc.) |
f_name |
string |
First name |
l_name |
string |
Last name |
m_name |
string |
Middle name |
firma_name |
string |
Company name |
client_type |
int |
Client type: 0=individual, 1=company |
firma_code |
string |
Company registration code |
tax_number |
string |
VAT / tax number |
email |
string |
Email |
birthday |
date |
Date of birth |
street |
string |
Street |
street_nr |
string |
Street number |
home |
string |
Building |
apartment |
string |
Apartment |
zip |
string |
Postal code |
city |
string |
City |
state |
string |
State / region |
country |
int |
Country ID |
phone |
string |
Phone |
mobil_phone |
string |
Mobile phone |
fax |
string |
Fax |
ext_field_1 |
string |
Extra field 1 |
ext_field_2 |
string |
Extra field 2 |
ext_field_3 |
string |
Extra field 3 |
delivery_adress |
int |
Has separate delivery address: 1/0 |
d_title |
int |
Delivery title |
d_f_name |
string |
Delivery first name |
d_l_name |
string |
Delivery last name |
d_m_name |
string |
Delivery middle name |
d_firma_name |
string |
Delivery company name |
d_email |
string |
Delivery email |
d_birthday |
date |
Delivery contact birthday |
d_street |
string |
Delivery street |
d_street_nr |
string |
Delivery street number |
d_home |
string |
Delivery building |
d_apartment |
string |
Delivery apartment |
d_zip |
string |
Delivery postal code |
d_city |
string |
Delivery city |
d_state |
string |
Delivery state / region |
d_country |
int |
Delivery country ID |
d_phone |
string |
Delivery phone |
d_mobil_phone |
string |
Delivery mobile phone |
d_fax |
string |
Delivery fax |
d_ext_field_1 |
string |
Delivery extra field 1 |
d_ext_field_2 |
string |
Delivery extra field 2 |
d_ext_field_3 |
string |
Delivery extra field 3 |
lang |
string |
Language tag |
POST /users
POST /users
Authorization: Bearer <token>
Content-Type: application/json
{
"user_id": 42,
"f_name": "John",
"l_name": "Smith",
"email": "john@example.com",
"usergroup_id": 1
}
| Field |
Required |
user_id |
yes (Joomla user ID) |
f_name |
no |
l_name |
no |
email |
no |
usergroup_id |
no |
phone |
no |
city |
no |
country |
no |
PATCH /users/{id}
PATCH /users/42
Authorization: Bearer <token>
Content-Type: application/json
{
"usergroup_id": 2,
"phone": "+380501234567"
}
vendors
DB table: #__jshopping_vendors | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Vendor ID |
shop_name |
string |
Shop/store name |
company_name |
string |
Legal company name |
url |
string |
Website |
logo |
string |
Logo filename |
adress |
string |
Street address |
city |
string |
City |
zip |
string |
Postal code |
state |
string |
State / region |
country |
int |
Country ID |
f_name |
string |
Contact first name |
l_name |
string |
Contact last name |
middlename |
string |
Contact middle name |
phone |
string |
Phone |
fax |
string |
Fax |
email |
string |
Contact email |
benef_bank_info |
string |
Beneficiary bank info |
benef_bic |
string |
BIC |
benef_conto |
string |
Account number |
benef_payee |
string |
Payee name |
benef_iban |
string |
IBAN |
benef_bic_bic |
string |
BIC of beneficiary bank |
benef_swift |
string |
SWIFT code |
interm_name |
string |
Intermediary bank name |
interm_swift |
string |
Intermediary SWIFT |
identification_number |
string |
Company ID number |
tax_number |
string |
Tax / VAT number |
additional_information |
string |
Extra notes |
user_id |
int |
Joomla user ID |
main |
int |
Is main vendor: 1/0 |
publish |
int |
Published: 1/0 |
POST /vendors
POST /vendors
Authorization: Bearer <token>
Content-Type: application/json
{
"shop_name": "MyShop",
"email": "shop@example.com",
"user_id": 55,
"publish": 1
}
| Field |
Required |
Notes |
shop_name | yes | |
email | yes | |
user_id | no | |
company_name | no | |
url | no | |
logo | no | Existing logo filename |
logo.base64 | no | Base64 data URI — saves and stores in logo |
logo.url | no | URL to download — saves and stores in logo |
city | no | |
country | no | |
publish | no | |
orderitems
DB table: #__jshopping_order_item | PK: order_item_id
Response fields
| Field |
Type |
Description |
order_item_id |
int |
Item ID |
order_id |
int |
Order ID |
product_id |
int |
Product ID |
category_id |
int |
Category ID |
product_ean |
string |
EAN code |
manufacturer_code |
string |
Manufacturer code |
real_ean |
string |
Real EAN |
product_name |
string |
Product name at time of order |
product_quantity |
decimal |
Quantity |
product_item_price |
decimal |
Unit price |
product_tax |
decimal |
Tax amount |
product_attributes |
string |
Serialized attributes |
product_freeattributes |
string |
Serialized free attributes |
attributes |
string |
Attributes (JSON) |
freeattributes |
string |
Free attributes (JSON) |
extra_fields |
string |
Extra fields (JSON) |
files |
string |
Files (JSON) |
weight |
decimal |
Product weight |
thumb_image |
string |
Thumbnail filename |
manufacturer |
string |
Manufacturer name |
delivery_times_id |
int |
Delivery time ID |
vendor_id |
int |
Vendor ID |
basicprice |
decimal |
Base price per unit |
basicpriceunit |
string |
Base price unit label |
params |
string |
Extra params (JSON) |
GET /orderitems
GET /orderitems
Authorization: Bearer <token>
GET /orderitems/{id}
GET /orderitems/1
Authorization: Bearer <token>
POST /orderitems
POST /orderitems
Authorization: Bearer <token>
Content-Type: application/json
{
"order_id": 10,
"product_id": 5,
"product_name": "Product Name",
"product_quantity": 2,
"product_item_price": 19.99
}
| Field |
Required |
order_id |
yes |
product_id |
yes |
product_name |
no |
product_quantity |
no |
product_item_price |
no |
PATCH /orderitems/{id}
PATCH /orderitems/1
Authorization: Bearer <token>
Content-Type: application/json
{
"product_quantity": 3
}
At least one field required (except order_item_id).
DELETE /orderitems/{id}
DELETE /orderitems/1
Authorization: Bearer <token>
languages
DB table: #__jshopping_languages | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Language ID |
language |
string |
Language code (e.g. en-GB) |
name |
string |
Language display name |
publish |
int |
Published: 1/0 |
ordering |
int |
Sort order |
GET /languages
GET /languages
Authorization: Bearer <token>
GET /languages/{id}
GET /languages/1
Authorization: Bearer <token>
POST /languages
POST /languages
Authorization: Bearer <token>
Content-Type: application/json
{
"language": "en-GB",
"name": "English",
"publish": 1,
"ordering": 1
}
| Field |
Required |
language |
yes |
name |
yes |
publish |
no |
ordering |
no |
PATCH /languages/{id}
PATCH /languages/1
Authorization: Bearer <token>
Content-Type: application/json
{
"publish": 0
}
At least one field required (except id).
DELETE /languages/{id}
DELETE /languages/1
Authorization: Bearer <token>
addons
DB table: #__jshopping_addons | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Addon ID |
alias |
string |
Unique alias |
name |
string |
Addon name |
key |
string |
License key |
usekey |
int |
Require key: 1/0 |
version |
string |
Version string |
uninstall |
string |
Uninstall handler |
params |
string |
Params (JSON) |
publish |
int |
Published: 1/0 (-1 = disabled) |
config |
string |
Config (JSON) |
GET /addons
GET /addons
Authorization: Bearer <token>
GET /addons/{id}
GET /addons/1
Authorization: Bearer <token>
POST /addons
POST /addons
Authorization: Bearer <token>
Content-Type: application/json
{
"alias": "myaddon",
"name": "My Addon",
"version": "1.0.0",
"publish": 1
}
| Field |
Required |
alias |
yes |
name |
yes |
version |
no |
publish |
no |
params |
no |
config |
no |
PATCH /addons/{id}
PATCH /addons/1
Authorization: Bearer <token>
Content-Type: application/json
{
"publish": 0
}
At least one field required (except id).
DELETE /addons/{id}
DELETE /addons/1
Authorization: Bearer <token>
configs
DB table: #__jshopping_configs | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Record ID |
config_id |
int |
Config group ID |
key |
string |
Config key |
value |
string |
Config value |
GET /configs
GET /configs
Authorization: Bearer <token>
GET /configs/{id}
GET /configs/1
Authorization: Bearer <token>
POST /configs
POST /configs
Authorization: Bearer <token>
Content-Type: application/json
{
"config_id": 1,
"key": "shop_name",
"value": "My Shop"
}
| Field |
Required |
key |
yes |
config_id |
no (default 1) |
value |
no |
PATCH /configs/{id}
PATCH /configs/1
Authorization: Bearer <token>
Content-Type: application/json
{
"value": "New Value"
}
At least one of key, value, or config_id required.
DELETE /configs/{id}
DELETE /configs/1
Authorization: Bearer <token>
configseos
DB table: #__jshopping_config_seo | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Record ID |
alias |
string |
SEO alias |
ordering |
int |
Sort order |
GET /configseos
GET /configseos
Authorization: Bearer <token>
GET /configseos/{id}
GET /configseos/1
Authorization: Bearer <token>
POST /configseos
POST /configseos
Authorization: Bearer <token>
Content-Type: application/json
{
"alias": "shop",
"ordering": 1
}
| Field |
Required |
alias |
yes |
ordering |
no |
PATCH /configseos/{id}
PATCH /configseos/1
Authorization: Bearer <token>
Content-Type: application/json
{
"ordering": 2
}
At least one field required (except id).
DELETE /configseos/{id}
DELETE /configseos/1
Authorization: Bearer <token>
configstatictexts
DB table: #__jshopping_config_statictext | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Record ID |
alias |
string |
Text alias |
use_for_return_policy |
int |
Use as return policy: 1/0 |
GET /configstatictexts
GET /configstatictexts
Authorization: Bearer <token>
GET /configstatictexts/{id}
GET /configstatictexts/1
Authorization: Bearer <token>
POST /configstatictexts
POST /configstatictexts
Authorization: Bearer <token>
Content-Type: application/json
{
"alias": "terms",
"use_for_return_policy": 0
}
| Field |
Required |
alias |
yes |
use_for_return_policy |
no |
PATCH /configstatictexts/{id}
PATCH /configstatictexts/1
Authorization: Bearer <token>
Content-Type: application/json
{
"use_for_return_policy": 1
}
At least one field required (except id).
DELETE /configstatictexts/{id}
DELETE /configstatictexts/1
Authorization: Bearer <token>
importexports
DB table: #__jshopping_import_export | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Record ID |
name |
string |
Profile name |
alias |
string |
Alias (slug) |
description |
string |
Description |
params |
string |
Params (JSON) |
endstart |
int |
End/start flag |
steptime |
int |
Step time (seconds) |
GET /importexports
GET /importexports
Authorization: Bearer <token>
GET /importexports/{id}
GET /importexports/1
Authorization: Bearer <token>
POST /importexports
POST /importexports
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Products CSV Import",
"alias": "products-csv-import"
}
| Field |
Required |
name |
yes |
alias |
yes |
description |
no |
params |
no |
steptime |
no |
PATCH /importexports/{id}
PATCH /importexports/1
Authorization: Bearer <token>
Content-Type: application/json
{
"steptime": 60
}
At least one field required (except id).
DELETE /importexports/{id}
DELETE /importexports/1
Authorization: Bearer <token>
orderhistorys
DB table: #__jshopping_order_history | PK: order_history_id
Response fields
| Field |
Type |
Description |
order_history_id |
int |
History record ID |
order_id |
int |
Order ID |
order_status_id |
int |
Status ID |
status_date_added |
datetime |
Date of status change |
customer_notify |
int |
Notify customer: 1/0 |
comments |
string |
Comments |
include_comment |
int |
Include comment in email: 1/0 |
GET /orderhistorys
GET /orderhistorys
Authorization: Bearer <token>
GET /orderhistorys/{id}
GET /orderhistorys/1
Authorization: Bearer <token>
POST /orderhistorys
POST /orderhistorys
Authorization: Bearer <token>
Content-Type: application/json
{
"order_id": 10,
"order_status_id": 2,
"customer_notify": 1,
"comments": "Shipped via DHL"
}
| Field |
Required |
order_id |
yes |
order_status_id |
no |
customer_notify |
no |
comments |
no |
include_comment |
no |
PATCH /orderhistorys/{id}
PATCH /orderhistorys/1
Authorization: Bearer <token>
Content-Type: application/json
{
"comments": "Updated tracking info"
}
At least one field required (except order_history_id).
DELETE /orderhistorys/{id}
DELETE /orderhistorys/1
Authorization: Bearer <token>
paymenttrxs
DB table: #__jshopping_payment_trx | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Transaction ID |
order_id |
int |
Order ID |
transaction |
string |
Transaction reference |
rescode |
int |
Response code |
status_id |
int |
Transaction status ID |
date |
datetime |
Transaction date |
GET /paymenttrxs
GET /paymenttrxs
Authorization: Bearer <token>
GET /paymenttrxs/{id}
GET /paymenttrxs/1
Authorization: Bearer <token>
POST /paymenttrxs
POST /paymenttrxs
Authorization: Bearer <token>
Content-Type: application/json
{
"order_id": 10,
"transaction": "TXN_ABC123",
"rescode": 0,
"status_id": 1
}
| Field |
Required |
order_id |
yes |
transaction |
no |
rescode |
no |
status_id |
no |
date |
no |
PATCH /paymenttrxs/{id}
PATCH /paymenttrxs/1
Authorization: Bearer <token>
Content-Type: application/json
{
"status_id": 2
}
At least one field required (except id).
DELETE /paymenttrxs/{id}
DELETE /paymenttrxs/1
Authorization: Bearer <token>
paymenttrxdatas
DB table: #__jshopping_payment_trx_data | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Record ID |
trx_id |
int |
Transaction ID (FK to paymenttrxs) |
order_id |
int |
Order ID |
key |
string |
Data key |
value |
string |
Data value |
GET /paymenttrxdatas
GET /paymenttrxdatas
Authorization: Bearer <token>
GET /paymenttrxdatas/{id}
GET /paymenttrxdatas/1
Authorization: Bearer <token>
POST /paymenttrxdatas
POST /paymenttrxdatas
Authorization: Bearer <token>
Content-Type: application/json
{
"trx_id": 1,
"order_id": 10,
"key": "payer_email",
"value": "user@example.com"
}
| Field |
Required |
trx_id |
yes |
order_id |
yes |
key |
yes |
value |
no |
PATCH /paymenttrxdatas/{id}
PATCH /paymenttrxdatas/1
Authorization: Bearer <token>
Content-Type: application/json
{
"value": "updated@example.com"
}
At least one field required (except id).
DELETE /paymenttrxdatas/{id}
DELETE /paymenttrxdatas/1
Authorization: Bearer <token>
productsattrs
DB table: #__jshopping_products_attr | PK: product_attr_id
Response fields
| Field |
Type |
Description |
product_attr_id |
int |
Attribute variant ID |
product_id |
int |
Product ID |
buy_price |
decimal |
Purchase price |
price |
decimal |
Sale price |
old_price |
decimal |
Old/crossed-out price |
count |
decimal |
Stock quantity |
ean |
string |
EAN / barcode |
manufacturer_code |
string |
Manufacturer SKU |
real_ean |
string |
Real EAN |
weight |
decimal |
Weight |
weight_volume_units |
decimal |
Volumetric weight units |
ext_attribute_product_id |
int |
External attribute product ID |
attrs |
object |
Attribute values map: {"attr_id": value_id, ...} |
Example response:
{
"product_attr_id": 19,
"product_id": 3,
"buy_price": "0.00",
"price": "90.0000",
"old_price": "100.0000",
"count": "1.0000",
"ean": "9781741105704",
"manufacturer_code": "",
"real_ean": "",
"weight": "1500.0000",
"weight_volume_units": "0.0000",
"ext_attribute_product_id": 0,
"id": 19,
"attrs": {
"1": 0,
"2": 0,
"4": 6
}
}
GET /productsattrs
GET /productsattrs
Authorization: Bearer <token>
GET /productsattrs/{id}
GET /productsattrs/1
Authorization: Bearer <token>
POST /productsattrs
POST /productsattrs
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 3,
"attrs": {
"1": 0,
"2": 0,
"4": 6
},
"price": 90.00,
"count": 1
}
| Field |
Required |
Description |
product_id | yes | Product ID |
attrs | yes | Attribute values map: {"attr_id": value_id, ...} |
price | no | Sale price |
old_price | no | Old price |
buy_price | no | Purchase price |
count | no | Stock quantity |
ean | no | EAN / barcode |
weight | no | Weight |
PATCH /productsattrs/{id}
PATCH /productsattrs/1
Authorization: Bearer <token>
Content-Type: application/json
{
"attrs": {
"4": 7
},
"count": 50
}
At least one field required (except product_attr_id).
DELETE /productsattrs/{id}
DELETE /productsattrs/1
Authorization: Bearer <token>
productsattr2s
DB table: #__jshopping_products_attr2 | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Record ID |
product_id |
int |
Product ID |
attr_id |
int |
Attribute ID |
attr_value_id |
int |
Attribute value ID |
price_mod |
string |
Price modifier sign (+ / -) |
addprice |
decimal |
Price addition/subtraction |
GET /productsattr2s
GET /productsattr2s
Authorization: Bearer <token>
Filters
| Parameter | Type | Description |
filter[product_id] | int | Filter by product ID |
Example:
GET /productsattr2s?filter[product_id]=5
Authorization: Bearer <token>
GET /productsattr2s/{id}
GET /productsattr2s/1
Authorization: Bearer <token>
POST /productsattr2s
POST /productsattr2s
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"attr_id": 2,
"attr_value_id": 10,
"price_mod": "+",
"addprice": 5.00
}
| Field |
Required |
product_id |
yes |
attr_id |
yes |
attr_value_id |
yes |
price_mod |
no |
addprice |
no |
PATCH /productsattr2s/{id}
PATCH /productsattr2s/1
Authorization: Bearer <token>
Content-Type: application/json
{
"addprice": 10.00
}
At least one field required (except id).
DELETE /productsattr2s/{id}
DELETE /productsattr2s/1
Authorization: Bearer <token>
productsfreeattrs
DB table: #__jshopping_products_free_attr | PK: id
Links products to free (custom) attributes.
Response fields
| Field |
Type |
Description |
id | int | Record ID |
product_id | int | Product ID |
attr_id | int | Free attribute ID (FK → #__jshopping_free_attr) |
GET /productsfreeattrs
GET /productsfreeattrs
Authorization: Bearer <token>
GET /productsfreeattrs/{id}
GET /productsfreeattrs/1
Authorization: Bearer <token>
POST /productsfreeattrs
POST /productsfreeattrs
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"attr_id": 2
}
| Field |
Required |
product_id | yes |
attr_id | yes |
PATCH /productsfreeattrs/{id}
PATCH /productsfreeattrs/1
Authorization: Bearer <token>
Content-Type: application/json
{
"attr_id": 3
}
DELETE /productsfreeattrs/{id}
DELETE /productsfreeattrs/1
Authorization: Bearer <token>
productsfiles
DB table: #__jshopping_products_files | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
File record ID |
product_id |
int |
Product ID |
demo |
string |
Demo file filename |
demo_descr |
string |
Demo file description |
file |
string |
Full file filename |
file_descr |
string |
Full file description |
ordering |
int |
Sort order |
GET /productsfiles
GET /productsfiles
Authorization: Bearer <token>
GET /productsfiles/{id}
GET /productsfiles/1
Authorization: Bearer <token>
POST /productsfiles
POST /productsfiles
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"file": "product_manual.pdf",
"file_descr": "User manual"
}
| Field |
Required |
Notes |
product_id | yes | |
file | no | Existing full-file filename |
file.base64 | no | Base64 data URI — saves and stores in file |
file.url | no | URL to download — saves and stores in file |
file_descr | no | |
demo | no | Existing demo-file filename |
demo.base64 | no | Base64 data URI — saves and stores in demo |
demo.url | no | URL to download — saves and stores in demo |
demo_descr | no | |
ordering | no | |
PATCH /productsfiles/{id}
PATCH /productsfiles/1
Authorization: Bearer <token>
Content-Type: application/json
{
"ordering": 2
}
At least one field required (except id).
DELETE /productsfiles/{id}
DELETE /productsfiles/1
Authorization: Bearer <token>
productsoptions
DB table: #__jshopping_products_option | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Option record ID |
product_id |
int |
Product ID |
key |
string |
Option key (unique per product) |
value |
string |
Option value |
GET /productsoptions
GET /productsoptions
Authorization: Bearer <token>
GET /productsoptions/{id}
GET /productsoptions/1
Authorization: Bearer <token>
POST /productsoptions
POST /productsoptions
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"key": "warranty",
"value": "2 years"
}
| Field |
Required |
product_id |
yes |
key |
yes |
value |
no |
PATCH /productsoptions/{id}
PATCH /productsoptions/1
Authorization: Bearer <token>
Content-Type: application/json
{
"value": "3 years"
}
At least one field required (except id).
DELETE /productsoptions/{id}
DELETE /productsoptions/1
Authorization: Bearer <token>
productsprices
DB table: #__jshopping_products_prices | PK: price_id
Response fields
| Field |
Type |
Description |
price_id |
int |
Price rule ID |
product_id |
int |
Product ID |
discount |
decimal |
Discount amount |
product_quantity_start |
int |
Min quantity for this price |
product_quantity_finish |
int |
Max quantity for this price (0 = unlimited) |
GET /productsprices
GET /productsprices
Authorization: Bearer <token>
GET /productsprices/{id}
GET /productsprices/1
Authorization: Bearer <token>
POST /productsprices
POST /productsprices
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"discount": 5.00,
"product_quantity_start": 10,
"product_quantity_finish": 0
}
| Field |
Required |
product_id |
yes |
discount |
no |
product_quantity_start |
no |
product_quantity_finish |
no |
PATCH /productsprices/{id}
PATCH /productsprices/1
Authorization: Bearer <token>
Content-Type: application/json
{
"discount": 10.00
}
At least one field required (except price_id).
DELETE /productsprices/{id}
DELETE /productsprices/1
Authorization: Bearer <token>
productsrelations
DB table: #__jshopping_products_relations | PK: id
Response fields
| Field |
Type |
Description |
id |
int |
Relation ID |
product_id |
int |
Source product ID |
product_related_id |
int |
Related product ID |
GET /productsrelations
GET /productsrelations
Authorization: Bearer <token>
GET /productsrelations/{id}
GET /productsrelations/1
Authorization: Bearer <token>
POST /productsrelations
POST /productsrelations
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"product_related_id": 12
}
| Field |
Required |
product_id |
yes |
product_related_id |
yes |
PATCH /productsrelations/{id}
PATCH /productsrelations/1
Authorization: Bearer <token>
Content-Type: application/json
{
"product_related_id": 15
}
At least one field required (except id).
DELETE /productsrelations/{id}
DELETE /productsrelations/1
Authorization: Bearer <token>
productfields
DB table: #__jshopping_products_to_extra_fields | PK: product_id
Extra field values for a product. Returned as a fields object where keys are field IDs and values are IDs from fieldvalues (or raw string for legacy fields).
Response fields
| Field |
Type |
Description |
product_id |
int |
Product ID (PK) |
fields |
object |
Extra field values, keyed by field ID |
GET /productfields
GET /productfields
Authorization: Bearer <token>
GET /productfields/{product_id}
GET /productfields/1
Authorization: Bearer <token>
Response:
{
"data": {
"type": "productfields",
"id": "1",
"attributes": {
"product_id": 1,
"fields": {
"1": "4",
"2": "165",
"4": 0,
"60": 0
}
}
}
}
POST /productfields
POST /productfields
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 11,
"fields": {
"1": "4",
"2": "120"
}
}
| Field |
Required |
product_id |
yes |
fields |
yes |
PATCH /productfields/{product_id}
PATCH /productfields/1
Authorization: Bearer <token>
Content-Type: application/json
{
"fields": {
"1": "4",
"2": "165",
"4": 0,
"60": 0
}
}
fields is required. Only the provided keys are updated; other existing columns are preserved.
DELETE /productfields/{product_id}
DELETE /productfields/1
Authorization: Bearer <token>
productsvideos
DB table: #__jshopping_products_videos | PK: video_id
Response fields
| Field |
Type |
Description |
video_id |
int |
Video ID |
product_id |
int |
Product ID |
video_name |
string |
Video title |
video_code |
string |
Embed code / URL |
video_preview |
string |
Preview image filename |
GET /productsvideos
GET /productsvideos
Authorization: Bearer <token>
GET /productsvideos/{id}
GET /productsvideos/1
Authorization: Bearer <token>
POST /productsvideos
POST /productsvideos
Authorization: Bearer <token>
Content-Type: application/json
{
"product_id": 5,
"video_name": "Product Overview",
"video_code": "<iframe ...></iframe>"
}
| Field |
Required |
Notes |
product_id | yes | |
video_name | no | |
video_code | no | |
video_preview | no | Existing preview image filename |
video_preview.base64 | no | Base64 data URI — saves and stores in video_preview |
video_preview.url | no | URL to download — saves and stores in video_preview |
PATCH /productsvideos/{id}
PATCH /productsvideos/1
Authorization: Bearer <token>
Content-Type: application/json
{
"video_name": "Updated Title"
}
At least one field required (except video_id).
DELETE /productsvideos/{id}
DELETE /productsvideos/1
Authorization: Bearer <token>
shippingmethodpricecountries
DB table: #__jshopping_shipping_method_price_countries | PK: sh_method_country_id
Response fields
| Field |
Type |
Description |
sh_method_country_id |
int |
Record ID |
country_id |
int |
Country ID |
sh_pr_method_id |
int |
Shipping price method ID |
GET /shippingmethodpricecountries
GET /shippingmethodpricecountries
Authorization: Bearer <token>
GET /shippingmethodpricecountries/{id}
GET /shippingmethodpricecountries/1
Authorization: Bearer <token>
POST /shippingmethodpricecountries
POST /shippingmethodpricecountries
Authorization: Bearer <token>
Content-Type: application/json
{
"country_id": 3,
"sh_pr_method_id": 1
}
| Field |
Required |
country_id |
yes |
sh_pr_method_id |
yes |
PATCH /shippingmethodpricecountries/{id}
PATCH /shippingmethodpricecountries/1
Authorization: Bearer <token>
Content-Type: application/json
{
"country_id": 5
}
At least one field required (except sh_method_country_id).
DELETE /shippingmethodpricecountries/{id}
DELETE /shippingmethodpricecountries/1
Authorization: Bearer <token>
shippingmethodpriceweights
DB table: #__jshopping_shipping_method_price_weight | PK: sh_pr_weight_id
Response fields
| Field |
Type |
Description |
sh_pr_weight_id |
int |
Weight rule ID |
sh_pr_method_id |
int |
Shipping price method ID |
shipping_price |
decimal |
Shipping price for this range |
shipping_weight_from |
decimal |
Weight range start |
shipping_weight_to |
decimal |
Weight range end |
shipping_package_price |
decimal |
Package surcharge |
GET /shippingmethodpriceweights
GET /shippingmethodpriceweights
Authorization: Bearer <token>
GET /shippingmethodpriceweights/{id}
GET /shippingmethodpriceweights/1
Authorization: Bearer <token>
POST /shippingmethodpriceweights
POST /shippingmethodpriceweights
Authorization: Bearer <token>
Content-Type: application/json
{
"sh_pr_method_id": 1,
"shipping_price": 5.00,
"shipping_weight_from": 0,
"shipping_weight_to": 1.00
}
| Field |
Required |
sh_pr_method_id |
yes |
shipping_price |
no |
shipping_weight_from |
no |
shipping_weight_to |
no |
shipping_package_price |
no |
PATCH /shippingmethodpriceweights/{id}
PATCH /shippingmethodpriceweights/1
Authorization: Bearer <token>
Content-Type: application/json
{
"shipping_price": 7.50
}
At least one field required (except sh_pr_weight_id).
DELETE /shippingmethodpriceweights/{id}
DELETE /shippingmethodpriceweights/1
Authorization: Bearer <token>
update
Install a JoomShopping addon from a ZIP file (base64-encoded) or a local folder path.
Supported methods: POST only.
POST /update
Option 1 — install from ZIP file (base64)
POST /update
Authorization: Bearer <token>
Content-Type: application/json
{
"type": "file",
"filezip": "<base64-encoded ZIP content>"
}
Required fields:
| Field | Type | Description |
type | string | Must be file |
filezip | string | ZIP archive content encoded as base64 |
Option 2 — install from local folder
POST /update
Authorization: Bearer <token>
Content-Type: application/json
{
"type": "folder",
"folder": "H:\\addons_pack\\Tools\\test"
}
Required fields:
| Field | Type | Description |
type | string | Must be folder |
folder | string | Absolute path to the addon folder on the server |
Response 200 OK
{
"links": {
"self": "http://site.com/api/index.php/v1/shop/update"
},
"data": {
"type": "update",
"id": "1",
"attributes": {
"result": "Ok"
}
}
}
Validation errors 400
| Condition | Message |
type not provided | Missing required field: type |
type is file and filezip is missing | Missing required field: filezip |
type is folder and folder is missing | Missing required field: folder |
type has unknown value | Invalid type value. Allowed: file, folder |
images
File browser for server-side image/file directories. Read-only (list only).
Skipped files: .htaccess, noimage.jpg, noimage.gif
Response fields
| Field | Type | Description |
id | int | Index in the file list |
name | string | Filename |
GET /images
GET /images?list[display]=product
Authorization: Bearer <token>
Query parameters
| Parameter | Values | Default | Description |
list[display] | product, category, manufacturer, attribute, video, demofiles, salefiles | product | Directory to browse |
list[limit] | int | — | Number of items per page |
list[start] | int | 0 | Offset |
Directory mapping
display value | Directory (from shop config) |
product | image_product_path (thumbnails, prefix thumb_) |
category | image_category_path |
manufacturer | image_manufs_path |
attribute | image_attributes_path |
video | video_product_path |
demofiles | demo_product_path |
salefiles | files_product_path |
Response example
{
"data": [
{ "type": "images", "id": "0", "attributes": { "name": "product1.jpg" } },
{ "type": "images", "id": "1", "attributes": { "name": "product2.png" } }
]
}