MENU

Product

Endpoint:

https://api.website.world/webapps/api/product

Description

Use our /product endpoint to get/create/update products, product variations and product options.

When Getting data, if supplying an ID, then only 1 data JSON element is returned. Otherwise an array is returned, irrespective of how many items are matched. When POSTing data, then only a single element will be returned, and only a single element is expected to be POSTed as a time.

Get Parameters

Name Description Example Data type
id

If ID is specified, then only a single element is returned if found. Otherwise, an array is returned, even if only one item matches. 

id=12345

int
keywords

Filter results based on Site keywords: Site search keywords

keywords=abc

string
code

Filter results based on p_code: Product code

code=123 string
categoryID

Filter results based on Product category id

categoryID=101

int
includeVariants Include product variants with the product includeVariants=1 string
includeAllAttributes When doing a multiple item search, include some product attributes that are hidden for the benfit of bandwidth. Attributes that are excluded by default are those where unlimited length HTML or rich text are included in the product description. So use this parameter if you specifically want this data, otherwise leave it out to have a smaller payload.  includeAllAttributes=t boolean
includeMinimalAttributes When doing a multiple item search, we can reduce fields only to code,title,  but all pricing and stock fields, thus saving bandwidth includeMinimalAttributes=t boolean
includeUltraMinimalAttributes When doing a multiple item search, we can reduce fields only to only code, basic pricing and stock fields, thus saving bandwidth includeUltraMinimalAttributes=t boolean
modifiedAfter Various date/time formats ok, but prefer 2021-06-20 14:59:59
modifiedAfter will be updated if any stock movement occurs.
modifiedAfter=2021-06-20 datetime
location

Filter results based on Product location

location=auckland

string
title

Filter results based on Product name/title

title=Book string
orderby

Sort results based on date/time created, product name, date/time updated at, product code

orderby=created / orderby=name / orderby=updated / orderby=code string
orderDirection Sort results in descending order. Default is ascending order

orderDirection = reverse for descending order

string

Useful use cases

1. Get all products

Return all products related to your website. Use GET to retrieve the data. Use additional parameters above. Use pagination if you have more than 100 products to return.

Example URL: https://api.website.world/webapps/api/product

"data": [
{
"p_title": "prod1",
"p_price":  10.00,
"pid": 1234,
...
}
]
}

1b. Get 1 product

Return 1 product, with all additional meta data. Use GET to retrieve the data. In this case, data is a single object. 

Example URL: GET https://api.website.world/webapps/api/product?id=12345

{

"data": 

{

"p_title": "prod1",

"p_price":  10.00,

"pid": 12345,

...

}

}

}

2. Create a new product

To create a new product you do not need to include an id in the data JSON. All the other information provided will be used to create a new Product.

To add the product to an existing category include : "p_groupid" : group id number. where the group id number can be found from the category endpoint.

{

   "p_title": "Bag",

   "p_price": 50.00,

   "p_qtyinstock": 25.0

}

The above JSON will create a new product with name Bag, price 50 and quantity in stock 25.

3. Update an existing product

To update an existing product include the product id and the fields you would like to update in the data JSON value. Only provide the minimal fields you would like to update in the data. You can also update a product by providing only a p_code instead of an ID, however, it will only update the first match.

In this example, we already know the ID, and only update stock count and price.

{
    "id": 12345,
    "p_qtyinstock": 5.000,
    "p_price": 25.00
}

Product Options

Some Products have sizes/colours/styles associated with it. We can create new options and update existing options for a Product.
To do so, include a JSON Array of styles/colours/sizes and provide p_option_type, p_option keys. The option name is p_option and the option type is p_option_type. The type is optional here while the name has to be unique.
To update any option include the option_id to identify the option to update. See below examples.

1. View Product options

To view the product options related to an individual product, GET the Product using the product ID

Example URL: https://api.website.world/webapps/api/product?id=12345

The product options will be contained in one of the 3 array elements, highlighting it's type. If the product contains variants, there is no guarantee that the sizes/colours/styles will be represented here, as our system can generate that data on the fly from the variant data.

{
  "id": 12345,
  ...
  "sizes": [],
  "colours": [],
  "styles": [],
  ...
} 

2. Create new option/size/colour/style

To create a new option, make sure you provide a unique option name (p_option) which hasn't been used before on that Product. The key of the options array to add should either be sizes or colours or styles. You do not need to provide the id for the option. The rest of the information provided will be used to create the option. The below example creates a large option in the product 12345.=

{
   "id": 12345,
 "sizes": [
       {
           "p_option": "large",
           "p_option_price": 10.00
       }
   ]
}

3. Update existing option

The product id and option id is provided for identifying the  product option. The rest of the information provided will be used to update the option. Only provide data you wish to update. In the example below the p_option and p_option_price will be updated for option id 123.

{ "id": 12345, "sizes": [ { "id": 123, "p_option": "Large", "p_option_price": 5.00 } ] }

4. Deleting Options

Send an option with a sorting order to negative -999 and we will delete the option.

eg "p_sort_order": -999

Or, add a request parameter, or a json data parameter (in top level) called "DeleteMissingArrayElements" and we will delete any items that are not in your array.




Product Variants

Product variants are different type of product options as they give you control over the stock quantity of the variation. Creating and updating a variant is similar to product with the key difference that a variant has a parent id. 

1. Insert a Product Variant

To create a new variant provide the variant(s) in the "variants" array. Every variant must have a parent id and hence the id key field must be provided. In the below example we are creating a new variant Large Red variant under the product id 12345. The rest of the information will be used to create the variant.

   "id": 12345,
   "variants": [ 

{

   "id": 12345,

   "variants": [

       {

           "p_size": "Large",

           "p_colour": "Red",

           "p_qtyinstock": 10,

           "p_price": 15.00,

           "p_code": "ABC123",

           "p_img": "image_url.jpeg"

       },

  ...

   ]

}

2. Update Product Variant

To update a variant include the id of the variant or the code to identify the variant. You must also provide the parent id of the variant. All the information provided with it will be used to update the variant. In the below examples we are updating the variant using id in the left example and using the code in the right.

{                                                            
   "id": 12345,                            
   "variants": [
          { 
              "id": 1234,
              "p_size": "Medium"
          }    
      ]
}
                                                              
   "id": "12345",                                
    "variants": [         
                       
            "p_code": "Code123",              
            "p_size": "Medium"         
         }          
    ]
}

3. Delete Product Variant 

Set the product order status to delete a specific variant. That variant may remain in the database, but it will not be visible to anyone. 

eg  "p_order":-999 

Or, add a request parameter, or a json data parameter (in top level) called "DeleteMissingArrayElements" and we will delete any items that are not in your array.  {Feature under construction}


Pro Tips: 

GST Pricing

Prices via API excl GST, and using 3 decimal points is good to ensure tidy round inclusive pricing. We don't have a GST component field, so if you want inclusive = 12.00, then you need to push price=10.435 Alternatively we can "round" all prices to 10cents if the merchant wants.

Category Ordering

Products can exist in multiple categories. The category exposure is visible or managed in 2 different ways. The hard connection to categories is via the p_group* fields. And a softer linkage is via a nested "groupOrdering" where you can control the ordering within a category. 

The ordering is any number > 0, and need not be sequential. Lowest numbers position at the top, and higher numbers position further down the page. These numbers may be automatically converted by our system to sequential positions should any item be repositioned within the CMS.  You can use either approach to add and remove products from categories. 

You can use pg_groupid or category_id interchangeably, both are valid. Same for pg_order or category_order. We now supply a read only field category_name for the text of the category. 

If you use the p_groupid* approach, then we will only remove the product from a category if the p_groupid is a negative number. If you do not supply these keys in your update, then no changes will occur.

If you do not provide a complete category ordering array, then we will not remove category linking, unless you specifically add a request parameter, or a json data parameter (in top level) called "DeleteMissingArrayElements".   




Visibility

The p_order field is used to determine general visibility on page and in search.  The field p_order used to determine the position on the page of the product, but that has been deprecated and replaced with each product having a unique position within any category, where a product may belong in multiple categories. The position in categories is now managed in the array "groupOrdering"

  • "p_order":1,    (This is a ordinary visible product, the default value)
  • "p_order":0,    (This product is hidden from category lists, but remains a searchable product, and you can link to it as you like.)
  • "p_order":-1,    (This is a hidden product, and anyone can access if the link is known, but it is excluded from search)
  • "p_order":-99,    (This is a hidden/blocked product, and no one can access it)


Security Visibility

The p_minlevelforsee and p_maxlevelforsee fields are focused on a member security level.  Use the min level to require a password. Whereas, use a lower max level, to prevent your wholesale customers viewing the product. The 2 fields together create a range.  Similar fields and rules exist for categories, but products do need to be secured in their own right, as a product can be searched without reference to the multiple categories in which it may reside. 

  • "p_minlevelforsee":0     (Anyone can see this product)
  • "p_minlevelforsee":100     (Customers must login to see this product)
  • "p_minlevelforsee":600     (This product is visible only to POS users)
  • "p_minlevelforsee":999     (This is a blocked product, no one can see this)

Promotions / Featured Items

The "p_promote" field is reserved for visual "Stamps" that appear on the product list within a category. If you supply a p_promote field it will be added to the "promotions" json array, with a default position. 

Ideally, you will use the "promotions" array to manage the promotion of your product. If you supply a promotion array, then the item will be promoted in all those categories. 

If you provide no promotions array, there will be no changes to the database. 

You can supply a promo_order of < 0 to force a delete of a specific promotion.

If you do not provide a complete array, then we will not remove category linking, unless you specifically add a request parameter, or a json data parameter (in top level) called "DeleteMissingArrayElements".  


 

Stock Counts

Unlimited stock can be set as p_qtyinstock=9999, or any number less indicate how many are available. If you have sold 3 items on backorder, then the stock level is negative -3

Unlimited backorder stock can be set as p_backorder=9999, or any number less indicates how many are on back order.

There are several more fields to help with reports and stock level targeting.

p_qtyinstock is updated whenever items are sold, or when stock movements are specifically saved. This field can be overridden by specified API connections, and also by importing CSV data. We make a best effort to provide a robust stock count, but acknowledge the needs for many merchants to manage this number externally.


Example JSON (Full sample)

{
	"endPoint": "product/1514650",
	"resultCount": 1,
	"data": {
		"id": 1514650,
		"p_title": "One small thing only",
		"p_price": 10,
		"p_aggregaterating": 5,
		"p_maxqty": 0,
		"p_qty_label": "Length",
		"p_assembled_part_count": 0,
		"pid": 1514650,
		"p_voucher_limit_pid": 0,
		"p_backorder_maxqty": 0,
		"p_last_sale": "2021-12-06 09:52:59.027852",
		"p_custom_fields": {},
		"p_categories": "Main Test Products",
		"p_order": 1,
		"groupOrdering": [{
			"pg_groupid": 4772,
			"pg_order": 2
		}],
		"p_minlevelforsee": 0,
		"p_pricebreakb_minqty": 0,
		"p_pricebreakc_minqty": 0,
		"p_pricebreaka_minqty": 0,
		"p_shipping_int": 0,
		"p_autoupgrade_mbrgrpid": 0,
		"p_img": "/images/05.png",
		"p_width": 0,
		"p_target_quantity": 0,
		"p_parentpid": 0,
		"p_customer_price_json": {},
		"p_gst_rule": "t",
		"p_buy_points": 0,
		"p_metadesc": "rtetre",
		"p_groupid2": -9,
		"p_depth": 0,
		"p_subscribetocampaignid": 0,
		"p_groupid8": -9,
		"p_age_target": 0,
		"p_groupid7": -9,
		"p_counter": 0,
		"p_deposit_pc": 0,
		"page": 905,
		"p_groupid4": -9,
		"p_minqty": 1,
		"p_showbuybutton": "t",
		"p_groupid3": -9,
		"p_season_pricing": 0,
		"p_sale_items_left": 9999,
		"p_groupid6": -9,
		"cid": 517,
		"p_groupid5": -9,
		"p_duplicationid": 0,
		"p_privacy_mbrgroupid": 0,
		"p_autoupgrademember": 0,
		"p_vendorid": 0,
		"p_qtyonorder": 0,
		"p_group": "Main Test Products",
		"p_calendar_count": 0,
		"p_bookingsequence": 0,
		"p_replenishqty": 0,
		"p_priceprediscount": 13.043,
		"p_childcnt": 0,
		"p_aggregateratingcount": 0,
		"p_supplier_puq": 1,
		"p_listed": "2017-02-03 14:03:07.639828",
		"p_pricebreakb": 0,
		"p_pricebreaka": 0,
		"p_freight_exclude": "f",
		"p_pricebreakc": 0,
		"p_shipping": 0,
		"p_priced": 6.38,
		"p_pricee": 6.58,
		"p_api_last_updated": "2017-02-03 14:03:07.639828",
		"p_priceb": 6.58,
		"p_weight": 0,
		"p_pricec": 6.58,
		"p_priceh": 6.58,
		"p_pricef": 6.58,
		"p_priceg": 6.58,
		"p_cascade_pricing": "f",
		"p_qtylowstock": 0,
		"p_qtyinstock": 8,
		"p_voucher_exclude_groupid": 0,
		"p_updated": "2021-12-06 09:52:59.027852",
		"p_pricea": 7.83,
		"p_supplierprice": 0,
		"p_stock_enquiry_count": 0,
		"p_optioncount": 0,
		"p_qtyinc": 0.1,
		"p_groupid": 4772,
		"p_metakeywords": "retrwet",
		"p_height": 0,
		"p_voucher_limit_groupid": 0,
		"p_promote_price_incl": 11.5
	},
	"success": true,
	"RecordExists": true
}

Data Dictionary


Additional information revealed in a tabbed interface
NameDescriptionValidationData type
pid (ID) Product Unique ID, aka ID.
System generated serial.
Read only
Integer
p_parentpid Product variants will have a p_parentpid that links to the master product. Master products have p_parentpid=0. Only master products display on category pages.Fkey to PID Integer
p_title Product name required Text
p_subtitle Sub title of product h2, optional field
Text
p_details Product short description
Text
p_codeProduct code used for reconcilation with other systems, or possibly printed bar code.  desireable Text
p_suppliercodeProduct code used for purchasing new stock 
Text
p_manufact_skuManufacturer code, eg barcode or ISBN 
Text
p_price The primary checkout price (excl GST).
Correct to 3 Decimal places in database.
required, 0=free Decimal
p_priceprediscount RRP Price prior to discount >=price Decimal
p_pricea Member Price A / VIP <=price Decimal
p_priceb, etc Member Price Group/Teir B - H <=price Decimal
p_price_from Where variants exist, this is the lowest price. <=price Decimal
p_price_to Where variants exist, this is the highest price.

<=price Decimal
p_shipping Fixed unit cost for domestic shipping on top of any other freight fees. Decimal
p_shipping_int Fixed unit cost for international shipping on top of any other freight fees  Decimal
p_freight_exclude Exclude courier setup freight fees, eg gift voucher t,f Boolean
p_pricebreaka Quantity price break A (low) Decimal
p_pricebreaka_minqty Qty to get price A Decimal
p_pricebreaka_setup Setup price added to total before quantity price break unit price Decimal
... Price breaks A-F ...
p_groupidMaster Category / Collection ID
Top level product = 0
Hidden or N/A = -9
Fkey To Category ID Integer
p_groupid2, etcCategory 2 - 8  ID (additional categories)Fkey To Category ID Integer
p_uomUnit of Measure
Text
p_order
1 is public and visible,
0 is hidden,
-99 is blocked
-99, 0, 1Integer
p_minlevelforsee
Security visibility, as per member level, eg
0 is public access
100 for any logged in users
200 for authorised users
600 for POS users only 
0,150,200,600,999, etcInteger
p_maxlevelforsee
Hide from wholesale option, as per member level, eg
175 only for retail visibility only
999 wholesale members can view
175,999, Integer
p_privacy_mbrgroupid
Security visibility to a limited member group memberGroup.idInteger
p_weight
Weight in grams0+Decimal
p_height
Height in cm0+
Decimal
p_width
Width in cm0+
Decimal
p_depth
Depth / length in cm0+
Decimal
p_extra1,2,3,4,...
Extra fields, often used for make, model year etc
Text
p_img
Image (Primary product image). URL can be local reference. External URLs will be imported and replaced with a local file reference.URLText
p_img_size
Size of image in bytesURLInteger
p_url
URL or attachment to PDF or something
Text
p_listed
Timestamp this product record was created
Timestamp
p_qtyinstock
Stock on hand. This value excludes recent sales that have already decremented this value. This number can go into negatives, typically in a back order situation. There is no break down by location
Decimal
p_stock_checked
The date of the last stock take, eg when this product last had it's qty in stock "set" as a new total, by a CMS web form.
Timestamp
p_backorder_maxqty
Permittable quantity of back order quantity allowed, perhaps set to the total number currently on back order by the supplier
Decimal
p_stock_display
Override default stock display ruleseg OOS,NONE,QTY,etcText
p_qtylowstock
An arbitrary point when stock is considered too low, and reordering is urgent.
Decimal
p_replenishqty
If enabled, the qty in stock will be reset to this value every morning. Typically used by cafes and bakeries who cook 10 dozen muffins every day, or something like that. Ignored if 0ignore if 0Decimal
p_target_quantity
The desired stock holding level. Purchase orders default to this number less stock on hand.ignore if 0Decimal
p_minqty
The min quantity that must be purchased per orderignore if 0Decimal
p_minqtytrade
The min quantity that must be purchased per order, before trade price  available.ignore if 0Decimal
p_maxqty
The max quantity that can be purchased per order.ignore if 0
Decimal
p_qtyinc
The increment unit, eg if an item is only sold by the dozen, then 12, or if decimals are permitted, then 0.1>0 
Decimal
p_qtyonorder
Total quantity in submitted purchase orders awaiting delivery. Value likely to be reset when purchase orders are edited.0+Decimal
p_supplier_puq
The incremental unit for purchase orders. eg if a supplier only allows purchases by the dozen, then PUQ is 12
Decimal
p_outofstockmessage
A customer defined text message to warn customer of specifics relating to availability. The existence of this message overrides default messages, and is considered a warning, so should be used for edge cases, not for global information
Decimal
p_assembled_part_count
If this product is assembled, then it will have a count of parts/materials (not quantity)0+Integer
p_recipe_type
The type of assembled part recipe, determines how products are synced to REVEALRECIPE,PACKAGE or NULL
Text
p_aggregaterating
An average review rating (5 stars)0.0 - 5.0Decimal
p_aggregateratingcount
Count of reviews contributing to average review0+Integer



p_categories
Category list, human friendlyreadonlyText
p_group
Temporary use when importing products into categories. When used in CSV imports, this column can auto create required categories, link them, and can expand into multiple categories using a | delimiter. Sometimes this column has the name of the primary category when exported (but is not guaranteed)
Text
p_filename
SEO Filename, will be prefixed with "/product/" automatically unless the SEO filename starts with a slash
Text
p_metatitle
SEO meta title
Text
p_metadesc
SEO meta description
Text
p_metakeywords
SEO meta keywords
Text
p_manufacturer
Name of manufacturer
Text
p_suppliername
Name of supplier
Text
p_supplierprice
Known cost of item to replace from supplier
Decimal
p_vendor_notify
Email address of a vendor to supply the goods, in a drop shipping arrangementEmailText
p_age_target
For market places, these specific age values represent age bands, for products targeting certain ages, such as baby or preschool0,1,2,3,5,10,15,25,50,70Integer
p_madeincountry
Country Code of origin. (2 digit country code, one code only. Used with market places.NZ,AU,US,CA,CM,JP etcText
p_autoupgrademember
Upgrades member to this security level once paid, status achieved. refer member security levels. 0+Integer
p_autoupgradepassword
If True, then a password will be sent to the customer as a welcome email, when paid statusT1Char
p_autovoucher
If True, then create a voucher to send to the customer and save in the vouchers list.T1Char
p_vouchervalue
The monetary value of the voucher in the default currency
Decimal
p_voucherexpiry
Interval signalling the date of expiry of voucher
Interval
p_voucher_percent
A percentage voucher, gives this percentage of discount of a future purchase.
Decimal
p_voucher_createafter
Delayed creation of the voucher, eg as a future incentive
Decimal
p_voucher_limit_groupid
Limit voucher use to this categoryRefers category.idInteger
p_voucher_limit_pid
Limit voucher use to this productRefers product.id
Integer
p_voucher_exclude_groupid
Allow voucher use for any category except this one.Refers category.id
Integer
p_optioncount
Number of product options rows, plus 1 if there is a value in p_prompt4text0+Integer
p_childcnt
Count of variant products, if this is a master product. Value = 0 forordinary product.0+Integer
p_stock_enquiry_count
Count of open enquiries related to this product0+Integer
p_prompt4text
Adds a prompt for customer to enter text, eg "enter your name for engraving"
Text
p_style
The default or variant style/option
Text
p_colour
The default or variant colour

Text
p_size
The default or variant size

Text
p_option_display_type
System code for alternative display logic for product options

Text
p_showbuybutton
Buy button is hidden if this value is false.Boolean
p_dt_available
This product is hidden until  this date makes the product available (visible)
Timestamp
p_dt_expires 
The product will be hidden from this date onwards
Timestamp
p_updatedThe time this product was last updated for core information, which should include when stock count changes. This may not be updated for long text fields
Timestamp
p_sale_endsOn this date/time the sale price will end, and the main price will revert to the value of the p_priceprediscount if a value exists.
Timestamp
p_cascade_pricing
Prices are automatically cascaded to variants when changes made to the master product, eg where there is no price variations expected.
Boolean
p_promote
The most recently assigned featured product stamp. A product can be featured in multiple places, but this value is only the most recent stamp
Text
p_api_source
A system code identifying which API is the master for this product.
Text
p_api_source_id
An identifier used for syncing with an API, eg a GUID
Text
p_api_last_updated
The timestamp when last synced with an API
Timestamp
p_api_debug
Either JSON or XML data as per the last API sync
Text
p_freight_exclude
Exclude normal freight rules, but apply product specific rules if known. Usually used to signal a gift voucher.
Boolean
p_freight_ship_separately
Calculate shipping on the basis that this item will be shipped separately. Courier platform dependent.
Boolean
p_limitshippingtocountries
Limit shipping to these countries only. Full country text, comma separated. eg "New Zealand, Australia"New Zealand, Australia
Text
p_address_search
Post Code availability. Product only available in these postcodes1021,1022,3050Text
p_gst_rule
Currently used to identify if GST / Sales tax should apply domestically. If false, then GST is not added to line items.Depreciating in favour of tax codes at some pointBoolean (Subject to change)
p_postpay_info
Information to be provided on invoices/receipts after payment. This might be a product key or instructions. Designed to give information only once payment received, but only unique per product, not per order.
Text
p_private_stock_notes
Confidential notes that the merchant keeps about the stock availability, but not visible to customers.
Text
p_location
Confidential location of the stock, eg shelf/bin number
Text
p_additionaltext
Additional rich product information revealed after product pricing table, but above the tabbed interface. So always visible on page.
HTMLText
p_tab_moreinformation
Additional information revealed in a tabbed interfaceHTML
Text
p_tab_features
Additional information revealed in a tabbed interface
HTML
Text
p_tab_specifications
Additional information revealed in a tabbed interface
HTML
Text
p_tab_contents
Additional information revealed in a tabbed interface
HTML
Text
p_tab_links
Additional information revealed in a tabbed interface
HTML
Text
p_tab_video
Additional information revealed in a tabbed interfaceHTML
Text
p_tab_reviews
Additional information revealed in a tabbed interface
HTML
Text
p_tab_applications
Additional information revealed in a tabbed interface
HTML
Text
p_tab_termsconditions
Additional information revealed in a tabbed interface. Then presents  this also at checkout, and requires acceptable of combined T&C's
HTML
Text
p_checkout_questions
A legacy approach to present additional questions at checkout... HTML format. 
Text
p_custom_fields
A count of how many additional customisation fields exist. Stored in text format for legacy reasons.
Text
p_qty_label
An alternative wording for the quantity prompt.
Text
p_deposit_pc
If only a deposit is required for this product, then only require this much be paid on checkout, even though the total of the invoice will be for the full cost, expectation to pay difference when collecting hire items.
Decimal
p_bookingtype
If this is a bookable item, then there are 4 typeseg Text
p_bookingcalendartags
If a service, or room, then these tags identify a limited set of global resources that can be used. 
Text
p_calendar_count
How many resources (aka hire items or seats) are available to book (calendar instances)
Integer
p_booking_price_unit
How the standard price unit compares to time. eg 1 day, 1 hour, or 45 minutes. This may be the fixed duration of a service or seat hire, or alternatively related to pricing units multiplied by quantity of time.
Interval
p_bookingsequence
For consecutive services, in which order would these occur.
Integer
p_duplicationid
Used internally during website/page duplications as a temporary reference to the old product

p_season_pricing
Seasonal pricing matrix applies
Integer
p_sale_items_left
How many items left on sale price, if greater than 0. Once it gets to 0, then prediscount price applies. This number is visible to customer, and is used to encourage a scarcity decision.
Integer
p_code_gl_sales
GL Code to use on API connections. eg Xero requires an item ID, and a sales code
Text
p_img_next_import
When any offsite image is next due to attempt an import. eg if p_img starts with http
Timestamp
p_error_msg
The error message related to any image import, but also reserved for other uses.. 
Text
p_last_sale
When this item was last sold to anyone
Timestamp
p_itemcondition
eg is this item New or Second Hand... Refer to meta schema for values. Default meaning is New if blank, so leave it blank.
Text
p_customer_price_json
JSON structure for targeted pricing on a unique customer basis, only best price applies compared with customer price teir.
JSON