Остатки

Остатки и цены по артикулу — до 500 позиций за запрос.

Остатки и цены пачкой

PATCH/stockправо products:write

До 500 позиций за запрос; каждая находит варианты по артикулу и меняет stock, price и compare_price (только переданные поля). Если один артикул у нескольких вариантов, обновятся все. Ответ — результат по каждой позиции в том же порядке; артикул, которого нет, не мешает остальным. Неверное значение (bad_price, bad_stock) отклоняет весь запрос: ничего не изменится.

stock: null — склад не ведётся, количество не ограничено.

Большая пачка (больше 200 изменений) даёт один вебхук catalog.imported вместо события на каждый товар.

Тело запроса

ПолеТипОписание
items обязательномассив: объект
items[].sku обязательнострока
items[].stockцелое или nullНовый остаток; null — склад не ведётся.
items[].priceстрока или число
items[].compare_priceстрока или число или null

Пример запроса

curl -X PATCH https://api.okeysait.ru/v1/stock \
  -H "Authorization: Bearer $OKEANO_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "sku": "CANDLE-F",
        "stock": 18
      },
      {
        "sku": "CANDLE-S",
        "price": "990.00",
        "compare_price": "1290.00"
      }
    ]
  }'
<?php
$ch = curl_init('https://api.okeysait.ru/v1/stock');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . getenv('OKEANO_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'items' => [
            ['sku' => 'CANDLE-F', 'stock' => 18],
            [
                'sku' => 'CANDLE-S',
                'price' => '990.00',
                'compare_price' => '1290.00',
            ],
        ],
    ], JSON_UNESCAPED_UNICODE),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 30,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
echo $status, PHP_EOL, $response, PHP_EOL;
import os

import requests

r = requests.patch(
    "https://api.okeysait.ru/v1/stock",
    headers={"Authorization": f"Bearer {os.environ['OKEANO_KEY']}"},
    json={
        "items": [
            {"sku": "CANDLE-F", "stock": 18},
            {
                "sku": "CANDLE-S",
                "price": "990.00",
                "compare_price": "1290.00",
            },
        ],
    },
    timeout=30,
)
print(r.status_code)
print(r.text)
// Node.js 18+: файл .mjs (await на верхнем уровне)
const res = await fetch("https://api.okeysait.ru/v1/stock", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${process.env.OKEANO_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    items: [
      { sku: "CANDLE-F", stock: 18 },
      {
        sku: "CANDLE-S",
        price: "990.00",
        compare_price: "1290.00",
      },
    ],
  }),
});
console.log(res.status);
console.log(await res.text());
// 1С:Предприятие 8.3
КлючОкеано = "oks_…"; // ключ из панели магазина; в рабочей базе храните его отдельно от кода
Соединение = Новый HTTPСоединение("api.okeysait.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/v1/stock");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + КлючОкеано);
Запрос.Заголовки.Вставить("Content-Type", "application/json");

Данные = Новый Структура;
Позиции = Новый Массив;
Позиция1 = Новый Структура;
Позиция1.Вставить("sku", "CANDLE-F");
Позиция1.Вставить("stock", 18);
Позиции.Добавить(Позиция1);
Позиция2 = Новый Структура;
Позиция2.Вставить("sku", "CANDLE-S");
Позиция2.Вставить("price", "990.00");
Позиция2.Вставить("compare_price", "1290.00");
Позиции.Добавить(Позиция2);
Данные.Вставить("items", Позиции);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Запрос.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ВызватьHTTPМетод("PATCH", Запрос);
Сообщить(Ответ.КодСостояния);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
  "items": [
    {
      "sku": "CANDLE-F",
      "stock": 18
    },
    {
      "sku": "CANDLE-S",
      "price": "990.00",
      "compare_price": "1290.00"
    }
  ]
}`)
	req, err := http.NewRequest("PATCH", "https://api.okeysait.ru/v1/stock", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("OKEANO_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.StatusCode)
	fmt.Println(string(data))
}

Ответ 200

JSON
{
  "data": [
    {
      "sku": "CANDLE-F",
      "result": "updated",
      "variants": 1
    },
    {
      "sku": "CANDLE-S",
      "result": "not_found"
    }
  ]
}

Другие ответы: 400, 401, 403, 422, 429 — коды ошибок.

Выбор города
Ваш город можно выбрать через корзину или в комментариях к заказу