sayren Docs
쿠폰

쿠폰 생성

주문 쿠폰(`ORDER`)·상품 쿠폰(`PRODUCT`)을 만든다. 발급 방식은 코드 입력(`CODE`)과 셀러 지급(`MANUAL`)이다. 정률 할인은 10원 단위로 내리고 최대 할인액을 둘 수 있다. 쿠폰끼리는 주문상품 한 줄에 상품 쿠폰 1장, 주문에 주문 쿠폰 1장까지 함께 쓴다. 발급·사용이 시작되면 혜택·조건·대상·사용 시작일은 바꿀 수 없다. 배송비 쿠폰·첫 구매 조건은 아직 받지 않는다(400 `COUPON_FEATURE_UNAVAILABLE`).

POST
/v1/coupons

주문 쿠폰(ORDER)·상품 쿠폰(PRODUCT)을 만든다. 발급 방식은 코드 입력(CODE)과 셀러 지급(MANUAL)이다. 정률 할인은 10원 단위로 내리고 최대 할인액을 둘 수 있다. 쿠폰끼리는 주문상품 한 줄에 상품 쿠폰 1장, 주문에 주문 쿠폰 1장까지 함께 쓴다. 발급·사용이 시작되면 혜택·조건·대상·사용 시작일은 바꿀 수 없다. 배송비 쿠폰·첫 구매 조건은 아직 받지 않는다(400 COUPON_FEATURE_UNAVAILABLE).

Authorization

accessToken
headerAuthorizationBearer <token>

Sayren 계정 토큰(로그인 토큰 또는 개인 액세스 토큰, RFC 9068 JWT)

Header Parameters

X-Store-Id*string

대상 상점 id. 토큰의 상점 범위 밖이면 403 STORE_NOT_GRANTED, 없으면 400 STORE_ID_REQUIRED다

idempotency-key?string

멱등키. 같은 키로 다시 보내면 처음 결과를 돌려주고 한 번만 적용한다. 재시도에는 같은 키를 쓴다

Lengthlength <= 255

Request Body

application/json
  1. body
name*string

구매자에게 보이는 쿠폰 이름. 1~60자

Length1 <= length <= 60
description?|

구매자에게 보이는 설명. 300자까지

Lengthlength <= 300
kind*string

쿠폰 종류. ORDER=주문 쿠폰(대상 상품 합계에서 할인), PRODUCT=상품 쿠폰(주문상품 한 줄에서 할인), DELIVERY=배송비 쿠폰(기본 배송비에서 할인, 지역 추가 배송비 제외)

Value in"ORDER""PRODUCT""DELIVERY"
benefit*
conditions?

사용 조건. 생략한 항목은 기본값(최소 금액 0, 회원 전용, 즉시할인과 중복 가능)

target?

대상 상품·카테고리. 생략하면 전 상품

issueMethod*string

발급 방식. CODE=구매자가 주문서에 코드를 입력한다, MANUAL=셀러가 회원을 골라 지급한다, DOWNLOAD=구매자가 스토어프론트에서 받는다, SIGNUP=회원가입 때 자동으로 지급한다

Value in"CODE""MANUAL""DOWNLOAD""SIGNUP"
code?string

쿠폰 코드 — 발급 방식이 CODE일 때 필수. 영문·숫자·-·_ 6~30자, 대소문자 구분 없음(대문자로 저장). 상점 안에서 유일하다

Match^[A-Za-z0-9_-]{6,30}$
startsAt?|

사용 시작 시각(ISO 8601, 시간대 포함). 생략하면 바로 쓸 수 있다

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Formatdate-time
endsAt?|

사용 종료 시각(ISO 8601, 시간대 포함). 이 시각부터 못 쓴다. 생략하면 제한이 없다. 이미 지급한 쿠폰의 유효 기간은 지급 때 정해지므로 뒤에 종료일을 늦춰도 늘어나지 않는다

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Formatdate-time
validDaysAfterIssue?|

발급 후 유효 일수 — 발급형(MANUAL·DOWNLOAD·SIGNUP) 쿠폰만. 쿠폰 종료일과 둘 중 먼저 끝나는 쪽이 적용된다

Range1 <= value <= 3650
totalIssueLimit?|

총 발급 수 한도. 생략하면 무제한. 다운로드·회원가입 쿠폰은 한도에 닿으면 더 발급하지 않는다

Range1 <= value <= 10000000
totalUseLimit?|

총 사용 수 한도. 결제 중인 예약도 센다. 생략하면 무제한

Range1 <= value <= 10000000
perMemberIssueLimit?|

1인 발급 수 한도(셀러 지급·다운로드). 생략하면 1인 1장. 회원가입 쿠폰은 1장 고정이라 1만 받는다

Range1 <= value <= 10000000
perMemberUseLimit?|

1인 사용 수 한도(코드 입력형). 생략하면 무제한. 비회원에게 여는 쿠폰은 둘 수 없다

Range1 <= value <= 10000000

Response Body

성공

application/json
  1. response
meta*
data*
error*|null
curl -X POST 'https://api.sayren.io/v1/coupons' \  -H 'X-Store-Id: string' \  -H 'Content-Type: application/json' \  -d '{  "name": "string",  "kind": "ORDER",  "benefit": {    "type": "RATE",    "value": 1,    "maxDiscountAmount": 1  },  "issueMethod": "CODE"}'
{  "meta": {    "status": 201,    "code": "OK",    "message": "OK",    "isSuccess": true  },  "data": {    "couponId": "string",    "name": "string",    "description": "string",    "kind": "ORDER",    "benefit": {      "type": "RATE",      "value": 1,      "maxDiscountAmount": 1    },    "conditions": {      "minOrderAmount": 0,      "firstOrderOnly": true,      "memberOnly": true,      "stackWithInstantDiscount": true    },    "target": {      "includeProductIds": [        "string"      ],      "includeCategoryIds": [        "string"      ],      "excludeProductIds": [        "string"      ],      "excludeCategoryIds": [        "string"      ]    },    "issueMethod": "string",    "code": "string",    "startsAt": "string",    "endsAt": "string",    "validDaysAfterIssue": 0,    "totalIssueLimit": 0,    "totalUseLimit": 0,    "perMemberIssueLimit": 0,    "perMemberUseLimit": 0,    "issuedCount": 0,    "reservedCount": 0,    "usedCount": 0,    "status": "ACTIVE",    "locked": true,    "lockedAt": "string",    "createdAt": "string",    "updatedAt": "string"  },  "error": null}