Pereiti prie turinio
ShopentlyLearn

Sukurti — Produktai

Atlikite „Sukurti“ ištekliuje „Produktai“ naudodami toliau aprašytus duomenis.

POST/api/v1/products

Tapatybės patvirtinimas
Bearer
Prieinama nuo plano
STANDARD
Būtinos teisės
catalog.product:create
Papildomos teisės pasirinktiems laukams
  • Kai variant_value_ids nėra tuščias: catalog.product_variant:create
Sužinoti daugiau

Kodo pavyzdžiai

Užklausos pavyzdys

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

Atsakymo pavyzdys 201

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

Kaip tai veikia

  • Integracija gali skaityti nepašalintus produktus, įskaitant juodraščius, išskyrus dėl plano ribos užblokuotus produktus.
  • Užblokuoti produktai neįtraukiami į sąrašus; tiesioginė prieiga grąžina entitlements.resource_blocked.
  • Todėl produkto matomumas API skiriasi nuo jo paskelbimo parduotuvėje.
  • Naudokite esamus prekių ženklų, kategorijų, savybių ir medijos identifikatorius.
  • Kainose aiškiai nurodoma valiuta, kainoraštis, mokesčių režimas ir lygiagrečių pakeitimų kontrolės versijos.
  • Produkto ir jo variantų kainodara yra atskira; naudokite palaikomą kainodaros struktūrą bei tikslias dešimtaines eilutes.

Parametrai

Užklausos parametrai

localeEilutė nullNeprivalomas

Šiai užklausai pasirinkta kalba.

Eilutė:minLength: 2maxLength: 20
market_idEilutė nullNeprivalomas

Konteksto prieigos taško grąžintas rinkos identifikatorius.

Apribojimai · Eilutė 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
market_codeEilutė nullNeprivalomas

Konteksto prieigos taško grąžintas rinkos kodas.

Eilutė:minLength: 1maxLength: 16

Užklausos antraštės

Idempotency-KeyEilutėPrivalomas

Vienos loginės įrašymo operacijos unikalus identifikatorius.

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

Užklausos turinys

application/json · Privalomas

ProductCreate
brand_idEilutė nullNeprivalomas

Prekės ženklo identifikatorius.

Eilutė:minLength: 1maxLength: 63
conditionEilutėNeprivalomas

Produkto būklė.

Apribojimai
enum
["new", "refurbished", "used", "returned", "display", "damaged"]
Numatytoji reikšmė: "new"
descriptionEilutė nullNeprivalomas

Aprašymas pasirinkta kalba.

Eilutė:maxLength: 100000
feature_value_idsMasyvas <Eilutė> Neprivalomas

Pasirinktų savybės reikšmių identifikatoriai.

maxItems: 1000
Masyvas:minLength: 1maxLength: 63
identifiersProductIdentifiers nullNeprivalomas

Produkto identifikavimo kodai.

market_idsMasyvas <Eilutė> Neprivalomas

Pasirinktų rinkų identifikatoriai.

maxItems: 1000
Masyvas:minLength: 1maxLength: 63
media_idsMasyvas <Eilutė> Neprivalomas

Jau esamų medijos failų identifikatoriai.

maxItems: 20
Masyvas:minLength: 1maxLength: 63
meta_descriptionEilutė nullNeprivalomas

Aprašymas paieškos sistemoms pasirinkta kalba.

Eilutė:maxLength: 160
meta_keywordsMasyvas <Eilutė> nullNeprivalomas

Raktažodžiai paieškos sistemoms pasirinkta kalba.

Masyvas:maxItems: 20
Masyvas / Masyvas:maxLength: 50
meta_titleEilutė nullNeprivalomas

Antraštė paieškos sistemoms pasirinkta kalba.

Eilutė:maxLength: 70
nameEilutėPrivalomas

Ištekliaus pavadinimas atitinkamame kontekste.

minLength: 1maxLength: 300
Pavyzdys: "Example"
pricingProductPrice Neprivalomas

Kainodaros konfigūracija ir lygiagrečių pakeitimų kontrolės versijos.

primary_category_idEilutė nullNeprivalomas

Pagrindinės kategorijos identifikatorius.

Eilutė:minLength: 1maxLength: 63
publishedLoginė reikšmėNeprivalomas

Ar išteklius paskelbtas.

Numatytoji reikšmė: false
skuEilutėPrivalomas

Atsargų apskaitos vieneto kodas.

minLength: 1maxLength: 100
Apribojimai
pattern
"^\\S+$"
Pavyzdys: "example"
slugEilutė nullNeprivalomas

URL kelio segmentas pasirinkta kalba.

Eilutė:maxLength: 160
tax_category_idEilutė nullNeprivalomas

Mokesčių kategorijos identifikatorius.

Eilutė:minLength: 1maxLength: 63
variant_value_idsMasyvas <Eilutė> Neprivalomas

Pasirinktų varianto reikšmių identifikatoriai.

maxItems: 250
Masyvas:minLength: 1maxLength: 63
variants_enabledLoginė reikšmėNeprivalomas

Ar produktas naudoja variantus.

Numatytoji reikšmė: false

Atsakymai

Atsakymas 201

dataMutationData Privalomas

Sėkmingo atsakymo duomenys.

Laukai · data
deletedLoginė reikšmėPrivalomas

Ar šalinimas buvo atliktas.

idEilutėPrivalomas

Ištekliaus identifikatorius; išsaugokite grąžintą išraišką.

versionSveikasis skaičius nullPrivalomas

Ištekliaus versija lygiagrečių pakeitimų kontrolei.

metaContextPageMeta ContextMeta PageMeta RequestMeta Privalomas

Atsakymo metaduomenys.

Laukai · meta

ContextPageMeta

localeEilutėPrivalomas

Šiai užklausai pasirinkta kalba.

market_codeEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos kodas.

market_idEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos identifikatorius.

paginationPagination Privalomas

Skaidymo į puslapius pagal žymeklį metaduomenys.

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100

ContextMeta

localeEilutėPrivalomas

Šiai užklausai pasirinkta kalba.

market_codeEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos kodas.

market_idEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos identifikatorius.

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100

PageMeta

paginationPagination Privalomas

Skaidymo į puslapius pagal žymeklį metaduomenys.

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100

RequestMeta

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100
Atsakymo pavyzdys

HTTP būsena

201
Išteklius sukurtas Schema
400
Netinkama užklausa
401
Būtinas tapatybės patvirtinimas
403
Prieiga uždrausta
404
Išteklius nerastas
409
Versijų konfliktas
422
Tikrinimo klaida
429
Viršytas užklausų limitas
Kitos HTTP būsenos (7)
405
Metodas neleidžiamas
413
Užklausa per didelė
415
Nepalaikomas formatas
500
Serverio klaida
502
API tinklų sietuvo klaida
503
Paslauga nepasiekiama
504
Baigėsi laukimo laikas

Klaidų katalogas: ErrorResponse

Antraštės

201

LocationEilutėNeprivalomas

Sukurto ištekliaus santykinis URL.

401

WWW-AuthenticateEilutėNeprivalomas

Serverio reikalaujama tapatybės patvirtinimo schema.

405

AllowEilutėNeprivalomas

Šio ištekliaus palaikomi HTTP metodai.

429, 503

Retry-AfterSveikasis skaičiusNeprivalomas

Mažiausias laukimo laikas prieš kartojant, sekundėmis.

minimum: 0