Preskoči na sadržaj
ShopentlyLearn

Stvori — Proizvodi

Izvršite „Stvori“ u „Proizvodi“ s podacima opisanima u nastavku.

POST/api/v1/products

Autentifikacija
Bearer
Dostupno od
STANDARD
Potrebne ovlasti
catalog.product:create
Dodatne ovlasti za odabrana polja
  • Kada variant_value_ids nije prazno: catalog.product_variant:create
Saznajte više

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

Primjer odgovora 201

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

Kako funkcionira

  • Integracija može čitati neizbrisane proizvode, uključujući nacrte, osim proizvoda blokiranih ograničenjem plana.
  • Blokirani proizvodi izostavljeni su s popisa; izravan pristup vraća entitlements.resource_blocked.
  • Vidljivost kroz API zato se razlikuje od objave u izlogu trgovine.
  • Koristite postojeće identifikatore marki, kategorija, svojstava i medija.
  • Cijene imaju izričitu valutu, cjenik, porezni način i verzije za kontrolu istodobnih upisa.
  • Cijene proizvoda i varijanti zasebne su; koristite podržanu strukturu cijena i točne decimalne nizove znakova.

Parametri

Parametri upita

localeNiz znakova nullNeobavezno

Jezik odabran za ovaj zahtjev.

Niz znakova:minLength: 2maxLength: 20
market_idNiz znakova nullNeobavezno

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

Ograničenja · Niz znakova 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
market_codeNiz znakova nullNeobavezno

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

Niz znakova:minLength: 1maxLength: 16

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: "example-create_product_api_v1_products_post"

Tijelo zahtjeva

application/json · Obvezno

ProductCreate
brand_idNiz znakova nullNeobavezno

Identifikator marke.

Niz znakova:minLength: 1maxLength: 63
conditionNiz znakovaNeobavezno

Stanje proizvoda.

Ograničenja
enum
["new", "refurbished", "used", "returned", "display", "damaged"]
Zadano: "new"
descriptionNiz znakova nullNeobavezno

Opis na odabranom jeziku.

Niz znakova:maxLength: 100000
feature_value_idsPolje vrijednosti <Niz znakova> Neobavezno

Identifikatori odabranih vrijednosti svojstva.

maxItems: 1000
Polje vrijednosti:minLength: 1maxLength: 63
identifiersProductIdentifiers nullNeobavezno

Identifikacijski kodovi proizvoda.

market_idsPolje vrijednosti <Niz znakova> Neobavezno

Identifikatori odabranih tržišta.

maxItems: 1000
Polje vrijednosti:minLength: 1maxLength: 63
media_idsPolje vrijednosti <Niz znakova> Neobavezno

Identifikatori već postojećih medijskih datoteka.

maxItems: 20
Polje vrijednosti:minLength: 1maxLength: 63
meta_descriptionNiz znakova nullNeobavezno

Opis za tražilice na odabranom jeziku.

Niz znakova:maxLength: 160
meta_keywordsPolje vrijednosti <Niz znakova> nullNeobavezno

Ključne riječi za tražilice na odabranom jeziku.

Polje vrijednosti:maxItems: 20
Polje vrijednosti / Polje vrijednosti:maxLength: 50
meta_titleNiz znakova nullNeobavezno

Naslov za tražilice na odabranom jeziku.

Niz znakova:maxLength: 70
nameNiz znakovaObvezno

Naziv resursa u odgovarajućem kontekstu.

minLength: 1maxLength: 300
Primjer: "Example"
pricingProductPrice Neobavezno

Postavke cijena i njihove verzije za kontrolu istodobnih upisa.

primary_category_idNiz znakova nullNeobavezno

Identifikator glavne kategorije.

Niz znakova:minLength: 1maxLength: 63
publishedLogička vrijednostNeobavezno

Je li resurs objavljen.

Zadano: false
skuNiz znakovaObvezno

Šifra skladišne jedinice.

minLength: 1maxLength: 100
Ograničenja
pattern
"^\\S+$"
Primjer: "example"
slugNiz znakova nullNeobavezno

Dio URL putanje na odabranom jeziku.

Niz znakova:maxLength: 160
tax_category_idNiz znakova nullNeobavezno

Identifikator porezne kategorije.

Niz znakova:minLength: 1maxLength: 63
variant_value_idsPolje vrijednosti <Niz znakova> Neobavezno

Identifikatori odabranih vrijednosti varijante.

maxItems: 250
Polje vrijednosti:minLength: 1maxLength: 63
variants_enabledLogička vrijednostNeobavezno

Koristi li proizvod varijante.

Zadano: false

Odgovori

Odgovor 201

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

201
Resurs stvoren 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

201

LocationNiz znakovaNeobavezno

Relativni URL izrađenog resursa.

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