Update a product
- Sandbox:
PATCH https://payme-store-staging.payme.io/api/products/{guid}
- Production:
PATCH https://payme-store.payme.io/api/products/{guid}
Credentials
- Header
Authorization: Bearer <token>
Changes some fields of one of the seller's products. Fields you don't send keep their values. A price object you send (store_prices or costs) replaces the stored one entirely.
The request names the price objects store_prices and costs; responses name them store_configuration and costs_details. Fields the API doesn't know are ignored.
To replace the whole product in one call, PUT /products/{guid} takes the same body as POST /products, with the same required fields.
Send Authorization: Bearer <auth_token>, the token from POST /auth-tokens. Hosts, tokens and the error format: Hosts, authentication and errors. Prices are decimal amounts in major units (99.99), not minor units.
Parameters
| Name |
In |
Type |
Required |
Description |
guid |
path |
string |
yes |
The product guid (a UUID) that POST /products returned. Any other format returns 400. |
Request body
Content type: application/json
The fields to change.
| Field |
Type |
Required |
Description |
product_remote_id |
string |
no |
Your own product id, 2–100 characters, unique among the seller's products (409 otherwise). Send it only to change it: resending the product's current value also returns 409. |
name |
string |
no |
Product name, 2–100 characters. |
status |
integer |
no |
1 – available, 0 – unavailable, -1 – draft. |
description |
string |
no |
Product description, at least 2 characters. |
store_prices |
object |
no |
Selling price. Replaces the stored selling price entirely: send is_vat_free and both prices together. Returned as store_configuration. The currency and price[min]/price[max] filters of GET /products match its price_include_vat. |
store_prices.is_vat_free |
boolean |
no |
true if the product is exempt from VAT. |
store_prices.price_without_vat |
object |
no |
Price before VAT. |
store_prices.price_without_vat.amount |
number |
yes |
Decimal amount in major units, e.g. 99.99. |
store_prices.price_without_vat.currency |
string |
yes |
ISO 4217 currency code, e.g. ILS. |
store_prices.price_include_vat |
object |
no |
Price including VAT. |
store_prices.price_include_vat.amount |
number |
yes |
Decimal amount in major units, e.g. 99.99. |
store_prices.price_include_vat.currency |
string |
yes |
ISO 4217 currency code, e.g. ILS. |
costs |
object |
no |
Your cost for the product, same shape as store_prices. Replaces the stored cost entirely. Returned as costs_details. |
costs.is_vat_free |
boolean |
no |
true if the product is exempt from VAT. |
costs.price_without_vat |
object |
no |
Price before VAT. |
costs.price_without_vat.amount |
number |
yes |
Decimal amount in major units, e.g. 99.99. |
costs.price_without_vat.currency |
string |
yes |
ISO 4217 currency code, e.g. ILS. |
costs.price_include_vat |
object |
no |
Price including VAT. |
costs.price_include_vat.amount |
number |
yes |
Decimal amount in major units, e.g. 99.99. |
costs.price_include_vat.currency |
string |
yes |
ISO 4217 currency code, e.g. ILS. |
Request example
{
"name": "Example product",
"status": 1,
"store_prices": {
"is_vat_free": false,
"price_without_vat": {
"amount": 99.99,
"currency": "ILS"
},
"price_include_vat": {
"amount": 117.99,
"currency": "ILS"
}
}
}
Code samples
curl
curl -X PATCH 'https://payme-store-staging.payme.io/api/products/<guid>' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_TOKEN>' \
--data-raw '{
"name": "Example product",
"status": 1,
"store_prices": {
"is_vat_free": false,
"price_without_vat": {
"amount": 99.99,
"currency": "ILS"
},
"price_include_vat": {
"amount": 117.99,
"currency": "ILS"
}
}
}'
Node.js
const response = await fetch("https://payme-store-staging.payme.io/api/products/<guid>", {
method: "PATCH",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer <YOUR_TOKEN>",
},
body: JSON.stringify({
"name": "Example product",
"status": 1,
"store_prices": {
"is_vat_free": false,
"price_without_vat": {
"amount": 99.99,
"currency": "ILS"
},
"price_include_vat": {
"amount": 117.99,
"currency": "ILS"
}
}
}),
});
console.log(await response.text());
Python
import requests
response = requests.patch(
"https://payme-store-staging.payme.io/api/products/<guid>",
headers={
"Authorization": "Bearer <YOUR_TOKEN>",
},
json={
"name": "Example product",
"status": 1,
"store_prices": {
"is_vat_free": False,
"price_without_vat": {
"amount": 99.99,
"currency": "ILS",
},
"price_include_vat": {
"amount": 117.99,
"currency": "ILS",
},
},
},
)
print(response.text)
PHP
<?php
$body = <<<'BODY'
{
"name": "Example product",
"status": 1,
"store_prices": {
"is_vat_free": false,
"price_without_vat": {
"amount": 99.99,
"currency": "ILS"
},
"price_include_vat": {
"amount": 117.99,
"currency": "ILS"
}
}
}
BODY;
$ch = curl_init('https://payme-store-staging.payme.io/api/products/<guid>');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer <YOUR_TOKEN>',
],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Responses
200 — Product updated. (success)
| Field |
Type |
Description |
guid |
string |
The product id (a UUID). |
created_at |
string |
Creation time, ISO 8601 (UTC). |
updated_at |
string |
Time of this update, ISO 8601 (UTC). |
{
"guid": "3f2b8f0e-5d7c-4a1e-9b8a-2c4d6e8f0a1b",
"created_at": "2026-11-01T09:30:00.000Z",
"updated_at": "2026-11-09T10:00:00.000Z"
}
400 — A field is invalid, the body isn't valid JSON, or guid isn't a UUID. (error)
| Field |
Type |
Description |
status_error_details |
string |
What went wrong. Validation messages are in Hebrew unless you send Accept-Language: en. |
status_error_code |
integer |
501 for a validation error or a body that isn't valid JSON, 999 for any other error. |
validation_errors |
object |
The fields that failed validation. Each key is a field name; its value maps each failed rule to a message. |
session |
string |
Trace id of the request. Quote it when you contact PayMe support. |
{
"status_error_details": "Please verify that the JSON provided is valid",
"status_error_code": 501,
"session": "f3a1c2b0-9e4d-11ef-8c1a-0242ac120002"
}
| Field |
Type |
Description |
status_error_details |
string |
What went wrong. |
status_error_code |
integer |
999. |
session |
string |
Trace id of the request. Quote it when you contact PayMe support. |
{
"status_error_details": "Unauthorized",
"status_error_code": 999,
"session": "f3a1c2b0-9e4d-11ef-8c1a-0242ac120002"
}
404 — The product doesn't exist, was deleted, or belongs to another seller. (error)
| Field |
Type |
Description |
status_error_details |
string |
What went wrong. |
status_error_code |
integer |
999. |
session |
string |
Trace id of the request. Quote it when you contact PayMe support. |
{
"status_error_details": "Product not found",
"status_error_code": 999,
"session": "f3a1c2b0-9e4d-11ef-8c1a-0242ac120002"
}
409 — product_remote_id is already used by another of the seller's products. (error)
| Field |
Type |
Description |
status_error_details |
string |
What went wrong. |
status_error_code |
integer |
999. |
session |
string |
Trace id of the request. Quote it when you contact PayMe support. |
{
"status_error_details": "Product remote id already exist",
"status_error_code": 999,
"session": "f3a1c2b0-9e4d-11ef-8c1a-0242ac120002"
}
| Field |
Type |
Description |
status_error_details |
string |
What went wrong. |
status_error_code |
integer |
999. |
session |
string |
Trace id of the request. Quote it when you contact PayMe support. |