コンテンツにスキップ
ShopentlyLearn

一覧取得 — 商品

「商品」のデータを取得します。結果はこの操作のパラメーターによって決まります。

GET/api/v1/products

認証
Bearer
利用可能な最低プラン
STANDARD
必要な権限
catalog.product:read

コード例

リクエスト例

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request GET \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --url "${SHOPENTLY_SHOP_URL%/}"'/api/v1/products?limit=20'

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 = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/products?limit=20');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    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);
    },
]);
$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 = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
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(
        'GET', base_url + '/api/v1/products?limit=20', 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))

レスポンス例 200

JSON
{
  "data": [
    {
      "availability": {
        "available_from": null,
        "available_until": null,
        "is_available": true
      },
      "brand_id": null,
      "condition": "new",
      "created_at": "2026-01-01T12:00:00Z",
      "id": "example",
      "name": "Example",
      "number": "example",
      "price": {
        "amount": "0.00",
        "currency": "PLN",
        "minor_units": 2,
        "tax_included": true
      },
      "price_version": 1,
      "primary_category_id": "example",
      "primary_media_id": "example",
      "published": false,
      "sku": "example",
      "slug": "example",
      "tax_category_id": "example",
      "updated_at": "2026-01-01T12:00:00Z",
      "variants_enabled": false,
      "version": 1
    }
  ],
  "meta": {
    "locale": "en",
    "market_code": "PL",
    "market_id": "example",
    "pagination": {
      "has_more": false,
      "limit": 20,
      "next_cursor": null
    },
    "request_id": "example"
  }
}

仕組み

プラン制限でブロックされた商品を除き、下書きを含む未削除の商品を取得できます。ブロックされた商品は一覧から除外され、直接アクセスすると entitlements.resource_blocked が返ります。そのため API での可視性はストアでの公開状態とは異なります。

パラメーター

クエリパラメーター

limit整数任意

このページの最大レコード数。

minimum: 1maximum: 100
既定値: 50例: 20
cursor文字列 null任意

前のページが返した、内部を解釈しない継続値。

文字列:minLength: 1maxLength: 1024
locale文字列 null任意

このリクエストで選択した言語。

文字列:minLength: 2maxLength: 20
market_id文字列 null任意

コンテキストエンドポイントが返した市場識別子。

制約 · 文字列 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
market_code文字列 null任意

コンテキストエンドポイントが返した市場コード。

文字列:minLength: 1maxLength: 16
sku文字列 null任意

在庫管理単位のコード。

文字列:minLength: 1maxLength: 100
制約 · 文字列 1
pattern
"^\\S+$"
published真偽値 null任意

リソースが公開済みかどうか。

brand_id文字列 null任意

ブランド識別子。

制約 · 文字列 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"
category_id文字列 null任意

カテゴリー識別子。

制約 · 文字列 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"

この操作は JSON 本文を受け付けません。

レスポンス

レスポンス 200

data配列 <ProductSummaryData > 必須

成功レスポンスのデータ。

フィールド · data

ProductSummaryData

availabilityAvailabilityData 必須

選択したコンテキストでの利用可能性。

brand_id文字列 null必須

ブランド識別子。

condition文字列必須

商品の状態。

制約
enum
["new", "refurbished", "used", "returned", "display", "damaged"]
created_at文字列必須

作成時刻。

format: "date-time"
id文字列必須

リソース識別子。返された値をそのまま保持してください。

name文字列 null必須

該当コンテキストでのリソース名。

number文字列必須

人向けの注文番号または申請番号。

pricePriceData null必須

選択したコンテキストでの価格情報。

price_version整数必須

同時更新制御に使う現在の価格バージョン。

primary_category_id文字列 null必須

主要カテゴリー識別子。

primary_media_id文字列 null必須

主要メディアアセット識別子。

published真偽値必須

リソースが公開済みかどうか。

sku文字列必須

在庫管理単位のコード。

slug文字列 null必須

選択した言語での URL パス部分。

tax_category_id文字列必須

税カテゴリー識別子。

updated_at文字列必須

最終更新時刻。

format: "date-time"
variants_enabled真偽値必須

商品がバリエーションを使うかどうか。

version整数必須

同時更新制御に使うリソースバージョン。

metaContextPageMeta ContextMeta PageMeta RequestMeta 必須

レスポンスのメタデータ。

フィールド · meta

ContextPageMeta

locale文字列必須

このリクエストで選択した言語。

market_code文字列必須

コンテキストエンドポイントが返した市場コード。

market_id文字列必須

コンテキストエンドポイントが返した市場識別子。

paginationPagination 必須

カーソルによるページ分割のメタデータ。

request_id文字列必須

申請識別子。レスポンスのメタデータでは HTTP リクエストを識別します。

minLength: 1maxLength: 100

ContextMeta

locale文字列必須

このリクエストで選択した言語。

market_code文字列必須

コンテキストエンドポイントが返した市場コード。

market_id文字列必須

コンテキストエンドポイントが返した市場識別子。

request_id文字列必須

申請識別子。レスポンスのメタデータでは HTTP リクエストを識別します。

minLength: 1maxLength: 100

PageMeta

paginationPagination 必須

カーソルによるページ分割のメタデータ。

request_id文字列必須

申請識別子。レスポンスのメタデータでは HTTP リクエストを識別します。

minLength: 1maxLength: 100

RequestMeta

request_id文字列必須

申請識別子。レスポンスのメタデータでは HTTP リクエストを識別します。

minLength: 1maxLength: 100
レスポンス例

HTTP ステータス

200
成功 スキーマ
400
無効なリクエスト
401
認証が必要です
403
権限がありません
404
リソースが見つかりません
409
バージョンの競合
422
検証エラー
429
リクエスト上限を超過
その他の HTTP ステータス (7)
405
許可されていないメソッド
413
リクエストが大きすぎます
415
未対応の形式
500
サーバーエラー
502
API ゲートウェイエラー
503
サービスを利用できません
504
タイムアウト

エラー一覧: ErrorResponse

ヘッダー

401

WWW-Authenticate文字列任意

サーバーが要求する認証方式。

405

Allow文字列任意

このリソースが対応する HTTP メソッド。

429, 503

Retry-After整数任意

再試行までに最低限待つ秒数。

minimum: 0