Темы, ассеты и файлы
Для чтения и изменения тем, ассетов и типов виджетов приложению нужно право на дизайн. Для работы с разделом «Контент — Файлы» нужно право на файлы, для панелей блоков — право на блоки.
Если нужного права нет, ответ 403:
{"status":"error","message":"Недостаточно прав для операции"}
Новую тему через этот API создать нельзя: POST /admin/themes.json отвечает 404. Скачать тему архивом нельзя: GET /admin/themes/:id/export.json отвечает 404.
Файлы темы и файлы раздела «Контент — Файлы» имеют разные адреса на витрине. В шаблоне используйте фильтр asset_url для файла темы и file_url для файла из раздела «Контент — Файлы».
Список тем
GET /admin/themes.json возвращает массив тем, которые можно открыть. В объект входят название, признак публикации, язык, версия ассетов и текст последней ошибки темы.
GET /admin/themes.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
[
{
"id": 1,
"title": "Пользовательская",
"description": null,
"is_published": true,
"is_mobile": null,
"language_id": 1,
"assets_version": 1651223995,
"errors_text": null,
"created_at": "2026-10-19T21:43:37.000+03:00",
"updated_at": "2026-10-21T22:17:41.000+03:00"
}
]
is_published: true — тема включена на витрине. language_id — язык темы. assets_version входит в путь файлов темы. errors_text — текст последней ошибки темы. У темы без ошибки поле равно null.
GET /admin/themes/999999999.json отвечает 404. Тело при заголовке Accept: application/json остаётся HTML-страницей.
При чтении одной темы API возвращает тот же набор полей.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id темы в пути. |
GET /admin/themes/1.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
{
"id": 1,
"title": "Пользовательская",
"description": null,
"is_published": true,
"is_mobile": null,
"language_id": 1,
"assets_version": 1651223995,
"errors_text": null,
"created_at": "2026-10-19T21:43:37.000+03:00",
"updated_at": "2026-10-21T22:17:41.000+03:00"
}
Название и описание
PUT /admin/themes/:id.json сохраняет title и description. Ответ — {"status":"ok"}, саму тему нужно прочитать отдельным GET. description: null очищает описание.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id темы в пути. |
theme[title] необязательныйстрока |
Название темы. |
theme[description] необязательныйстрока |
Описание. `null` очищает поле. |
PUT /admin/themes/1.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"theme": {
"title": "Пользовательская",
"description": "docs probe"
}
}
Ответ · 200
{"status":"ok"}
Чтобы изменить цвета, шрифты и пресеты, обновите файл settings_data.json. Эти настройки не передаются в запросе на изменение темы. Подробнее — в разделе «Настройки темы».
Публикация
PUT /admin/themes/:id/publish.json публикует тему. Повторный вызов для уже опубликованной темы тоже отвечает {"status":"ok"}.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id темы в пути. |
PUT /admin/themes/1/publish.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{}
Ответ · 200
{"status":"ok"}
Удаление
Если отправить DELETE /admin/themes/:id.json для опубликованной основной темы, API вернёт {"status":"ok"}, но тема останется в списке.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id темы в пути. |
DELETE /admin/themes/1.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
{"status":"ok"}
После ответа на удаление проверьте тему отдельным запросом. Ответ {"status":"ok"} подтверждает принятие запроса, но не гарантирует удаление записи.
Ассеты темы
Ассет — файл внутри темы: шаблон, сниппет, картинка, стиль, скрипт или JSON из каталога config. Адрес: /admin/themes/:theme_id/assets.json.
type при создании:
| Тип | Что это | Имя в запросе |
|---|---|---|
Asset::Template |
Шаблон страницы. К имени дописывается .liquid. |
product.docs_api становится product.docs_api.liquid |
Asset::Snippet |
Сниппет. К имени дописывается .liquid. |
docs_api_note становится docs_api_note.liquid |
Asset::Media |
Картинка, CSS, JS и прочие файлы в корне темы. | Имя как есть, с расширением: docs-api.png |
Asset::Configuration |
JSON настроек в config. |
docs-api.json, settings_data.json |
Список возвращает идентификатор, тип, имя, человекочитаемое имя, адрес и version — время изменения в формате Unix. Содержимое файлов в список не включается.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
GET /admin/themes/1/assets.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
[
{
"id": 97,
"human_readable_name": "Товар",
"asset_url": "/assets/1/1/1/1651223995/templates/product.liquid",
"inner_file_name": "product.liquid",
"type": "Asset::Template",
"version": 1792435418
},
{
"id": 177,
"human_readable_name": "theme.css",
"asset_url": "/assets/1/1/1/1651223995/theme.css",
"inner_file_name": "theme.css",
"type": "Asset::Media",
"version": 1792435421
}
]
Список содержит все файлы темы без их содержимого. Поле asset_url задаёт путь к файлу на витрине без хоста. Путь включает значение assets_version темы.
При чтении одного Liquid-файла API дополнительно возвращает поле content. Для CSS, JS, изображений и JSON это поле в ответ не включается.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
id обязательныйчисло |
id ассета в пути. |
GET /admin/themes/1/assets/113.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
{
"id": 113,
"human_readable_name": "head.liquid",
"asset_url": "/assets/1/1/1/1651223995/snippets/head.liquid",
"inner_file_name": "head.liquid",
"type": "Asset::Snippet",
"version": 1792435418,
"content": "<!-- meta -->\n<meta charset=\"UTF-8\" />\n"
}
У CSS, JS, картинки и JSON тот же GET возвращает метаданные без content.
Чтобы получить содержимое любого файла, используйте отдельный адрес .../raw.json. API возвращает само содержимое: текст для JSON или CSS, байты файла для изображения.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
id обязательныйчисло |
id ассета в пути. |
GET /admin/themes/1/assets/153/raw.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
{
"current": "custom",
"generation": 4,
"presets": {
"custom": {
"color-btn-bg": "#0073E6"
}
}
}
Например, через этот адрес можно прочитать settings_data.json. Запрос к .../raw без суффикса .json возвращает 404 с пустым телом.
При чтении изображения в формате .xml ответ дополнительно содержит attachment — файл в Base64. В JSON этого поля нет; для получения байтов изображения используйте raw.json.
Создание ассета
Для создания ассета отправьте POST /admin/themes/:theme_id/assets.json. Заголовок Content-Type: application/json обязателен. Без него API вернёт 422 и {"message":"incorrect Content-Type, should be application/json"}.
Чтобы создать сниппет, передайте его текст в content. InSales автоматически добавит расширение .liquid к имени.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
asset[type] обязательныйстрока |
`Asset::Snippet`. |
asset[name] обязательныйстрока |
Имя без `.liquid`. |
asset[content] обязательныйстрока |
Текст сниппета. |
POST /admin/themes/1/assets.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"asset": {
"type": "Asset::Snippet",
"name": "docs_api_note",
"content": "<p>docs-api</p>"
}
}
Ответ · 201
{
"id": 1241,
"human_readable_name": "docs_api_note.liquid",
"asset_url": "/assets/1/1/1/1651223995/snippets/docs_api_note.liquid?1792609806",
"inner_file_name": "docs_api_note.liquid",
"type": "Asset::Snippet",
"version": 1792609806
}
Повтор с тем же именем — 422:
{"inner_file_name":["Файл с именем docs_api_note.liquid уже существует"]}
Невалидный Liquid отвечает 422:
{"inner":["Ошибка синтаксиса: Liquid syntax error (line 1): [:end_of_string] is not a valid expression in \"\""]}
Неизвестный type — 422, в теле одновременно «Не заполнены обязательные поля» у inner и «имеет неверное значение» у type.
Свой шаблон товара называется product.ИМЯ. В ответе human_readable_name — «Товар: ИМЯ». Так же создаются page.ИМЯ («Страница: ИМЯ») и collection.ИМЯ («Категория: ИМЯ»).
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
asset[type] обязательныйстрока |
`Asset::Template`. |
asset[name] обязательныйстрока |
Тип страницы, точка и имя шаблона. |
asset[content] обязательныйстрока |
Liquid-текст шаблона. |
POST /admin/themes/1/assets.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"asset": {
"type": "Asset::Template",
"name": "product.docs_api",
"content": "<h1>{{ product.title }}</h1>"
}
}
Ответ · 201
{
"id": 1249,
"human_readable_name": "Товар: docs_api",
"asset_url": "/assets/1/1/1/1651223995/templates/product.docs_api.liquid?1792609807",
"inner_file_name": "product.docs_api.liquid",
"type": "Asset::Template",
"version": 1792609807
}
Чтобы загрузить изображение или другой бинарный файл, передайте его содержимое в Base64 в поле attachment. В filename укажите имя файла — оно будет возвращаться в поле name.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
asset[type] обязательныйстрока |
`Asset::Media`. |
asset[name] обязательныйстрока |
Имя файла с расширением. |
asset[filename] обязательныйстрока |
То же имя: по нему определяется тип Base64. |
asset[attachment] обязательныйстрока |
Файл в Base64. |
POST /admin/themes/1/assets.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"asset": {
"type": "Asset::Media",
"name": "docs-api.png",
"filename": "docs-api.png",
"attachment": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
}
}
Ответ · 201
{
"id": 1257,
"human_readable_name": "docs-api.png",
"asset_url": "/assets/1/1/1/1651223995/docs-api.png?1792609808",
"inner_file_name": "docs-api.png",
"type": "Asset::Media",
"version": 1792609808
}
Вместо содержимого в Base64 можно передать публичный URL в src со схемой http или https. Для адреса внутренней сети API возвращает 422: ошибку «Недопустимый URL» у src и «Не заполнены обязательные поля» у inner.
CSS и JSON создаются тем же полем content. Для CSS тип — Asset::Media, для JSON — Asset::Configuration. raw.json возвращает текст файла как есть.
Изменение и переименование
Чтобы заменить содержимое ассета, передайте новый текст в content запросом PUT. В JSON-ответе текст файла не возвращается. Проверьте результат через GET для Liquid-файла или через raw.json для остальных типов.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
id обязательныйчисло |
id ассета в пути. |
asset[content] обязательныйстрока |
Новый текст файла. |
PUT /admin/themes/1/assets/1241.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"asset": {
"content": "<p>docs-api updated</p>"
}
}
Ответ · 200
{
"id": 1241,
"human_readable_name": "docs_api_note.liquid",
"asset_url": "/assets/1/1/1/1651223995/snippets/docs_api_note.liquid",
"inner_file_name": "docs_api_note.liquid",
"type": "Asset::Snippet",
"version": 1792609807
}
Для переименования используйте отдельный путь .../rename.json. Передайте новое имя в поле new_name.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
id обязательныйчисло |
id ассета в пути. |
asset[new_name] обязательныйстрока |
Новое имя файла. |
PUT /admin/themes/1/assets/1241/rename.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"asset": {
"new_name": "docs_api_note_renamed.liquid"
}
}
Ответ · 200
{
"id": 1241,
"human_readable_name": "docs_api_note_renamed.liquid",
"asset_url": "/assets/1/1/1/1651223995/snippets/docs_api_note_renamed.liquid?1792609807",
"inner_file_name": "docs_api_note_renamed.liquid",
"type": "Asset::Snippet",
"version": 1792609807
}
Стандартный шаблон, например product.liquid, так не переименовывается. Ответ 422:
{"inner_file_name":["Нельзя переименовать стандартный шаблон"]}
Удаление ассета
DELETE возвращает 200 с пустым телом и при успешном удалении, и когда файл удалить нельзя. Чтобы проверить результат, запросите файл отдельным GET.
Сниппет, свой шаблон, картинка и CSS после такого ответа читаются как 404. Стандартный product.liquid остаётся на месте. Файл типа Asset::Configuration, в том числе свой JSON-файл настроек и settings_data.json, тоже остаётся: GET после DELETE по-прежнему 200.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
id обязательныйчисло |
id ассета в пути. |
DELETE /admin/themes/1/assets/1241.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
Тело пустое.
Настройки темы
Цвета, шрифты и текущий пресет хранятся в settings_data.json — ассете типа Asset::Configuration. Чтобы прочитать файл, используйте .../raw.json: запрос метаданных не возвращает content.
Для сохранения передайте весь JSON файла строкой в content запросом PUT. API вернёт метаданные ассета. Проверьте сохранённый текст повторным запросом к raw.json.
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
id обязательныйчисло |
id ассета `settings_data.json`. |
asset[content] обязательныйстрока |
Полный JSON файла настроек. |
PUT /admin/themes/1/assets/153.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"asset": {
"content": "<текст из GET /admin/themes/1/assets/153/raw.json>"
}
}
Ответ · 200
{
"id": 153,
"human_readable_name": "settings_data.json",
"asset_url": "/assets/1/1/1/1651223995/config/settings_data.json",
"inner_file_name": "settings_data.json",
"type": "Asset::Configuration",
"version": 1792609881
}
Перед сохранением получите весь файл через raw.json, измените нужные ключи и передайте полный JSON в content. Если передать только часть файла, остальные настройки пресета будут удалены.
Перед сохранением settings_data.json проверяйте синтаксис JSON: API принимает даже невалидный JSON со статусом 200, после чего файл не удаётся разобрать. Для settings.json и других JSON-ассетов такое тело отклоняется со статусом 422, а файл остаётся прежним:
{"content":["Невалидный json"]}
Рядом в теме лежат:
settings.json— описание полей редактора. Невалидный JSON отклоняется.messages.json— тексты по языкам. Обновляется тем жеPUTс полным JSON.setup.json— состав блоков темы, в том числеblock_lists. Читается черезraw.json. Метода для панелей виджетов страницы в этом API нет, см. ниже.
Файлы аккаунта
Ресурс /admin/files.json позволяет работать с разделом «Контент — Файлы». В ответе возвращаются id, created_at и absolute_url. Отдельного поля с именем нет: имя файла находится в конце absolute_url.
GET /admin/files.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
[
{
"id": 249,
"created_at": "2026-10-21T22:13:06.867+03:00",
"absolute_url": "https://static-ru.insales.ru/files/1/249/249/original/docs-api.png"
},
{
"id": 257,
"created_at": "2026-10-21T22:13:06.992+03:00",
"absolute_url": "https://static-ru.insales.ru/files/1/257/257/original/docs-api.txt"
}
]
absolute_url — полный адрес файла на CDN. Хост у магазина свой, путь имеет вид /files/…/original/имя. Хост из адреса убирать нельзя. В шаблоне тот же файл подключают фильтром file_url по имени.
При создании файла absolute_url содержит параметр URL со временем изменения в формате Unix. В списке и в ответе GET /admin/files/:id.json этот параметр отсутствует.
name ищет подстроку в имени. Без per_page на странице 10 файлов. page начинается с 1. page=0 отвечает 422:
{"message":"page должен иметь значение, большее 0"}
| Параметр | Описание |
|---|---|
name необязательныйстрока |
Часть имени файла. |
per_page необязательныйчисло |
Размер страницы. Без параметра — 10. |
page необязательныйчисло |
Номер страницы, начиная с 1. |
GET /admin/files.json?name=docs-api&per_page=1&page=1
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
[
{
"id": 249,
"created_at": "2026-10-21T22:13:06.867+03:00",
"absolute_url": "https://static-ru.insales.ru/files/1/249/249/original/docs-api.png"
}
]
Чтобы загрузить файл, передайте его содержимое в Base64 в attachment и имя в filename. Изменить существующий файл нельзя: PUT /admin/files/:id.json возвращает 404. Для замены удалите файл и создайте его заново. Повторное имя отклоняется со статусом 422 и телом {"inner_file_name":["уже существует"]}.
| Параметр | Описание |
|---|---|
file[filename] обязательныйстрока |
Имя файла с расширением. |
file[attachment] обязательныйстрока |
Файл в Base64. Вместо него можно передать `file[src]`. |
POST /admin/files.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"file": {
"filename": "docs-api.png",
"attachment": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
}
}
Ответ · 201
{
"id": 249,
"created_at": "2026-10-21T22:13:06.867+03:00",
"absolute_url": "https://static-ru.insales.ru/files/1/249/249/original/docs-api.png?1792609986"
}
Для непубличного адреса в src API возвращает 422 и сообщение «Недопустимый URL». Имя robots.txt также отклоняется со статусом 422:
{"inner_file_name":["Вы можете отредактировать robots.txt в разделе Настройки → Robots.txt"]}
Удаление возвращает {"status":"ok"}. Следующий GET этого id — HTML 404.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id файла в пути. |
DELETE /admin/files/249.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
{"status":"ok"}
Свой шаблон страницы
Чтобы назначить собственный шаблон товару, странице или категории, запишите в custom_template часть имени файла между первой точкой и .liquid. Например, для product.docs_api.liquid передайте docs_api. Одного создания файла недостаточно для его назначения.
API сохраняет custom_template, даже если соответствующего файла нет в теме.
Товар:
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id товара в пути. |
product[custom_template] необязательныйстрока |
Имя шаблона без префикса `product.` и без `.liquid`. |
PUT /admin/products/681.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"product": {
"custom_template": "docs_api"
}
}
Ответ · 200
{
"id": 681,
"title": "docs-api-theme",
"custom_template": "docs_api"
}
Создание товара — в разделе про товары.
Страница принимает то же поле, но без текста страницы ответ 422: «Добавьте какой-нибудь текст на страницу, даже если она будет скрыта.» С текстом custom_template сохраняется.
| Параметр | Описание |
|---|---|
page[title] обязательныйстрока |
Название. Из него строится permalink. |
page[content] обязательныйстрока |
Текст страницы. |
page[custom_template] необязательныйстрока |
Имя шаблона для файла `page.ИМЯ.liquid`. |
POST /admin/pages.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"page": {
"title": "docs-api page",
"content": "Текст страницы",
"custom_template": "docs_api"
}
}
Ответ · 201
{
"id": 59,
"title": "docs-api page",
"permalink": "docs-api-page-710e05",
"content": "Текст страницы",
"custom_template": "docs_api",
"is_hidden": false,
"kind": "only_page"
}
Категория создаётся с parent_id существующей категории и тем же custom_template. Без родителя ответ 422: «Не заполнены обязательные поля» у parent_id. Файл шаблона категории — collection.docs_api.liquid.
У блога в GET /admin/blogs.json есть поле custom_template.
Виджеты темы
Для работы с типами виджетов темы используйте /admin/themes/:theme_id/widget_types.json. Список возвращает только собственные типы указанной темы; системные типы не включаются.
Размещать виджеты на странице, получать список виджетов страницы и панели header / content / footer через этот API нельзя. Запросы GET /admin/themes/1/widgets.json, GET /admin/widget_lists.json и GET /admin/widgets.json возвращают 404.
Виджет в карточке заказа или товара бэк-офиса — другой ресурс, виджеты приложения.
При создании типа виджета передавайте поля на верхнем уровне JSON. Если вложить их в widget_type, API вернёт 422: ключ будет отмечен как неизвестный, а обязательные поля — как пропущенные.
page_kinds — массив из all, index, collection, product, cart, page, search, blog, article, compare, favorite, shared_cart. Чужое значение даёт 422: {"page_kinds":{"0":["is not valid"]}}.
widget_list_kinds — массив из header, before_content, content, sidebar, after_content, footer, outside, top_panel, bottom_panel. Чужое значение: {"widget_list_kinds":{"0":["is not valid"]}}.
widget_category_handle — handle существующей категории, например benefits. Неизвестная категория: 422, widget_category_id — «Не заполнены обязательные поля».
| Параметр | Описание |
|---|---|
theme_id обязательныйчисло |
id темы в пути. |
type обязательныйстрока |
`SimpleWidgetType` или `BlockListWidgetType`. |
name обязательныйобъект |
Название по языкам, ключ `ru` и другие. |
handle обязательныйстрока |
Код виджета в теме. Не начинается с `system_`. |
snippet_content обязательныйстрока |
Liquid-разметка. |
generation обязательныйчисло |
Поколение виджета. Для темы поколения 4 — `4`. |
page_kinds обязательныймассив |
Типы страниц, где виджет можно поставить. |
widget_list_kinds обязательныймассив |
Панели, куда виджет можно поставить. |
widget_category_handle необязательныйстрока |
Категория в списке виджетов. Без известной категории запись не создаётся. |
snippet_js необязательныйстрока |
JavaScript виджета. |
snippet_scss необязательныйстрока |
Стили виджета. |
messages необязательныйстрока |
JSON текстов. В теле запроса это строка. |
description необязательныйобъект |
Описание по языкам. |
setup необязательныйстрока |
JSON состава строкой. |
settings_form необязательныйстрока |
JSON формы настроек строкой. |
settings_data необязательныйстрока |
JSON значений строкой. |
block_template_handle необязательныйстрока |
Шаблон блока. Нужен для `BlockListWidgetType`. |
POST /admin/themes/1/widget_types.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"type": "SimpleWidgetType",
"name": {"ru": "docs-api виджет"},
"handle": "docs-api-widget",
"snippet_content": "<div class=\"docs-api\">{{ widget_settings.title }}</div>",
"generation": 4,
"page_kinds": ["index", "all"],
"widget_list_kinds": ["content"],
"widget_category_handle": "benefits",
"snippet_js": "console.log('docs-api');",
"snippet_scss": ".docs-api{display:block}",
"messages": "{\"ru\":{\"title\":\"Заголовок\"}}",
"description": {"ru": "Пример виджета"},
"setup": "{}",
"settings_form": "{\"content\":[],\"design\":[]}",
"settings_data": "{}"
}
Ответ · 201
{
"id": 12381652,
"type": "SimpleWidgetType",
"name": "docs-api виджет",
"handle": "docs-api-widget",
"snippet_content": "<div class=\"docs-api\">{{ widget_settings.title }}</div>",
"snippet_scss": ".docs-api{display:block}",
"snippet_js": "console.log('docs-api');",
"settings_form": "{\"content\":[],\"design\":[]}",
"settings_data": "{}",
"setup": "{}",
"messages": "{\"ru\":{\"title\":\"Заголовок\"}}",
"description": "Пример виджета",
"page_kinds": ["index", "all"],
"widget_list_kinds": ["content"],
"generation": 4,
"preview_url": null,
"widget_category_handle": "benefits",
"libraries": []
}
В ответе name и description содержат строки на текущем языке. В запросе name нужно передавать объектом с ключами языков. Поле handle задаётся при создании и не меняется: PUT с этим полем возвращает 422 и {"handle":["unknown attribute"]}.
Пустой JSON {} на создание отвечает 422 и перечисляет пропущенные поля: type, name, handle, snippet_content, generation, page_kinds, widget_list_kinds. Неизвестный type — {"type":["is not valid"]}.
PUT меняет переданные поля и возвращает тип целиком. GET /admin/themes/:theme_id/widget_types.json возвращает массив таких объектов. GET одного id — один объект. DELETE отвечает 200 и пустым телом, следующий GET — HTML 404.
Виджет со списком блоков создаётся типом BlockListWidgetType. В block_template_handle передаётся handle системного шаблона блока, например system-benefit. В ответе это поле возвращается вместе с остальными полями простого виджета.
| Параметр | Описание |
|---|---|
type обязательныйстрока |
`BlockListWidgetType`. |
block_template_handle обязательныйстрока |
Handle системного шаблона блока, например `system-benefit`. |
name обязательныйобъект |
Название по языкам. |
handle обязательныйстрока |
Код виджета. |
snippet_content обязательныйстрока |
Liquid-разметка. |
generation обязательныйчисло |
Поколение виджета. Для темы поколения 4 — `4`. |
page_kinds обязательныймассив |
Типы страниц. |
widget_list_kinds обязательныймассив |
Панели размещения. |
widget_category_handle обязательныйстрока |
Категория виджета. |
POST /admin/themes/1/widget_types.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Content-Type: application/json
{
"type": "BlockListWidgetType",
"name": {"ru": "docs-api блоки"},
"handle": "docs-api-blocks",
"snippet_content": "<div class=\"docs-api\">{{ widget_settings.title }}</div>",
"generation": 4,
"page_kinds": ["index", "all"],
"widget_list_kinds": ["content"],
"widget_category_handle": "benefits",
"block_template_handle": "system-benefit"
}
Ответ · 201
{
"id": 12381653,
"type": "BlockListWidgetType",
"name": "docs-api блоки",
"handle": "docs-api-blocks",
"block_template_handle": "system-benefit",
"generation": 4,
"page_kinds": ["index", "all"],
"widget_list_kinds": ["content"],
"widget_category_handle": "benefits"
}
Ответ содержит те же snippet_content, settings_form, messages и libraries, что и простой виджет, и поле block_template_handle.
Панели блоков
/admin/block_lists.json возвращает панели блоков магазина. У панели есть имя, liquid_name и block_template_id. Чтобы получить её состав, используйте /admin/block_lists/:id/block_list_items.json: у каждого элемента есть block_id и position.
GET /admin/block_lists.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
[
{
"id": 1,
"name": "Цвет стикеров",
"liquid_name": "block-list-e213b73920beb6a2-pffc9bb5ea465fefbd",
"block_template_id": 2851286,
"invisible": true
}
]
В ответе также есть account_id и даты. GET /admin/block_lists/1.json возвращает одну такую запись.
| Параметр | Описание |
|---|---|
block_list_id обязательныйчисло |
id панели в пути. |
GET /admin/block_lists/1/block_list_items.json
Authorization: Basic API_KEY:API_PASSWORD
Accept: application/json
Ответ · 200
[
{
"id": 1,
"block_list_id": 1,
"block_id": 1,
"position": 1
},
{
"id": 9,
"block_list_id": 1,
"block_id": 9,
"position": 2
}
]
Создать панель через POST /admin/block_lists.json с name и liquid_name нельзя: API возвращает 404 со страницей «Couldn't find BlockList without an ID». Изменение панели через PUT в JSON возвращает 406; панель не изменяется.
Получить список блоков через GET /admin/blocks.json нельзя: API возвращает 404. Запрос POST /admin/blocks.json с названием и текстом возвращает 200 и {"status":"error","errors":{}}. В формате XML тот же запрос возвращает 422 с пустым <errors/>. Отдельного метода чтения блока нет.
Для чтения состава блоков поколения 4, который отображается в редакторе темы, получите файл setup.json через raw.json. Методы панелей блоков не возвращают этот состав. Разместить виджет на панели через публичный API нельзя.