Update a product

Credentials

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"
}

401 — The Authorization header is missing, or the access token is invalid or expired. Get a new token with POST /refresh-exchanges or POST /auth-tokens. (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": "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"
}

500 — Server error. Contact PayMe support and quote the session. (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.