Preskočiť na obsah
ShopentlyLearn

Vytvoriť — Produkty

Vykonajte „Vytvoriť“ v „Produkty“ s údajmi opísanými nižšie.

POST/api/v1/products

Overovanie
Bearer
Dostupné od plánu
STANDARD
Požadované oprávnenia
catalog.product:create
Ďalšie oprávnenia pre vybrané polia
  • Ak variant_value_ids nie je prázdne: catalog.product_variant:create
Ďalšie informácie

Príklady kódu

Príklad požiadavky

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: example-create_product_api_v1_products_post' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "name": "Example",
  "sku": "example"
}' \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/products

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: example-create_product_api_v1_products_post', 'Content-Type: application/json'];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/products');
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, '{
  "name": "Example",
  "sku": "example"
}');
$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': 'example-create_product_api_v1_products_post'}
headers["Authorization"] = 'Bearer' + " " + credential
body = '{\n  "name": "Example",\n  "sku": "example"\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/products', 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))

Príklad odpovede 201

JSON
{
  "data": {
    "deleted": false,
    "id": "example",
    "version": 1
  },
  "meta": {
    "request_id": "example"
  }
}

Ako to funguje

  • Integrácia môže čítať nezmazané produkty vrátane konceptov, okrem produktov blokovaných limitom plánu.
  • Blokované produkty nie sú v zoznamoch; priamy prístup vracia entitlements.resource_blocked.
  • Viditeľnosť produktu v API sa preto líši od jeho zverejnenia v obchode.
  • Používajte existujúce identifikátory značiek, kategórií, vlastností a médií.
  • Ceny obsahujú výslovne určenú menu, cenník, daňový režim a verzie na riadenie súbežných zmien.
  • Ceny produktov a variantov sa rozlišujú; používajte podporovanú štruktúru cien a presné desatinné reťazce.

Parametre

Parametre dopytu

localeReťazec nullVoliteľné

Jazyk vybraný pre túto požiadavku.

Reťazec:minLength: 2maxLength: 20
market_idReťazec nullVoliteľné

Identifikátor trhu vrátený koncovým bodom kontextu.

Obmedzenia · Reťazec 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
market_codeReťazec nullVoliteľné

Kód trhu vrátený koncovým bodom kontextu.

Reťazec:minLength: 1maxLength: 16

Hlavičky požiadavky

Idempotency-KeyReťazecPovinné

Jedinečný identifikátor jednej logickej operácie zápisu.

minLength: 1maxLength: 128
Obmedzenia
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Príklad: "example-create_product_api_v1_products_post"

Telo požiadavky

application/json · Povinné

ProductCreate
brand_idReťazec nullVoliteľné

Identifikátor značky.

Reťazec:minLength: 1maxLength: 63
conditionReťazecVoliteľné

Stav produktu.

Obmedzenia
enum
["new", "refurbished", "used", "returned", "display", "damaged"]
Predvolená hodnota: "new"
descriptionReťazec nullVoliteľné

Opis vo vybranom jazyku.

Reťazec:maxLength: 100000
feature_value_idsPole <Reťazec> Voliteľné

Identifikátory vybraných hodnôt vlastností.

maxItems: 1000
Pole:minLength: 1maxLength: 63
identifiersProductIdentifiers nullVoliteľné

Identifikačné kódy produktu.

market_idsPole <Reťazec> Voliteľné

Identifikátory vybraných trhov.

maxItems: 1000
Pole:minLength: 1maxLength: 63
media_idsPole <Reťazec> Voliteľné

Identifikátory už existujúcich mediálnych súborov.

maxItems: 20
Pole:minLength: 1maxLength: 63
meta_descriptionReťazec nullVoliteľné

Opis pre vyhľadávače vo vybranom jazyku.

Reťazec:maxLength: 160
meta_keywordsPole <Reťazec> nullVoliteľné

Kľúčové slová pre vyhľadávače vo vybranom jazyku.

Pole:maxItems: 20
Pole / Pole:maxLength: 50
meta_titleReťazec nullVoliteľné

Titulok pre vyhľadávače vo vybranom jazyku.

Reťazec:maxLength: 70
nameReťazecPovinné

Názov zdroja v príslušnom kontexte.

minLength: 1maxLength: 300
Príklad: "Example"
pricingProductPrice Voliteľné

Nastavenie cien a ich verzie na riadenie súbežných zmien.

primary_category_idReťazec nullVoliteľné

Identifikátor hlavnej kategórie.

Reťazec:minLength: 1maxLength: 63
publishedLogická hodnotaVoliteľné

Či je zdroj zverejnený.

Predvolená hodnota: false
skuReťazecPovinné

Skladový kód položky.

minLength: 1maxLength: 100
Obmedzenia
pattern
"^\\S+$"
Príklad: "example"
slugReťazec nullVoliteľné

Úsek cesty URL vo vybranom jazyku.

Reťazec:maxLength: 160
tax_category_idReťazec nullVoliteľné

Identifikátor daňovej kategórie.

Reťazec:minLength: 1maxLength: 63
variant_value_idsPole <Reťazec> Voliteľné

Identifikátory vybraných hodnôt variantov.

maxItems: 250
Pole:minLength: 1maxLength: 63
variants_enabledLogická hodnotaVoliteľné

Či produkt používa varianty.

Predvolená hodnota: false

Odpovede

Odpoveď 201

dataMutationData Povinné

Obsah úspešnej odpovede.

Polia · data
deletedLogická hodnotaPovinné

Či bolo zmazanie vykonané.

idReťazecPovinné

Identifikátor zdroja; zachovajte ho v podobe, v akej bol vrátený.

versionCelé číslo nullPovinné

Verzia zdroja používaná na riadenie súbežných zmien.

metaContextPageMeta ContextMeta PageMeta RequestMeta Povinné

Metaúdaje odpovede.

Polia · meta

ContextPageMeta

localeReťazecPovinné

Jazyk vybraný pre túto požiadavku.

market_codeReťazecPovinné

Kód trhu vrátený koncovým bodom kontextu.

market_idReťazecPovinné

Identifikátor trhu vrátený koncovým bodom kontextu.

paginationPagination Povinné

Metaúdaje stránkovania pomocou kurzora.

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

minLength: 1maxLength: 100

ContextMeta

localeReťazecPovinné

Jazyk vybraný pre túto požiadavku.

market_codeReťazecPovinné

Kód trhu vrátený koncovým bodom kontextu.

market_idReťazecPovinné

Identifikátor trhu vrátený koncovým bodom kontextu.

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

minLength: 1maxLength: 100

PageMeta

paginationPagination Povinné

Metaúdaje stránkovania pomocou kurzora.

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

minLength: 1maxLength: 100

RequestMeta

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

minLength: 1maxLength: 100
Príklad odpovede

Stav HTTP

201
Zdroj vytvorený Schéma
400
Neplatná požiadavka
401
Vyžaduje sa overenie
403
Prístup zamietnutý
404
Zdroj sa nenašiel
409
Konflikt verzií
422
Chyba validácie
429
Prekročený limit požiadaviek
Ďalšie stavy HTTP (7)
405
Metóda nie je povolená
413
Príliš veľká požiadavka
415
Nepodporovaný formát
500
Chyba servera
502
Chyba brány API
503
Služba nedostupná
504
Vypršal časový limit

Katalóg chýb: ErrorResponse

Hlavičky

201

LocationReťazecVoliteľné

Relatívna URL vytvoreného zdroja.

401

WWW-AuthenticateReťazecVoliteľné

Spôsob overenia požadovaný serverom.

405

AllowReťazecVoliteľné

Metódy HTTP podporované týmto zdrojom.

429, 503

Retry-AfterCelé čísloVoliteľné

Minimálne oneskorenie pred opakovaním v sekundách.

minimum: 0