Variable API
Variable API даёт внешним системам единый режим чтения: можно узнать, какие поля доступны в SNABZHENETS+, и получить значения по конкретной сущности. Те же пути переменных используются в документах и API-интеграциях.
Авторизация
Variable API поддерживает два способа доступа:
- JWT текущего пользователя: права берутся из роли пользователя в портале.
- API key: ключ передаётся в заголовке
X-API-Keyи должен иметьvariables.readплюс право чтения нужной области.
Примеры доменных scopes:
| Scope | Доступ |
|---|---|
catalog.read | Номенклатура и связанные каталоговые переменные |
price_lists.read | Прайсы |
warehouses.read | Склады и остатки |
counterparties.read | Контрагенты |
suppliers.read | Поставщики |
purchase_requisitions.read | Заявки |
documents.read | Документы |
customer_documents.read | КП, исходящие счета, договоры |
supplier_documents.read | RFQ, ответы поставщиков, входящие счета |
logistics.read | Объекты, маршруты, партии и документы поставки |
messengers.read | Безопасные внешние идентификаторы Wazzup и связанные чаты |
company.read или settings.read | Компания и региональные настройки |
users.read | Пользователи |
API key без variables.read не может получить ни каталог переменных, ни значения переменных. Legacy scope procurements.read принимается как alias для старых интеграций.
Переменная company.nomenclatureSavePolicy доступна в домене company со scope settings.read. Значение соответствует режиму сохранения номенклатуры: SUPPLIER_QUOTES_ALL, ACCEPTED_QUOTE_LINES_ONLY или ALL_PR_IMPORTED_AND_MANUAL_ITEMS.
Каталог переменных
GET /api/v1/variables?domain=catalog&entityType=catalogItem&search=sku&includeCustom=true
Authorization: Bearer <accessToken>Или через ключ:
GET /api/v1/variables?entityType=priceList
X-API-Key: spk_...Ответ содержит плоский список items, сгруппированный список groups для интерфейса и meta.
{
"items": [
{
"path": "catalogItem.sku",
"label": "SKU",
"domain": "catalog",
"entityTypes": ["catalogItem"],
"valueType": "string",
"scopes": ["catalog.read"]
}
],
"groups": [],
"meta": {
"total": 1,
"includeCustom": true,
"authType": "apiKey"
}
}Получение значений
POST /api/v1/variables/resolve
X-API-Key: spk_...
Content-Type: application/json
{
"entityType": "catalogItem",
"entityId": "catalog-item-001",
"paths": [
"catalogItem.id",
"catalogItem.type",
"catalogItem.sku",
"catalogItem.stock.available",
"custom.vendorCode"
]
}Пример ответа:
{
"entityType": "catalogItem",
"entityId": "catalog-item-001",
"values": {
"catalogItem.id": "catalog-item-001",
"catalogItem.type": "product",
"catalogItem.sku": "SKU-001",
"catalogItem.stock.available": "8",
"custom.vendorCode": "A-104"
},
"unresolved": [],
"resolvedAt": "2026-05-11T09:00:00.000Z"
}Если path недоступен по правам, отсутствует в каталоге или не имеет значения у сущности, он попадает в unresolved; генерация документов и интеграции не должны падать из-за пустого значения.
Формат paths
Path строится как namespace.path:
procurement.idprocurement.stage.externalIdprocurement.stage.nameprocurement.customerRequestFileNameprocurement.selectedSupplier.namecompany.nomenclatureSavePolicyprocurement.constructionProject.actualStartDateprocurement.customerContact.fullNameprocurement.responsible.codecatalogItem.typecatalogItem.skucatalogItem.currentCostPricepriceList.items[].pricedocument.totalAmountdocument.pricingModedocument.commissionAmountdocument.grossMarginPercentcounterparty.checkingAccountcounterparty.paymentRequisites[].bankNamelogisticsObject.namedeliveryRoute.vehicleNumberdeliveryBatch.numbergeneratedDocument.carrierNamediadoc.statusdiadoc.messageIdsaby.statussaby.documentIdastral.statusastral.docflowIduser.codecustom.vendorCode
[] означает массив строк или связанных записей. В v1 Variable API только читает данные; запись выполняется через обычные доменные методы API.
Для контрагентов основной платёжный реквизит доступен через counterparty.bankName, counterparty.bik, counterparty.checkingAccount и counterparty.correspondentAccount. Все сохранённые счета можно читать массивами counterparty.paymentRequisites[].label, counterparty.paymentRequisites[].bankName, counterparty.paymentRequisites[].bik, counterparty.paymentRequisites[].checkingAccount, counterparty.paymentRequisites[].correspondentAccount и counterparty.paymentRequisites[].isPrimary. Для API key нужны variables.read и counterparties.read.
Для заявок, связанных с amoCRM или другой CRM, доступны безопасные поля обмена: procurement.customerRequestFileName, procurement.plannedTotal, procurement.actualTotal, procurement.dueDate, procurement.selectedSupplier.name, procurement.selectedSupplier.supplierId, procurement.selectedSupplier.counterpartyId и procurement.selectedSupplier.inn.
Стройка+
Если для портала включено отраслевое расширение Стройка+, в заявках и партиях доставки доступны безопасные строительные поля:
procurement.constructionProject.nameprocurement.constructionProject.actualStartDateprocurement.constructionProject.actualEndDateprocurement.constructionObject.nameprocurement.constructionObject.addressprocurement.constructionStage.nameprocurement.items[].sourceSectionNameprocurement.items[].workTypeprocurement.items[].requiredAtprocurement.items[].needGroupKeyrequest.constructionProject.actualStartDaterequest.constructionProject.actualEndDatedeliveryBatch.constructionProject.actualStartDatedeliveryBatch.constructionProject.actualEndDate
Обеспечение строк заявки
Для заявок доступны переменные построчного обеспечения поставщиками:
procurement.items[].supplyCoverage.status—not_covered,partially_coveredилиcovered;procurement.items[].supplyCoverage.percent— процент закрытого количества по строке;procurement.items[].supplyCoverage.acceptedQuantity— количество, принятое к обеспечению у поставщиков;procurement.items[].supplyCoverage.remainingQuantity— остаток количества без выбранного поставщика;procurement.items[].supplyCoverage.suppliers[].name— выбранные поставщики по строке.
Эти переменные показывают принятое решение снабжения: у каких поставщиков планируется закупка и в каком объёме. Они не заменяют receivedQuantity и не означают фактический приход на склад.
Портал и согласия
Для портала доступны безопасные сведения о компании и последней зафиксированной записи согласий:
company.namecompany.slugcompany.companyInncompany.legalConsent.hasRecordcompany.legalConsent.acceptedOffercompany.legalConsent.acceptedPersonalDatacompany.legalConsent.acceptedMarketingcompany.legalConsent.acceptedAtcompany.legalConsent.sourcecompany.legalConsent.documentVersionscompany.legalConsent.documentUrlscompany.paidWidgets[].slugcompany.paidWidgets[].namecompany.paidWidgets[].licenseStatuscompany.paidWidgets[].effectiveLicenseStatuscompany.paidWidgets[].activeFromcompany.paidWidgets[].activeUntilcompany.paidWidgets[].priceMonthlyRubcompany.paidWidgets[].estimatedMonthlyAmountRub
Для получения значений через API key нужны variables.read и company.read или settings.read. IP, user-agent, хэши документов и служебные доказательные данные через Variable API не раскрываются.
В массив company.paidWidgets[] попадают только видимые платные виджеты со статусом notPaid, trial или active. Отключенные disabled-виджеты и служебные metadata, payload заявок, токены и audit-данные через Variable API не раскрываются.
Себестоимость и маржа
Для номенклатуры доступны поля текущей себестоимости:
catalogItem.type—productдля товара илиserviceдля услугиcatalogItem.currentCostPricecatalogItem.currentCostCurrencycatalogItem.currentCostSourcecatalogItem.currentCostUpdatedAtcatalogItem.suppliers[].namecatalogItem.suppliers[].lastPricecatalogItem.suppliers[].sources
Для поставщиков доступны безопасные поля ассортимента:
supplier.assortment.categories[].namesupplier.assortment.products[].name
Для исходящих документов после выпуска доступны снимки себестоимости и маржинальности:
document.costTotalAmountdocument.grossProfitAmountdocument.grossMarginPercentdocument.costCoveragePercentdocument.costCapturedAtitems.rows[].unitCostitems.rows[].lineCostAmountitems.rows[].grossProfitAmountitems.rows[].grossMarginPercentitems.rows[].costIsEstimated
Если счёт ещё не выпущен или строка не имеет надёжной себестоимости в валюте документа, соответствующие значения могут быть пустыми.
Контур.Диадок
Для исходящих счетов, договоров и документов поставки доступны безопасные переменные ЭДО:
diadoc.status;diadoc.signatureStatus;diadoc.statusText;diadoc.senderBoxId;diadoc.recipientBoxId;diadoc.messageId;diadoc.attachmentEntityId;diadoc.documentId;diadoc.sentAt;diadoc.syncedAt;diadoc.signedAt.
Через Variable API не раскрываются OAuth-токены, настройки подключения, raw-ответы Диадок и файловые хэши.
СБИС / SABY ЭДО
Для исходящих счетов, договоров и документов поставки доступны безопасные переменные ЭДО:
saby.status;saby.signatureStatus;saby.statusText;saby.statusDetails;saby.documentId;saby.revisionId;saby.attachmentId;saby.counterpartyParticipantId;saby.counterpartyName;saby.counterpartyInn;saby.counterpartyKpp;saby.lastEventId;saby.lastEventName;saby.sentAt;saby.syncedAt;saby.signedAt.
Через Variable API не раскрываются пароль, настройки подключения, raw-ответы SABY и файловые хэши.
Калуга Астрал ЭДО
Для исходящих счетов, договоров и документов поставки доступны безопасные переменные ЭДО:
astral.status;astral.signatureStatus;astral.statusText;astral.statusDetails;astral.direction;astral.senderAbonentId;astral.recipientId;astral.draftId;astral.docflowId;astral.documentId;astral.signingRequestId;astral.counterpartyName;astral.counterpartyInn;astral.counterpartyKpp;astral.lastEventId;astral.lastEventName;astral.sentAt;astral.syncedAt;astral.signedAt.
Через Variable API не раскрываются API-токен, настройки подключения, raw-ответы Калуга Астрал и файловые хэши.
Коммерческие предложения
Для сущности commercialProposal доступны безопасные поля расширенного расчёта КП:
document.pricingModedocument.proposalModeldocument.commissionModedocument.commissionPercentdocument.commissionFixedAmountdocument.materialsAmountdocument.servicesAmountdocument.expenseTotalAmountdocument.allocatedExpenseAmountdocument.commissionAmountitems.rows[].lineTypeitems.rows[].supplierNameitems.rows[].groupKeyitems.rows[].groupLabelitems.rows[].unitCostitems.rows[].markupPercentitems.rows[].markupAmountitems.rows[].allocatedExpenseAmountitems.rows[].commissionPercentitems.rows[].commissionFixedAmountitems.rows[].commissionAmountitems.rows[].lineCostAmount
Для получения значений через API key нужны variables.read, documents.read и customer_documents.read. Raw metadata, токены, webhook payload, зашифрованные настройки и служебные JSON-поля через Variable API не раскрываются.
Логистика и документы поставки
Для документов поставки доступны безопасные поля логистики:
logisticsObject.codelogisticsObject.namelogisticsObject.addresslogisticsObject.latitudelogisticsObject.longitudelogisticsObject.contactNamedeliveryRoute.namedeliveryRoute.isActivedeliveryRoute.originAddressdeliveryRoute.originLatitudedeliveryRoute.originLongitudedeliveryRoute.destinationAddressdeliveryRoute.destinationLatitudedeliveryRoute.destinationLongitudedeliveryRoute.stops[].sequencedeliveryRoute.stops[].kinddeliveryRoute.stops[].labeldeliveryRoute.stops[].addressdeliveryRoute.stops[].latitudedeliveryRoute.stops[].longitudedeliveryRoute.stops[].object.namedeliveryRoute.carrierNamedeliveryRoute.driverNamedeliveryRoute.vehicleNumberdeliveryBatch.numberdeliveryBatch.statusdeliveryBatch.isActivedeliveryBatch.items[].namedeliveryBatch.items[].quantitylogisticsVehicle.latestLocation.recordedAtlogisticsVehicle.latestLocation.statuslogisticsVehicle.latestLocation.latitudelogisticsVehicle.latestLocation.longitudelogisticsVehicle.latestLocation.addresslogisticsVehicle.locations[].recordedAtlogisticsVehicle.locations[].statusgeneratedDocument.kindgeneratedDocument.numbergeneratedDocument.stagegeneratedDocument.scopegeneratedDocument.carrierNamegeneratedDocument.driverNamegeneratedDocument.vehicleNumbergeneratedDocument.attorneyNamegeneratedDocument.recipientNamegeneratedDocument.deliveryAddress
Для получения значений через API key нужны variables.read и logistics.read. Ссылки хранения, подписи скачивания, служебные JSON-поля и технические audit payload через Variable API не раскрываются.
Wazzup и мессенджеры
Для PR, RFQ поставщику, поставщика и контрагента доступны безопасные поля внешней переписки:
wazzup.chat.channelIdwazzup.chat.chatTypewazzup.chat.chatIdwazzup.links[].externalKindwazzup.links[].externalIdwazzup.lastMessage.messageIdwazzup.lastMessage.requestIdwazzup.lastMessage.statuswazzup.lastMessage.createdAt
Для получения значений через API key нужны variables.read и messengers.read. API-ключи Wazzup, bearer-токены webhook, iframe URL и зашифрованные настройки через Variable API не раскрываются.
YouGile
Для закупки доступны безопасные поля связи с задачником YouGile:
yougile.primary.targetTypeyougile.primary.externalIdyougile.links[].targetTypeyougile.links[].externalIdyougile.task.taskIdyougile.task.idTaskCommonyougile.task.idTaskProjectyougile.task.titleyougile.task.columnIdyougile.task.completedyougile.task.archivedyougile.task.lastSyncedAtyougile.task.lastEventAt
Для получения значений через API key нужны variables.read и доступ к закупкам. API key YouGile, webhook token, зашифрованная конфигурация и raw payload задач через Variable API не раскрываются.
Дополнительные поля
Индивидуальные поля портала описываются в настройках:
| Метод | Путь | Назначение |
|---|---|---|
GET | /api/v1/settings/custom-fields?entityType=procurement | Список определений |
POST | /api/v1/settings/custom-fields | Создать определение |
PATCH | /api/v1/settings/custom-fields/:id | Обновить label/options/status |
DELETE | /api/v1/settings/custom-fields/:id | Архивировать определение |
GET | /api/v1/settings/custom-fields/values?entityType=procurement&entityId=... | Значения сущности |
PUT | /api/v1/settings/custom-fields/:id/values | Записать значение сущности |
Тип пользовательского поля после создания не меняется. Для select опции хранятся как { "items": ["..."] }, а записываемое значение должно совпадать с одним из вариантов, если список задан.
Для закупок дополнительно доступны безопасные переменные текущего этапа воронки:
procurement.stage.idprocurement.stage.externalIdprocurement.stage.nameprocurement.stage.color
После создания поля с ключом vendorCode для catalogItem или amocrmProcurementNumber для procurement в каталоге переменных этого портала появляется custom.vendorCode или custom.amocrmProcurementNumber. Пользовательские переменные ограничены порталом: другой портал не увидит и не сможет получить это поле.
При импорте PR колонки можно сопоставить с дополнительными полями номенклатуры. Такие значения сохраняются на связанном catalogItem и затем доступны как custom.<key> для товара и как items.rows[].custom.<key> в строках клиентских документов.