# Warehouse. Точки продаж

> Источник: https://wiki.virtualpos.ru/hc/api/warehouse  
> Обновлено: 2026-10-08

Методы для работы со справочником точек продаж (магазинов и складов): получение списка, создание и изменение.

> **Примечание:**
> Как получить ключ, как формируются запросы и какие бывают ответы и ошибки — в статье [Общие сведения](https://wiki.virtualpos.ru/hc/api/overview). Здесь описаны только особенности методов раздела `warehouse`.

## Методы

| Метод | Адрес | Что делает |
| --- | --- | --- |
| Получить точки продаж | `/api/warehouse` | Возвращает одну или все точки продаж |
| Создать или изменить | `/api/warehouse/update` | Обновляет точку продаж или создаёт новую |

Удаления точек продаж через API нет.

> **Важно:**
> **Где передавать параметры.** Ключ `apikey` и формат `format` принимаются и в адресной строке, и в теле POST-запроса. Параметры `id` и `external_id` в методе получения читаются **только из адресной строки (GET)**. В методе `update` все параметры можно передавать и в адресной строке, и в теле POST. Значения с кириллицей, пробелами и знаками `+` кодируйте.

## Получение точек продаж

```
GET https://[компания].myvirtualpos.ru/api/warehouse?apikey=MySecret&fields=organisation_name
```

### Параметры запроса

- **id** — Число. Ид точки продаж. Только GET
- **external_id** — Строка. Код точки продаж во внешней системе (например, в 1С). Только GET
- **fields** — Дополнительные поля через двоеточие. Допустимое значение: `organisation_name` — название юридического лица точки продаж
- **format** — `json` (по умолчанию) или `xml`

Условия объединяются по «и». Без параметров возвращаются все точки продаж одним ответом. Если указано неизвестное поле в `fields`, метод вернёт ошибку со списком допустимых значений.

### Структура ответа

- **success** — `1` — данные получены
- **type** — Тип данных, всегда `warehouse`
- **count** — Количество точек продаж в ответе
- **warehouses** — Список точек продаж. Каждая обёрнута в объект `warehouse`

### Поля точки продаж

Пустые значения в JSON приходят как `null`, в XML — как пустой элемент.

**Основное**

- **id** — Число. Ид точки продаж
- **external_id** — Строка. Код во внешней системе
- **number** — Строка. Номер точки продаж
- **name** — Строка. Название
- **active** — Число. `1` — точка активна
- **address** — Строка. Адрес
- **phone** — Строка. Телефон
- **open_time**, **close_time** — Строка. Время открытия и закрытия, формат `чч:мм:сс`
- **flag24hours** — Число. `1` — работает круглосуточно
- **lat**, **lon** — Строка. Широта и долгота
- **location_id** — Число. Ид территории
- **location_name** — Строка. Название территории
- **created_date**, **last_update_date** — Строка. Дата и время создания и последнего изменения
- **created_by**, **last_update_by** — Число. Ид пользователя, создавшего и изменившего запись

**Настройки**

- **minusale** — Число. `1` — разрешена продажа в минус (при отсутствии остатка)
- **show_in_shop** — Число. `1` — точка показывается в интернет-магазине и мобильном приложении
- **organisation_id** — Число. Ид юридического лица
- **manager_user_id** — Число. Ид ответственного менеджера
- **main_store_id** — Число. Не используется
- **headquerter_id** — Число. Ид головной точки. Написание поля сохранено для совместимости
- **vat_mandatory_flag** — Число. `1` — НДС обязателен
- **znak_branch_id** — Строка. Идентификатор в системе маркировки
- **sbp_merchant_id** — Строка. Идентификатор для платежей через СБП
- **attribute1** … **attribute15** — Строка. Значения гибких полей
- **organisation_name** — Строка. Название юридического лица, только при `fields=organisation_name`

### Пример ответа

```json
{
  "success": 1,
  "type": "warehouse",
  "count": 1,
  "warehouses": [
    {
      "warehouse": {
        "open_time": "10:00:00",
        "close_time": "21:00:00",
        "id": 6,
        "number": "5",
        "name": "Точка на Тверской",
        "active": 1,
        "address": "г. Москва, ул. Тверская, д. 3",
        "phone": "+7 900 000-00-01",
        "headquerter_id": 0,
        "created_date": "2019-06-06 17:25:12",
        "created_by": 3,
        "last_update_date": "2026-09-01 10:34:46",
        "last_update_by": 23,
        "flag24hours": 0,
        "lat": "55.76000000000000",
        "lon": "37.61000000000000",
        "minusale": 1,
        "location_id": 8,
        "external_id": "WH-6",
        "show_in_shop": 1,
        "organisation_id": 2,
        "vat_mandatory_flag": 0,
        "manager_user_id": 3,
        "main_store_id": null,
        "znak_branch_id": "",
        "sbp_merchant_id": null,
        "location_name": "Москва"
      }
    }
  ]
}
```

В примере опущены пустые гибкие поля `attribute1`…`attribute15`. Тот же ответ при `format=xml` (сокращённо):

```xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <success>1</success>
  <type>warehouse</type>
  <count>1</count>
  <warehouses>
    <warehouse>
      <open_time>10:00:00</open_time>
      <close_time>21:00:00</close_time>
      <id>6</id>
      <name>Точка на Тверской</name>
      <!-- остальные поля точки продаж -->
      <location_name>Москва</location_name>
    </warehouse>
  </warehouses>
</root>
```

Если ничего не найдено, метод возвращает успешный ответ с `count` равным `0` и пустым списком.

## Создание и изменение

```
POST https://[компания].myvirtualpos.ru/api/warehouse/update?apikey=MySecret&external_id=WH-6&create_if_not_exist=1
name=Точка на Тверской&address=г. Москва, ул. Тверская, д. 3&location_name=Москва
```

Точка продаж ищется по `id`, а если он не указан — по `external_id`. Если точка не найдена, а передан `create_if_not_exist=1`, создаётся новая. Изменяются только переданные параметры.

### Параметры

- **id** — Число. Ид изменяемой точки продаж
- **external_id** — Строка. Код точки продаж во внешней системе. Если `id` не указан, по нему ищется точка; одновременно это поле точки: при создании код сохраняется
- **create_if_not_exist** — `1` — создать точку продаж, если она не найдена
- **name** — Строка. Название. Обязательно при создании
- **address** — Строка. Адрес. Обязателен при создании
- **phone** — Строка. Телефон
- **open_time**, **close_time** — Строка. Время открытия и закрытия, формат `чч:мм:сс`
- **flag24hours** — `1` — работает круглосуточно, `0` — нет
- **lat**, **lon** — Число. Широта и долгота
- **minusale** — `1` — разрешить продажу в минус, `0` — запретить
- **location_id** — Число. Ид территории; территория должна существовать
- **location_name** — Строка. Название территории, используется, если не указан `location_id`. Если территории с таким названием нет, она создаётся
- **default_pricelist_id** — Число. Ид прайс-листа, который становится основным для точки продаж. Прайс-лист должен существовать
- **attribute1** … **attribute15** — Значения гибких полей

Остальные поля точки продаж (например, `active`, `organisation_id`, `show_in_shop`) через API не меняются: настраивайте их в панели управления.

> **Важно:**
> **Территория новой точки.** Если при создании не указаны ни `location_id`, ни `location_name`, точка привязывается к первой найденной территории. Для правильной привязки указывайте территорию явно. Если в системе нет ни одной территории и не указано название, метод вернёт ошибку.
>
> **Значения по умолчанию.** Не переданные при создании `lat`, `lon` и `minusale` становятся равными `0`.

### Ответ

```json
{"success":1,"id":"17","isnew":"1"}
```

- **success** — `1` — точка продаж сохранена
- **id** — Ид точки продаж. При создании приходит строкой, при изменении — числом
- **isnew** — `"1"` — создана, `"0"` — изменена существующая

## Примеры запросов

| Задача | Запрос |
| --- | --- |
| Все точки продаж | `/api/warehouse?apikey=MySecret` |
| Точка по ид с юридическим лицом | `/api/warehouse?apikey=MySecret&id=6&fields=organisation_name` |
| Точка по коду из 1С | `/api/warehouse?apikey=MySecret&external_id=WH-6` |
| Создать точку | `/api/warehouse/update?apikey=MySecret&create_if_not_exist=1&external_id=WH-7&name=Shop7&address=Moscow&location_id=8` |
| Изменить телефон | `/api/warehouse/update?apikey=MySecret&id=6&phone=%2B79000000001` |
| Назначить основной прайс-лист | `/api/warehouse/update?apikey=MySecret&id=6&default_pricelist_id=1` |

## Ошибки

Ошибка авторизации и общие ошибки описаны в статье [Общие сведения](https://wiki.virtualpos.ru/hc/api/overview). Ошибки приходят с кодом HTTP 200 и `success` равным `0`:

| Сообщение | Причина | Что делать |
| --- | --- | --- |
| You have to specify [id] or [external_id] to update record | Нет `id`, `external_id` и `create_if_not_exist` | Передайте идентификатор или `create_if_not_exist=1` |
| Record not found | Точка не найдена, а `create_if_not_exist` не указан | Проверьте идентификатор или передайте `create_if_not_exist=1` |
| There is no any location in VirtualPos. Please create new location and try again | В системе нет территорий | Создайте территорию или передайте `location_name` |
| Data validation failed. … | Не заполнены название или адрес, нечисловые `lat` или `lon` | Исправьте поля, перечисленные в сообщении |
| Cannot save data. … | Ошибка сохранения; например, `location_id` или `default_pricelist_id` указывают на несуществующую запись | Проверьте ссылки на другие записи |
| Field '…' not found. Use combination of: [organisation_name] | Неизвестное поле в `fields` | Используйте `organisation_name` |

## Связанные разделы

- [Общие сведения](https://wiki.virtualpos.ru/hc/api/overview) — Ключ доступа, вызов методов, форматы ответов и ошибки
- [Pricelist. Цены на товары](https://wiki.virtualpos.ru/hc/api/pricelist) — Прайс-листы, назначаемые точкам продаж
- [Store. Остатки товара](https://wiki.virtualpos.ru/hc/api/store) — Остатки на точках продаж
