Онлайн магазин

Как да свържете персонализиран магазин с easySales през API

Как да свържете персонализиран магазин с easySales през API

Свържете всеки персонализиран или неподдържан магазин с easySales през API: двете нужни удостоверения, изпращане на продукти и наличности, подаване на поръчки и получаване на промените обратно.

Кога Ви е нужно това

easySales разполага с готови конектори за най-разпространените магазин платформи. Ако работите с нещо персонализирано — собствен магазин, разработен вътрешно, или платформа, за която нямаме интеграция — можете да го свържете сами през API.

Това е задача за разработчик. Ще напишете код, който изпраща каталога Ви към easySales и предава поръчките, а easySales ще извиква обратно Вашия магазин, когато нещо се промени. Нищо от описаното тук не изисква инсталиран плъгин.

Как работи връзката

Участват две удостоверения и тяхното объркване е най-честата причина първата интеграция да връща 403.

Удостоверение Откъде идва Как се изпраща Ако липсва
Токен за достъп POST /oauth/token, чрез OAuth клиента, който създавате в API Настройки Хедър Authorization: Bearer <token> 401
Токен на уебсайта Стъпката Настройки в съветника за свързване Поле website_token в тялото на заявката, не хедър 403 Invalid website token
Двете удостоверения и за какво служи всяко от тях

И двете са необходими при всяко записване. Токенът за достъп доказва кой извиква; токенът на уебсайта казва на кой магазин принадлежат данните.

Стъпка 1 — Добавете уебсайта

Отидете в Интеграции → Уебсайтове, натиснете Свържете уебсайт, попълнете формата, след което изберете плочката API и версията API V2 под нея.

Формата Свържете уебсайт в easySales с избрана плочка API и зелена отметка, а под нея плочката за версия API V2 под заглавието Изберете версията на платформата, която Вашият сайт използва.
Изберете плочката API, а след това API V2 под нея.
Поле Какво прави
Име на уебсайт Вашият собствен етикет. По него различавате магазините си по-късно.
URL на уебсайт Адресът на магазина Ви, с правилния протокол.
Страна Определя кои ДДС ставки предлага следващото поле. Постоянно.
Цена с ДДС ДДС-то, което се прилага към продукти, пристигащи без такова. Избира се от списък, не се въвежда.
ДДС за доставка ДДС-то, което се прилага към доставката, когато поръчката не носи такова.
Език / Валута Езикът на магазина и валутата, в която са цените Ви. И двете постоянни.
Персонализиран статус за нова поръчка По избор. Поставя всяка импортирана поръчка в един от Вашите собствени статуси.
Източник на стокови наличности Къде се намира меродавната стойност на наличността. По подразбиране easySales.
Обичаен тип пакет Стойността по подразбиране при генериране на товарителници за тези поръчки.
Серия фактури Серията за фактуриране, използвана когато заявката Ви не подава такава.
Формата за свързване

Стъпка 2 — Копирайте токена на уебсайта

Стъпката Настройки в съветника показва токен от 60 знака. Именно него старата статия изобщо не споменава и именно от него се нуждае всяко извикване за запис.

Стъпката Настройки в съветника за свързване на easySales за API V2, показваща генерирания токен на уебсайта от 60 знака само за четене, с бутон за копиране в клипборда.
Токенът на уебсайта. Всяко извикване за запис го носи в тялото на заявката.

Копирайте го с бутона, вместо да го преписвате, и го съхранявайте като тайна в приложението си. Натиснете Запази, за да създадете уебсайта.

Магазинът вече се показва в Интеграции → Уебсайтове със същия токен върху картата си — оттам ще го намерите отново по-късно.

Екранът Уебсайтове в easySales с картата на свързан магазин API V2, с неговия URL, ДДС, токен на уебсайта и превключвател Активен.
Свързан магазин през API. Токенът върху картата е същият, който изпраща Вашият код.

Стъпка 3 — Създайте OAuth клиент

Отидете в Настройки → API Настройки. Там се намират OAuth удостоверенията.

Екранът API Настройки в easySales със списък с OAuth клиент, неговия идентификатор, име и скрит таен ключ, а под него личен токен за достъп.
Настройки → API Настройки. OAuth клиентите горе, личните токени за достъп долу.

Натиснете Създаване на нов клиент, наименувайте го според системата, която ще извиква, и задайте Grant тип на Website Grant.

Формата за създаване на клиент в API Настройки на easySales с попълнено име и Grant тип, зададен на Website Grant, с обяснението, че Website Grant получава токен за достъп чрез website_token.
Website Grant — този, който разменя токена на уебсайта Ви за токен за достъп.

Website Grant е създаден точно за тази задача: разменя токена на уебсайта Ви за токен за достъп, без пренасочване в браузъра и без намеса на потребител. Запазете и копирайте появилите се Идентификационен номер на клиента и Таен ключ.

Стъпка 4 — Получете токен за достъп

POST https://easy-sales.com/oauth/token
Content-Type: application/json

{
  "grant_type":    "website",
  "client_id":     "your-client-id",
  "client_secret": "your-client-secret",
  "website_token": "your-60-character-website-token",
  "scope":         "add-products update-products update-stock add-orders update-orders read-orders"
}

Отговорът е стандартно OAuth тяло:

{
  "token_type":    "Bearer",
  "expires_in":    31536000,
  "access_token":  "eyJ0eXAiOiJKV1Qi...",
  "refresh_token": "def50200a1b2c3..."
}

Изпращайте го като Authorization: Bearer <access_token> при всяко следващо извикване.

Стъпка 5 — Изпратете каталога си

Базовият адрес за всичко по-долу е https://easy-sales.com/api/v2.

Редът има значение. Категориите и характеристиките трябва да съществуват, преди продукт да може да ги посочи, иначе извикването за продукта се отхвърля.

  1. POST /categories/save — Вашите категории
  2. POST /characteristics/save — Вашите атрибути
  3. POST /products/save — Вашите продукти
POST https://easy-sales.com/api/v2/products/save
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "website_token": "your-60-character-website-token",
  "product": {
    "product_website_id": "10231",
    "sku": "TS-BLK-M",
    "name": "Black T-shirt, size M",
    "sale_price": 79.99,
    "full_price": 99.99,
    "stock": 24,
    "type": "simple",
    "tax_rate": 21,
    "url": "https://my-shop.example.com/p/ts-blk-m",
    "images": ["https://my-shop.example.com/img/ts-blk-m.jpg"],
    "categories": ["cat-778"],
    "characteristics": [{ "id": "char-12", "value": "Black" }]
  }
}
Поле Задължително Бележки
product_website_id Да Собственият идентификатор на продукта във Вашия магазин
sku Да Уникален за уебсайта; ключът за upsert
name Да
sale_price Да Цената, която плаща клиентът
stock Да Трябва да е число
type Да simple или complex
full_price Не Цена преди отстъпка, ако показвате такава
tax_rate Не Трябва да е ставка, валидна за страната на уебсайта
categories Не Вашите собствени идентификатори на категории — всеки трябва вече да съществува
characteristics Не Вашите собствени идентификатори на атрибути — всеки трябва вече да съществува
images Не Масив от URL адреси, които можем да изтеглим
weight, handling_time, description, url Не Използват се за куриери, срокове за доставка и обяви в маркетплейси
Полета на продукта

Стъпка 6 — Поддържайте наличностите синхронизирани

Наличността е това, което трябва да остане актуално, и е най-евтиното извикване, което може да се прави често. Изпращайте до 100 реда наведнъж:

PATCH https://easy-sales.com/api/v2/stocks/bulk
Authorization: Bearer <access_token>

{
  "website_token": "your-60-character-website-token",
  "data": [
    { "sku": "TS-BLK-M", "stock": 24 },
    { "sku": "TS-BLK-L", "stock": 0 }
  ]
}

Всеки SKU трябва вече да съществува в този уебсайт; непознатите се отхвърлят, а не се създават.

Стъпка 7 — Изпратете поръчките си

POST https://easy-sales.com/api/v2/orders/save
Authorization: Bearer <access_token>

{
  "website_token": "your-60-character-website-token",
  "order": {
    "order_id": "SO-100244",
    "order_date": "2026-09-09 14:31:00",
    "order_total": 179.98,
    "status": "new",
    "payment_mode": "card",
    "shipment_tax": 21,
    "billing_address":  { "country": "RO", "city": "Cluj-Napoca", "street": "Str. Memorandumului 4" },
    "shipping_address": { "country": "RO", "city": "Cluj-Napoca", "street": "Str. Memorandumului 4" },
    "order_products": [
      { "product_website_id": "10231", "sku": "TS-BLK-M", "name": "Black T-shirt, size M",
        "quantity": 2, "price": 79.99, "total": 159.98 }
    ]
  }
}

Изпратете същия order_id отново и поръчката се актуализира, вместо да се дублира, което прави повторните опити безопасни.

Стъпка 8 — Получавайте промените обратно

Магазинът Ви трябва да знае кога една поръчка е фактурирана, има товарителница или сменя статуса си. Вместо да правите периодични заявки, абонирайте webhook:

GET https://easy-sales.com/api/v2/webhooks
Authorization: Bearer <access_token>
POST https://easy-sales.com/api/v2/webhooks/order-updated
Authorization: Bearer <access_token>

{
  "url":    "https://my-shop.example.com/hooks/easysales",
  "secret": "a-shared-secret-of-at-least-24-characters"
}

Абонирате се за едно събитие наведнъж, затова повторете заявката за всяко от order-created, order-updated, awb-created, invoice-created и delivery-status-updated.

Всяко доставяне е подписано, затова проверявайте подписа, преди да се доверите на съдържанието. Отговаряйте бързо — заявката изтича след няколко секунди и се повтаря ограничен брой пъти, затова първо потвърдете и обработвайте след това.

Ограничения

Ограничение Стойност
Заявки 500 в минута за целия API
Заявки за токен 60 в минута — кеширайте токена си
Продукти, наличности, цени, категории, характеристики на групово извикване 100
Продукти на групово архивиране 50
Уебсайтове на акаунт 30
Описание на продукта 65 534 знака
Ограничения, с които си струва да се съобразите

Когато нещо се провали

Код Значение Обичайна причина
400 Invalid json Тялото на заявката не е валиден JSON
401 Неудостоверен Липсващ, изтекъл или неправилен токен за достъп
403 Invalid website token website_token липсва или е грешен
403 The website has been deactivated Превключвателят Активен на уебсайта е изключен
422 Неуспешна валидация Липсва задължително поле, SKU се повтаря или категория, съответно характеристика, още не съществува
429 Твърде много заявки Над 500 в минута
503 Временно недостъпно Обработката е претоварена; опитайте отново след посочения интервал
Какво означава всеки код на отговор

Всичко, което се проваля от наша страна, попада и в Продукти → Онлайн магазини → Грешки в уебсайта, заедно със заявката и действие за повторен опит, което обикновено е по-бързо от възпроизвеждането на извикването.

Справочник

Пълният справочник на крайните точки, с всяко поле и всеки отговор, е публикуван на https://api.easy-sales.com.

Често задавани въпроси

Токенът за достъп е OAuth2 bearer токен, който идентифицира акаунта Ви, и се поставя в хедъра Authorization. Токенът на уебсайта идентифицира един конкретен магазин и се поставя в тялото на заявката като website_token. Извикванията за запис изискват и двата: 401 означава, че токенът за достъп е грешен, а 403 с "Invalid website token" — че грешен е токенът на уебсайта.

За персонализиран магазин няма период на опресняване и няма поле за него във формата. Нищо не се извлича периодично — Вие решавате кога да изпращате продукти, наличности и поръчки, а промените получавате обратно чрез webhook-и. Старата статия описваше поле, което вече не е част от процеса на свързване.

Не. Уебсайтовете от тип API не се тестват за връзка, защото easySales няма какво да извика, докато не започнете да изпращате данни. Надписът се задава при създаването на записа. Истинската проверка е дали продуктите Ви се появяват в Продукти → Онлайн магазини → Продукти.

Website Grant. Той е създаден точно за това: разменя токена на уебсайта за токен за достъп без пренасочване и без намеса на потребител, което е нужно на една сървър-към-сървър интеграция. Личен токен за достъп също работи, но обхваща целия акаунт, а не отделен магазин, и се показва само веднъж.

Токените за достъп, refresh токените и личните токени за достъп са валидни една година. Токенът на уебсайта изобщо не изтича — съществува, докато не натиснете Опресняване на токена или не изтриете уебсайта. Кеширайте токена си за достъп, вместо да заявявате нов при всяко извикване; крайната точка за токени е ограничена до 60 заявки в минута.

Категориите и характеристиките трябва да съществуват, преди продукт да може да ги посочи. Изпратете първо категориите, след това характеристиките и накрая продуктите. Същото важи и за груповите актуализации на наличности: всеки SKU трябва вече да съществува в уебсайта.

Да, ако използвате крайните точки /save. POST /products/save прави upsert по SKU, а POST /orders/save по order_id, така че повторните опити са безопасни и повторните доставяния не създават дубликати. Обикновените крайни точки POST /products и POST /orders вместо това отхвърлят дубликатите с 422.

Не и при персонализиран магазин. Наличността се движи в една посока, от Вашия магазин към easySales, така че магазинът Ви остава източникът на истина. Обратно идва информация на ниво поръчка: промени в статуса, товарителници и фактури, доставяни чрез webhook-ите, за които се абонирате.

Беше ли полезно това ръководство?