Skip to content

Create or update a product by SKU

PUT
/products/by-sku/{sku}
curl --request PUT \
--url https://api.europlaybook.com/v1/products/by-sku/example \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "gtin": "8712345678906", "net_weight_mg": 100000, "title": "Green tea 100 g" }'

Creates the product (201) or updates the fields you send (200). Product data only: packaging goes through proposals. Changing a product does not touch its packaging confirmation.

sku
required
Sku
string
Media typeapplication/json
ProductUpsertIn

Create the product with this SKU, or update the fields you send. Fields you leave out stay as they are (on create they get their default).

object
title
required
Title

Product name.

string
>= 1 characters <= 300 characters
brand_name
Any of:
string
<= 200 characters
gtin
Any of:
string
<= 14 characters
hs_code
Any of:
string
<= 12 characters
country_of_origin
Any of:
string
<= 2 characters
net_weight_mg
Any of:
integer
is_electrical
Any of:
boolean
is_textile
Any of:
boolean

OK

Media typeapplication/json
ProductOut
object
id
required
Id
string format: uuid
sku
required
Sku

Your stock keeping unit; unique per account.

string
title
required
Title

Product name.

string
brand_name
required
Brand Name

Brand on the product.

string
gtin
Any of:
string
hs_code
required
Hs Code

Customs tariff code.

string
country_of_origin
required
Country Of Origin

ISO 3166-1 alpha-2.

string
net_weight_mg
Any of:
integer
status
required
Status

Archived products are kept for history.

string
Allowed values: active archived
is_kit
required
Is Kit

A bundle of other products (bill of materials).

boolean
is_electrical
required
Is Electrical

Electrical/electronic equipment (WEEE).

boolean
is_textile
required
Is Textile

Textile product (textiles EPR).

boolean
packaging_confirmed
required
Packaging Confirmed

Gate 1: a person confirmed this product’s packaging. Changing packaging (also through a proposal) clears it until someone confirms again in the portal.

boolean
confirmed_at
Any of:
string format: date-time
confirmation
required
ConfirmationOut

Gate 1 in detail (complements packaging_confirmed, which equals state confirmed when the packaging is unchanged).

object
state
required
State

None = never confirmed; confirmed = the packaging is what a person confirmed; changed = it was confirmed, but the packaging (own or inherited) differs now.

string
Allowed values: none confirmed changed
at
Any of:
string format: date-time
by
Any of:
string
group_id
Any of:
string format: uuid
archived_at
Any of:
string format: date-time
created_at
required
Created At
string format: date-time
updated_at
required
Updated At
string format: date-time

Example

{
"id": "0199f5a2-7c1e-7b4a-9d0e-3f6c2a1b8e44",
"sku": "TEA-001",
"title": "Green tea 100 g",
"brand_name": "Demo Garden",
"gtin": "8712345678906",
"hs_code": "090210",
"country_of_origin": "NL",
"net_weight_mg": 100000,
"status": "active",
"confirmation": {
"state": "none"
}
}

Created

Media typeapplication/json
ProductOut
object
id
required
Id
string format: uuid
sku
required
Sku

Your stock keeping unit; unique per account.

string
title
required
Title

Product name.

string
brand_name
required
Brand Name

Brand on the product.

string
gtin
Any of:
string
hs_code
required
Hs Code

Customs tariff code.

string
country_of_origin
required
Country Of Origin

ISO 3166-1 alpha-2.

string
net_weight_mg
Any of:
integer
status
required
Status

Archived products are kept for history.

string
Allowed values: active archived
is_kit
required
Is Kit

A bundle of other products (bill of materials).

boolean
is_electrical
required
Is Electrical

Electrical/electronic equipment (WEEE).

boolean
is_textile
required
Is Textile

Textile product (textiles EPR).

boolean
packaging_confirmed
required
Packaging Confirmed

Gate 1: a person confirmed this product’s packaging. Changing packaging (also through a proposal) clears it until someone confirms again in the portal.

boolean
confirmed_at
Any of:
string format: date-time
confirmation
required
ConfirmationOut

Gate 1 in detail (complements packaging_confirmed, which equals state confirmed when the packaging is unchanged).

object
state
required
State

None = never confirmed; confirmed = the packaging is what a person confirmed; changed = it was confirmed, but the packaging (own or inherited) differs now.

string
Allowed values: none confirmed changed
at
Any of:
string format: date-time
by
Any of:
string
group_id
Any of:
string format: uuid
archived_at
Any of:
string format: date-time
created_at
required
Created At
string format: date-time
updated_at
required
Updated At
string format: date-time

Example

{
"id": "0199f5a2-7c1e-7b4a-9d0e-3f6c2a1b8e44",
"sku": "TEA-001",
"title": "Green tea 100 g",
"brand_name": "Demo Garden",
"gtin": "8712345678906",
"hs_code": "090210",
"country_of_origin": "NL",
"net_weight_mg": 100000,
"status": "active",
"confirmation": {
"state": "none"
}
}

Bad Request

Media typeapplication/json
PublicErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
}
}

Unauthorized

Media typeapplication/json
PublicErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
}
}

Forbidden

Media typeapplication/json
PublicErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
}
}

Not Found

Media typeapplication/json
PublicErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
}
}

Conflict

Media typeapplication/json
PublicErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
}
}

Unprocessable Content

Media typeapplication/json
PublicValidationErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any
errors
Errors

Per-field problems (pydantic format: loc, msg, type).

Array<object>
default:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
},
"errors": []
}

Too Many Requests

Media typeapplication/json
PublicErrorOut
object
detail
required
Detail

What went wrong, in English, for people and logs.

string
code
required
Code

Stable machine-readable error code; translate and branch on this.

string
params
Any of:
object
key
additional properties
any

Example

{
"detail": "This API key lacks the scope catalogue:write",
"code": "insufficient_scope",
"params": {
"required_scope": "catalogue:write"
}
}