Skip to content

Accept or dismiss a suggestion

POST
/products/review/{productId}/decision
curl --request POST \
--url https://example.com/products/review/019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f/decision \
--header 'Content-Type: application/json' \
--cookie bottle.session_token=<bottle.session_token> \
--data '{ "decision": "accept", "kind": "cylinder", "gasTypeName": "example", "gasTypeId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "brand": "example" }'

Accepting puts the product under the gas type named, creating it if the business has no such gas type, writes the size where the product had none, and turns a deposit or rent suggestion into that charge. Any field sent with the decision replaces what was suggested, so a reviewer can correct and accept in one go. Dismissing leaves the product as it is and stops it being suggested again. Either way it is recorded who said so.

productId
required

UUID v7

string format: uuid
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f

UUID v7

Media typeapplication/json
object
decision
required
string
Allowed values: accept dismiss
kind

A cylinder of gas, a deposit or rent on cylinders, an accessory such as a regulator, the delivery charge, or nothing Bottle could tell.

string
Allowed values: cylinder deposit hire accessory delivery unknown
gasTypeName
string | null
>= 1 characters <= 80 characters
gasTypeId

UUID v7

string | null format: uuid
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f
brand
string | null
<= 40 characters

The product as it now stands

Media typeapplication/json
object
status
required
string
Allowed values: pending accepted dismissed
product
required
object
id
required

UUID v7

string format: uuid
name
required
string
shortCode
required
string | null
sku
required
string | null
unitPrice
required

Pence, exactly as entered. Whether VAT is in this figure is what priceIncludesVat says; the other reading is given beside it for display.

integer
<= 100000000
priceIncludesVat
required

Whether unitPrice includes VAT. False: VAT goes on top when the product is sold. True: unitPrice is the shelf price, and the VAT is worked back out of it on each line.

boolean
unitPriceExVat
required

UnitPrice without VAT, in pence, for display. The same as unitPrice when it excludes VAT or the business is not registered; otherwise derived and rounded. Do not multiply it: amounts are worked out from unitPrice.

integer
unitPriceIncVat
required

UnitPrice with VAT, in pence, for display. The same as unitPrice when it includes VAT or the business is not registered; otherwise derived and rounded.

integer
vatRate
required

VAT in basis points: 2000 is 20%, 500 is 5%, 0 is zero rated.

integer
<= 10000
charge
required
string | null
Allowed values: deposit hire
chargePeriod
required
string | null
Allowed values: once daily weekly monthly
chargeForProductId
required

UUID v7

string | null format: uuid
gasTypeId
required

UUID v7

string | null format: uuid
weightKg
required
number | null
volumeLitres
required
integer | null
notes
required
string | null
kind
required

What the product is. The one set on it, or when none has been, read from it: a charge makes it a deposit or hire, a gas type a cylinder, anything else other.

string
Allowed values: cylinder deposit hire accessory appliance fuel consumable delivery other
kindSet
required

Whether kind was set rather than read from the product.

boolean
brand
required
string | null
description
required

What the shop says about it, plain text with line breaks.

string | null
published
required

On the business’s own shop. Shown there only once the shop is switched on. Never true on an archived product.

boolean
refundRule
required

On a deposit: what comes back when a cylinder is returned. Null follows the business’s own setting (invoice settings).

string | null
Allowed values: full percent scale none
refundPercent
required
integer | null
<= 100
refundDeductionPence
required
integer | null
refundScale
required
Array<object> | null
>= 1 items <= 10 items
object
upToMonths
required
integer | null
>= 1 <= 1200
percent
integer
<= 100
fixedPence
integer
<= 10000000
refundCountsFrom
required

Which hire a returned cylinder is measured from. Null is latest.

string | null
Allowed values: latest first
tradeUnitPrice
required

What a trade customer pays, on the shop and on office orders, when no rate has been agreed with them, pence as typed. Null: the list price. A customer’s agreed rate still comes first, and price rules for trade work off this.

integer | null
<= 100000000
tradePriceIncludesVat
required
boolean
tradePriceExVat
required
integer | null
tradePriceIncVat
required
integer | null
costPrice
required

What one costs the business, pence without VAT. Optional; read by cost-plus price rules. Never shown to customers.

integer | null
<= 100000000
stockOnHand
required

How many are on the shelf, for things sold on the shop that are not cylinders. Null is not counted: always available. Set and moved with POST /products/{id}/stock, never here. May be below nought when the product keeps selling once none are left.

integer | null
stockLowAt
required

At or under this count the office is told, and the shop may say low stock. Null is never.

integer | null
whenOut
required

What the shop does when none are left, for this product. Null follows the shop’s own rule (Settings, Shop). stop: off sale. continue: keeps selling, shown as ships when back in stock.

string | null
Allowed values: stop continue
images
required
Array<object>
object
id
required

UUID v7

string format: uuid
alt
required

What the picture shows, for screen readers and search.

string | null
sortOrder
required
integer
width
required

Of the original, in pixels.

integer
height
required
integer
thumb
required

Fits inside 200 pixels. WebP.

string
card
required

Fits inside 600 pixels. WebP.

string
large
required

Fits inside 1600 pixels. WebP.

string
categoryIds
required
Array<string>
links
required
Array<object>
object
source
required
string
Allowed values: woocommerce shopify
externalId
required
string
externalVariantId
required
string | null
externalSku
required
string | null
lastSyncedAt
required
string | null format: date-time
archivedAt
required
string | null format: date-time
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
gasType
required
object
id
required

UUID v7

string format: uuid
name
required
string
supplierId
required

UUID v7

string | null format: uuid
supplier
required
string | null
colour
required
string | null
/^#[0-9a-fA-F]{6}$/
catalogueKey
required
string | null
archivedAt
required
string | null format: date-time
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
Example
{
"status": "pending",
"product": {
"id": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f",
"name": "19kg propane",
"shortCode": "19",
"sku": "PROP-19",
"unitPrice": 5400,
"unitPriceExVat": 5400,
"unitPriceIncVat": 6480,
"vatRate": 2000,
"charge": "deposit",
"chargePeriod": "once",
"chargeForProductId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f",
"gasTypeId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f",
"weightKg": 38.5,
"volumeLitres": 60,
"kind": "cylinder",
"brand": "Flogas",
"refundRule": "full",
"refundCountsFrom": "latest",
"stockOnHand": 12,
"stockLowAt": 3,
"whenOut": "stop",
"images": [
{
"id": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f"
}
],
"categoryIds": [
"019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f"
],
"links": [
{
"source": "woocommerce",
"externalId": "1043"
}
]
},
"gasType": {
"id": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f",
"name": "Flogas Propane",
"supplierId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f",
"supplier": "Flogas",
"colour": "#D7263D"
}
}

A deposit or rent with no gas type to put it on

Media typeapplication/json
object
error
required
string
message
required
string
Example
{
"error": "not_found",
"message": "Customer not found"
}

Not signed in

Media typeapplication/json
object
error
required
string
message
required
string
Example
{
"error": "not_found",
"message": "Customer not found"
}

Not a member, or without the permission this needs

Media typeapplication/json
object
error
required
string
message
required
string
Example
{
"error": "not_found",
"message": "Customer not found"
}

Not found

Media typeapplication/json
object
error
required
string
message
required
string
Example
{
"error": "not_found",
"message": "Customer not found"
}

That gas type already has this charge

Media typeapplication/json
object
error
required
string
message
required
string
Example
{
"error": "not_found",
"message": "Customer not found"
}

Validation failed

Media typeapplication/json
object
error
required
string
Allowed values: validation
message
required
string
issues
required
Array<object>
object
path
required
string
message
required
string
Example
{
"error": "validation",
"issues": [
{
"path": "email",
"message": "Invalid email"
}
]
}