The Wherehouse Public API is in BETA. Please contact us should you wish to build a feature rich integration dev@wherehouse.co.za.
code on the JSON body so values like BLUE+RED5 are not mangled.400 validation_error. Fields you leave out keep their current values.code within a catalogue.| API key reaches | What to send | If you omit it |
|---|---|---|
| One catalogue | Nothing, it is inferred | Fine |
| More than one catalogue | catalogue_uid | 400 catalogue_required |
catalogue_id still works as a fallback. A uid the key cannot reach returns 404 catalogue_not_found.code identifies the product and cannot be renamed here. A product cannot be moved between catalogues. id, created_at and updated_at are ignored. Unknown field names are ignored.{
"catalogue_uid": "demo-catalogue",
"code": "BLUE+RED5",
"soh": 12,
"retail_price": 199.99
}custom_attributes on the same body to upsert additional attributes. Core product fields are saved immediately. Attribute writes are queued. The product you get back still has the previous custom_attributes. Poll GET /product-batches/{ticket} using custom_attributes_update.ticket.503 queue_unavailable and product fields are not written.key (latest row if duplicates exist).| Key | Behaviour |
|---|---|
| Already on the product | Updates value only. Uses the stored type. Incoming type is ignored. |
| New on the product | type is required. Creates the attribute. |
type is one of string, date, currency, number, array, boolean, json. Caps: 50 keys per product, key length 100, value 8KB. No deletes. value: null clears the stored value.{
"catalogue_uid": "demo-catalogue",
"code": "BLUE+RED5",
"soh": 12,
"custom_attributes": [
{ "key": "warehouse_bin", "value": "A-12" },
{ "key": "lead_time_days", "value": 5, "type": "number", "label": "Lead time (days)" }
]
}{ "warehouse_bin": { "value": "A-12" } }. GET-shaped value: { "data": ... } works for a round trip.