Pāriet uz saturu
ShopentlyLearn

Izveidot — Produkti

Veiciet “Izveidot” resursā “Produkti”, izmantojot tālāk aprakstītos datus.

POST/api/v1/products

Autentifikācija
Bearer
Pieejams no
STANDARD
Nepieciešamās atļaujas
catalog.product:create
Papildu atļaujas izvēlētiem laukiem
  • Ja variant_value_ids nav tukšs: catalog.product_variant:create
Uzzināt vairāk

Koda piemēri

Pieprasījuma piemērs

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

Atbildes piemērs 201

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

Kā tas darbojas

  • Integrācija var lasīt nedzēstus produktus, tostarp melnrakstus, izņemot ar plāna limitu bloķētos produktus.
  • Bloķētie produkti nav sarakstos; tieša piekļuve atgriež entitlements.resource_blocked.
  • Tāpēc produktu redzamība API atšķiras no publicēšanas veikalā.
  • Izmantojiet esošos zīmolu, kategoriju, īpašību un multivides identifikatorus.
  • Cenas ietver skaidri norādītu valūtu, cenrādi, nodokļu režīmu un vienlaicīgu izmaiņu versijas.
  • Produktu un variantu cenas ir atsevišķas; izmantojiet atbalstīto cenu struktūru un precīzas decimālskaitļu virknes.

Parametri

Vaicājuma parametri

localeVirkne nullNeobligāts

Šim pieprasījumam izvēlētā valoda.

Virkne:minLength: 2maxLength: 20
market_idVirkne nullNeobligāts

Konteksta galapunkta atgrieztais tirgus identifikators.

Ierobežojumi · Virkne 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
market_codeVirkne nullNeobligāts

Konteksta galapunkta atgrieztais tirgus kods.

Virkne:minLength: 1maxLength: 16

Pieprasījuma galvenes

Idempotency-KeyVirkneObligāts

Vienas loģiskas rakstīšanas darbības unikāls identifikators.

minLength: 1maxLength: 128
Ierobežojumi
pattern
"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
Piemērs: "example-create_product_api_v1_products_post"

Pieprasījuma saturs

application/json · Obligāts

ProductCreate
brand_idVirkne nullNeobligāts

Zīmola identifikators.

Virkne:minLength: 1maxLength: 63
conditionVirkneNeobligāts

Produkta stāvoklis.

Ierobežojumi
enum
["new", "refurbished", "used", "returned", "display", "damaged"]
Noklusējums: "new"
descriptionVirkne nullNeobligāts

Apraksts izvēlētajā valodā.

Virkne:maxLength: 100000
feature_value_idsMasīvs <Virkne> Neobligāts

Izvēlēto īpašību vērtību identifikatori.

maxItems: 1000
Masīvs:minLength: 1maxLength: 63
identifiersProductIdentifiers nullNeobligāts

Produkta identifikācijas kodi.

market_idsMasīvs <Virkne> Neobligāts

Izvēlēto tirgu identifikatori.

maxItems: 1000
Masīvs:minLength: 1maxLength: 63
media_idsMasīvs <Virkne> Neobligāts

Jau esošu multivides resursu identifikatori.

maxItems: 20
Masīvs:minLength: 1maxLength: 63
meta_descriptionVirkne nullNeobligāts

Meklētājprogrammas apraksts izvēlētajā valodā.

Virkne:maxLength: 160
meta_keywordsMasīvs <Virkne> nullNeobligāts

Meklētājprogrammas atslēgvārdi izvēlētajā valodā.

Masīvs:maxItems: 20
Masīvs / Masīvs:maxLength: 50
meta_titleVirkne nullNeobligāts

Meklētājprogrammas virsraksts izvēlētajā valodā.

Virkne:maxLength: 70
nameVirkneObligāts

Resursa nosaukums attiecīgajā kontekstā.

minLength: 1maxLength: 300
Piemērs: "Example"
pricingProductPrice Neobligāts

Cenu konfigurācija un tās vienlaicīgu izmaiņu versijas.

primary_category_idVirkne nullNeobligāts

Galvenās kategorijas identifikators.

Virkne:minLength: 1maxLength: 63
publishedLoģiska vērtībaNeobligāts

Vai resurss ir publicēts.

Noklusējums: false
skuVirkneObligāts

Krājumu uzskaites vienības kods.

minLength: 1maxLength: 100
Ierobežojumi
pattern
"^\\S+$"
Piemērs: "example"
slugVirkne nullNeobligāts

URL ceļa segments izvēlētajā valodā.

Virkne:maxLength: 160
tax_category_idVirkne nullNeobligāts

Nodokļu kategorijas identifikators.

Virkne:minLength: 1maxLength: 63
variant_value_idsMasīvs <Virkne> Neobligāts

Izvēlēto variantu vērtību identifikatori.

maxItems: 250
Masīvs:minLength: 1maxLength: 63
variants_enabledLoģiska vērtībaNeobligāts

Vai produkts izmanto variantus.

Noklusējums: false

Atbildes

Atbilde 201

dataMutationData Obligāts

Veiksmīgas atbildes dati.

Lauki · data
deletedLoģiska vērtībaObligāts

Vai dzēšana ir piemērota.

idVirkneObligāts

Resursa identifikators; saglabājiet to atgrieztajā formā.

versionVesels skaitlis nullObligāts

Resursa versija vienlaicīgu izmaiņu kontrolei.

metaContextPageMeta ContextMeta PageMeta RequestMeta Obligāts

Atbildes metadati.

Lauki · meta

ContextPageMeta

localeVirkneObligāts

Šim pieprasījumam izvēlētā valoda.

market_codeVirkneObligāts

Konteksta galapunkta atgrieztais tirgus kods.

market_idVirkneObligāts

Konteksta galapunkta atgrieztais tirgus identifikators.

paginationPagination Obligāts

Kursora lapošanas metadati.

request_idVirkneObligāts

Pieteikuma identifikators; atbildes metadatos tas identificē HTTP pieprasījumu.

minLength: 1maxLength: 100

ContextMeta

localeVirkneObligāts

Šim pieprasījumam izvēlētā valoda.

market_codeVirkneObligāts

Konteksta galapunkta atgrieztais tirgus kods.

market_idVirkneObligāts

Konteksta galapunkta atgrieztais tirgus identifikators.

request_idVirkneObligāts

Pieteikuma identifikators; atbildes metadatos tas identificē HTTP pieprasījumu.

minLength: 1maxLength: 100

PageMeta

paginationPagination Obligāts

Kursora lapošanas metadati.

request_idVirkneObligāts

Pieteikuma identifikators; atbildes metadatos tas identificē HTTP pieprasījumu.

minLength: 1maxLength: 100

RequestMeta

request_idVirkneObligāts

Pieteikuma identifikators; atbildes metadatos tas identificē HTTP pieprasījumu.

minLength: 1maxLength: 100
Atbildes piemērs

HTTP statuss

201
Resurss izveidots Shēma
400
Nederīgs pieprasījums
401
Nepieciešama autentifikācija
403
Piekļuve liegta
404
Resurss nav atrasts
409
Versiju konflikts
422
Validācijas kļūda
429
Pārsniegts pieprasījumu limits
Citi HTTP statusi (7)
405
Metode nav atļauta
413
Pieprasījums ir pārāk liels
415
Neatbalstīts formāts
500
Servera kļūda
502
API vārtejas kļūda
503
Pakalpojums nav pieejams
504
Noildze

Kļūdu katalogs: ErrorResponse

Galvenes

201

LocationVirkneNeobligāts

Izveidotā resursa relatīvais URL.

401

WWW-AuthenticateVirkneNeobligāts

Servera pieprasītā autentifikācijas shēma.

405

AllowVirkneNeobligāts

Šī resursa atbalstītās HTTP metodes.

429, 503

Retry-AfterVesels skaitlisNeobligāts

Minimālā aizkave pirms atkārtošanas sekundēs.

minimum: 0