ProductSet API
CREMA 서버에 등록된 상품간 리뷰 연동 세트 정보를 확인하고, 등록/수정하는 방법을 제공합니다. 세트는 상품들을 묶어 리뷰를 함께 노출하는 단위이며, 연동 유형(set_type)에 따라 리뷰가 노출되는 방향이 달라집니다.
미리 입력해 크리마 DB에 존재하는 상품들만 세트에 포함할 수 있습니다.
기존 세트상품 API(POST /v1/products/:id/sub_products, DELETE /v1/products/:id/sub_products)와는 별개의 연동 방식입니다. 두 방식을 함께 사용할 수는 없으며, 상품간 리뷰 연동 세트를 이용하려면 이 문서의 API만 사용해야 합니다. 도입을 원하시면 리뷰 운영팀(review@cre.ma)으로 문의해 주세요.
세트를 등록/수정한 뒤 각 상품의 연동 리뷰 수와 평점에 반영되기까지 수 분이 소요될 수 있습니다.
연동 유형 (set_type)
| 값 | 설명 |
|---|---|
unidirectional |
한 방향 연동. 리뷰를 보낼 상품들의 리뷰가 리뷰를 받을 상품들에 함께 노출됩니다. 리뷰를 보낼 상품에는 영향이 없습니다. |
bidirectional |
양방향 연동. 세트에 포함된 상품들이 서로의 리뷰를 함께 노출합니다. |
group |
그룹 연동. 그룹으로 묶인 상품들이 서로의 리뷰를 함께 노출합니다. 상품 1개 이상이면 생성할 수 있습니다. |
연동 유형별 파라미터의 의미
상품 목록 파라미터의 이름은 모든 연동 유형에서 source_product_ids(source_product_codes) / target_product_ids(target_product_codes)로 동일하지만, set_type에 따라 각 파라미터가 의미하는 상품의 역할이 달라집니다. 요청 전 아래 표에서 사용할 연동 유형의 파라미터 의미를 확인해 주세요.
set_type |
source_product_ids / source_product_codes |
target_product_ids / target_product_codes |
|---|---|---|
unidirectional |
리뷰를 보낼 상품. 이 상품들의 리뷰가 target 상품에 제공됩니다. | 리뷰를 받을 상품. source 상품들의 리뷰가 이 상품들에 함께 노출됩니다. |
bidirectional |
리뷰를 연동할 상품. source/target 구분 없이 세트 내 모든 상품이 서로의 리뷰를 노출합니다. | 리뷰를 연동할 상품. source와 동일한 의미입니다. |
group |
그룹에 추가할 상품. 그룹으로 묶여 서로의 리뷰를 노출합니다. | 사용하지 않습니다. 입력하면 400으로 응답합니다. |
상품의 연동 조합 제약
하나의 상품은 여러 세트에 속할 수 있으나, 역할에 따라 아래 조합만 허용됩니다. 조합을 위반하는 요청은 400으로 응답합니다.
| 이미 속한 역할 \ 추가할 역할 | 한 방향: 리뷰 보내는 상품 | 한 방향: 리뷰 받는 상품 | 양방향 | 그룹 |
|---|---|---|---|---|
| 한 방향: 리뷰 보내는 상품 | ⭕️ | ⭕️ | ⭕️ | ⭕️ |
| 한 방향: 리뷰 받는 상품 | ⭕️ | ⭕️ | ⭕️ | ❌ |
| 양방향 | ⭕️ | ⭕️ | ⭕️ | ❌ |
| 그룹 | ⭕️ | ❌ | ❌ | ❌ |
그룹에 포함된 상품은 한 방향 연동의 리뷰 보내는 상품으로만 다른 세트에 겸해서 속할 수 있고, 리뷰 받는 상품·양방향·다른 그룹에는 포함될 수 없습니다.
List product sets
상품간 리뷰 연동 세트 목록을 가져옵니다.
GET /v1/product_sets HTTP/1.1
Parameters
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
limit |
integer | ✖ | 한 페이지의 세트 목록 길이. 범위: 1 ~ 100. 기본: 30 |
page |
integer | ✖ | 페이지 번호. 최대 페이지 수는 Link HTTP header의 rel="last"에 기재되어 있습니다. 기본: 1 |
set_type |
string | ✖ | 연동 유형을 기준으로 필터링할 때 사용합니다. 사용가능 유형: unidirectional, bidirectional, group |
ids |
array | ✖ | 특정 세트만 가져올 때 사용합니다. 세트의 id 값들을 array 형식으로 입력합니다. |
Response
HTTP/1.1 200 OK
Link: <https://api.cre.ma/v1/product_sets?page=3>; rel="last", <https://api.cre.ma/v1/product_sets?page=2>; rel="next"
[
{
"id": 12,
"name": "테스트 세트 (20260713)",
"set_type": "group",
"source_products": [
{"id": 588, "code": "296"},
{"id": 583, "code": "293"}
],
"target_products": [],
"created_at": "2026-07-13T11:30:00.000+09:00",
"updated_at": "2026-07-13T11:30:00.000+09:00"
},
{
"id": 11,
"name": "한 방향 연동 세트",
"set_type": "unidirectional",
"source_products": [
{"id": 572, "code": "290"}
],
"target_products": [
{"id": 588, "code": "296"}
],
"created_at": "2026-07-10T09:12:00.000+09:00",
"updated_at": "2026-07-12T18:40:21.000+09:00"
}
]
Errors
| HTTP 상태 | 원인 |
|---|---|
400 |
set_type이 유효하지 않은 값인 경우 |
400 |
page가 전체 페이지 수를 초과한 경우 |
Create or Update a product set
새로운 상품간 리뷰 연동 세트를 생성하거나 기존 세트를 수정합니다.
id를 지정하지 않으면 새 세트를 생성하고 201 Created로 응답합니다. id를 지정하면 해당 세트의 구성을 요청 내용으로 전체 교체하고 200 OK로 응답합니다. 상품을 일부만 추가하거나 제거하는 방식이 아니므로, 세트에 유지할 상품을 항상 전부 포함해 요청해야 합니다. id 없이 같은 요청을 반복하면 세트가 중복 생성되므로, 수정할 때는 반드시 id를 포함해야 합니다. 세트의 id는 생성 응답 또는 목록 조회로 확인할 수 있습니다.
상품은 크리마 상품 id(source_product_ids, target_product_ids) 또는 쇼핑몰 상품 코드(source_product_codes, target_product_codes)로 지정할 수 있습니다. 같은 대상에 id와 code를 함께 보내면 code를 사용하고 id는 무시합니다. 요청 배열에 같은 상품이 중복으로 들어 있으면 중복을 제거한 뒤 처리합니다.
요청한 상품 중 크리마 DB에 존재하지 않는 상품이 일부 포함된 경우, 해당 상품만 제외하고 세트를 구성한 뒤 성공 응답의 nonexistent_로 시작하는 필드로 제외된 상품을 알려줍니다. 요청한 상품이 전부 존재하지 않으면 400으로 응답합니다.
POST /v1/product_sets HTTP/1.1
Parameters
unidirectional, bidirectional
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id |
integer | ✖ | 수정할 세트의 id. 지정하지 않으면 새 세트를 생성합니다. |
set_type |
string | ✔ | 연동 유형. unidirectional 또는 bidirectional |
name |
string | ✔ | 세트 이름. 관리자 화면에서 세트를 구분하는 데 사용됩니다. |
source_product_ids |
array | ✔ | 한 방향 연동은 리뷰를 보낼 상품, 양방향 연동은 리뷰를 연동할 상품의 id 목록. source_product_codes를 입력한 경우 source_product_ids는 입력하지 않아도 됩니다. |
source_product_codes |
array | ✔ | 한 방향 연동은 리뷰를 보낼 상품, 양방향 연동은 리뷰를 연동할 상품의 code 목록. source_product_ids를 입력한 경우 source_product_codes는 입력하지 않아도 됩니다. |
target_product_ids |
array | ✔ | 한 방향 연동은 리뷰를 받을 상품, 양방향 연동은 리뷰를 연동할 상품의 id 목록. target_product_codes를 입력한 경우 target_product_ids는 입력하지 않아도 됩니다. |
target_product_codes |
array | ✔ | 한 방향 연동은 리뷰를 받을 상품, 양방향 연동은 리뷰를 연동할 상품의 code 목록. target_product_ids를 입력한 경우 target_product_codes는 입력하지 않아도 됩니다. |
group
그룹 연동은 source 파라미터만 사용합니다. target_product_ids, target_product_codes는 사용하지 않으며, 입력하면 400으로 응답합니다.
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id |
integer | ✖ | 수정할 세트의 id. 지정하지 않으면 새 세트를 생성합니다. |
set_type |
string | ✔ | 연동 유형. group |
name |
string | ✔ | 세트 이름. 관리자 화면에서 세트를 구분하는 데 사용됩니다. |
source_product_ids |
array | ✔ | 그룹에 추가할 상품의 id 목록. 1개 이상 입력합니다. source_product_codes를 입력한 경우 source_product_ids는 입력하지 않아도 됩니다. |
source_product_codes |
array | ✔ | 그룹에 추가할 상품의 code 목록. 1개 이상 입력합니다. source_product_ids를 입력한 경우 source_product_codes는 입력하지 않아도 됩니다. |
Request
새 세트를 생성하는 경우
{
"set_type": "unidirectional",
"name": "한 방향 연동 세트",
"source_product_codes": ["290"],
"target_product_codes": ["296"]
}
기존 세트를 수정하는 경우
{
"id": 11,
"set_type": "unidirectional",
"name": "한 방향 연동 세트",
"source_product_codes": ["290", "293"],
"target_product_codes": ["296"]
}
Response
새 세트가 생성된 경우
HTTP/1.1 201 Created
기존 세트가 수정된 경우
HTTP/1.1 200 OK
{
"id": 11,
"name": "한 방향 연동 세트",
"set_type": "unidirectional",
"source_products": [
{"id": 572, "code": "290"}
],
"target_products": [
{"id": 588, "code": "296"}
],
"nonexistent_source_product_codes": ["293"],
"nonexistent_target_product_codes": [],
"created_at": "2026-07-10T09:12:00.000+09:00",
"updated_at": "2026-07-13T14:02:11.000+09:00"
}
nonexistent_로 시작하는 필드는 크리마 DB에 존재하지 않아 세트에서 제외된 상품 목록입니다. 빈 배열이면 요청한 상품이 모두 처리된 것입니다.
필드 이름과 값은 요청에 사용한 파라미터 단위를 따릅니다. id로 요청하면 nonexistent_source_product_ids에 id 목록으로, code로 요청하면 nonexistent_source_product_codes에 code 목록으로 응답합니다. target 상품을 보내지 않는 group 세트는 nonexistent_target_product_ids가 빈 배열로 응답됩니다.
Errors
파라미터 검증에 실패하면 400으로 응답하며, 응답 본문의 errors 배열에 문제가 된 파라미터(param)와 값(value), 원인 설명(message)을 담습니다.
{
"code": 4001000,
"message": "Invalid parameters",
"errors": [
{
"param": "source_product_codes",
"value": [{"id": 572, "code": "290"}],
"message": "Parameters 'source_product_codes' and 'target_product_codes' should not contain the same products (572 (290))"
},
{
"param": "target_product_codes",
"value": [{"id": 572, "code": "290"}],
"message": "Parameters 'source_product_codes' and 'target_product_codes' should not contain the same products (572 (290))"
}
]
}
| HTTP 상태 | 원인 |
|---|---|
404 |
지정한 id의 세트가 존재하지 않는 경우 |
400 |
수정할 때 기존 세트와 다른 set_type을 지정한 경우 |
400 |
요청한 source 또는 target 상품이 전부 크리마 DB에 존재하지 않는 경우 일부만 존재하지 않으면 에러 없이 해당 상품만 제외하고 처리합니다. |
400 |
set_type이 유효하지 않거나, group 유형에 target 상품을 지정한 경우 |
400 |
상품 목록이 비어 있는 경우 |
400 |
source와 target에 동일한 상품이 포함된 경우 |
400 |
상품의 연동 조합 제약을 위반하는 경우 예) 그룹에 속한 상품을 양방향 연동에 추가 |
errors의 param은 호출한 쪽에서 실제 사용한 파라미터명입니다. code로 요청한 경우 source_product_codes, target_product_codes로 응답합니다.
존재하는 상품에 대한 검증 에러(source와 target에 동일한 상품 포함, 연동 조합 제약 위반)의 value는 상품의 id와 code를 함께 담은 객체 목록([{"id": 572, "code": "290"}])이며, message의 상품 표기도 572 (290) 형태로 id와 code를 병기합니다.
존재하지 않는 상품 에러(Products not found with ids/codes (...))의 value는 요청에 사용한 단위 그대로 id 목록 또는 code 목록입니다.
Delete a product set
상품간 리뷰 연동 세트 한 개를 삭제합니다. 세트를 삭제하면 세트에 포함된 상품들의 리뷰 연동이 해제되며, 상품과 리뷰 자체는 삭제되지 않습니다. 세트의 id는 생성 응답 또는 목록 조회로 확인할 수 있습니다.
DELETE /v1/product_sets/:id HTTP/1.1
Parameters
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id |
integer | ✔ | 세트의 id |
Response
HTTP/1.1 204 No Content
Errors
| HTTP 상태 | 원인 |
|---|---|
404 |
지정한 id의 세트가 존재하지 않는 경우 |