Skip to content

Catalog API

토스 POS의 [상품] - [상품 · 할인][상품], [옵션], [카테고리] 메뉴를 통해 매장의 카탈로그를 관리할 수 있어요. Catalog API를 통해 해당 정보를 조회할 수 있으며, 매장의 메뉴 구성과 상품 정보를 제공해요.

Types

상품 (CatalogItem)

매장에 등록된 상품이에요. 소비자가 주문할 때 하나 또는 여러 상품을 주문에 포함하게 돼요.

NameTypeRequiredDescriptionExample
idString상품 ID"42"
merchantIdLong매장 ID42
categoryCatalogCategory카테고리
상품은 반드시 하나의 카테고리에 속해요.
titleString상품명"아메리카노"
codeString상품코드""
stateCatalogItemState상품 판매 상태
상품이 품절 상태로 표기되어 있더라도, 그 상품의 주문이 원천적으로 불가능하지는 않다는 점에 유의해야 해요. 품절 상태는 메뉴 전시 등 시각적인 표기를 위한 정보로 이해하는 것이 적절해요.
"ON_SALE"
enabledBoolean상품 활성화 및 노출 여부true
enableScheduleCatalogScheduleALPHA 상품 활성화 및 노출 시간·일자 설정
enabledtrue인 경우, 노출 시간·일자가 설정된 경우 해당 시간·일자에만 상품이 노출됩니다.
orderInt카테고리 내 정렬 순서1
descriptionString상품 설명""
imageUrlString상품 이미지 URL""
labelsString[]상품 라벨 목록["신규"]
priceCatalogItemPrice가격
priceVariationsCatalogItemPriceVariation[]ALPHA 주문 맥락에 따라 동적으로 변경되는 가격 정보
기본적으로 price의 가격이 적용되나, 특정 상황을 만족하면 priceVariation의 가격이 적용될 수 있습니다.
diningOptionsCatalogDiningOption[]ALPHA 상품을 제공하는 식사 옵션 목록["HERE", "TOGO"]
optionsCatalogOption[]옵션 목록
attributes[String: Any]기타 속성{"key": "value"}
createdAttimestamp생성 시각"2025-09-01T00:00:00Z"
updatedAttimestamp수정 시각"2025-09-01T00:00:00Z"

상품 가격 (CatalogItemPrice)

NameTypeRequiredDescriptionExample
titleString가격명"기본"
priceTypeCatalogItemPriceType가격 종류"FIXED"
priceUnitLong가격 단위1
priceValueLong가격3000
barcodeString바코드""

상품 가격 종류 (CatalogItemPriceType)

ValueDescription
"FIXED"정가
"VARIABLE"시가
"UNIT"단위가격
"UNDEFINED"

ALPHA 상품 가격 변동 (CatalogItemPriceVariation)

NameTypeRequiredDescriptionExample
typeString가격 변동 유형
  • "DINING_OPTION": 식사 옵션에 따른 가격 차등
"DINING_OPTION"
valueString가격 변동 적용 조건 값"HERE"
priceValueLong변동 가격3000

상품 판매 상태 (CatalogItemState)

ValueDescription
"ON_SALE"판매 중
"SOLD_OUT"품절
"UNDEFINED"

카테고리 (CatalogCategory)

여러 상품을 그룹화하는 카테고리예요. 토스 POS, 또는 고객에게 상품이 전시되는 키오스크 등의 채널에서 카테고리를 통해 상품을 탐색할 수 있어요.

매장의 상품은 반드시 하나의 카테고리에 속해요.

NameTypeRequiredDescriptionExample
idString카테고리 ID"42"
merchantIdLong매장 ID42
titleString카테고리명"커피"
codeString카테고리 코드""
enabledBoolean카테고리 활성화 및 노출 여부true
orderInt정렬 순서1
createdAttimestamp생성 시각"2025-09-01T00:00:00Z"
updatedAttimestamp수정 시각"2025-09-01T00:00:00Z"

옵션 (CatalogOption)

상품에 추가할 수 있는 옵션이에요. 예를 들어 '아메리카노' 상품에 '온도' 옵션을 두고, 선택지로 'ICE', 'HOT'을 제공할 수 있어요. 상품과 옵션은 서로 다대다 관계로, 한 상품에 여러 가지 옵션을 제공하는 것도, 동일한 옵션을 여러 상품에 제공하는 것도 가능해요.

NameTypeRequiredDescriptionExample
idString옵션 ID"42"
merchantIdLong매장 ID42
titleString옵션명"온도"
codeString옵션 코드""
enabledBoolean옵션 활성화 및 노출 여부true
orderInt정렬 순서1
choicesCatalogOptionChoice[]선택지 목록
requiredBoolean필수 선택 여부true
minChoicesInt고를 수 있는 최소 선택지 개수1
maxChoicesInt고를 수 있는 최대 선택지 개수3
createdAttimestamp생성 시각"2025-09-01T00:00:00Z"
updatedAttimestamp수정 시각"2025-09-01T00:00:00Z"

옵션 선택지 (CatalogOptionChoice)

옵션의 선택지예요. 선택지별로 추가 가격을 부여할 수 있어요.

NameTypeRequiredDescriptionExample
idString옵션 ID"42"
merchantIdLong매장 ID42
optionIdString선택지가 속한 옵션 ID"42"
titleString선택지명"ICE"
codeString선택지 코드""
stateCatalogOptionChoiceState선택지 판매 상태
선택지가 품절 상태로 표기되어 있더라도, 그 선택지의 주문이 원천적으로 불가능하지는 않다는 점에 유의해야 해요. 품절 상태는 메뉴 전시 등 시각적인 표기를 위한 정보로 이해하는 것이 적절해요.
"ON_SALE"
enabledBoolean선택지 활성화 및 노출 여부true
orderInt옵션 내 정렬 순서1
priceValueLong가격500
imageUrlString선택지 이미지 URL""
quantityEnabledBoolean수량 선택 가능 여부true
minQuantityInt선택 가능 최소 수량1
maxQuantityInt선택 가능 최대 수량999
createdAttimestamp생성 시각"2025-09-01T00:00:00Z"
updatedAttimestamp수정 시각"2025-09-01T00:00:00Z"

옵션 선택지 판매 상태 (CatalogOptionChoiceState)

ValueDescription
"ON_SALE"판매 중
"SOLD_OUT"품절
"UNDEFINED"

ALPHA 노출 시간·일자 설정 (CatalogSchedule)

카탈로그가 노출되는 시간·일자를 설정할 수 있습니다. 설정되어 있지 않은 필드는 제약 없음(예: timeRange 미설정 시 24시간 노출)을 의미합니다.

NameTypeRequiredDescriptionExample
daysOfWeekString[]노출 요일 설정 ("MONDAY" ~ "SUNDAY")["FRIDAY", "SATURDAY"]
dateRange{ "start": LocalDate, "end": LocalDate? }노출 기간 설정 (inclusive)
종료일 미설정 시 무제한 노출
{ "start": "2025-09-01", "end": "2025-09-30" }
timeRange{ "start": LocalTime, "end": LocalTime }노출 시간 설정 (inclusive){ "start": "10:00:00", "end": "17:59:59" }

ALPHA 식사 옵션 (CatalogDiningOption)

상품·옵션 등을 제공하는 식사 옵션을 나타냅니다.

ValueDescription
"HERE"매장 식사
"TOGO"포장
"UNDEFINED"

Methods

상품 단건 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/items/{itemId}
Response TypeCatalogItem
Description매장의 상품 하나를 조회해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
itemIdPathString상품 ID

상품 복수건 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/items/by-ids
Response TypeCatalogItem[]
DescriptionID를 통해 매장의 상품 여러 건을 조회해요. 최대 25건까지 조회 가능해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
idsQueryString[]상품 ID 목록

상품 목록 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/items
Response TypeCatalogItem[]
Description매장의 상품 목록을 상품 ID 순으로 조회해요.

요청 파라미터

ParameterLocationTypeRequiredDefaultDescription
merchantIdPathLong-매장 ID
pageQueryInt1조회할 페이지
sizeQueryInt100페이지 크기

상품 검색

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/items/search
Response TypeCatalogItem[]
Description조건에 맞는 상품을 검색해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
categoryIdsQueryString[]카테고리 ID 목록
이 파라미터를 지정하면 검색 결과는 해당 카테고리에 속한 상품만 반환돼요.
pageQueryInt1
sizeQueryInt100

카테고리 단건 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/categories/{categoryId}
Response TypeCatalogCategory
Description매장의 카테고리 하나를 조회해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
categoryIdPathString카테고리 ID

카테고리 복수건 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/categories/by-ids
Response TypeCatalogCategory[]
DescriptionID를 통해 매장의 카테고리 여러 건을 조회해요. 최대 25건까지 조회 가능해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
idsQueryString[]카테고리 ID 목록

카테고리 목록 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/categories
Response TypeCatalogCategory[]
Description매장의 카테고리 목록을 조회해요.

요청 파라미터

ParameterLocationTypeRequiredDefaultDescription
merchantIdPathLong-매장 ID
pageQueryInt1조회할 페이지
sizeQueryInt100페이지 크기

옵션 단건 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/options/{optionId}
Response TypeCatalogOption
Description매장의 옵션 하나를 조회해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
optionIdPathString옵션 ID

옵션 복수건 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/options/by-ids
Response TypeCatalogOption[]
DescriptionID를 통해 매장의 옵션 여러 건을 조회해요. 최대 25건까지 조회 가능해요.

요청 파라미터

ParameterLocationTypeRequiredDescription
merchantIdPathLong매장 ID
idsQueryString[]옵션 ID 목록

옵션 목록 조회

PropertyValue
MethodGET
Path/api-public/openapi/v1/merchants/{merchantId}/catalog/options
Response TypeCatalogOption[]
Description매장의 옵션 목록을 조회해요.

요청 파라미터

ParameterLocationTypeRequiredDefaultDescription
merchantIdPathLong-매장 ID
pageQueryInt1조회할 페이지
sizeQueryInt100페이지 크기

Events

상품 생성됨 (catalog.item.created.v1)

PropertyValue
Event Typecatalog.item.created.v1
Description상품이 생성되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
itemCatalogItem생성된 상품 정보

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.item.created.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "item": {
            "id": "42",
            "merchantId": 42,
            "category": {
                "id": "42",
                "merchantId": 42,
                "title": "커피",
                "code": "CATEGORY_CODE",
                "enabled": true,
                "order": 1,
                "createdAt": "2026-01-01T00:00:00Z",
                "updatedAt": "2026-01-01T00:00:00Z"
            },
            "title": "아메리카노",
            "code": "ITEM_CODE",
            "state": "ON_SALE",
            "enabled": true,
            "order": 1,
            "description": "아메리카노 설명",
            "imageUrl": "https://example.com/image.png",
            "labels": ["신규"],
            "price": {
                "title": "기본",
                "priceType": "FIXED",
                "priceUnit": 1,
                "priceValue": 3000,
                "barcode": "1234567890"
            },
            "diningOptions": ["HERE", "TOGO"],
            "options": [
                {
                    "id": "42",
                    "merchantId": 42,
                    "title": "온도",
                    "code": "OPTION_CODE",
                    "enabled": true,
                    "order": 1,
                    "choices": [
                        {
                            "id": "42",
                            "merchantId": 42,
                            "optionId": "42",
                            "title": "ICE",
                            "code": "CHOICE_CODE",
                            "state": "ON_SALE",
                            "enabled": true,
                            "order": 1,
                            "priceValue": 500,
                            "quantityEnabled": false,
                            "minQuantity": 0,
                            "maxQuantity": 1,
                            "createdAt": "2026-01-01T00:00:00Z",
                            "updatedAt": "2026-01-01T00:00:00Z"
                        }
                    ],
                    "required": true,
                    "minChoices": 1,
                    "maxChoices": 1,
                    "createdAt": "2026-01-01T00:00:00Z",
                    "updatedAt": "2026-01-01T00:00:00Z"
                }
            ],
            "createdAt": "2026-01-01T00:00:00Z",
            "updatedAt": "2026-01-01T00:00:00Z"
        }
    }
}

상품 수정됨 (catalog.item.updated.v1)

PropertyValue
Event Typecatalog.item.updated.v1
Description상품이 수정되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
itemCatalogItem수정된 상품 정보

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.item.updated.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "item": {
            "id": "42",
            "merchantId": 42,
            "category": {
                "id": "42",
                "merchantId": 42,
                "title": "커피",
                "code": "CATEGORY_CODE",
                "enabled": true,
                "order": 1,
                "createdAt": "2026-01-01T00:00:00Z",
                "updatedAt": "2026-01-01T00:00:00Z"
            },
            "title": "아메리카노",
            "code": "ITEM_CODE",
            "state": "ON_SALE",
            "enabled": true,
            "order": 1,
            "description": "아메리카노 설명",
            "imageUrl": "https://example.com/image.png",
            "labels": ["신규"],
            "price": {
                "title": "기본",
                "priceType": "FIXED",
                "priceUnit": 1,
                "priceValue": 3000,
                "barcode": "1234567890"
            },
            "diningOptions": ["HERE", "TOGO"],
            "options": [
                {
                    "id": "42",
                    "merchantId": 42,
                    "title": "온도",
                    "code": "OPTION_CODE",
                    "enabled": true,
                    "order": 1,
                    "choices": [
                        {
                            "id": "42",
                            "merchantId": 42,
                            "optionId": "42",
                            "title": "ICE",
                            "code": "CHOICE_CODE",
                            "state": "ON_SALE",
                            "enabled": true,
                            "order": 1,
                            "priceValue": 500,
                            "quantityEnabled": false,
                            "minQuantity": 0,
                            "maxQuantity": 1,
                            "createdAt": "2026-01-01T00:00:00Z",
                            "updatedAt": "2026-01-01T00:00:00Z"
                        }
                    ],
                    "required": true,
                    "minChoices": 1,
                    "maxChoices": 1,
                    "createdAt": "2026-01-01T00:00:00Z",
                    "updatedAt": "2026-01-01T00:00:00Z"
                }
            ],
            "createdAt": "2026-01-01T00:00:00Z",
            "updatedAt": "2026-01-01T00:00:00Z"
        }
    }
}

상품 삭제됨 (catalog.item.deleted.v1)

PropertyValue
Event Typecatalog.item.deleted.v1
Description상품이 삭제되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
itemIdString삭제된 상품 ID"42"

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.item.deleted.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "itemId": "42"
    }
}

카테고리 생성됨 (catalog.category.created.v1)

PropertyValue
Event Typecatalog.category.created.v1
Description카테고리가 생성되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
categoryCatalogCategory생성된 카테고리 정보

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.category.created.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "category": {
            "id": "42",
            "merchantId": 42,
            "title": "커피",
            "code": "CATEGORY_CODE",
            "enabled": true,
            "order": 1,
            "createdAt": "2026-01-01T00:00:00Z",
            "updatedAt": "2026-01-01T00:00:00Z"
        }
    }
}

카테고리 수정됨 (catalog.category.updated.v1)

PropertyValue
Event Typecatalog.category.updated.v1
Description카테고리가 수정되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
categoryCatalogCategory수정된 카테고리 정보

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.category.updated.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "category": {
            "id": "42",
            "merchantId": 42,
            "title": "커피",
            "code": "CATEGORY_CODE",
            "enabled": true,
            "order": 1,
            "createdAt": "2026-01-01T00:00:00Z",
            "updatedAt": "2026-01-01T00:00:00Z"
        }
    }
}

카테고리 삭제됨 (catalog.category.deleted.v1)

PropertyValue
Event Typecatalog.category.deleted.v1
Description카테고리가 삭제되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
categoryIdString삭제된 카테고리 ID"42"

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.category.deleted.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "categoryId": "42"
    }
}

옵션 생성됨 (catalog.option.created.v1)

PropertyValue
Event Typecatalog.option.created.v1
Description옵션이 생성되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
optionCatalogOption생성된 옵션 정보

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.option.created.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "option": {
            "id": "42",
            "merchantId": 42,
            "title": "온도",
            "code": "OPTION_CODE",
            "enabled": true,
            "order": 1,
            "choices": [
                {
                    "id": "42",
                    "merchantId": 42,
                    "optionId": "42",
                    "title": "ICE",
                    "code": "CHOICE_CODE",
                    "state": "ON_SALE",
                    "enabled": true,
                    "order": 1,
                    "priceValue": 500,
                    "quantityEnabled": false,
                    "minQuantity": 0,
                    "maxQuantity": 1,
                    "createdAt": "2026-01-01T00:00:00Z",
                    "updatedAt": "2026-01-01T00:00:00Z"
                }
            ],
            "required": true,
            "minChoices": 1,
            "maxChoices": 1,
            "createdAt": "2026-01-01T00:00:00Z",
            "updatedAt": "2026-01-01T00:00:00Z"
        }
    }
}

옵션 수정됨 (catalog.option.updated.v1)

PropertyValue
Event Typecatalog.option.updated.v1
Description옵션이 수정되었어요.
옵션에 속한 선택지가 변경되거나 추가/삭제되었을 때도 이 이벤트가 발생해요.

이벤트 Payload

NameTypeRequiredDescriptionExample
optionCatalogOption수정된 옵션 정보

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.option.updated.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "option": {
            "id": "42",
            "merchantId": 42,
            "title": "온도",
            "code": "OPTION_CODE",
            "enabled": true,
            "order": 1,
            "choices": [
                {
                    "id": "42",
                    "merchantId": 42,
                    "optionId": "42",
                    "title": "ICE",
                    "code": "CHOICE_CODE",
                    "state": "ON_SALE",
                    "enabled": true,
                    "order": 1,
                    "priceValue": 500,
                    "quantityEnabled": false,
                    "minQuantity": 0,
                    "maxQuantity": 1,
                    "createdAt": "2026-01-01T00:00:00Z",
                    "updatedAt": "2026-01-01T00:00:00Z"
                }
            ],
            "required": true,
            "minChoices": 1,
            "maxChoices": 1,
            "createdAt": "2026-01-01T00:00:00Z",
            "updatedAt": "2026-01-01T00:00:00Z"
        }
    }
}

옵션 삭제됨 (catalog.option.deleted.v1)

PropertyValue
Event Typecatalog.option.deleted.v1
Description옵션이 삭제되었어요.

이벤트 Payload

NameTypeRequiredDescriptionExample
optionIdString삭제된 옵션 ID"42"

이벤트 Body 예시

json
{
    "id": "000000000000000000000000",
    "type": "catalog.option.deleted.v1",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "merchantId": 42,
    "app": "my-awesome-app",
    "data": {
        "optionId": "42"
    }
}