인증, 오류 처리, Webhook 및 주요 워크플로를 이해하고 안정적인 Giftpack 연동을 구축하세요.
Giftpack API를 사용하면 리워드, 인센티브, 굿즈, 수신자 선택 워크플로를 백엔드에서 생성하고 운영할 수 있습니다. 비즈니스 트리거와 고객 데이터는 고객사의 시스템에서 관리하고, 카탈로그 가용성, 수신자 경험, 풀필먼트, 배송 상태 업데이트는 Giftpack이 처리합니다.
프로덕션 환경의 기본 URL은 다음과 같습니다.
https://developer.giftpack.ai
전체 요청 및 응답 스키마는 API Reference에서 확인하세요. 이 가이드에서는 적합한 리소스 패밀리를 선택하는 방법과 생성 후 각 리소스의 상태가 어떻게 전환되는지 설명합니다.
| 목적 | 주요 리소스 | 라이프사이클 이벤트 |
|---|---|---|
| Smart Gifting, 예약 리워드 또는 자동 포상 | Campaign 및 Giftee | giftee.* |
| Gift Mall 또는 Merchandise Catalog에서 직접 주문 | Marketplace Order 및 Marketplace Order Receiver | marketplace_order_receiver.* |
| 회원의 리워드 잔액 관리 | Point Recipient 및 Point History | 포인트 사용 후 생성되는 Marketplace Order 추적 |
Smart Gifting에서는 Campaign이 프로그램 컨테이너 역할을 하고, Giftee가 수신자별 라이프사이클을 나타냅니다.
Campaign -> Giftee -> Redemption -> Fulfillment -> Delivery
카탈로그 직접 주문에서는 Marketplace Order가 주문 컨테이너 역할을 하고, Marketplace Order Receiver가 수신자별 라이프사이클을 나타냅니다.
Marketplace Order -> Receiver -> Claim or Selection -> Fulfillment -> Delivery
giftee와 marketplace_order_receiver를 서로 바꿔 사용할 수 있는 개념으로 취급하지 마세요. 풀필먼트 상태가 비슷해 보이더라도 이벤트 이름은 서로 다른 주문 패밀리를 식별합니다.
생성 및 업데이트 요청은 현재 리소스 상태를 반환합니다. 수신자의 작업, 풀필먼트, 발송, 배송은 이후에도 비동기로 진행됩니다.
안정적인 연동을 위해 다음 사항을 준수하세요.
id를 중복 제거 키로 사용합니다.Giftpack에서 API 키를 생성한 후 Webhook 이벤트 카탈로그를 조회하여 접근 권한을 확인하세요.
curl https://developer.giftpack.ai/v1/webhookeventtypes \
--header 'Accept: application/json' \
--header 'X-API-KEY: YOUR_API_KEY'
응답에는 현재 API가 지원하는 Webhook 이벤트 타입이 나열됩니다. 하드코딩된 클라이언트 목록이 아니라 이 엔드포인트가 공식 이벤트 카탈로그입니다.

이 정의 섹션은 Giftpack API 통합에서 사용하는 핵심 도메인 객체를 설명합니다. 워크플로를 구축하기 전에 객체 간 관계를 이해하는 것이 중요합니다. Giftpack은 세 가지 주요 레이어로 동작합니다:
참여 레이어 (Engagement Layer)커머스 레이어 (Commerce Layer)공급 및 운영 레이어 (Supply & Operations Layer)이 레이어는 발신자와 수신자 간의 관계 라이프사이클을 모델링합니다. 이벤트 기반(event-driven)이며 비동기 흐름이 많습니다.
선물 또는 리워드를 받을 수 있는 실제 개인(직원, 고객, 파트너)입니다. API 관점에서 Recipient는 Giftpack 워크스페이스 내의 영속적 식별자입니다. Recipient는 캠페인과 독립적으로 존재할 수 있으며 시간에 따라 여러 캠페인에 참여할 수 있습니다.
타기팅 및 대량 할당에 사용하는 논리적 수신자 묶음입니다. 그룹은 조직 구조 개념이며 트랜잭션을 의미하지 않습니다.
Campaign은 단일 참여 의도(engagement intent)를 나타냅니다.
정의 항목:
Campaign은 주문(order)이 아닙니다. Campaign은 redemption/fulfillment 이벤트가 진행되는 라이프사이클 컨테이너입니다.
Recipient가 Campaign에 연결되면 Giftee가 됩니다. Giftee는 특정 캠페인에서의 참여 상태를 나타냅니다. 이 구분은 중요합니다:
Recipient = 식별(Identity)Giftee = 캠페인 바운드 상태캠페인의 표현 레이어를 정의하며 다음을 포함합니다:
템플릿은 커뮤니케이션에 영향을 주며 fulfillment 로직에는 영향을 주지 않습니다.
수신자가 선물을 클레임하는 액션을 의미합니다. 다음 방식으로 발생할 수 있습니다:
Redemption은 상태를 “invited”에서 “claimed”로 전환합니다.
Giftee가 선물을 클레임할 수 있는 고유 URL입니다.
Campaign Template을 사용해 redemption 링크를 전달하는 이메일입니다.
이 레이어는 트랜잭션 및 fulfillment 관련 작업을 처리합니다. Campaign 워크플로와 독립적으로 동작할 수 있습니다.
발신자가 직접 선택하는 고정형 큐레이션 상품입니다. 주문 생성 직후 즉시 fulfilled 되는 경우가 일반적입니다.
하나 이상의 수신자를 대상으로 하는 직접 구매 트랜잭션입니다. 캠페인형 redemption을 건너뛰고 fulfillment로 바로 진행될 수 있습니다. Marketplace Order ≠ Campaign.
Marketplace Order의 fulfillment 대상자로 지정된 수신자입니다.
Giftpack의 재고/창고 시스템에서 관리되는 커스터마이즈 가능 상품입니다. 다음 작업이 필요할 수 있습니다:
Marketplace 또는 Swag 카탈로그 내 판매 가능한 컨테이너 객체입니다.
상품의 구매 가능한 구체 구성입니다. 예:
트랜잭션은 항상 Product Variant 단위로 발생합니다.
이 레이어는 fulfillment 및 vendor 관리를 담당합니다. 대부분의 통합에서는 추상화되지만 상태 전환 이해를 위해 중요합니다.
다음을 담당하는 운영 레이어:
Giftpack 생태계에 상품을 공급하는 vendor입니다.
카탈로그 품질, 온보딩, 운영 통제를 위해 Procurement Office의 감독을 받는 Provider입니다.
API 작업에서 Provider를 참조하기 위한 고유 식별자입니다.
아래 구조는 엔티티 간 관계를 보여줍니다:
Recipient
└─ may belong to Recipient Group
└─ becomes Giftee when attached to Campaign
Campaign (Engagement Container)
├─ defines Redemption rules
├─ manages Giftee states
└─ may generate Fulfillment Orders
Commerce Layer
├─ Marketplace Order (direct transaction)
└─ Swag Order (inventory-based transaction)
Redemption
├─ Link-based
├─ Email-based
└─ Transitions state before fulfillment
Giftpack의 주요 /v1 작업은 워크스페이스 범위 API 키를 X-API-KEY 헤더에 담아 사용합니다. API 키는 신뢰할 수 있는 서버 측 애플리케이션에서만 사용해야 합니다.
API 키는 Developer Settings에서 관리할 수 있습니다. 워크스페이스와 현재 사용자에게 Giftpack Open API 기능 접근 권한 및 필요한 개발자 설정 권한이 있어야 합니다.
Developer 페이지를 사용할 수 없다면 연동 개발을 시작하기 전에 워크스페이스 관리자에게 워크스페이스 요금제와 본인의 역할을 확인하세요.
API 키를 브라우저 JavaScript, 모바일 애플리케이션, 로그, 스크린샷, 지원 티켓 또는 버전 관리 시스템에 포함하지 마세요.
스테이징과 프로덕션에는 서로 다른 인증 정보를 사용하세요. 키가 노출되었을 가능성이 있다면 즉시 폐기하세요.
curl https://developer.giftpack.ai/v1/webhookeventtypes \
--header 'Accept: application/json' \
--header 'X-API-KEY: YOUR_API_KEY'
API 키는 워크스페이스를 식별합니다. 리소스 권한은 서버 측에서 적용되므로 다른 워크스페이스의 ID를 알아도 해당 리소스에 접근할 수 없습니다.
https://developer.giftpack.ai로 전송합니다.API Reference의 일부 커넥터 작업은 Bearer Token 또는 공급자별 인증을 사용합니다. 각 작업에 표시된 보안 스키마를 따르고, Giftpack API 키로 커넥터 엔드포인트를 호출할 수 있다고 가정하지 마세요.
X-API-KEY를 마스킹합니다.공개 API 계약은 모든 작업에 공통으로 적용되는 속도 제한이나 단일 재시도 정책을 보장하지 않습니다. 제공되는 경우 엔드포인트별 헤더와 API Reference를 확인하고, 대량의 버스트 요청을 계획하기 전에 Giftpack에 문의하세요.
Giftpack 작업은 표준 HTTP 상태 코드를 사용합니다. API Reference에 문서화된 오류 응답의 미디어 타입은 application/problem+json입니다.
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Property email is required but is missing.",
"instance": "https://developer.giftpack.ai/errors/example",
"errors": [
{
"location": "body.email",
"message": "The email field is required.",
"value": null
}
]
}
type: 문제 유형을 식별하는 URI입니다. about:blank일 수 있습니다.title: 사람이 읽을 수 있는 일관된 문제 요약입니다.status: 이 응답에 해당하는 HTTP 상태입니다.detail: 이번에 발생한 구체적인 실패에 대한 설명입니다.instance: 제공되는 경우 이번 오류 발생을 식별하는 URI입니다.errors: location, message, value를 포함하는 선택적 필드 단위 세부 정보입니다.모든 오류에 모든 필드가 포함된다고 보장할 수 없습니다. 선택적 필드가 생략되거나 향후 알 수 없는 필드가 추가되어도 처리할 수 있도록 파서를 구현하세요.
| 상태 | 의미 | 권장 조치 |
|---|---|---|
2xx | HTTP 작업 성공 | 반환된 ID를 저장하고 이후 라이프사이클 변경은 Webhook으로 추적 |
400 | 잘못된 요청 또는 검증 실패 | 요청을 수정한 후 다시 시도 |
401 | 인증 정보가 없거나 유효하지 않음 | 서버 측 API 키와 환경을 확인 |
403 | 인증되었지만 권한이 없음 | 워크스페이스 소유 관계, 요금제 접근 권한, 사용자 권한을 확인 |
404 | 리소스 또는 경로를 찾을 수 없음 | 엔드포인트와 리소스 ID를 확인 |
409 | 요청이 현재 상태와 충돌 | 리소스를 다시 조회하고 작업이 여전히 유효한지 판단 |
5xx | Giftpack 또는 업스트림 서비스에서 요청을 완료하지 못함 | 현재 상태를 보존하고 작업을 안전하게 실행할 수 있을 때만 재시도 |
각 작업에 문서화된 응답은 API Reference가 공식 기준입니다.
GET 요청은 일반적으로 상한을 둔 지수 백오프로 재시도할 수 있습니다. 상태 변경 요청은 더 신중하게 처리해야 합니다.
전송 타임아웃은 클라이언트가 응답을 받지 못했다는 뜻일 뿐, 서버가 요청을 완료하지 않았음을 증명하지는 않습니다.
문제를 에스컬레이션할 때는 엔드포인트, 메서드, UTC 타임스탬프, HTTP 상태, 관련 리소스 ID, 민감 정보를 마스킹한 Problem 응답을 제공하세요. API 키나 마스킹되지 않은 수신자 데이터는 절대 포함하지 마세요.
Webhook은 API 요청이 반환된 후 발생하는 수신자 및 풀필먼트 상태 전환을 알립니다. Webhook을 주요 라이프사이클 신호로 사용하고, 상태 대조에는 GET 작업을 사용하세요.
이전 목록을 하드코딩하지 말고 현재 카탈로그를 조회하세요.
curl https://developer.giftpack.ai/v1/webhookeventtypes \
--header 'Accept: application/json' \
--header 'X-API-KEY: YOUR_API_KEY'
현재 카탈로그에는 두 개의 리소스 패밀리가 있습니다.
giftee
연동을 통해 시작된 Campaign, 예약 프로그램, 자동 리워드 워크플로를 포함한 Smart Gifting 주문의 수신자 라이프사이클 이벤트입니다.
giftee.createdgiftee.launchedgiftee.preparinggiftee.shippedgiftee.deliveredgiftee.failedgiftee.returnedgiftee.reviewedgiftee.cancelgiftee.resumegiftee.deletemarketplace_order_receiver
Smart Gifting Campaign 워크플로 외부에서 Gift Mall 또는 Merchandise Catalog를 통해 직접 주문한 건의 수신자 라이프사이클 이벤트입니다.
marketplace_order_receiver.createdmarketplace_order_receiver.launchedmarketplace_order_receiver.shippedmarketplace_order_receiver.deliveredmarketplace_order_receiver.failedmarketplace_order_receiver.returnedmarketplace_order_receiver.reviewedmarketplace_order_receiver.delete각 전달 항목은 JSON 객체입니다. data는 구조화된 리소스 스냅샷이며 이스케이프된 JSON 문자열이 아닙니다.
{
"id": "123e4567-e89b-12d3-a456-426655440000",
"type": "giftee.shipped",
"data": {
"id": "23e4567-e89b-12d3-a456-426655440000",
"type": "giftee",
"email": "recipient@example.com",
"status": 12,
"delivery_status": 2,
"budget": 100,
"campaign": {
"id": "323e4567-e89b-12d3-a456-426655440000"
},
"recipient": {
"id": "423e4567-e89b-12d3-a456-426655440000"
},
"delivery_tracking_code": "TRACKING-CODE"
},
"created_at": "2026-09-01 15:23:33"
}
id는 영구적인 이벤트 발생 ID이며 중복 제거 키로 사용해야 합니다.type은 리소스 패밀리와 상태 전환을 식별합니다.data는 이벤트 발생 시점의 리소스 상태를 담습니다. 필드는 리소스 패밀리와 라이프사이클 단계에 따라 달라집니다.created_at은 이벤트 발생 시각입니다. 전달 순서가 뒤바뀔 수 있으므로 상태 전환의 순서를 정할 때 이 값을 사용하세요.Giftpack은 원본 요청 본문의 HMAC-SHA256 다이제스트를 소문자 16진수 문자열로 계산하여 X-Giftpack-Signature에 담아 전송합니다.
const crypto = require('crypto');
function verifyGiftpackWebhook(rawBody, signature, secret) {
if (!signature) return false;
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const actualBuffer = Buffer.from(signature, 'utf8');
const expectedBuffer = Buffer.from(expected, 'utf8');
return (
actualBuffer.length === expectedBuffer.length &&
crypto.timingSafeEqual(actualBuffer, expectedBuffer)
);
}
페이로드를 파싱하거나 처리하기 전에 서명을 검증하세요. Webhook 시크릿은 서버 측 시크릿 저장소에 보관합니다.
POST를 전송합니다.2xx 응답은 전달 성공으로 처리됩니다.id를 기준으로 멱등하게 처리하세요.이벤트를 검증하고 영구적으로 수락한 후 신속하게 2xx를 반환하세요. 처리 비용이 큰 작업은 큐로 넘깁니다.
Webhook 이벤트 및 요청 로그는 다음 숫자 상태를 사용합니다.
-1: 실패0: 처리 중1: 성공이벤트 상세 응답에는 문제 해결을 위한 구조화된 webhook_event_data, 시도 횟수, 개별 요청 레코드가 포함됩니다.
X-Giftpack-Signature를 검증합니다.id로 중복을 제거합니다.created_at을 저장하고 이벤트가 순서 없이 도착해도 처리할 수 있도록 합니다.2xx를 반환합니다.수신자가 리워드를 받는 방식에 맞는 리소스 패밀리를 선택하세요. 모든 필수 필드와 응답 모델은 API Reference가 공식 기준입니다.
연동, 예약 프로그램 또는 자동화를 통해 Campaign 기반 수신자 경험을 생성할 때 이 워크플로를 사용하세요.
POST /v1/campaigns로 Campaign을 생성하거나 선택합니다.POST /v1/giftees로 각 수신자를 추가합니다.POST /v1/giftees/{gifteeId}/redemptionlink로 수신자 링크를 생성합니다.giftee.* Webhook 이벤트로 수신자 라이프사이클을 추적합니다.이후 작업에는 반환된 Giftee ID를 사용하세요. Redemption URL을 직접 조합하지 마세요.
먼저 giftee.created, giftee.launched, giftee.preparing, giftee.shipped, giftee.delivered, giftee.failed, giftee.returned를 구독합니다. 연동에 해당 상태 전환이 필요한 경우 취소, 재개, 삭제, 리뷰 이벤트를 추가하세요.
Smart Gifting Campaign이 아니라 Gift Mall 또는 Merchandise Catalog에서 직접 주문하는 경우 Marketplace Order를 사용하세요.
curl https://developer.giftpack.ai/v1/marketplaceorders \
--request POST \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY' \
--data '{
"marketplace_order_name": "September employee rewards",
"marketplace_order_start_date": "2026-09-01",
"marketplace_order_end_date": "2026-09-30",
"marketplace_order_type": "Normal",
"submit": false,
"receivers": [
{
"member_id": "9a1232aa-238f-421c-82e7-45693d1b25b4",
"country": "US",
"gift_message": "Thank you for your contribution.",
"email_notification": true,
"sms_notification": false,
"marketplace_feature": false,
"donation_feature": false,
"products": [
{
"marketplace_product_id": "961be65a-88d8-4040-8808-843ccf5da624",
"marketplace_product_variant_id": "961be65a-a96a-412d-b22a-325f07d85647",
"product_quantity": 1
}
]
}
]
}'
애플리케이션에서 주문을 검토하거나 업데이트해야 한다면 초안으로 생성하세요. 준비가 완료되면 POST /v1/marketplaceorders/{marketplaceOrderId}/submit으로 제출합니다.
각 수신자는 marketplace_order_receiver.* 이벤트로 추적합니다. Receiver는 Campaign이 아닌 Marketplace Order에 속하므로 이 이벤트는 giftee.*와 별개의 이벤트 패밀리입니다.
회원이 리워드 잔액을 보유하고 나중에 사용하도록 하려면 포인트를 사용하세요.
POST /v1/pointrecipients/{memberId}/enablepointfeature로 포인트 기능을 활성화합니다.PATCH /v1/pointrecipients/{memberId}/points로 잔액을 업데이트합니다.잔액 업데이트에는 credits와 points가 모두 필요합니다.
curl https://developer.giftpack.ai/v1/pointrecipients/MEMBER_ID/points \
--request PATCH \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY' \
--data '{
"credits": 1,
"points": 100,
"expired_at": "2027-09-01",
"notes": "Annual recognition allocation"
}'
비즈니스 로직이 주로 포인트로 표현되더라도 credits를 생략하지 마세요. 타임아웃 후 잔액 업데이트를 다시 실행하기 전에 반환된 Point Recipient와 Point History를 확인하세요.