Перейти до вмісту
ShopentlyLearn

Знижки · Створити

Знижки · Створити. Кожен код має дозволяти поєднання. Знижки застосовуються послідовно.

POST/api/v1/discounts/coupons

Автентифікація
Bearer
Доступно починаючи з
STANDARD
Потрібні дозволи
discounts.coupons:create

Приклади коду

Приклад запиту

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request POST \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --header 'Idempotency-Key: learn-create_campaign_api_v1_discounts_coupons_post' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "code": "LEARN10",
  "markets": [
    {
      "currency": "PLN",
      "market_id": "poland",
      "minor_units": 2
    }
  ],
  "name": "Autumn guide offer"
}' \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/discounts/coupons

PHP

<?php
declare(strict_types=1);

$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
    isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
    isset($origin['query']) || isset($origin['fragment'])) {
    throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = ['Idempotency-Key: learn-create_campaign_api_v1_discounts_coupons_post', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/discounts/coupons');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
        if (str_contains($line, ':')) {
            [$name, $value] = explode(':', $line, 2);
            $responseHeaders[strtolower(trim($name))] = trim($value);
        }
        return strlen($line);
    },
]);
curl_setopt($handle, CURLOPT_POSTFIELDS, '{
  "code": "LEARN10",
  "markets": [
    {
      "currency": "PLN",
      "market_id": "poland",
      "minor_units": 2
    }
  ],
  "name": "Autumn guide offer"
}');
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
    throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
    throw new RuntimeException('HTTP ' . $status . '; request_id=' .
        ($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;

Python

from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit

import requests  # python -m pip install requests

base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
    raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {'Idempotency-Key': 'learn-create_campaign_api_v1_discounts_coupons_post'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n  "code": "LEARN10",\n  "markets": [\n    {\n      "currency": "PLN",\n      "market_id": "poland",\n      "minor_units": 2\n    }\n  ],\n  "name": "Autumn guide offer"\n}'
if body is not None:
    headers["Content-Type"] = "application/json"

with ExitStack() as stack:
    session = stack.enter_context(requests.Session())
    files = None
    if False:
        image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
        if os.fstat(image.fileno()).st_size > 5242880:
            raise ValueError("Image exceeds 5 MiB")
        files = {"file": ("article.png", image, "image/png")}
    response = session.request(
        'POST', base_url + '/api/v1/discounts/coupons', headers=headers,
        data=body.encode("utf-8") if body is not None else None, files=files,
        timeout=(5, 30), allow_redirects=False,
    )
    if not 200 <= response.status_code < 300:
        raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
    if False:
        if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
            raise ValueError("Unexpected image response")
        with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
            output.write(response.content)
    else:
        result = response.json() if response.content else None
        print(json.dumps(result, ensure_ascii=False, indent=2))

Приклад відповіді 201

JSON
{
  "data": {
    "deleted": false,
    "id": "example-campaign",
    "version": null
  },
  "meta": {
    "locale": "example",
    "market_code": "example",
    "market_id": "poland",
    "pagination": {
      "has_more": false,
      "limit": 1,
      "next_cursor": null
    },
    "request_id": "learn-example-request"
  }
}

Огляд

Вибрані товари й категорії об’єднуються. Категорії охоплюють безпосередньо призначені товари.

Параметри

Заголовки запиту

Idempotency-KeyРядокОбов’язкове

Унікальний ідентифікатор однієї логічної операції запису.

minLength: 1maxLength: 128
Обмеження
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Приклад: "learn-create_campaign_api_v1_discounts_coupons_post"

Тіло запиту

application/json · Обов’язкове

CampaignCreate
audienceРядокНеобов’язкове

Клієнти

Обмеження
enum
["all", "guest", "customer", "selected"]
За замовчуванням: "all"
benefit_typeРядокНеобов’язкове

Різновид структури даних, визначений допустимими значеннями.

Обмеження
enum
["percentage", "fixed", "none"]
За замовчуванням: "percentage"
category_idsМасив <Рядок> Необов’язкове

Ідентифікатори пов’язаних категорій.

maxItems: 1000
Обмеження · Масив 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
codeРядок nullНеобов’язкове

Стабільний машинозчитуваний код.

Обмеження · Рядок 1
pattern
"^[A-Za-z0-9]{6,16}$"
Приклад: "LEARN10"
combine_couponsЛогічне значенняНеобов’язкове

Поєднувати з іншими кодами

За замовчуванням: false
combine_promotionsЛогічне значенняНеобов’язкове

Дозволити цей код для товарів з автоматичними акціями

За замовчуванням: false
customer_idsМасив <Рядок> Необов’язкове

Відомості про клієнта, записані для цього ресурсу.

maxItems: 1000
Обмеження · Масив 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
ends_atРядок nullНеобов’язкове

Активний до

Рядок:format: "date-time"
free_shippingЛогічне значенняНеобов’язкове

Безкоштовна доставка

За замовчуванням: false
marketsМасив <MarketData-Input > Обов’язкове

Ринки, доступні в контексті магазину.

minItems: 1maxItems: 1000
Приклад: [{"currency":"PLN","market_id":"poland","minor_units":2}]
minimum_quantityЦіле числоНеобов’язкове

Мінімальна кількість одиниць у кошику

minimum: 1maximum: 2147483647
За замовчуванням: 1
nameРядокОбов’язкове

Назва ресурсу у відповідному контексті.

minLength: 1maxLength: 160
Приклад: "Autumn guide offer"
per_customer_limitЦіле числоНеобов’язкове

Ліміт використань на клієнта

minimum: -1maximum: 2147483647
За замовчуванням: -1
percentageРядокНеобов’язкове

Відсоткова

maxLength: 19
Обмеження
pattern
"^(0|[1-9][0-9]{0,13})(\\.[0-9]{1,4})?$"
За замовчуванням: "10"
product_idsМасив <Рядок> Необов’язкове

Ідентифікатори пов’язаних товарів.

maxItems: 1000
Обмеження · Масив 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
product_scopeРядокНеобов’язкове

Товари

Обмеження
enum
["all", "selected"]
За замовчуванням: "all"
show_accountЛогічне значенняНеобов’язкове

В обліковому записі клієнта

За замовчуванням: false
show_cartЛогічне значенняНеобов’язкове

У кошику

За замовчуванням: false
show_productЛогічне значенняНеобов’язкове

На сторінках товарів

За замовчуванням: false
starts_atРядок nullНеобов’язкове

Активний з

Рядок:format: "date-time"
usage_limitЦіле числоНеобов’язкове

Ліміт використань

minimum: -1maximum: 2147483647
За замовчуванням: -1

Відповіді

Відповідь 201

dataMutationData Обов’язкове

Дані успішної відповіді.

Поля · data
deletedЛогічне значенняОбов’язкове

Чи виконано видалення.

idРядокОбов’язкове

Ідентифікатор ресурсу; зберігайте його в отриманому вигляді.

versionЦіле число nullОбов’язкове

Версія ресурсу для контролю одночасних змін.

metaContextPageMeta ContextMeta PageMeta RequestMeta Обов’язкове

Метадані відповіді.

Поля · meta

ContextPageMeta

localeРядокОбов’язкове

Мова, вибрана для цього запиту.

market_codeРядокОбов’язкове

Код ринку, повернутий кінцевою точкою контексту.

market_idРядокОбов’язкове

Ідентифікатор ринку, повернутий кінцевою точкою контексту.

paginationPagination Обов’язкове

Метадані пагінації за курсором.

request_idРядокОбов’язкове

Ідентифікатор звернення; у метаданих відповіді ідентифікує запит HTTP.

minLength: 1maxLength: 100

ContextMeta

localeРядокОбов’язкове

Мова, вибрана для цього запиту.

market_codeРядокОбов’язкове

Код ринку, повернутий кінцевою точкою контексту.

market_idРядокОбов’язкове

Ідентифікатор ринку, повернутий кінцевою точкою контексту.

request_idРядокОбов’язкове

Ідентифікатор звернення; у метаданих відповіді ідентифікує запит HTTP.

minLength: 1maxLength: 100

PageMeta

paginationPagination Обов’язкове

Метадані пагінації за курсором.

request_idРядокОбов’язкове

Ідентифікатор звернення; у метаданих відповіді ідентифікує запит HTTP.

minLength: 1maxLength: 100

RequestMeta

request_idРядокОбов’язкове

Ідентифікатор звернення; у метаданих відповіді ідентифікує запит HTTP.

minLength: 1maxLength: 100
Приклад відповіді

Статус HTTP

201
Ресурс створено Схема
400
Некоректний запит
401
Потрібна автентифікація
403
Доступ заборонено
404
Ресурс не знайдено
409
Конфлікт версій
422
Помилка валідації
429
Перевищено ліміт запитів
Інші статуси HTTP (7)
405
Метод не дозволено
413
Завеликий запит
415
Непідтримуваний формат
500
Помилка сервера
502
Помилка шлюзу API
503
Сервіс недоступний
504
Перевищено час очікування

Каталог помилок: ErrorResponse

Заголовки

201

LocationРядокНеобов’язкове

Відносний URL створеного ресурсу.

401

WWW-AuthenticateРядокНеобов’язкове

Схема автентифікації, потрібна серверу.

405

AllowРядокНеобов’язкове

Методи HTTP, підтримувані цим ресурсом.

429, 503

Retry-AfterЦіле числоНеобов’язкове

Мінімальна затримка перед повтором у секундах.

minimum: 0