İçeriğe atla
ShopentlyLearn

İndirimler · Oluştur

İndirimler · Oluştur. Her kod birleştirmeye izin vermelidir. İndirimler sırayla uygulanır.

POST/api/v1/discounts/coupons

Kimlik doğrulama
Bearer
En düşük plan
STANDARD
Gerekli izinler
discounts.coupons:create

Kod örnekleri

İstek örneği

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))

Yanıt örneği 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"
  }
}

Genel bakış

Seçilen ürünler ve kategoriler birlikte kapsanır. Kategoriler doğrudan atanan ürünleri içerir.

Parametreler

İstek başlıkları

Idempotency-KeyDizeZorunlu

Tek bir mantıksal yazma işleminin benzersiz tanımlayıcısı.

minLength: 1maxLength: 128
Kısıtlamalar
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Örnek: "learn-create_campaign_api_v1_discounts_coupons_post"

İstek gövdesi

application/json · Zorunlu

CampaignCreate
audienceDizeİsteğe bağlı

Müşteriler

Kısıtlamalar
enum
["all", "guest", "customer", "selected"]
Varsayılan: "all"
benefit_typeDizeİsteğe bağlı

İzin verilen değerlerle tanımlanan veri yapısı çeşidi.

Kısıtlamalar
enum
["percentage", "fixed", "none"]
Varsayılan: "percentage"
category_idsDizi <Dize> İsteğe bağlı

İlgili kategorilerin tanımlayıcıları.

maxItems: 1000
Kısıtlamalar · Dizi 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
codeDize nullİsteğe bağlı

Makine tarafından okunabilir, sabit kod.

Kısıtlamalar · Dize 1
pattern
"^[A-Za-z0-9]{6,16}$"
Örnek: "LEARN10"
combine_couponsMantıksal değerİsteğe bağlı

Diğer kodlarla birleştir

Varsayılan: false
combine_promotionsMantıksal değerİsteğe bağlı

Bu kodun otomatik kampanyalı ürünlerde kullanılmasına izin ver

Varsayılan: false
customer_idsDizi <Dize> İsteğe bağlı

Bu kaynak için kaydedilen müşteri bilgileri.

maxItems: 1000
Kısıtlamalar · Dizi 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
ends_atDize nullİsteğe bağlı

Bitiş

Dize:format: "date-time"
free_shippingMantıksal değerİsteğe bağlı

Ücretsiz kargo

Varsayılan: false
marketsDizi <MarketData-Input > Zorunlu

Mağaza bağlamında kullanılabilir pazarlar.

minItems: 1maxItems: 1000
Örnek: [{"currency":"PLN","market_id":"poland","minor_units":2}]
minimum_quantityTam sayıİsteğe bağlı

Sepetteki minimum ürün adedi

minimum: 1maximum: 2147483647
Varsayılan: 1
nameDizeZorunlu

İlgili bağlamdaki kaynak adı.

minLength: 1maxLength: 160
Örnek: "Autumn guide offer"
per_customer_limitTam sayıİsteğe bağlı

Müşteri başına kullanım sınırı

minimum: -1maximum: 2147483647
Varsayılan: -1
percentageDizeİsteğe bağlı

Yüzde

maxLength: 19
Kısıtlamalar
pattern
"^(0|[1-9][0-9]{0,13})(\\.[0-9]{1,4})?$"
Varsayılan: "10"
product_idsDizi <Dize> İsteğe bağlı

İlgili ürünlerin tanımlayıcıları.

maxItems: 1000
Kısıtlamalar · Dizi 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
product_scopeDizeİsteğe bağlı

Ürünler

Kısıtlamalar
enum
["all", "selected"]
Varsayılan: "all"
show_accountMantıksal değerİsteğe bağlı

Müşteri hesabında

Varsayılan: false
show_cartMantıksal değerİsteğe bağlı

Sepette

Varsayılan: false
show_productMantıksal değerİsteğe bağlı

Ürün sayfalarında

Varsayılan: false
starts_atDize nullİsteğe bağlı

Başlangıç

Dize:format: "date-time"
usage_limitTam sayıİsteğe bağlı

Kullanım sınırı

minimum: -1maximum: 2147483647
Varsayılan: -1

Yanıtlar

Yanıt 201

dataMutationData Zorunlu

Başarılı yanıtın verileri.

Alanlar · data
deletedMantıksal değerZorunlu

Silme işleminin uygulanıp uygulanmadığı.

idDizeZorunlu

Kaynak tanımlayıcısı; döndürüldüğü biçimi koruyun.

versionTam sayı nullZorunlu

Eşzamanlılık denetiminde kullanılan kaynak sürümü.

metaContextPageMeta ContextMeta PageMeta RequestMeta Zorunlu

Yanıt üst verileri.

Alanlar · meta

ContextPageMeta

localeDizeZorunlu

Bu istek için seçilen dil.

market_codeDizeZorunlu

Bağlam uç noktasının döndürdüğü pazar kodu.

market_idDizeZorunlu

Bağlam uç noktasının döndürdüğü pazar tanımlayıcısı.

paginationPagination Zorunlu

İmleç tabanlı sayfalamanın üst verileri.

request_idDizeZorunlu

Talep tanımlayıcısı; yanıt üst verilerinde HTTP isteğini tanımlar.

minLength: 1maxLength: 100

ContextMeta

localeDizeZorunlu

Bu istek için seçilen dil.

market_codeDizeZorunlu

Bağlam uç noktasının döndürdüğü pazar kodu.

market_idDizeZorunlu

Bağlam uç noktasının döndürdüğü pazar tanımlayıcısı.

request_idDizeZorunlu

Talep tanımlayıcısı; yanıt üst verilerinde HTTP isteğini tanımlar.

minLength: 1maxLength: 100

PageMeta

paginationPagination Zorunlu

İmleç tabanlı sayfalamanın üst verileri.

request_idDizeZorunlu

Talep tanımlayıcısı; yanıt üst verilerinde HTTP isteğini tanımlar.

minLength: 1maxLength: 100

RequestMeta

request_idDizeZorunlu

Talep tanımlayıcısı; yanıt üst verilerinde HTTP isteğini tanımlar.

minLength: 1maxLength: 100
Yanıt örneği

HTTP durumu

201
Kaynak oluşturuldu Şema
400
Geçersiz istek
401
Kimlik doğrulaması gerekli
403
İzin reddedildi
404
Kaynak bulunamadı
409
Sürüm çakışması
422
Doğrulama başarısız
429
İstek sınırı aşıldı
Diğer HTTP durumları (7)
405
Yönteme izin verilmiyor
413
İstek çok büyük
415
Desteklenmeyen biçim
500
Sunucu hatası
502
API ağ geçidi hatası
503
Hizmet kullanılamıyor
504
Zaman aşımı

Hata kataloğu: ErrorResponse

Başlıklar

201

LocationDizeİsteğe bağlı

Oluşturulan kaynağın göreli URL'si.

401

WWW-AuthenticateDizeİsteğe bağlı

Sunucunun gerektirdiği kimlik doğrulama şeması.

405

AllowDizeİsteğe bağlı

Bu kaynağın desteklediği HTTP yöntemleri.

429, 503

Retry-AfterTam sayıİsteğe bağlı

Yeniden denemeden önce saniye cinsinden en kısa bekleme süresi.

minimum: 0