# 상품 등록하기

## 상품 등록 이해하기

상품을 등록할 때는 이름, 재고, 카테고리 등 다양한 정보가 필요해요. 자유롭게 준비하면 되는 정보도 있지만, 아래 보이는 일부 항목은 토스쇼핑에서 지정한 템플릿 또는 값에 맞추어 등록해야 돼요.

<figure><img src="https://1893239884-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5jZ0MNZGU289cgosea36%2Fuploads%2Fk3Yyho4v3pFG35AOEHEj%2Fimage.png?alt=media&#x26;token=8c4531f8-ac28-4d43-ba6f-c8817540ed31" alt=""><figcaption></figcaption></figure>

* **카테고리**란 상품을 분류하는 체계입니다. 토스쇼핑에는 레벨 2부터 6까지 카테고리가 있어요. 각 카테고리마다 등록할 수 있는 옵션과 검색 키워드가 달라요. 등록하는 상품의 최하위 카테고리 템플릿에 맞춰 상품을 등록해주세요.
* **고시항목**이란 법적으로 고객에게 알려야 하는 필수 정보에요. 등록하는 상품의 고시항목을 확인하고 올바른 정보를 상품 등록할 때 입력해주세요.
* **배송비 묶음 그룹**이란 한 상자에 함께 포장·발송 시 배송비 1회만 부과하는 것이에요. 배송비 묶음 그룹이 없다면 생략해주세요. 배송비 묶음 그룹이 있다면 주소지를 등록한 다음 토스쇼핑에서 반환하는 ID 값을 상품 등록할 때 사용해주세요.
* **교환반품지**란 교환반품 상품을 받는 주소지입니다. 주소를 등록하면 토스쇼핑에서 반환하는 교환반품지 ID 값을 상품 등록할 때 사용해주세요.

이 가이드에서는 카테고리, 배송 API를 호출해서 상품 등록하는 방법을 안내합니다.

> ### API 연동 중 문의사항이나 개선 제안이 있으시다면

{% hint style="info" %}
토스쇼핑 API 연동에 대한 질문이나, 건의사항이 있다면 [연동/개발 문의](https://discord.gg/xPz6H9NZ3P)에 남겨주세요. 다른 유저의 문의를 참고하거나, 토스쇼핑 담당자와 질의를 주고 받을 수 있어요.
{% endhint %}

## 카테고리 정보 찾기

카테고리는 상품을 성격이나 용도에 따라 구분하는 체계에요. 토스쇼핑 카테고리는 레벨 2부터 6까지 있어요. 상위 카테고리는 큰 분류(가구/홈데코)이고, 하위 카테고리는 갈수록 더 구체적(가구  → 리클라이너)이에요. 각 카테고리에는 고유한 ID가 있고, 등록하려는 상품의 최하위 카테고리 ID를 기준으로 옵션을 등록해야 돼요.

카테고리마다 필요한 상품 옵션이 달라져요. 옵션은 색상, 사이즈, 갯수 등 같은 상품의 베리에이션이에요. 상품을 등록할 때 토스쇼핑에서 정한 상품의 옵션 템플릿을 반드시 지켜야 해요. 예를 들어, 의류 카테고리의 옵션 템플릿에는 색상과 사이즈 규격이 정의되어 있어요.

{% stepper %}
{% step %}

### 전체 카테고리 목록 조회하기

[카테고리 항목 조회 AP](https://shopping-docs.toss.im/dev/api-2/category#get-api-v3-shopping-fep-products-categories-children)로 토스쇼핑의 카테고리 목록을 확인해주세요. 카테고리 목록에서는 내가 등록하고자하는 상품의 최상위 카테고리 ID를 찾을 수 있어요. 리클라이너 상품을 등록한다고 가정해볼게요.&#x20;

**GET**  `/api/v3/shopping-fep/products/categories/children`&#x20;

#### Request

```bash
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/products/categories/children \
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

#### Response

<pre class="language-json"><code class="lang-json">...
{
<strong>  "id": 14817,
</strong><strong>  "name": "가구/홈데코",
</strong>  "level": 1,
  "parentId": null,
  "isLeaf": false,
  "policy": null
  }
...
</code></pre>

응답으로 돌아온 카테고리 목록을 검토해서 리클라이너에 적합한 카테고리를 찾아주세요. 리클라이너는 "가구/홈데코" 카테고리에 속하기 때문에 해당 카테고리의 `id` 값을 다음 단계에서 사용할게요.
{% endstep %}

{% step %}

### 최하위 카테고리 조회하기

"가구/홈데코"는 최상위 카테고리이기 때문에 하위 카테고리를 확인해야 돼요. 최하위 카테고리 ID로 상품 옵션 템플릿을 조회할 수 있어요. 위 응답에서 받은 "가구/홈데코"의 `id` 를 [카테고리 항목 조회 API](https://shopping-docs.toss.im/dev/api-2/category#get-api-v3-shopping-fep-products-categories-children)의 쿼리 파라미터로 사용해주세요.&#x20;

**GET**  `/api/v3/shopping-fep/products/categories/children?id={categoryID}` &#x20;

#### Request

```bash
  curl --request GET \
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/products/categories/children?id={categoryID} \
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

#### Response

<pre class="language-json"><code class="lang-json">...
{
<strong>  "id": 14819,
</strong>  "name": "가구",
  "level": 2,
  "parentId": 14817,
<strong>  "isLeaf": false,
</strong>  "policy": null
  }
...

</code></pre>

"가구/홈데코" 카테고리의 모든 하위 카테고리가 목록으로 돌아와요. 리클라이너가 속하는 "가구" 카테고리의 정보를 확인해보세요.

* `isLeaf` 필드가 `true` 면 최하위 카테고리이고,  `false` 면 하위 카테고리가 더 있어요.
* "가구" 카테고리의 `isLeaf` 값은 `false`이기 때문에 `id` 값을 사용해서 [카테고리 항목 조회 API](https://shopping-docs.toss.im/dev/api-2/category#get-api-v3-shopping-fep-products-categories-children)를 한번 더 호출해주세요.&#x20;

#### Response

<pre class="language-json"><code class="lang-json">...
{
<strong>  "id": 14835,
</strong>  "name": "리클라이너",
  "level": 3,
  "parentId": 14819,
<strong>  "isLeaf": true, // 마지막 단계
</strong>  "policy": {
    "isCultureDeductionTarget": false,
    "discountLimitPercentage": null
    }
...
</code></pre>

이번에는 "가구" 카테고리의 모든 하위 카테고리의 목록이 응답돼요. "리클라이너" 카테고리의 정보를 확인해주세요.

* &#x20;`isLeaf` 값이 `true` 이기 때문에 해당 카테고리는 최하위 카테고리입니다.
* &#x20;`id` 값을 저장해서 상품 등록 API의 `categoryId` 파라미터로 사용해주세요.
  {% endstep %}

{% step %}

### 상품 옵션 입력하는 방법 알아보기

위 단계에서 확인한 최하위 카테고리 ID를 [카테고리 템플릿 조회 API](https://shopping-docs.toss.im/dev/api-2/category#get-api-v3-shopping-fep-category-categoryid-constraint-templates)의 Path 파라미터로 사용해주세요. 상품 등록할 때 필요한 key-value 템플릿 정보를 확인할 수 있어요.

**GET** `/api/v3/shopping-fep/category/{categoryId}/constraint-templates`&#x20;

#### Request

{% code title="요청" %}

```bash
  curl --request GET \
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/category/{categoryId}/constraint-templates \
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

{% endcode %}

#### Response

<pre class="language-bash"><code class="lang-bash">{
  "resultType": "SUCCESS",
  "success": {
    "categoryName": "가구/홈데코 > 가구 > 리클라이너",
    "categoryId": 14835,
    // 카테고리 옵션 정보
<strong>    "categorySalesOptions": [
</strong><strong>      {
</strong><strong>        "id": 1,
</strong><strong>        "key": "색상",
</strong><strong>        "valueCandidates": [], // 자유롭게 입력할 수 있습니다. 
</strong><strong>        "isOption": false, // 상품등록 API에 필수로 입력합니다. 
</strong><strong>        "placeholder": "",
</strong><strong>        "unitValues": null,
</strong><strong>        "keyComment": null,
</strong><strong>        "valueComment": null,
</strong><strong>        "isOneOfRequiredGroup": false
</strong><strong>      }
</strong>    ],
    // 검색 옵션 정보
<strong>    "categorySearchOptions": [
</strong><strong>      {
</strong><strong>        "key": "책상/PC용 의자종류",
</strong><strong>        "valueCandidates": [
</strong><strong>          "사무/학생용의자",
</strong><strong>          "게이밍의자",
</strong><strong>          "중역의자",
</strong><strong>          "좌식의자",
</strong><strong>          "아동용의자"
</strong><strong>        ], // 보기 중 하나를 선택해 입력합니다. 
</strong><strong>        "isOption": true, 
</strong><strong>        "placeholder": "선택해주세요",
</strong><strong>        "unitValues": null,
</strong><strong>        "keyComment": null,
</strong><strong>        "valueComment": null
</strong><strong>      },
</strong>      {
        "key": "가로길이",
        "valueCandidates": [],
        "isOption": true,
        "placeholder": "",
<strong>        "unitValues": [
</strong><strong>          "cm",
</strong><strong>          "mm",
</strong><strong>          "m",
</strong><strong>          "km"
</strong><strong>        ],
</strong><strong>        "keyComment": null,
</strong><strong>        "valueComment": "[단위수량 옵션정보 입력안내]\\n'숫자+단위' 형식으로만 입력가능합니다.\\n\\n[입력가능단위]\\nmm, cm, m, km\\n\\n[입력가이드]\\n1. 상세정보 또는 이미지에 나온 가로 길이를 단위(mm, cm)와 함께 작성하세요.\\n\\n※ 도마 상품의 경우, 길이는 더 긴 사이드의 길이를 기준으로 작성\\n※ 패션 상품의 경우, 대부분 A가로xB세로xC높이로 표기되기 때문에 A를 가로로 작성\\n※ 가구 상품의 경우, '최대 사이즈'를 작성\\n※ 매트 상품의 경우\\n일반 매트 : 길이가 '긴면'을 가로로 작성\\n롤타입 : '폭 또는 가로' 라고 명시되어 있으면 가로길이로 작성하며, 명시 없을경우 '긴면'을 가로길이로 작성\\n※ 캠핑테이블의 경우\\n- 가로x세로 정보가 없는 경우 펼쳤을때 가장 긴 길이 기준으로 작업 (II: 137611629 > 60cm 로 작업)\\n- 쿠킹테이블과 같이 조립하여 하나가되는 테이블의 경우에도 완성했을때 가장 긴 길이 기준으로 작업 (II: 5141110810 > 138cm로 작업)\\"\\"\\"\\"\\n※고양이화장실의 경우\\n- 이미지 상 가로, 세로 구분이 가능한 경우 가로 길이 입력\\n- 이미지 상 가로, 세로 구분이 불가능한 경우 A x B x C 표기 중 A 입력\\n※ 베개/바디필로우 상품의 경우, 길이는 더 긴 사이드의 길이를 기준으로 작성\\n※ 접이식 캠핑침대 상품의 경우 접었을 때 더 긴 사이즈를 기준으로 작성 \\n※ 포장 관련 상품의 경우 위 아래의 가로길이가 상이한 경우 짧은쪽으로 작성\\n※ 밀대 상품의 경우 \\"\\"밀대판\\"\\"의 가로길이를 작성해주세요."
</strong>      }
    ],
    "productNoticeInfoTemplateTypes": [
      "FURNITURE",
      "ETC_GOODS"
    ]
  }
}
</code></pre>

응답에는 구매옵션( `categorySalesOptions`)과 검색옵션( `categorySearchOptions` )이 포함돼요

<table><thead><tr><th width="235.336669921875">응답 필드</th><th>설명</th></tr></thead><tbody><tr><td><p>구매옵션</p><p>( <code>categorySalesOptions</code>)</p></td><td>색상, 사이즈, 수량 등 구매자에게 제공하는 상품의 선택지입니다.</td></tr><tr><td><p>검색옵션</p><p>( <code>categorySearchOptions</code> )</p></td><td>검색 알고리즘에 활용됩니다. 정보가 많을 수록 검색 맞춤 추천에 유리해요.</td></tr></tbody></table>

응답으로 돌아온 `categorySalesOptions` 및 `categorySearchOptions`는 상품을 등록할 때 필요한 템플릿입니다. 각 객체에 있는 정보를 참고해서 상품등록 API의 `stocks.option` 정보를 올바르게 준비해주세요.

<table><thead><tr><th width="156.9097900390625">필드명</th><th>설명</th></tr></thead><tbody><tr><td><code>key</code></td><td>상품 옵션명입니다.</td></tr><tr><td><code>isOption</code></td><td>상품 등록할 때 옵션의 필수・선택 여부를 나타내요. 상품 등록 API의 <code>stocks.options.groupName</code>에 사용됩니다.<br>- <code>false</code>: 상품등록할 때 필수 옵션입니다.<br>- <code>true:</code> 상품등록할 때 선택 옵션입니다.  </td></tr><tr><td><code>valueCandidates</code></td><td>상품 옵션으로 사용할 수 있는 <code>value</code> 값의 목록입니다. <code>valueCandidates</code> 에 빈 배열이 돌아오면 판매자가 원하는 옵션을 자유롭게 입력할 수 있어요.</td></tr><tr><td><code>unitValues</code></td><td>상품 옵션으로 사용할 수 있는 value의 단위입니다. <code>unitValues</code> 에 값이 있다면 상품 옵션 값으로 반드시 숫자를 입력해야 돼요.</td></tr></tbody></table>

위 응답을 예시로 생각해볼게요. “리클라이너” 카테고리의 "색상" 구매옵션은 상품 등록 API의 `stocks.options` 에 아래와 같이 입력할 수 있어요.&#x20;

* `stocks.options.groupName` : 색상 (필수, `isOption = false`)
* `stocks.options.groupValue` : {셀러가 지정한 색상} (`valueCandidates`가 빈 배열)

&#x20;"책상/PC용 의자종류" 검색옵션은 상품 등록 API의 `stocks.searchOption` 에 아래와 같이 입력할 수 있어요.&#x20;

* `stocks.searchOption.searchOptionWithValue` : \[ `"책상/PC용 의자종류"`: `"게이밍의자"` ]
* `isOption`이 `true`이므로 "책상/PC용 의자종류"은 선택 옵션입니다.
* 입력한다면 key에는 `책상/PC용 의자종류`, value에는 `valueCandidates` 에 주어진 값을 입력해주세요.

"가로길이" 검색옵션은 상품 등록 API의 `stocks.options` 에 아래처럼 입력할 수 있어요.&#x20;

* `stocks.searchOption.searchOptionWithValue` : \[ `"가로길이"`: `"50cm"` ]
* "가로길이"는 `isOption`이 `true`이므로 "가로길이"는 선택 옵션입니다.
* 입력한다면  `unitValues` 에 있는 "cm", "m" 등에서 단위를 선택해 입력해요.&#x20;
  {% endstep %}
  {% endstepper %}

## 고시 항목 확인하기

고시 항목은 법적으로 고객에게 안내해야 하는 정보예요. 예를 들어, 식품은 제조일자·유통기한·원재료명을, 전자제품은 전력 소비량·KC 인증 여부를 반드시 표시해야 해요. 상품의 고시 카테고리 코드를 조회하고, 해당 코드를 사용해서 고시 항목을 확인해주세요.&#x20;

{% stepper %}
{% step %}

### 고시 카테고리 코드 조회하기&#x20;

[정보제공 고시 카테고리 코드 조회 API](https://shopping-docs.toss.im/dev/api-2/category#get-api-v3-shopping-fep-notices-category-codes)로 고시 카테고리 코드 목록을 확인해주세요.&#x20;

**GET** `/api/v3/shopping-fep/notices/category-codes`

#### Request

```bash
  curl --request GET \
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/notices/category-codes \
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

#### Response

```json
{
  "resultType": "SUCCESS",
  "success": {
    "items": [
      ...
            {
                "categoryCode": "FURNITURE",
                "firstCategoryName": "가구",
                "secondCategoryName": "가구(침대,쇼파,싱크대등)"
            },
      ...
```

리클라이너를 예로 들어볼게요. 리클라이너는 가구에 속하니까 `firstCategoryName`이 '가구'인 객체에서 `categoryCode` 값을 확인해주세요. 상품 등록 API의 `notice.categoryCode` 필드에 입력해야 됩니다.
{% endstep %}

{% step %}

### 고시 항목 조회하기

이전 단계에서 얻은 고시 `categoryCode`를 [정보제공 고시 항목 조회 API](https://shopping-docs.toss.im/dev/api-2/category#get-api-v3-shopping-fep-notices)의 path 파라미터로 넣어주세요.&#x20;

**GET** `/api/v3/shopping-fep/notices?categoryCode={categoryCode}`

#### Request

{% code title="요청" %}

```bash
  curl --request GET \
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/notices?categoryCode={categoryCode} \
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

{% endcode %}

#### Response

```json
{
  "resultType": "SUCCESS",
  "success": {
    "items": [
      {
        "id": 27,
        "title": "1. 제품 소재",
        "order": 1
      },
      {
        "id": 29,
        "title": "2. 색상",
        "order": 2
      },
      {
        "id": 31,
        "title": "3. 치수",
        "order": 3
      },
      {
        "id": 33,
        "title": "4. 제조자, 수입품의 경우 수입자를 함께 표기 (병행수입의 경우 병행수입 여부로 대체 가능)",
        "order": 4
      },
      ...
```

응답으로 돌아오는 각 고시 항목에는 `id`와 `title`이 있어요.

* &#x20;`id`는 각 고시 항목을 구분해요.&#x20;
* `title`에는 해당 항목에 입력해야 되는 내용을 가리켜요.&#x20;
* 이 정보를 참고해서 상품 등록 API의 `notice` 필드를 채우면 됩니다.&#x20;

위 응답을 보면서 예시를 들어볼게요. `id`가 27인 객체의 `title`은 "제품 소재"입니다. 나무로 만든 리클라이너 상품을 등록 API Request Body에는 아래와 같이 `id`와 `content` 값을 입력하면 됩니다.

```json
...
 "notice": {
    "categoryCode": "FURNITURE",
    "items": [
      {
        "id": 27,
        "content": "나무, 가죽"
      },
...
```

{% endstep %}
{% endstepper %}

## 교환반품지 조회하기

교환반품지는 고객이 교환하거나 반품한 상품을 보내는 주소예요. 셀러는 교환반품지에서 상품을 수거할 수 있어요. [교환반품지 ID 조회 API](https://shopping-docs.toss.im/dev/api-2/delivery#get-api-v3-shopping-fep-merchants-group-delivery-exchange-refund-location-v2) 로 기존에 등록된 교환반품지 ID를 확인해주세요.

**GET** `/api/v3/shopping-fep/merchants/group-delivery/exchange-refund-location/v2`

{% code title="요청" %}

```bash
curl --request GET \
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/merchants/group-delivery/exchange-refund-location/v2 \
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

{% endcode %}

응답의`items.id` 를 상품 등록 API의 `exchangeReturnPolicy.exchangeRefundLocationId` 파라미터 값으로 사용해주세요.&#x20;

{% code title="응답" expandable="true" %}

```json
{
  "resultType": "SUCCESS",
  "error": {
    "errorCode": "INVALID_REQUEST",
    "reason": "string"
  },
  "success": {
    "items": [
      {
        "id": 2001,
        "zipCode": "06234",
        "address": "서울특별시 강남구 테헤란로 123",
        "detailAddress": "토스타워 10층",
        "isMain": true
      }
    ],
    "nextToken": "eyJpZCI6MjAwMX0=",
    "hasNext": true
  }
}
```

{% endcode %}

{% hint style="info" %}
**아직 교환반품지를 등록하지 않았어요**

등록된 교환반품지가 없다면 토스쇼핑 파트너스 > 좌측 목록 '셀러 정보' > 배송·교환·반품 정보 > [교환·반품 정보](https://shopping-seller-alpha.toss.im/group-delivery?tab=%EA%B5%90%ED%99%98%EB%B0%98%ED%92%88) 페이지나 [교환 반품지 등록 API](https://shopping-docs.toss.im/dev/api-2/delivery#post-api-v3-shopping-fep-merchants-group-delivery-exchange-refund-location)로 교환반품지를 등록해주세요.&#x20;

<img src="https://1893239884-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5jZ0MNZGU289cgosea36%2Fuploads%2FLhy0zcE30kLruww49IZN%2FFrame%208%20(10).png?alt=media&#x26;token=a81c8008-4f16-4afb-89fd-a262d29fc108" alt="" data-size="original">

{% endhint %}

## 배송 묶음그룹 등록 및 조회하기

배송 묶음그룹을 지정하면 여러 상품을 한 번에 배송하고 배송비를 절감할 수 있어요. 같은 배송 묶음그룹 ID로 설정된 상품은 같이 배송돼요. [배송비 묶음그룹 ID 조회 API](https://shopping-docs.toss.im/dev/api-2/delivery#get-api-v3-shopping-fep-merchants-group-delivery-delivery-location-v2)로 기존에 등록된 배송 묶음그룹 ID를 확인해주세요.

**GET** `api/v3/shopping-fep/merchants/group-delivery/delivery-location/v2`

{% code title="요청" %}

```bash
curl --request GET \
  --url 'https://shopping-fep.toss.im/api/v3/shopping-fep/merchants/group-delivery/delivery-location/v2\
  --header 'Authorization: Bearer {ACCESS_TOKEN}' \
  --header 'Content-Type: application/json'
```

{% endcode %}

{% code title="응답" %}

```bash
{
  "resultType": "SUCCESS",
  "error": {
    "errorCode": "INVALID_REQUEST",
    "reason": "string"
  },
  "success": {
    "items": [
      {
        "id": 1001,
        "name": "기본 배송 그룹",
        "isMain": true
      }
    ],
    "nextToken": "eyJpZCI6MTAwMX0=",
    "hasNext": true
  }
}
```

{% endcode %}

응답의 `items.id` 를 나중에 상품 등록 API `deliveryPolicy.deliveryLocationId`의 값으로 사용해주세요. 이 값을  `null` 로 두면 개별배송돼요.&#x20;

{% hint style="info" %}
아직 배송 묶음그룹을 등록하지 않았어요

등록된 배송 묶음그룹 ID가 없으면 토스쇼핑 파트너스 > 좌측 목록 '셀러 정보' > 배송·교환·반품 정보 > [배송 정보](https://shopping-seller-alpha.toss.im/group-delivery) 페이지나 [배송비 묶음그룹 ID 등록 API](https://shopping-docs.toss.im/dev/api-2/delivery#post-api-v3-shopping-fep-merchants-group-delivery-delivery-location)로 배송 묶음그룹을 등록해주세요.&#x20;

<img src="https://1893239884-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5jZ0MNZGU289cgosea36%2Fuploads%2FoxJHYLxOK4LIFUdp01ED%2FFrame%208%20(8).png?alt=media&#x26;token=554f5919-91a9-4c76-aaf2-fec9ee8c0b82" alt="" data-size="original">
{% endhint %}

## 상품 등록하기

앞 단계에서 필요한 정보를 모두 확인했다면, 이제 등록 요청을 보낼 수 있어요.&#x20;

이 가이드에서는 아래 파라미터를 설정하는 방법에 대해서 알아봤어요. 이 외에도 필요한 파라미터는 [상품 등록 API](https://shopping-docs.toss.im/dev/api-2/product)를 참고해주세요.

* `categoryID`: [상품 카테고리 ID](#undefined-3)
* [`stocks`](#undefined-4)
  * `stocks.options.groupName`: 구매옵션 그룹 이름&#x20;
  * `stocks.options.valueName`: 구매옵션 입력 값
  * `stocks.searchOption.searchOptionWithValue`: \[키: 검색옵션 이름, 값: 검색옵션 값]
* [`deliveryPolicy`](#undefined-9)
  * `deliveryPolicy.deliveryLcationId` : 배송 묶음 그룹 ID
* [`exchangeReturnPolicy`](#undefined-8)
  * `exchangeReturnPolicy.exchangeRefundLocationId`: 교환반품지 ID&#x20;
* `notice`
  * `notice.categoryCode` : [고시 카테고리 코드](#undefined-6)
  * `notice.items.id` : [고시 항목 ID](#undefined-7)
  * `notice.items.content` : 고시 항목 내용

{% hint style="info" %}
상품 등록 API 호출 제한\
상품 등록/수정시에는 초당 10건 이하로 요청해주세요. 초과시에는 호출이 실패할 수 있어요.&#x20;
{% endhint %}

**POST**`/api/v3/shopping-fep/products/v2`&#x20;

**Request**

{% code expandable="true" %}

```json
 {
  "name": "토스 리클라이너", // 필수, 상품명
  "brandName": "토스", // 선택, 브랜드명
  "categoryId": "14835", // 필수, 카테고리 ID
  "stocks": [
     {
      "options": [ // 옵션 그룹명 및 값은 카테고리 제약 사항에 따라 제한됩니다
        {
          "groupName": "색상",
          "valueName": "검정"
        }
      ],
      "searchOption": {
	      "searchOptionWithValue": {
		      "가로길이": "50cm",
		      "책상/PC용 의자종류": "사무/학생용의자"
	      }
      }
      "remainingCount": 99, // 필수, 재고 수량
      "isHide": false, // 필수, 숨김 여부
      "isMainPrice": true, // 필수, 대표 가격 여부, stocks 중 최소 1개는 true여야합니다.
      "isSoldOut": false, // 필수, 품절 여부
      "originPrice": 20000, // 필수, 정상가
      "salePrice": 18000, // 필수, 판매가
      "isPurchasableAlone": true,// 선택, 단독 구매 가능 여부
      "managementCode": "ABC-1234", // 선택, 옵션 관리 코드
      "representativeThumbnailImage": "이미지url" // 선택, 옵션 별 대표 썸네일 이미지 url
    },
    {
      "options": [ // 옵션 그룹명 및 값은 카테고리 제약 사항에 따라 제한됩니다
        {
          "groupName": "색상",
          "valueName": "파랑"
        }
      ],
      "searchOption": {
	      "searchOptionWithValue": {
		      "가로길이": "50cm",
		      "책상/PC용 의자종류": "사무/학생용의자"
	      }
      }
      "remainingCount": 99, // 필수, 재고 수량
      "isHide": false, // 필수, 숨김 여부
      "isMainPrice": false, // 필수, 대표 가격 여부, stocks 중 최소 1개는 true여야합니다.
      "isSoldOut": false, // 필수, 품절 여부
      "originPrice": 22000, // 필수, 정상가
      "salePrice": 20000, // 필수, 판매가
      "isPurchasableAlone": true,// 선택, 단독 구매 가능 여부
      "managementCode": "ABC-1235", // 선택, 옵션 관리 코드
      "representativeThumbnailImage": "이미지url" // 선택, 옵션 별 대표 썸네일 이미지 url
    }
  ],
  "images": [
    {
      "type": "THUMBNAIL", // 필수, 이미지 유형 (THUMBNAIL, DESCRIPTION, AD, DESCRIPTION_HTML)
      "url": "이미지 url", // 선택, 최대 255자
      "order": "0" // 필수, 정렬 순서 (0부터 증가)
    },
    {
      "type": "DESCRIPTION", // 필수, 이미지 유형 (THUMBNAIL, DESCRIPTION, AD, DESCRIPTION_HTML)
      "url": "이미지 url", // 선택, 최대 255자, url
      "order": "1" // 필수, 정렬 순서 (0부터 증가)
    }
  ],
  "exposure": {
    "searchKeywords": ["리클라이너", "의자"], // 필수, 검색 키워드 리스트, 없으면 emptyList로 요청. 키워드 당 1~10 글자 허용
    "description": "토스 쇼핑의 리클라이너 입니다", // 필수, 상품 설명
    "serialNumber": "a1234" // 선택, 모델명 허용 정규식: [0-9a-zA-Z가-힣 -_]{1,5
  },
  "isTaxFree": false, // 필수, 면세 여부
  "deliveryPolicy": {
    "deliveryMethod": "NORMAL", // 필수, 배송 방식 (NORMAL, TODAY_DELIVERY)
    "deliveryDeadline": "14:00", // 선택, 출고 마감 시각 (HH:mm, 30분 단위)
    "deliveryLocationId": 1, // 선택, 배송비 묶음 그룹 ID, null이면 묶음배송 불가 
    "deliveryFeeType": "CONDITIONALLY_FREE", // 필수, 배송비 유형 (FREE, PAID, CONDITIONALLY_FREE) : (무료, 유료, 조건부 무료배송)
    "deliveryFee": "1500", // 필수, 기본 배송비
    "minimumPurchasePrice": "20000", // 필수, 조건부 무료배송 시 무료배송 조건 금액
    "isJejuAndIslandsMountainsDelivery": true, // 필수, 제주/도서산간 배송 가능여부 true/false
    "jejuDeliveryFee": 3000, // 필수, 제주도 추가 배송비, isJejuAndIslandsMountainsDelivery 가 true일 경우 적용됩니다.
    "islandsMountainsDeliveryFee": 3000 // 필수, 도서 산간 추가 배송비, isJejuAndIslandsMountainsDelivery 가 true일 경우 적용됩니다.
  },
  "exchangeReturnPolicy": {
    "exchangeRefundLocationId": 111, // 조건부필수, 교환/반품지 ID
    "refundOneWayDeliveryFee": 1500,  // 필수, 반품 편도 배송비
    "exchangeRoundTripDeliveryFee": 3000, // 필수, 교환 왕복 배송비
    "applicationMethodDescription": "고객센터 연락 후 교환/반품 신청", // 필수, 교환,환불 방법 설명, 500자 이내
    "applicationTermDescription": "상품 수령 후 7일 이내" // 필수, 교환,환불 신청 가능 기간 설명, 500자 이내
  },
  "notice": {
    "categoryCode": "CLOTHING", // 필수, 상품 정보제공 고시 카테고리 코드 (아래 참조)
    "items": [
      {
        "id": 27, // 필수, 정보제공 고시 항목 ID
        "content": "2025년 11월" // 필수, 고시 항목 내용(판매자 입력 정보) 1~4000자
      },
      {
        "id": 29,
        "content": "품질보증기준에 따른 교환/환불 가능"
      }
    ],
  "isCultureDeduction": false, // 선택, 문화비 소득공제 가능 여부
  "managementCode": "b1234" // 선택, 상품 관리 코드
}
```

{% endcode %}

**Response**

```json
{
  "resultType": "SUCCESS",
  "error": null,
  "success": {
    "id": 123      // 생성된 상품 ID
  }
}
```

상품 등록에 성공하면 `resultType`필드의 값으로 `SUCCESS` 가 돌아와요. `success` 필드에서는 생성된 상품의 ID를 확인할 수 있어요.&#x20;

**Error**

```json
{
    "resultType": "FAIL",
    "error": {
        "errorType": 0,
        "errorCode": "InvalidRequest",
        "reason": "잘못된 타입의 파라미터가 전달되었습니다. (productId)",
        "data": {},
        "title": null
    },
    "success": null
}
```

등록에 실패하면 `resultType`필드의 값으로 `FAIL`이 돌아와요. `error.reason`필드에서 등록에 실패한 이유를 확인해주세요.&#x20;

> ### API 연동 중 문의사항이나 개선 제안이 있으신가요?

{% hint style="info" %}
토스쇼핑 API 연동에 대한 질문이나, 건의사항이 있다면 [연동/개발 문의](https://discord.gg/xPz6H9NZ3P)에 남겨주세요. 다른 유저의 문의를 참고하거나, 토스쇼핑 담당자와 질의를 주고 받을 수 있어요.
{% endhint %}
