Preskoči na sadržaj
ShopentlyLearn

Promocije · Ažuriraj

Promocije · Ažuriraj. Svaki kod mora dopuštati kombiniranje. Popusti se primjenjuju redom.

PATCH/api/v1/discounts/promotions/{identity}

Autentifikacija
Bearer
Dostupno od
STANDARD
Potrebne ovlasti
discounts.promotions:update

Primjeri koda

Primjer zahtjeva

cURL

: "${SHOPENTLY_SHOP_URL:?}"

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

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-update_campaign_api_v1_discounts_promotions__identity__patch', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/discounts/promotions/example-campaign');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    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, '{
  "expected_version": 1,
  "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-update_campaign_api_v1_discounts_promotions__identity__patch'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n  "expected_version": 1,\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(
        'PATCH', base_url + '/api/v1/discounts/promotions/example-campaign', 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))

Primjer odgovora 200

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"
  }
}

Pregled

Odabrani proizvodi i kategorije se objedinjuju. Kategorije uključuju izravno dodijeljene proizvode.

Parametri

Parametri putanje

identityNiz znakovaObvezno

Identifikator korišten u putanji ovog resursa.

Ograničenja
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
Primjer: "example-campaign"

Zaglavlja zahtjeva

Idempotency-KeyNiz znakovaObvezno

Jedinstveni identifikator jedne logičke operacije upisa.

minLength: 1maxLength: 128
Ograničenja
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Primjer: "learn-update_campaign_api_v1_discounts_promotions__identity__patch"

Tijelo zahtjeva

application/json · Obvezno

CampaignUpdate
audienceNiz znakovaNeobavezno

Kupci

Ograničenja
enum
["all", "guest", "customer", "selected"]
Zadano: "all"
benefit_typeNiz znakovaNeobavezno

Varijanta strukture podataka opisana dopuštenim vrijednostima.

Ograničenja
enum
["percentage", "fixed", "none"]
Zadano: "percentage"
category_idsPolje vrijednosti <Niz znakova> Neobavezno

Identifikatori povezanih kategorija.

maxItems: 1000
Ograničenja · Polje vrijednosti 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
codeNiz znakova nullNeobavezno

Stabilan strojno čitljiv kod.

Ograničenja · Niz znakova 1
pattern
"^[A-Za-z0-9]{6,16}$"
Primjer: "LEARN10"
combine_couponsLogička vrijednostNeobavezno

Kombiniraj s drugim kodovima

Zadano: false
combine_promotionsLogička vrijednostNeobavezno

Dopusti ovaj kod za proizvode s automatskim promocijama

Zadano: false
customer_idsPolje vrijednosti <Niz znakova> Neobavezno

Podaci kupca zabilježeni za ovaj resurs.

maxItems: 1000
Ograničenja · Polje vrijednosti 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
ends_atNiz znakova nullNeobavezno

Aktivno do

Niz znakova:format: "date-time"
expected_versionCijeli brojObvezno

Verzija pročitana prije upisa; nepodudaranje odbija ažuriranje.

minimum: 1maximum: 9223372036854775807
Primjer: 1
free_shippingLogička vrijednostNeobavezno

Besplatna dostava

Zadano: false
marketsPolje vrijednosti <MarketData-Input > Obvezno

Tržišta dostupna u kontekstu trgovine.

minItems: 1maxItems: 1000
Primjer: [{"currency":"PLN","market_id":"poland","minor_units":2}]
minimum_quantityCijeli brojNeobavezno

Minimalni broj artikala u košarici

minimum: 1maximum: 2147483647
Zadano: 1
nameNiz znakovaObvezno

Naziv resursa u odgovarajućem kontekstu.

minLength: 1maxLength: 160
Primjer: "Autumn guide offer"
per_customer_limitCijeli brojNeobavezno

Ograničenje upotreba po kupcu

minimum: -1maximum: 2147483647
Zadano: -1
percentageNiz znakovaNeobavezno

Postotak

maxLength: 19
Ograničenja
pattern
"^(0|[1-9][0-9]{0,13})(\\.[0-9]{1,4})?$"
Zadano: "10"
product_idsPolje vrijednosti <Niz znakova> Neobavezno

Identifikatori povezanih proizvoda.

maxItems: 1000
Ograničenja · Polje vrijednosti 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
product_scopeNiz znakovaNeobavezno

Proizvodi

Ograničenja
enum
["all", "selected"]
Zadano: "all"
show_accountLogička vrijednostNeobavezno

Na računu kupca

Zadano: false
show_cartLogička vrijednostNeobavezno

U košarici

Zadano: false
show_productLogička vrijednostNeobavezno

Na stranicama proizvoda

Zadano: false
starts_atNiz znakova nullNeobavezno

Aktivno od

Niz znakova:format: "date-time"
usage_limitCijeli brojNeobavezno

Ograničenje upotreba

minimum: -1maximum: 2147483647
Zadano: -1

Odgovori

Odgovor 200

dataMutationData Obvezno

Podaci uspješnog odgovora.

Polja · data
deletedLogička vrijednostObvezno

Je li brisanje primijenjeno.

idNiz znakovaObvezno

Identifikator resursa; sačuvajte ga u vraćenom obliku.

versionCijeli broj nullObvezno

Verzija resursa za kontrolu istodobnih upisa.

metaContextPageMeta ContextMeta PageMeta RequestMeta Obvezno

Metapodaci odgovora.

Polja · meta

ContextPageMeta

localeNiz znakovaObvezno

Jezik odabran za ovaj zahtjev.

market_codeNiz znakovaObvezno

Kod tržišta vraćen s krajnje točke konteksta.

market_idNiz znakovaObvezno

Identifikator tržišta vraćen s krajnje točke konteksta.

paginationPagination Obvezno

Metapodaci straničenja pomoću kursora.

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100

ContextMeta

localeNiz znakovaObvezno

Jezik odabran za ovaj zahtjev.

market_codeNiz znakovaObvezno

Kod tržišta vraćen s krajnje točke konteksta.

market_idNiz znakovaObvezno

Identifikator tržišta vraćen s krajnje točke konteksta.

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100

PageMeta

paginationPagination Obvezno

Metapodaci straničenja pomoću kursora.

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100

RequestMeta

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100
Primjer odgovora

HTTP status

200
Uspješan odgovor Shema
400
Nevaljan zahtjev
401
Potrebna je autentikacija
403
Pristup odbijen
404
Resurs nije pronađen
409
Sukob verzija
422
Provjera nije uspjela
429
Prekoračeno ograničenje zahtjeva
Ostali HTTP statusi (7)
405
Metoda nije dopuštena
413
Zahtjev je prevelik
415
Nepodržan format
500
Pogreška poslužitelja
502
Pogreška API pristupnika
503
Usluga nije dostupna
504
Istek vremena

Katalog pogrešaka: ErrorResponse

Zaglavlja

401

WWW-AuthenticateNiz znakovaNeobavezno

Shema autentifikacije koju zahtijeva poslužitelj.

405

AllowNiz znakovaNeobavezno

HTTP metode koje ovaj resurs podržava.

429, 503

Retry-AfterCijeli brojNeobavezno

Najkraće čekanje prije ponavljanja, u sekundama.

minimum: 0