deliveryapi 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -546,39 +546,6 @@ var HistoriesResource = class {
546
546
  this.auth
547
547
  );
548
548
  }
549
- /**
550
- * 대량 등록 이력을 삭제(취소)합니다.
551
- *
552
- * `courierDeliveryIds`를 지정하면 부분 취소, 생략하면 전체 취소(soft delete)입니다.
553
- * 택배사 API를 호출하여 실제 접수도 취소합니다.
554
- *
555
- * @param historyId - 이력 ID
556
- * @param params - 삭제 파라미터 (courierAccountKey 필수)
557
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정
558
- *
559
- * @example
560
- * // 전체 취소
561
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
562
- * courierAccountKey: 'your-key',
563
- * })
564
- *
565
- * // 부분 취소
566
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
567
- * courierAccountKey: 'your-key',
568
- * courierDeliveryIds: ['7705241632'],
569
- * })
570
- */
571
- async delete(historyId, params) {
572
- await request(
573
- `/v1/courier/deliveries/bulk-upload-histories/${historyId}`,
574
- {
575
- method: "DELETE",
576
- params: { courierAccountKey: params.courierAccountKey },
577
- body: params.courierDeliveryIds ? { courierDeliveryIds: params.courierDeliveryIds } : void 0
578
- },
579
- this.auth
580
- );
581
- }
582
549
  };
583
550
 
584
551
  // src/resources/deliveries.ts
@@ -679,19 +646,33 @@ var DeliveriesResource = class {
679
646
  );
680
647
  }
681
648
  /**
682
- * 등록된 배송을 취소합니다.
649
+ * 배송을 취소합니다. 3가지 사용 방식을 지원합니다.
683
650
  *
684
- * **주의**: 등록 7일 이내의 배송만 취소 가능합니다.
685
- * 7일 이상 경과한 배송은 택배사에서 조회되지 않아 취소할 수 없습니다.
686
- * 지원하지 않는 택배사의 경우 에러가 반환됩니다.
651
+ * 1. **historyId만**: 해당 이력의 전체 배송 취소 + 이력 soft delete
652
+ * 2. **historyId + courierDeliveryIds**: 이력 부분 취소
653
+ * 3. **courierDeliveryIds만**: 택배사 직접 취소 (이력 무관, 최근 7일 이내)
687
654
  *
688
- * 이력 단위 취소가 필요하면 `client.courier.deliveries.histories.delete()`를 사용하세요.
655
+ * `historyId`와 `courierDeliveryIds` 하나는 반드시 필요합니다.
689
656
  *
690
- * @param params - 취소 파라미터 (courierDeliveryId 목록)
691
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정
657
+ * @param params - 취소 파라미터
658
+ * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 이력
692
659
  * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음
693
660
  *
694
661
  * @example
662
+ * // 이력 전체 취소
663
+ * await client.courier.deliveries.cancel({
664
+ * courierAccountKey: 'your-key',
665
+ * historyId: '202603221456_a1b2c',
666
+ * })
667
+ *
668
+ * // 이력 내 부분 취소
669
+ * await client.courier.deliveries.cancel({
670
+ * courierAccountKey: 'your-key',
671
+ * historyId: '202603221456_a1b2c',
672
+ * courierDeliveryIds: ['7705241632'],
673
+ * })
674
+ *
675
+ * // 직접 취소 (이력 없이)
695
676
  * await client.courier.deliveries.cancel({
696
677
  * courierAccountKey: 'your-key',
697
678
  * courierDeliveryIds: ['7705241632', '7705241633'],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../shared-types/src/courier/CourierDeliveryStatus.ts","../src/index.ts","../src/http.ts","../src/resources/tracking.ts","../src/resources/endpoints.ts","../src/resources/subscriptions.ts","../src/resources/webhooks.ts","../src/resources/accounts.ts","../src/resources/histories.ts","../src/resources/deliveries.ts","../src/resources/print.ts","../src/resources/courier.ts","../src/client.ts","../src/types.ts"],"sourcesContent":["/**\n * 택배 배송 상태 코드\n *\n * 모든 택배사의 상태를 하나의 통합 코드로 정규화합니다.\n */\nexport enum CourierDeliveryStatus {\n // 접수/준비 단계\n PENDING = 'PENDING', // 접수 대기\n REGISTERED = 'REGISTERED', // 접수 완료\n PICKUP_READY = 'PICKUP_READY', // 집하 준비\n\n // 배송 진행 단계\n PICKED_UP = 'PICKED_UP', // 집하 완료\n IN_TRANSIT = 'IN_TRANSIT', // 배송 중\n OUT_FOR_DELIVERY = 'OUT_FOR_DELIVERY', // 배송 출발\n\n // 완료 단계\n DELIVERED = 'DELIVERED', // 배송 완료\n\n // 예외 상태\n FAILED = 'FAILED', // 배송 실패\n RETURNED = 'RETURNED', // 반송\n CANCELLED = 'CANCELLED', // 취소\n HOLD = 'HOLD', // 보류\n UNKNOWN = 'UNKNOWN', // 알 수 없음\n}","// ─────────────────────────────────────────────────────────────────────────────\n// deliveryapi — DeliveryAPI SDK v1.10.0\n//\n// 사용 예시:\n// import { DeliveryAPIClient } from 'deliveryapi'\n//\n// const client = new DeliveryAPIClient({ apiKey: '...', secretKey: '...' })\n// const result = await client.tracking.trace({ items: [...] })\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Client\nexport { DeliveryAPIClient } from './client'\nexport type { DeliveryAPIClientOptions } from './client'\n\n// Error\nexport { ApiError } from './http'\n\n// Enums\nexport { CourierDeliveryStatus } from './types'\n\n// Types — Tracking\nexport type {\n CourierInfo,\n GetCouriersResponse,\n TraceItem,\n TraceParams,\n TraceResult,\n TraceItemError,\n TraceCacheInfo,\n TraceResponse,\n TrackingProgress,\n UnifiedTrackingResponse,\n TrackingErrorCode,\n} from './types'\n\n// Types — Webhooks (Endpoints)\nexport type {\n CreateEndpointParams,\n CreateEndpointResponse,\n EndpointInfo,\n ListEndpointsResponse,\n UpdateEndpointParams,\n RotateSecretParams,\n RotateSecretResponse,\n} from './types'\n\n// Types — Webhooks (Subscriptions)\nexport type {\n RegisterItem,\n RegisterResponse,\n SubscriptionSummary,\n SubscriptionListItem,\n ListSubscriptionsParams,\n ListSubscriptionsResponse,\n SubscriptionItem,\n SubscriptionDetail,\n BatchResultItem,\n BatchResultsParams,\n BatchResultEntry,\n BatchResultsResponse,\n} from './types'\n\n// Types — Webhook Payload\nexport type {\n WebhookPayload,\n WebhookTrackingItem,\n ApiErrorCode,\n} from './types'\n\n// Types — Courier Account Service\nexport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n BulkUploadItemParams,\n BulkUploadParams,\n BulkUploadResponse,\n BulkUploadResultItem,\n BulkUploadHistoryInfo,\n BulkUploadHistoryItemInfo,\n BulkUploadStatus,\n DeliveryStatusFilter,\n InquiryParams,\n AccountInquiryResponse,\n AccountInquiryItem,\n DashboardParams,\n DashboardStatsResponse,\n DashboardSummary,\n DashboardStatsItem,\n CancelDeliveriesParams,\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n DeleteHistoryParams,\n CreatePrintSessionParams,\n PrintSessionResponse,\n} from './types'\n\n// Resource Classes (for advanced usage / type narrowing)\nexport { CourierResource } from './resources/courier'\nexport { AccountsResource } from './resources/accounts'\nexport { DeliveriesResource } from './resources/deliveries'\nexport { HistoriesResource } from './resources/histories'\nexport { PrintResource } from './resources/print'\n","import type { ApiErrorCode } from './types'\n\nexport const BASE_URL = 'https://api.deliveryapi.co.kr'\n\n/** 서버가 반환하는 공통 응답 포맷 (SDK 내부 파싱용) */\ninterface ApiResponse<T = unknown> {\n isSuccess: boolean\n data?: T\n errorCode?: ApiErrorCode\n error?: string\n message?: string\n}\n\n/**\n * API 호출 실패 시 throw 되는 에러 클래스\n *\n * @example\n * try {\n * await client.tracking.trace({ items: [...] })\n * } catch (err) {\n * if (err instanceof ApiError) {\n * console.error(err.code) // 'RATE_LIMITED'\n * console.error(err.status) // 429\n * console.error(err.message) // '요청 횟수가 플랜 한도를 초과했습니다'\n * }\n * }\n */\nexport class ApiError extends Error {\n /**\n * 기계가 읽는 에러 코드\n *\n * 이 값을 기준으로 분기 처리하세요.\n */\n readonly code: ApiErrorCode | string\n /** HTTP 상태 코드 */\n readonly status: number\n /**\n * 에러 상세 데이터 (에러 종류에 따라 포함될 수 있음)\n *\n * 예) `INVALID_ITEMS` 에러 시 잘못된 항목 목록:\n * `[{ courierCode, trackingNumber, errorCode }]`\n */\n readonly data?: unknown\n\n constructor(code: ApiErrorCode | string, message: string, status: number, data?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.code = code\n this.status = status\n this.data = data\n }\n}\n\n/** API Key 인증 정보 */\nexport interface AuthCredentials {\n apiKey: string\n secretKey: string\n}\n\n/** 내부 HTTP 요청 함수 */\nexport async function request<T>(\n path: string,\n options: { method?: string; body?: unknown; params?: Record<string, string | number | boolean | undefined> },\n auth: AuthCredentials,\n): Promise<T> {\n let url = `${BASE_URL}${path}`\n\n if (options.params) {\n const qs = Object.entries(options.params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&')\n if (qs) url += `?${qs}`\n }\n\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${auth.apiKey}:${auth.secretKey}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n })\n\n const json = (await res.json()) as ApiResponse<T>\n\n if (!json.isSuccess) {\n throw new ApiError(\n json.errorCode ?? 'INTERNAL_ERROR',\n json.error ?? json.message ?? `HTTP ${res.status}`,\n res.status,\n json.data,\n )\n }\n\n return json.data as T\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { GetCouriersResponse, TraceResponse } from '../types'\n\nexport class TrackingResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 지원 택배사 목록을 조회합니다.\n *\n * 택배사 코드(`trackingApiCode`)는 `trace()`의 `courierCode` 파라미터에 사용합니다.\n *\n * @example\n * const { couriers } = await client.tracking.getCouriers()\n * // couriers: [{ trackingApiCode: 'cj', displayName: 'CJ대한통운' }, ...]\n */\n async getCouriers(): Promise<GetCouriersResponse> {\n return request<GetCouriersResponse>(\n '/v1/tracking/couriers',\n {},\n this.auth,\n )\n }\n\n /**\n * 송장번호로 배송 정보를 조회합니다.\n *\n * - 여러 건을 배열로 전달할 수 있습니다.\n * - 결과는 요청 순서와 동일한 인덱스로 반환됩니다.\n * - 일부 아이템이 실패해도 전체 요청이 실패하지 않습니다. `results[].success`로 건별 확인하세요.\n *\n * **과금 안내**: `NOT_FOUND` 에러는 과금됩니다. `results[].error.billable`로 확인하세요.\n *\n * @throws {ApiError} API 인증 실패, 요청 한도 초과 등 전체 요청 실패 시\n *\n * @example\n * const { results } = await client.tracking.trace({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' },\n * { courierCode: 'lotte', trackingNumber: '9876543210', clientId: 'order_002' },\n * ],\n * })\n *\n * for (const result of results) {\n * if (result.success) {\n * console.log(result.data?.deliveryStatus) // 'DELIVERED'\n * } else {\n * console.warn(result.error?.code) // 'NOT_FOUND'\n * }\n * }\n */\n async trace(params: {\n items: { courierCode: string; trackingNumber: string; clientId?: string }[]\n includeProgresses?: boolean\n }): Promise<TraceResponse> {\n return request<TraceResponse>(\n '/v1/tracking/trace',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n CreateEndpointResponse,\n ListEndpointsResponse,\n RotateSecretResponse,\n} from '../types'\n\nexport class EndpointsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 웹훅 엔드포인트를 등록합니다.\n *\n * 등록 시 서버에서 해당 URL로 테스트 POST 요청을 전송하여 연결 가능 여부를 검증합니다.\n * 응답의 `webhookSecret`은 **이 응답에서만 평문으로 반환**됩니다.\n * 분실 시 `rotateSecret()`으로 재발급해야 합니다.\n *\n * @throws {ApiError} `WEBHOOK_ENDPOINT_LIMIT` — 엔드포인트 등록 한도 초과\n * @throws {ApiError} `WEBHOOK_ENDPOINT_UNREACHABLE` — URL 검증 실패 (서버에서 테스트 POST 전송 시 200 응답 없음)\n *\n * @example\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * console.log(endpoint.endpointId) // 'ep_xxxx'\n * console.log(endpoint.webhookSecret) // 반드시 저장하세요!\n */\n async create(params: {\n /** 웹훅을 수신할 URL (`https://` 필수) */\n url: string\n /** 엔드포인트 이름 (관리용) */\n name: string\n /** 서명 시크릿 직접 지정 (미제공 시 서버 자동 생성, 최소 5자) */\n webhookSecret?: string\n }): Promise<CreateEndpointResponse> {\n return request<CreateEndpointResponse>(\n '/v1/webhooks/endpoints',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 웹훅 엔드포인트 목록을 조회합니다.\n *\n * @example\n * const { endpoints } = await client.webhooks.endpoints.list()\n * const active = endpoints.filter(ep => ep.status === 'active')\n * console.log(active[0].endpointId) // 'ep_xxxx'\n */\n async list(): Promise<ListEndpointsResponse> {\n return request<ListEndpointsResponse>(\n '/v1/webhooks/endpoints',\n {},\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트 이름을 수정합니다.\n *\n * URL은 변경할 수 없습니다. URL을 변경해야 한다면 삭제 후 재등록하세요.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.update('ep_xxxx', { name: '스테이징 서버' })\n */\n async update(endpointId: string, params: {\n /** 새 엔드포인트 이름 */\n name: string\n }): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'PUT', body: params },\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트를 삭제합니다.\n *\n * 해당 엔드포인트에 연결된 구독도 함께 삭제됩니다 (cascade).\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.delete('ep_xxxx')\n */\n async delete(endpointId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 웹훅 서명 시크릿을 재발급합니다.\n *\n * 기존 시크릿은 즉시 무효화됩니다.\n * 새 시크릿은 **이 응답에서만 평문으로 반환**됩니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * const { webhookSecret } = await client.webhooks.endpoints.rotateSecret('ep_xxxx')\n * console.log(webhookSecret) // 새 시크릿 — 반드시 저장하세요!\n */\n async rotateSecret(endpointId: string, params?: {\n /** 새 시크릿 직접 지정 (미제공 시 서버 자동 생성) */\n webhookSecret?: string\n }): Promise<RotateSecretResponse> {\n return request<RotateSecretResponse>(\n `/v1/webhooks/endpoints/${endpointId}/rotate`,\n { method: 'POST', body: params ?? {} },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BatchResultsResponse,\n ListSubscriptionsParams,\n ListSubscriptionsResponse,\n RegisterResponse,\n SubscriptionDetail,\n} from '../types'\n\nexport class SubscriptionsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배 추적 구독을 등록합니다.\n *\n * ## 구독형 (`recurring: true`)\n * 배송 완료 또는 최대 14일까지 주기적으로 폴링합니다.\n * - `endpointId` 있음: 상태가 변경될 때마다 웹훅(`tracking.polled`)을 발송하고, 배송 완료 또는 기간 만료 시 `tracking.completed` 웹훅을 발송 후 자동 종료\n * - `endpointId` 없음: 웹훅 없이 폴링만 수행. `get(requestId)`으로 현재 상태를 직접 조회\n *\n * ## 일회성 (`recurring: false`)\n * 등록 즉시 1회 크롤 후 종료합니다. 폴링을 반복하지 않습니다.\n * - `endpointId` 있음: 크롤 완료 시 웹훅 1회 발송\n * - `endpointId` 없음: 웹훅 없이 크롤만 수행. `get(requestId)`으로 결과를 직접 조회\n *\n * @example\n * // 구독형 — 배송 완료까지 상태 변경 시마다 웹훅 수신\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n * // sub.requestId로 구독 관리 (cancel, get)\n *\n * @example\n * // 일회성 — 웹훅 없이 즉시 크롤 후 결과 직접 조회\n * const req = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'lotte', trackingNumber: '9876543210' }],\n * recurring: false,\n * })\n * const detail = await client.webhooks.subscriptions.get(req.requestId)\n * console.log(detail.items[0].currentStatus) // 'DELIVERED'\n */\n async register(params:\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 반복 구독. 배송 완료 또는 14일까지 주기적으로 폴링. */\n recurring: true\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 상태 변경마다 웹훅 발송.\n * 생략 시 웹훅 없이 폴링만 수행하며 `get(requestId)`으로 결과를 직접 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 일회성. 등록 즉시 1회 크롤 후 종료. `endpointId` 없으면 `get(requestId)`으로 결과 조회. */\n recurring: false\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 크롤 완료 후 웹훅 1회 발송.\n * 생략 시 웹훅 없이 크롤만 수행하며 `get(requestId)`으로 결과를 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n ): Promise<RegisterResponse> {\n return request<RegisterResponse>(\n '/v1/webhooks/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 구독 목록을 조회합니다.\n *\n * 커서 기반 페이지네이션을 지원합니다.\n * 다음 페이지가 있으면 응답의 `nextCursor`를 다음 호출의 `cursor` 파라미터로 전달하세요.\n *\n * @example\n * let cursor: string | undefined\n * do {\n * const page = await client.webhooks.subscriptions.list({ cursor, limit: 50 })\n * for (const sub of page.subscriptions) {\n * console.log(sub.requestId, sub.isActive)\n * }\n * cursor = page.nextCursor\n * } while (cursor)\n */\n async list(params?: ListSubscriptionsParams): Promise<ListSubscriptionsResponse> {\n return request<ListSubscriptionsResponse>(\n '/v1/webhooks/subscriptions',\n { params: { cursor: params?.cursor, limit: params?.limit, status: params?.status, from: params?.from, to: params?.to } },\n this.auth,\n )\n }\n\n /**\n * 구독 상세 정보를 조회합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * const detail = await client.webhooks.subscriptions.get('req_xxxx')\n * for (const item of detail.items) {\n * console.log(item.trackingNumber, item.currentStatus)\n * }\n */\n async get(requestId: string): Promise<SubscriptionDetail> {\n return request<SubscriptionDetail>(\n `/v1/webhooks/subscriptions/${requestId}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 구독을 취소합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * await client.webhooks.subscriptions.cancel('req_xxxx')\n */\n async cancel(requestId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/subscriptions/${requestId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 여러 송장번호의 최신 배송 정보를 한 번에 조회합니다.\n *\n * 해당 계정에 등록된 구독 중 일치하는 아이템의 최신 상태를 반환합니다.\n *\n * @example\n * const { results } = await client.webhooks.subscriptions.batchResults({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1111111111' },\n * { courierCode: 'lotte', trackingNumber: '2222222222' },\n * ],\n * })\n * for (const r of results) {\n * console.log(r.currentStatus, r.isDelivered)\n * }\n */\n async batchResults(params: {\n items: { courierCode: string; trackingNumber: string }[]\n }): Promise<BatchResultsResponse> {\n return request<BatchResultsResponse>(\n '/v1/webhooks/results',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { EndpointsResource } from './endpoints'\nimport { SubscriptionsResource } from './subscriptions'\n\n/**\n * 웹훅 리소스\n *\n * - `endpoints` — 웹훅 수신 URL 등록/관리\n * - `subscriptions` — 택배 추적 구독 등록/관리\n *\n * @example\n * const client = new DeliveryAPIClient({ apiKey: '...', secretKey: '...' })\n *\n * // 1. 엔드포인트 등록\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * // ⚠️ endpoint.webhookSecret 을 안전하게 보관하세요!\n *\n * // 2. 택배 추적 구독\n * const sub = await client.webhooks.subscriptions.register({\n * endpointId: endpoint.endpointId,\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * })\n *\n * // 3. 구독 상태 조회\n * const detail = await client.webhooks.subscriptions.get(sub.requestId)\n */\nexport class WebhooksResource {\n /**\n * 웹훅 엔드포인트 관리\n *\n * - `create()` — 수신 URL 등록\n * - `list()` — 목록 조회\n * - `update()` — 이름 수정\n * - `delete()` — 삭제\n * - `rotateSecret()` — 서명 시크릿 재발급\n */\n readonly endpoints: EndpointsResource\n\n /**\n * 웹훅 구독 관리\n *\n * - `register()` — 택배 추적 구독 등록\n * - `list()` — 구독 목록\n * - `get()` — 구독 상세\n * - `cancel()` — 구독 취소\n * - `batchResults()` — 다건 최신 상태 조회\n */\n readonly subscriptions: SubscriptionsResource\n\n constructor(auth: AuthCredentials) {\n this.endpoints = new EndpointsResource(auth)\n this.subscriptions = new SubscriptionsResource(auth)\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n} from '../types'\n\nexport class AccountsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배사 계정을 등록합니다.\n *\n * 롯데택배, CJ대한통운 계정을 등록할 수 있습니다.\n * CJ대한통운은 2FA(OTP) 인증이 필요할 수 있으며, 이 경우 `COURIER_OTP_REQUIRED` 에러가 발생합니다.\n *\n * @param params - 계정 등록 파라미터\n * @returns 등록된 계정 정보 (courierAccountKey 포함)\n * @throws {ApiError} COURIER_OTP_REQUIRED — CJ 계정 OTP 인증 필요\n * @throws {ApiError} COURIER_AUTH_FAILED — 계정 인증 실패 (아이디/비밀번호 오류)\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-lotte-id',\n * accountPassword: 'my-password',\n * accountName: '메인 롯데 계정',\n * })\n * console.log(account.courierAccountKey) // 이후 API 호출에 사용\n */\n async register(params: RegisterAccountParams): Promise<RegisterAccountResponse> {\n return request<RegisterAccountResponse>(\n '/v1/courier/accounts/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 택배사 계정 목록을 조회합니다.\n *\n * @returns 계정 목록 (courierAccountKey, providerId, isActive 등)\n *\n * @example\n * const accounts = await client.courier.accounts.list()\n * const active = accounts.filter(a => a.isActive)\n * console.log(active[0].courierAccountKey)\n */\n async list(): Promise<CourierAccountInfo[]> {\n return request<CourierAccountInfo[]>(\n '/v1/courier/accounts',\n {},\n this.auth,\n )\n }\n\n /**\n * 특정 택배사 계정의 상세 정보를 조회합니다.\n *\n * 목록 조회와 달리 `accountPassword` 필드가 포함됩니다 (항상 마스킹된 값).\n * `expiresAt` 필드는 포함되지 않습니다.\n *\n * @param accountKey - 조회할 계정의 courierAccountKey\n * @returns 계정 상세 정보\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const detail = await client.courier.accounts.get('your-account-key')\n * console.log(detail.accountId) // 'my-lotte-id'\n * console.log(detail.accountPassword) // '(암호화하여 저장중)'\n */\n async get(accountKey: string): Promise<CourierAccountDetail> {\n return request<CourierAccountDetail>(\n `/v1/courier/accounts/${accountKey}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 택배사 계정을 삭제합니다.\n *\n * @param accountKey - 삭제할 계정의 courierAccountKey\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * await client.courier.accounts.delete('your-account-key')\n */\n async delete(accountKey: string): Promise<void> {\n await request<unknown>(\n `/v1/courier/accounts/${accountKey}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n DeleteHistoryParams,\n} from '../types'\n\nexport class HistoriesResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 대량 등록 이력 목록을 조회합니다.\n *\n * @param params - 조회 파라미터 (providerId 필수)\n * @returns 이력 목록 (histories 배열)\n *\n * @example\n * const { histories } = await client.courier.deliveries.histories.list({\n * providerId: 'lotte',\n * courierAccountKey: 'your-key',\n * limit: 20,\n * })\n * const completed = histories.filter(h => h.status === 'completed')\n */\n async list(params: ListHistoriesParams): Promise<ListHistoriesResponse> {\n return request<ListHistoriesResponse>(\n '/v1/courier/deliveries/bulk-upload-histories',\n {\n method: 'GET',\n params: {\n providerId: params.providerId,\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n limit: params.limit,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 대량 등록 이력의 상세 정보를 조회합니다.\n *\n * 택배사 API를 호출하여 실시간 배송 상태를 함께 반환합니다.\n *\n * @param historyId - 이력 ID\n * @param params - 조회 파라미터 (courierAccountKey 필수)\n * @returns 이력 정보 + 실시간 배송 상태 (detailItems)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정\n *\n * @example\n * const { history, detailItems } = await client.courier.deliveries.histories.get(\n * '202603221456_a1b2c',\n * { courierAccountKey: 'your-key' },\n * )\n * const delivered = detailItems.filter(d => d.isDelivered)\n */\n async get(historyId: string, params: HistoryDetailParams): Promise<HistoryDetailResponse> {\n return request<HistoryDetailResponse>(\n `/v1/courier/deliveries/bulk-upload-histories/${historyId}/detail`,\n {\n method: 'GET',\n params: { courierAccountKey: params.courierAccountKey },\n },\n this.auth,\n )\n }\n\n /**\n * 대량 등록 이력을 삭제(취소)합니다.\n *\n * `courierDeliveryIds`를 지정하면 부분 취소, 생략하면 전체 취소(soft delete)입니다.\n * 택배사 API를 호출하여 실제 접수도 취소합니다.\n *\n * @param historyId - 이력 ID\n * @param params - 삭제 파라미터 (courierAccountKey 필수)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정\n *\n * @example\n * // 전체 취소\n * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {\n * courierAccountKey: 'your-key',\n * })\n *\n * // 부분 취소\n * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {\n * courierAccountKey: 'your-key',\n * courierDeliveryIds: ['7705241632'],\n * })\n */\n async delete(historyId: string, params: DeleteHistoryParams): Promise<void> {\n await request<unknown>(\n `/v1/courier/deliveries/bulk-upload-histories/${historyId}`,\n {\n method: 'DELETE',\n params: { courierAccountKey: params.courierAccountKey },\n body: params.courierDeliveryIds\n ? { courierDeliveryIds: params.courierDeliveryIds }\n : undefined,\n },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BulkUploadParams,\n BulkUploadResponse,\n InquiryParams,\n AccountInquiryResponse,\n DashboardParams,\n DashboardStatsResponse,\n CancelDeliveriesParams,\n} from '../types'\nimport { HistoriesResource } from './histories'\n\nexport class DeliveriesResource {\n /** 대량 등록 이력 관리 */\n readonly histories: HistoriesResource\n\n constructor(private readonly auth: AuthCredentials) {\n this.histories = new HistoriesResource(auth)\n }\n\n /**\n * 택배를 대량 등록합니다. 최대 1,000건까지 한 번에 등록 가능합니다.\n *\n * 등록 직후에는 관리번호(courierDeliveryId)만 발급됩니다.\n * 송장번호(trackingNumber)는 **송장 출력 시점에 발급**됩니다.\n *\n * HTTP 200으로 응답하며, `success`는 전체 성공 여부입니다.\n * 부분 실패가 가능하므로 반드시 `results[].success`로 개별 확인하세요.\n *\n * @param params - 대량 등록 요청 파라미터\n * @returns 등록 결과 (부분 성공 포함, results[].success로 개별 확인)\n * @throws {ApiError} RATE_LIMITED — 요청 한도 초과\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const result = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: 'your-key',\n * items: [{\n * clientOrderId: 'ORD-001',\n * receiverName: '홍길동',\n * receiverPhone1: '01012345678',\n * receiverAddress: '서울특별시 중구 세종대로 110',\n * productName: '테스트 상품',\n * quantity: 1,\n * }],\n * })\n * const failed = result.results.filter(r => !r.success)\n * const ids = result.results.filter(r => r.success).map(r => r.courierDeliveryId)\n */\n async bulkUpload(params: BulkUploadParams): Promise<BulkUploadResponse> {\n return request<BulkUploadResponse>(\n '/v1/courier/deliveries/bulk-upload',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 목록을 조회합니다.\n *\n * 택배사 API를 실시간으로 호출하여 최신 배송 상태를 반환합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 목록 (items) + 요약 통계 (summary)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const result = await client.courier.deliveries.inquiry({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(result.summary.delivered) // 배송 완료 건수\n * const pending = result.items.filter(i => i.deliveryStatus === 'PENDING')\n */\n async inquiry(params: InquiryParams): Promise<AccountInquiryResponse> {\n return request<AccountInquiryResponse>(\n '/v1/courier/deliveries/inquiry',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 통계(대시보드)를 조회합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 통계 (items: 상세 행, summary: 요약)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const stats = await client.courier.deliveries.dashboard({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(stats.summary.totalCount) // 전체 건수\n * console.log(stats.summary.delivered) // 배송 완료 건수\n */\n async dashboard(params: DashboardParams): Promise<DashboardStatsResponse> {\n return request<DashboardStatsResponse>(\n '/v1/courier/deliveries/dashboard',\n {\n method: 'GET',\n params: {\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 등록된 배송을 취소합니다.\n *\n * **주의**: 등록 후 7일 이내의 배송만 취소 가능합니다.\n * 7일 이상 경과한 배송은 택배사에서 조회되지 않아 취소할 수 없습니다.\n * 지원하지 않는 택배사의 경우 에러가 반환됩니다.\n *\n * 이력 단위 취소가 필요하면 `client.courier.deliveries.histories.delete()`를 사용하세요.\n *\n * @param params - 취소 파라미터 (courierDeliveryId 목록)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음\n *\n * @example\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * courierDeliveryIds: ['7705241632', '7705241633'],\n * })\n */\n async cancel(params: CancelDeliveriesParams): Promise<void> {\n await request<unknown>(\n '/v1/courier/deliveries/cancel',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { CreatePrintSessionParams, PrintSessionResponse } from '../types'\n\nexport class PrintResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 송장 출력 세션을 생성합니다.\n *\n * 세션 ID로 출력 페이지(`https://print.deliveryapi.co.kr?session={sessionId}`)에 접속할 수 있습니다.\n * 세션은 **10분 유효, 1회용**입니다. OZ Viewer 설치가 필요합니다.\n *\n * `courierTrackingIds` 또는 `bulkUploadHistoryId` 중 하나를 지정하세요.\n *\n * **중요**: 대부분의 택배사에서 송장번호(trackingNumber)는 이 출력 시점에 발급됩니다.\n * 출력 후 `client.courier.deliveries.inquiry()`로 발급된 송장번호를 확인하세요.\n *\n * @param params - 출력 세션 생성 파라미터\n * @returns 세션 정보 (sessionId, expiresAt)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 배송 ID\n *\n * @example\n * // 개별 ID로 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * courierTrackingIds: ['7705241632', '7705241633'],\n * })\n * // 브라우저에서 출력 페이지 열기\n * window.open(`https://print.deliveryapi.co.kr?session=${session.sessionId}`)\n *\n * @example\n * // 이력 전체 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * bulkUploadHistoryId: '202603221456_a1b2c',\n * })\n */\n async createSession(params: CreatePrintSessionParams): Promise<PrintSessionResponse> {\n return request<PrintSessionResponse>(\n '/v1/courier/print/sessions',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { AccountsResource } from './accounts'\nimport { DeliveriesResource } from './deliveries'\nimport { PrintResource } from './print'\n\n/**\n * 택배 계정 서비스 리소스\n *\n * 택배사 계정을 등록하고, 택배를 대량 등록·조회·취소하며, 송장을 출력합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * @example\n * // 전체 플로우: 계정 등록 → 대량 등록 → 송장 출력 → 배송 추적\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-id',\n * accountPassword: 'my-password',\n * })\n *\n * const upload = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: account.courierAccountKey,\n * items: [{ clientOrderId: 'ORD-001', receiverName: '홍길동', ... }],\n * })\n *\n * const session = await client.courier.print.createSession({\n * courierAccountKey: account.courierAccountKey,\n * providerId: 'lotte',\n * courierTrackingIds: upload.results.filter(r => r.success).map(r => r.courierDeliveryId!),\n * })\n * // 출력 후 trackingNumber가 발급됨 → inquiry로 확인 → webhooks로 추적\n */\nexport class CourierResource {\n /** 택배사 계정 관리 (등록, 조회, 삭제) */\n readonly accounts: AccountsResource\n /** 배송 관리 (대량 등록, 조회, 대시보드, 취소, 이력) */\n readonly deliveries: DeliveriesResource\n /** 송장 출력 (세션 생성) */\n readonly print: PrintResource\n\n constructor(auth: AuthCredentials) {\n this.accounts = new AccountsResource(auth)\n this.deliveries = new DeliveriesResource(auth)\n this.print = new PrintResource(auth)\n }\n}\n","import { BASE_URL } from './http'\nimport { TrackingResource } from './resources/tracking'\nimport { WebhooksResource } from './resources/webhooks'\nimport { CourierResource } from './resources/courier'\n\n/** `DeliveryAPIClient` 생성 옵션 */\nexport interface DeliveryAPIClientOptions {\n /**\n * API Key\n *\n * 대시보드에서 발급한 API Key입니다.\n */\n apiKey: string\n /**\n * Secret Key\n *\n * API Key에 연결된 Secret Key입니다.\n * 클라이언트 사이드(브라우저)에 노출되지 않도록 주의하세요.\n */\n secretKey: string\n}\n\n/**\n * DeliveryAPI 클라이언트\n *\n * API Key + Secret Key로 인증합니다.\n * 모든 요청은 `Authorization: Bearer {apiKey}:{secretKey}` 헤더로 전송됩니다.\n *\n * @example\n * import { DeliveryAPIClient } from 'deliveryapi'\n *\n * const client = new DeliveryAPIClient({\n * apiKey: 'pk_live_xxxx',\n * secretKey: 'sk_live_xxxx',\n * })\n *\n * // 택배 조회\n * const { results } = await client.tracking.trace({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * })\n *\n * // 웹훅 구독\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n */\nexport class DeliveryAPIClient {\n /**\n * 택배 조회 API\n *\n * 송장번호로 배송 정보를 즉시 조회합니다.\n *\n * - `getCouriers()` — 지원 택배사 목록\n * - `trace()` — 송장번호 조회 (단건/다건)\n */\n readonly tracking: TrackingResource\n\n /**\n * 웹훅 API\n *\n * 배송 상태 변경 시 웹훅으로 알림을 받습니다.\n *\n * **`webhooks.endpoints`** — 수신 URL 등록/관리\n * **`webhooks.subscriptions`** — 택배 추적 구독 등록/관리\n */\n readonly webhooks: WebhooksResource\n\n /**\n * 택배 계정 서비스 API\n *\n * 택배사 계정 등록, 택배 대량 등록·조회·취소, 송장 출력을 제공합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * **`courier.accounts`** — 택배사 계정 관리\n * **`courier.deliveries`** — 대량 등록, 배송 조회/취소, 이력\n * **`courier.print`** — 송장 출력 세션 생성\n */\n readonly courier: CourierResource\n\n /** API Base URL (`https://api.deliveryapi.co.kr`) */\n readonly baseUrl: string = BASE_URL\n\n constructor(options: DeliveryAPIClientOptions) {\n const auth = { apiKey: options.apiKey, secretKey: options.secretKey }\n this.tracking = new TrackingResource(auth)\n this.webhooks = new WebhooksResource(auth)\n this.courier = new CourierResource(auth)\n }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// DeliveryAPI SDK — Public Types\n//\n// 모든 타입은 @delivery-saas/shared-types (단일 진실 소스)에서 import.\n// SDK 공개 API 네이밍은 alias re-export로 유지.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── 도메인 타입 (그대로 re-export) ──────────────────────────────────────────\n\nexport { CourierDeliveryStatus } from '@delivery-saas/shared-types/courier/CourierDeliveryStatus'\nexport type { ApiErrorCode } from '@delivery-saas/shared-types/api/apiErrorCode'\nexport type { TrackingErrorCode, TrackingProgress, UnifiedTrackingResponse } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { WebhookPayload, WebhookTrackingItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// WebhookTrackingItem을 SubscriptionItem 이름으로도 export (하위 호환)\nexport type { WebhookTrackingItem as SubscriptionItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// ── Tracking (Tracking* → Trace* alias) ─────────────────────────────────────\n\nexport type { TrackingItem as TraceItem } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingRequest as TraceParams } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingItemError as TraceItemError } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingCacheInfo as TraceCacheInfo } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResult as TraceResult } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResponse as TraceResponse } from '@delivery-saas/shared-types/tracking/tracking'\n\n// ── Courier 조회 ────────────────────────────────────────────────────────────\n\nexport type { CourierInfoResponse as CourierInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { GetCouriersApiResponse as GetCouriersResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Endpoint ────────────────────────────────────────────────────────\n\nexport type { CreateEndpointRequest as CreateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { CreateEndpointApiResponse as CreateEndpointResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { EndpointListItem as EndpointInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListEndpointsApiResponse as ListEndpointsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { UpdateEndpointRequest as UpdateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretRequest as RotateSecretParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretApiResponse as RotateSecretResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Subscription ────────────────────────────────────────────────────\n\nexport type { RegisterTrackingItem as RegisterItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RegisterTrackingApiResponse as RegisterResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { TrackingBatchSummary as SubscriptionSummary } from '@delivery-saas/shared-types/tracking/webhook.types'\nexport type { ListSubscriptionsRequest as ListSubscriptionsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionListItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListSubscriptionsApiResponse as ListSubscriptionsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionDetailApiResponse as SubscriptionDetail } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Batch Results ───────────────────────────────────────────────────────────\n\nexport type { BatchResultItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsRequest as BatchResultsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultEntry } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsApiResponse as BatchResultsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Courier Account Service ─────────────────────────────────────────────────\n\nexport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n BulkUploadItemParams,\n BulkUploadParams,\n DeliveryStatusFilter,\n InquiryParams,\n DashboardParams,\n CancelDeliveriesParams,\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n DeleteHistoryParams,\n CreatePrintSessionParams,\n PrintSessionResponse,\n BulkUploadHistoryInfo,\n BulkUploadHistoryItemInfo,\n} from '@delivery-saas/shared-types/courier/sdk'\n\n// ── Courier Shared Types (reused in SDK responses) ──────────────────────────\n\n// BulkUploadResultItem re-typed: deliveryItem contains JSON (no Timestamp methods at runtime)\nimport type {\n BulkUploadResponse as _BulkUploadResponse,\n BulkUploadResultItem as _BulkUploadResultItem,\n} from '@delivery-saas/shared-types/courier/bulkUpload'\n\n/** Individual bulk upload result item (SDK-safe: deliveryItem is raw JSON) */\nexport type BulkUploadResultItem = Omit<_BulkUploadResultItem, 'deliveryItem'> & {\n /** Courier delivery data (raw JSON object, only present when tracking number is updated) */\n deliveryItem?: Record<string, unknown>\n}\n\n/** Bulk upload response */\nexport type BulkUploadResponse = Omit<_BulkUploadResponse, 'results'> & {\n /** Individual item results (same order as request items) */\n results: BulkUploadResultItem[]\n}\nexport type { BulkUploadStatus } from '@delivery-saas/shared-types/courier/bulkUploadHistory'\nexport type { AccountInquiryResponse, AccountInquiryItem } from '@delivery-saas/shared-types/courier/accountInquiry'\nexport type { DashboardStatsResponse, DashboardSummary, DashboardStatsItem } from '@delivery-saas/shared-types/dashboard/index'\n"],"mappings":"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","names":["CourierDeliveryStatus","exports"]}
1
+ {"version":3,"sources":["../../shared-types/src/courier/CourierDeliveryStatus.ts","../src/index.ts","../src/http.ts","../src/resources/tracking.ts","../src/resources/endpoints.ts","../src/resources/subscriptions.ts","../src/resources/webhooks.ts","../src/resources/accounts.ts","../src/resources/histories.ts","../src/resources/deliveries.ts","../src/resources/print.ts","../src/resources/courier.ts","../src/client.ts","../src/types.ts"],"sourcesContent":["/**\n * 택배 배송 상태 코드\n *\n * 모든 택배사의 상태를 하나의 통합 코드로 정규화합니다.\n */\nexport enum CourierDeliveryStatus {\n // 접수/준비 단계\n PENDING = 'PENDING', // 접수 대기\n REGISTERED = 'REGISTERED', // 접수 완료\n PICKUP_READY = 'PICKUP_READY', // 집하 준비\n\n // 배송 진행 단계\n PICKED_UP = 'PICKED_UP', // 집하 완료\n IN_TRANSIT = 'IN_TRANSIT', // 배송 중\n OUT_FOR_DELIVERY = 'OUT_FOR_DELIVERY', // 배송 출발\n\n // 완료 단계\n DELIVERED = 'DELIVERED', // 배송 완료\n\n // 예외 상태\n FAILED = 'FAILED', // 배송 실패\n RETURNED = 'RETURNED', // 반송\n CANCELLED = 'CANCELLED', // 취소\n HOLD = 'HOLD', // 보류\n UNKNOWN = 'UNKNOWN', // 알 수 없음\n}","// ─────────────────────────────────────────────────────────────────────────────\n// deliveryapi — DeliveryAPI SDK v1.10.0\n//\n// 사용 예시:\n// import { DeliveryAPIClient } from 'deliveryapi'\n//\n// const client = new DeliveryAPIClient({ apiKey: '...', secretKey: '...' })\n// const result = await client.tracking.trace({ items: [...] })\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Client\nexport { DeliveryAPIClient } from './client'\nexport type { DeliveryAPIClientOptions } from './client'\n\n// Error\nexport { ApiError } from './http'\n\n// Enums\nexport { CourierDeliveryStatus } from './types'\n\n// Types — Tracking\nexport type {\n CourierInfo,\n GetCouriersResponse,\n TraceItem,\n TraceParams,\n TraceResult,\n TraceItemError,\n TraceCacheInfo,\n TraceResponse,\n TrackingProgress,\n UnifiedTrackingResponse,\n TrackingErrorCode,\n} from './types'\n\n// Types — Webhooks (Endpoints)\nexport type {\n CreateEndpointParams,\n CreateEndpointResponse,\n EndpointInfo,\n ListEndpointsResponse,\n UpdateEndpointParams,\n RotateSecretParams,\n RotateSecretResponse,\n} from './types'\n\n// Types — Webhooks (Subscriptions)\nexport type {\n RegisterItem,\n RegisterResponse,\n SubscriptionSummary,\n SubscriptionListItem,\n ListSubscriptionsParams,\n ListSubscriptionsResponse,\n SubscriptionItem,\n SubscriptionDetail,\n BatchResultItem,\n BatchResultsParams,\n BatchResultEntry,\n BatchResultsResponse,\n} from './types'\n\n// Types — Webhook Payload\nexport type {\n WebhookPayload,\n WebhookTrackingItem,\n ApiErrorCode,\n} from './types'\n\n// Types — Courier Account Service\nexport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n BulkUploadItemParams,\n BulkUploadParams,\n BulkUploadResponse,\n BulkUploadResultItem,\n BulkUploadHistoryInfo,\n BulkUploadHistoryItemInfo,\n BulkUploadStatus,\n DeliveryStatusFilter,\n InquiryParams,\n AccountInquiryResponse,\n AccountInquiryItem,\n DashboardParams,\n DashboardStatsResponse,\n DashboardSummary,\n DashboardStatsItem,\n CancelDeliveriesParams,\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n CreatePrintSessionParams,\n PrintSessionResponse,\n} from './types'\n\n// Resource Classes (for advanced usage / type narrowing)\nexport { CourierResource } from './resources/courier'\nexport { AccountsResource } from './resources/accounts'\nexport { DeliveriesResource } from './resources/deliveries'\nexport { HistoriesResource } from './resources/histories'\nexport { PrintResource } from './resources/print'\n","import type { ApiErrorCode } from './types'\n\nexport const BASE_URL = 'https://api.deliveryapi.co.kr'\n\n/** 서버가 반환하는 공통 응답 포맷 (SDK 내부 파싱용) */\ninterface ApiResponse<T = unknown> {\n isSuccess: boolean\n data?: T\n errorCode?: ApiErrorCode\n error?: string\n message?: string\n}\n\n/**\n * API 호출 실패 시 throw 되는 에러 클래스\n *\n * @example\n * try {\n * await client.tracking.trace({ items: [...] })\n * } catch (err) {\n * if (err instanceof ApiError) {\n * console.error(err.code) // 'RATE_LIMITED'\n * console.error(err.status) // 429\n * console.error(err.message) // '요청 횟수가 플랜 한도를 초과했습니다'\n * }\n * }\n */\nexport class ApiError extends Error {\n /**\n * 기계가 읽는 에러 코드\n *\n * 이 값을 기준으로 분기 처리하세요.\n */\n readonly code: ApiErrorCode | string\n /** HTTP 상태 코드 */\n readonly status: number\n /**\n * 에러 상세 데이터 (에러 종류에 따라 포함될 수 있음)\n *\n * 예) `INVALID_ITEMS` 에러 시 잘못된 항목 목록:\n * `[{ courierCode, trackingNumber, errorCode }]`\n */\n readonly data?: unknown\n\n constructor(code: ApiErrorCode | string, message: string, status: number, data?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.code = code\n this.status = status\n this.data = data\n }\n}\n\n/** API Key 인증 정보 */\nexport interface AuthCredentials {\n apiKey: string\n secretKey: string\n}\n\n/** 내부 HTTP 요청 함수 */\nexport async function request<T>(\n path: string,\n options: { method?: string; body?: unknown; params?: Record<string, string | number | boolean | undefined> },\n auth: AuthCredentials,\n): Promise<T> {\n let url = `${BASE_URL}${path}`\n\n if (options.params) {\n const qs = Object.entries(options.params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&')\n if (qs) url += `?${qs}`\n }\n\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${auth.apiKey}:${auth.secretKey}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n })\n\n const json = (await res.json()) as ApiResponse<T>\n\n if (!json.isSuccess) {\n throw new ApiError(\n json.errorCode ?? 'INTERNAL_ERROR',\n json.error ?? json.message ?? `HTTP ${res.status}`,\n res.status,\n json.data,\n )\n }\n\n return json.data as T\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { GetCouriersResponse, TraceResponse } from '../types'\n\nexport class TrackingResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 지원 택배사 목록을 조회합니다.\n *\n * 택배사 코드(`trackingApiCode`)는 `trace()`의 `courierCode` 파라미터에 사용합니다.\n *\n * @example\n * const { couriers } = await client.tracking.getCouriers()\n * // couriers: [{ trackingApiCode: 'cj', displayName: 'CJ대한통운' }, ...]\n */\n async getCouriers(): Promise<GetCouriersResponse> {\n return request<GetCouriersResponse>(\n '/v1/tracking/couriers',\n {},\n this.auth,\n )\n }\n\n /**\n * 송장번호로 배송 정보를 조회합니다.\n *\n * - 여러 건을 배열로 전달할 수 있습니다.\n * - 결과는 요청 순서와 동일한 인덱스로 반환됩니다.\n * - 일부 아이템이 실패해도 전체 요청이 실패하지 않습니다. `results[].success`로 건별 확인하세요.\n *\n * **과금 안내**: `NOT_FOUND` 에러는 과금됩니다. `results[].error.billable`로 확인하세요.\n *\n * @throws {ApiError} API 인증 실패, 요청 한도 초과 등 전체 요청 실패 시\n *\n * @example\n * const { results } = await client.tracking.trace({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' },\n * { courierCode: 'lotte', trackingNumber: '9876543210', clientId: 'order_002' },\n * ],\n * })\n *\n * for (const result of results) {\n * if (result.success) {\n * console.log(result.data?.deliveryStatus) // 'DELIVERED'\n * } else {\n * console.warn(result.error?.code) // 'NOT_FOUND'\n * }\n * }\n */\n async trace(params: {\n items: { courierCode: string; trackingNumber: string; clientId?: string }[]\n includeProgresses?: boolean\n }): Promise<TraceResponse> {\n return request<TraceResponse>(\n '/v1/tracking/trace',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n CreateEndpointResponse,\n ListEndpointsResponse,\n RotateSecretResponse,\n} from '../types'\n\nexport class EndpointsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 웹훅 엔드포인트를 등록합니다.\n *\n * 등록 시 서버에서 해당 URL로 테스트 POST 요청을 전송하여 연결 가능 여부를 검증합니다.\n * 응답의 `webhookSecret`은 **이 응답에서만 평문으로 반환**됩니다.\n * 분실 시 `rotateSecret()`으로 재발급해야 합니다.\n *\n * @throws {ApiError} `WEBHOOK_ENDPOINT_LIMIT` — 엔드포인트 등록 한도 초과\n * @throws {ApiError} `WEBHOOK_ENDPOINT_UNREACHABLE` — URL 검증 실패 (서버에서 테스트 POST 전송 시 200 응답 없음)\n *\n * @example\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * console.log(endpoint.endpointId) // 'ep_xxxx'\n * console.log(endpoint.webhookSecret) // 반드시 저장하세요!\n */\n async create(params: {\n /** 웹훅을 수신할 URL (`https://` 필수) */\n url: string\n /** 엔드포인트 이름 (관리용) */\n name: string\n /** 서명 시크릿 직접 지정 (미제공 시 서버 자동 생성, 최소 5자) */\n webhookSecret?: string\n }): Promise<CreateEndpointResponse> {\n return request<CreateEndpointResponse>(\n '/v1/webhooks/endpoints',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 웹훅 엔드포인트 목록을 조회합니다.\n *\n * @example\n * const { endpoints } = await client.webhooks.endpoints.list()\n * const active = endpoints.filter(ep => ep.status === 'active')\n * console.log(active[0].endpointId) // 'ep_xxxx'\n */\n async list(): Promise<ListEndpointsResponse> {\n return request<ListEndpointsResponse>(\n '/v1/webhooks/endpoints',\n {},\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트 이름을 수정합니다.\n *\n * URL은 변경할 수 없습니다. URL을 변경해야 한다면 삭제 후 재등록하세요.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.update('ep_xxxx', { name: '스테이징 서버' })\n */\n async update(endpointId: string, params: {\n /** 새 엔드포인트 이름 */\n name: string\n }): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'PUT', body: params },\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트를 삭제합니다.\n *\n * 해당 엔드포인트에 연결된 구독도 함께 삭제됩니다 (cascade).\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.delete('ep_xxxx')\n */\n async delete(endpointId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 웹훅 서명 시크릿을 재발급합니다.\n *\n * 기존 시크릿은 즉시 무효화됩니다.\n * 새 시크릿은 **이 응답에서만 평문으로 반환**됩니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * const { webhookSecret } = await client.webhooks.endpoints.rotateSecret('ep_xxxx')\n * console.log(webhookSecret) // 새 시크릿 — 반드시 저장하세요!\n */\n async rotateSecret(endpointId: string, params?: {\n /** 새 시크릿 직접 지정 (미제공 시 서버 자동 생성) */\n webhookSecret?: string\n }): Promise<RotateSecretResponse> {\n return request<RotateSecretResponse>(\n `/v1/webhooks/endpoints/${endpointId}/rotate`,\n { method: 'POST', body: params ?? {} },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BatchResultsResponse,\n ListSubscriptionsParams,\n ListSubscriptionsResponse,\n RegisterResponse,\n SubscriptionDetail,\n} from '../types'\n\nexport class SubscriptionsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배 추적 구독을 등록합니다.\n *\n * ## 구독형 (`recurring: true`)\n * 배송 완료 또는 최대 14일까지 주기적으로 폴링합니다.\n * - `endpointId` 있음: 상태가 변경될 때마다 웹훅(`tracking.polled`)을 발송하고, 배송 완료 또는 기간 만료 시 `tracking.completed` 웹훅을 발송 후 자동 종료\n * - `endpointId` 없음: 웹훅 없이 폴링만 수행. `get(requestId)`으로 현재 상태를 직접 조회\n *\n * ## 일회성 (`recurring: false`)\n * 등록 즉시 1회 크롤 후 종료합니다. 폴링을 반복하지 않습니다.\n * - `endpointId` 있음: 크롤 완료 시 웹훅 1회 발송\n * - `endpointId` 없음: 웹훅 없이 크롤만 수행. `get(requestId)`으로 결과를 직접 조회\n *\n * @example\n * // 구독형 — 배송 완료까지 상태 변경 시마다 웹훅 수신\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n * // sub.requestId로 구독 관리 (cancel, get)\n *\n * @example\n * // 일회성 — 웹훅 없이 즉시 크롤 후 결과 직접 조회\n * const req = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'lotte', trackingNumber: '9876543210' }],\n * recurring: false,\n * })\n * const detail = await client.webhooks.subscriptions.get(req.requestId)\n * console.log(detail.items[0].currentStatus) // 'DELIVERED'\n */\n async register(params:\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 반복 구독. 배송 완료 또는 14일까지 주기적으로 폴링. */\n recurring: true\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 상태 변경마다 웹훅 발송.\n * 생략 시 웹훅 없이 폴링만 수행하며 `get(requestId)`으로 결과를 직접 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 일회성. 등록 즉시 1회 크롤 후 종료. `endpointId` 없으면 `get(requestId)`으로 결과 조회. */\n recurring: false\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 크롤 완료 후 웹훅 1회 발송.\n * 생략 시 웹훅 없이 크롤만 수행하며 `get(requestId)`으로 결과를 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n ): Promise<RegisterResponse> {\n return request<RegisterResponse>(\n '/v1/webhooks/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 구독 목록을 조회합니다.\n *\n * 커서 기반 페이지네이션을 지원합니다.\n * 다음 페이지가 있으면 응답의 `nextCursor`를 다음 호출의 `cursor` 파라미터로 전달하세요.\n *\n * @example\n * let cursor: string | undefined\n * do {\n * const page = await client.webhooks.subscriptions.list({ cursor, limit: 50 })\n * for (const sub of page.subscriptions) {\n * console.log(sub.requestId, sub.isActive)\n * }\n * cursor = page.nextCursor\n * } while (cursor)\n */\n async list(params?: ListSubscriptionsParams): Promise<ListSubscriptionsResponse> {\n return request<ListSubscriptionsResponse>(\n '/v1/webhooks/subscriptions',\n { params: { cursor: params?.cursor, limit: params?.limit, status: params?.status, from: params?.from, to: params?.to } },\n this.auth,\n )\n }\n\n /**\n * 구독 상세 정보를 조회합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * const detail = await client.webhooks.subscriptions.get('req_xxxx')\n * for (const item of detail.items) {\n * console.log(item.trackingNumber, item.currentStatus)\n * }\n */\n async get(requestId: string): Promise<SubscriptionDetail> {\n return request<SubscriptionDetail>(\n `/v1/webhooks/subscriptions/${requestId}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 구독을 취소합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * await client.webhooks.subscriptions.cancel('req_xxxx')\n */\n async cancel(requestId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/subscriptions/${requestId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 여러 송장번호의 최신 배송 정보를 한 번에 조회합니다.\n *\n * 해당 계정에 등록된 구독 중 일치하는 아이템의 최신 상태를 반환합니다.\n *\n * @example\n * const { results } = await client.webhooks.subscriptions.batchResults({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1111111111' },\n * { courierCode: 'lotte', trackingNumber: '2222222222' },\n * ],\n * })\n * for (const r of results) {\n * console.log(r.currentStatus, r.isDelivered)\n * }\n */\n async batchResults(params: {\n items: { courierCode: string; trackingNumber: string }[]\n }): Promise<BatchResultsResponse> {\n return request<BatchResultsResponse>(\n '/v1/webhooks/results',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { EndpointsResource } from './endpoints'\nimport { SubscriptionsResource } from './subscriptions'\n\n/**\n * 웹훅 리소스\n *\n * - `endpoints` — 웹훅 수신 URL 등록/관리\n * - `subscriptions` — 택배 추적 구독 등록/관리\n *\n * @example\n * const client = new DeliveryAPIClient({ apiKey: '...', secretKey: '...' })\n *\n * // 1. 엔드포인트 등록\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * // ⚠️ endpoint.webhookSecret 을 안전하게 보관하세요!\n *\n * // 2. 택배 추적 구독\n * const sub = await client.webhooks.subscriptions.register({\n * endpointId: endpoint.endpointId,\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * })\n *\n * // 3. 구독 상태 조회\n * const detail = await client.webhooks.subscriptions.get(sub.requestId)\n */\nexport class WebhooksResource {\n /**\n * 웹훅 엔드포인트 관리\n *\n * - `create()` — 수신 URL 등록\n * - `list()` — 목록 조회\n * - `update()` — 이름 수정\n * - `delete()` — 삭제\n * - `rotateSecret()` — 서명 시크릿 재발급\n */\n readonly endpoints: EndpointsResource\n\n /**\n * 웹훅 구독 관리\n *\n * - `register()` — 택배 추적 구독 등록\n * - `list()` — 구독 목록\n * - `get()` — 구독 상세\n * - `cancel()` — 구독 취소\n * - `batchResults()` — 다건 최신 상태 조회\n */\n readonly subscriptions: SubscriptionsResource\n\n constructor(auth: AuthCredentials) {\n this.endpoints = new EndpointsResource(auth)\n this.subscriptions = new SubscriptionsResource(auth)\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n} from '../types'\n\nexport class AccountsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배사 계정을 등록합니다.\n *\n * 롯데택배, CJ대한통운 계정을 등록할 수 있습니다.\n * CJ대한통운은 2FA(OTP) 인증이 필요할 수 있으며, 이 경우 `COURIER_OTP_REQUIRED` 에러가 발생합니다.\n *\n * @param params - 계정 등록 파라미터\n * @returns 등록된 계정 정보 (courierAccountKey 포함)\n * @throws {ApiError} COURIER_OTP_REQUIRED — CJ 계정 OTP 인증 필요\n * @throws {ApiError} COURIER_AUTH_FAILED — 계정 인증 실패 (아이디/비밀번호 오류)\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-lotte-id',\n * accountPassword: 'my-password',\n * accountName: '메인 롯데 계정',\n * })\n * console.log(account.courierAccountKey) // 이후 API 호출에 사용\n */\n async register(params: RegisterAccountParams): Promise<RegisterAccountResponse> {\n return request<RegisterAccountResponse>(\n '/v1/courier/accounts/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 택배사 계정 목록을 조회합니다.\n *\n * @returns 계정 목록 (courierAccountKey, providerId, isActive 등)\n *\n * @example\n * const accounts = await client.courier.accounts.list()\n * const active = accounts.filter(a => a.isActive)\n * console.log(active[0].courierAccountKey)\n */\n async list(): Promise<CourierAccountInfo[]> {\n return request<CourierAccountInfo[]>(\n '/v1/courier/accounts',\n {},\n this.auth,\n )\n }\n\n /**\n * 특정 택배사 계정의 상세 정보를 조회합니다.\n *\n * 목록 조회와 달리 `accountPassword` 필드가 포함됩니다 (항상 마스킹된 값).\n * `expiresAt` 필드는 포함되지 않습니다.\n *\n * @param accountKey - 조회할 계정의 courierAccountKey\n * @returns 계정 상세 정보\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const detail = await client.courier.accounts.get('your-account-key')\n * console.log(detail.accountId) // 'my-lotte-id'\n * console.log(detail.accountPassword) // '(암호화하여 저장중)'\n */\n async get(accountKey: string): Promise<CourierAccountDetail> {\n return request<CourierAccountDetail>(\n `/v1/courier/accounts/${accountKey}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 택배사 계정을 삭제합니다.\n *\n * @param accountKey - 삭제할 계정의 courierAccountKey\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * await client.courier.accounts.delete('your-account-key')\n */\n async delete(accountKey: string): Promise<void> {\n await request<unknown>(\n `/v1/courier/accounts/${accountKey}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n} from '../types'\n\nexport class HistoriesResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 대량 등록 이력 목록을 조회합니다.\n *\n * @param params - 조회 파라미터 (providerId 필수)\n * @returns 이력 목록 (histories 배열)\n *\n * @example\n * const { histories } = await client.courier.deliveries.histories.list({\n * providerId: 'lotte',\n * courierAccountKey: 'your-key',\n * limit: 20,\n * })\n * const completed = histories.filter(h => h.status === 'completed')\n */\n async list(params: ListHistoriesParams): Promise<ListHistoriesResponse> {\n return request<ListHistoriesResponse>(\n '/v1/courier/deliveries/bulk-upload-histories',\n {\n method: 'GET',\n params: {\n providerId: params.providerId,\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n limit: params.limit,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 대량 등록 이력의 상세 정보를 조회합니다.\n *\n * 택배사 API를 호출하여 실시간 배송 상태를 함께 반환합니다.\n *\n * @param historyId - 이력 ID\n * @param params - 조회 파라미터 (courierAccountKey 필수)\n * @returns 이력 정보 + 실시간 배송 상태 (detailItems)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정\n *\n * @example\n * const { history, detailItems } = await client.courier.deliveries.histories.get(\n * '202603221456_a1b2c',\n * { courierAccountKey: 'your-key' },\n * )\n * const delivered = detailItems.filter(d => d.isDelivered)\n */\n async get(historyId: string, params: HistoryDetailParams): Promise<HistoryDetailResponse> {\n return request<HistoryDetailResponse>(\n `/v1/courier/deliveries/bulk-upload-histories/${historyId}/detail`,\n {\n method: 'GET',\n params: { courierAccountKey: params.courierAccountKey },\n },\n this.auth,\n )\n }\n\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BulkUploadParams,\n BulkUploadResponse,\n InquiryParams,\n AccountInquiryResponse,\n DashboardParams,\n DashboardStatsResponse,\n CancelDeliveriesParams,\n} from '../types'\nimport { HistoriesResource } from './histories'\n\nexport class DeliveriesResource {\n /** 대량 등록 이력 관리 */\n readonly histories: HistoriesResource\n\n constructor(private readonly auth: AuthCredentials) {\n this.histories = new HistoriesResource(auth)\n }\n\n /**\n * 택배를 대량 등록합니다. 최대 1,000건까지 한 번에 등록 가능합니다.\n *\n * 등록 직후에는 관리번호(courierDeliveryId)만 발급됩니다.\n * 송장번호(trackingNumber)는 **송장 출력 시점에 발급**됩니다.\n *\n * HTTP 200으로 응답하며, `success`는 전체 성공 여부입니다.\n * 부분 실패가 가능하므로 반드시 `results[].success`로 개별 확인하세요.\n *\n * @param params - 대량 등록 요청 파라미터\n * @returns 등록 결과 (부분 성공 포함, results[].success로 개별 확인)\n * @throws {ApiError} RATE_LIMITED — 요청 한도 초과\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const result = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: 'your-key',\n * items: [{\n * clientOrderId: 'ORD-001',\n * receiverName: '홍길동',\n * receiverPhone1: '01012345678',\n * receiverAddress: '서울특별시 중구 세종대로 110',\n * productName: '테스트 상품',\n * quantity: 1,\n * }],\n * })\n * const failed = result.results.filter(r => !r.success)\n * const ids = result.results.filter(r => r.success).map(r => r.courierDeliveryId)\n */\n async bulkUpload(params: BulkUploadParams): Promise<BulkUploadResponse> {\n return request<BulkUploadResponse>(\n '/v1/courier/deliveries/bulk-upload',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 목록을 조회합니다.\n *\n * 택배사 API를 실시간으로 호출하여 최신 배송 상태를 반환합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 목록 (items) + 요약 통계 (summary)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const result = await client.courier.deliveries.inquiry({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(result.summary.delivered) // 배송 완료 건수\n * const pending = result.items.filter(i => i.deliveryStatus === 'PENDING')\n */\n async inquiry(params: InquiryParams): Promise<AccountInquiryResponse> {\n return request<AccountInquiryResponse>(\n '/v1/courier/deliveries/inquiry',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 통계(대시보드)를 조회합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 통계 (items: 상세 행, summary: 요약)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const stats = await client.courier.deliveries.dashboard({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(stats.summary.totalCount) // 전체 건수\n * console.log(stats.summary.delivered) // 배송 완료 건수\n */\n async dashboard(params: DashboardParams): Promise<DashboardStatsResponse> {\n return request<DashboardStatsResponse>(\n '/v1/courier/deliveries/dashboard',\n {\n method: 'GET',\n params: {\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 배송을 취소합니다. 3가지 사용 방식을 지원합니다.\n *\n * 1. **historyId만**: 해당 이력의 전체 배송 취소 + 이력 soft delete\n * 2. **historyId + courierDeliveryIds**: 이력 내 부분 취소\n * 3. **courierDeliveryIds만**: 택배사 직접 취소 (이력 무관, 최근 7일 이내)\n *\n * `historyId`와 `courierDeliveryIds` 중 하나는 반드시 필요합니다.\n *\n * @param params - 취소 파라미터\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 이력\n * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음\n *\n * @example\n * // 이력 전체 취소\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * historyId: '202603221456_a1b2c',\n * })\n *\n * // 이력 내 부분 취소\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * historyId: '202603221456_a1b2c',\n * courierDeliveryIds: ['7705241632'],\n * })\n *\n * // 직접 취소 (이력 없이)\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * courierDeliveryIds: ['7705241632', '7705241633'],\n * })\n */\n async cancel(params: CancelDeliveriesParams): Promise<void> {\n await request<unknown>(\n '/v1/courier/deliveries/cancel',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { CreatePrintSessionParams, PrintSessionResponse } from '../types'\n\nexport class PrintResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 송장 출력 세션을 생성합니다.\n *\n * 세션 ID로 출력 페이지(`https://print.deliveryapi.co.kr?session={sessionId}`)에 접속할 수 있습니다.\n * 세션은 **10분 유효, 1회용**입니다. OZ Viewer 설치가 필요합니다.\n *\n * `courierTrackingIds` 또는 `bulkUploadHistoryId` 중 하나를 지정하세요.\n *\n * **중요**: 대부분의 택배사에서 송장번호(trackingNumber)는 이 출력 시점에 발급됩니다.\n * 출력 후 `client.courier.deliveries.inquiry()`로 발급된 송장번호를 확인하세요.\n *\n * @param params - 출력 세션 생성 파라미터\n * @returns 세션 정보 (sessionId, expiresAt)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 배송 ID\n *\n * @example\n * // 개별 ID로 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * courierTrackingIds: ['7705241632', '7705241633'],\n * })\n * // 브라우저에서 출력 페이지 열기\n * window.open(`https://print.deliveryapi.co.kr?session=${session.sessionId}`)\n *\n * @example\n * // 이력 전체 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * bulkUploadHistoryId: '202603221456_a1b2c',\n * })\n */\n async createSession(params: CreatePrintSessionParams): Promise<PrintSessionResponse> {\n return request<PrintSessionResponse>(\n '/v1/courier/print/sessions',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { AccountsResource } from './accounts'\nimport { DeliveriesResource } from './deliveries'\nimport { PrintResource } from './print'\n\n/**\n * 택배 계정 서비스 리소스\n *\n * 택배사 계정을 등록하고, 택배를 대량 등록·조회·취소하며, 송장을 출력합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * @example\n * // 전체 플로우: 계정 등록 → 대량 등록 → 송장 출력 → 배송 추적\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-id',\n * accountPassword: 'my-password',\n * })\n *\n * const upload = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: account.courierAccountKey,\n * items: [{ clientOrderId: 'ORD-001', receiverName: '홍길동', ... }],\n * })\n *\n * const session = await client.courier.print.createSession({\n * courierAccountKey: account.courierAccountKey,\n * providerId: 'lotte',\n * courierTrackingIds: upload.results.filter(r => r.success).map(r => r.courierDeliveryId!),\n * })\n * // 출력 후 trackingNumber가 발급됨 → inquiry로 확인 → webhooks로 추적\n */\nexport class CourierResource {\n /** 택배사 계정 관리 (등록, 조회, 삭제) */\n readonly accounts: AccountsResource\n /** 배송 관리 (대량 등록, 조회, 대시보드, 취소, 이력) */\n readonly deliveries: DeliveriesResource\n /** 송장 출력 (세션 생성) */\n readonly print: PrintResource\n\n constructor(auth: AuthCredentials) {\n this.accounts = new AccountsResource(auth)\n this.deliveries = new DeliveriesResource(auth)\n this.print = new PrintResource(auth)\n }\n}\n","import { BASE_URL } from './http'\nimport { TrackingResource } from './resources/tracking'\nimport { WebhooksResource } from './resources/webhooks'\nimport { CourierResource } from './resources/courier'\n\n/** `DeliveryAPIClient` 생성 옵션 */\nexport interface DeliveryAPIClientOptions {\n /**\n * API Key\n *\n * 대시보드에서 발급한 API Key입니다.\n */\n apiKey: string\n /**\n * Secret Key\n *\n * API Key에 연결된 Secret Key입니다.\n * 클라이언트 사이드(브라우저)에 노출되지 않도록 주의하세요.\n */\n secretKey: string\n}\n\n/**\n * DeliveryAPI 클라이언트\n *\n * API Key + Secret Key로 인증합니다.\n * 모든 요청은 `Authorization: Bearer {apiKey}:{secretKey}` 헤더로 전송됩니다.\n *\n * @example\n * import { DeliveryAPIClient } from 'deliveryapi'\n *\n * const client = new DeliveryAPIClient({\n * apiKey: 'pk_live_xxxx',\n * secretKey: 'sk_live_xxxx',\n * })\n *\n * // 택배 조회\n * const { results } = await client.tracking.trace({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * })\n *\n * // 웹훅 구독\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n */\nexport class DeliveryAPIClient {\n /**\n * 택배 조회 API\n *\n * 송장번호로 배송 정보를 즉시 조회합니다.\n *\n * - `getCouriers()` — 지원 택배사 목록\n * - `trace()` — 송장번호 조회 (단건/다건)\n */\n readonly tracking: TrackingResource\n\n /**\n * 웹훅 API\n *\n * 배송 상태 변경 시 웹훅으로 알림을 받습니다.\n *\n * **`webhooks.endpoints`** — 수신 URL 등록/관리\n * **`webhooks.subscriptions`** — 택배 추적 구독 등록/관리\n */\n readonly webhooks: WebhooksResource\n\n /**\n * 택배 계정 서비스 API\n *\n * 택배사 계정 등록, 택배 대량 등록·조회·취소, 송장 출력을 제공합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * **`courier.accounts`** — 택배사 계정 관리\n * **`courier.deliveries`** — 대량 등록, 배송 조회/취소, 이력\n * **`courier.print`** — 송장 출력 세션 생성\n */\n readonly courier: CourierResource\n\n /** API Base URL (`https://api.deliveryapi.co.kr`) */\n readonly baseUrl: string = BASE_URL\n\n constructor(options: DeliveryAPIClientOptions) {\n const auth = { apiKey: options.apiKey, secretKey: options.secretKey }\n this.tracking = new TrackingResource(auth)\n this.webhooks = new WebhooksResource(auth)\n this.courier = new CourierResource(auth)\n }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// DeliveryAPI SDK — Public Types\n//\n// 모든 타입은 @delivery-saas/shared-types (단일 진실 소스)에서 import.\n// SDK 공개 API 네이밍은 alias re-export로 유지.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── 도메인 타입 (그대로 re-export) ──────────────────────────────────────────\n\nexport { CourierDeliveryStatus } from '@delivery-saas/shared-types/courier/CourierDeliveryStatus'\nexport type { ApiErrorCode } from '@delivery-saas/shared-types/api/apiErrorCode'\nexport type { TrackingErrorCode, TrackingProgress, UnifiedTrackingResponse } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { WebhookPayload, WebhookTrackingItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// WebhookTrackingItem을 SubscriptionItem 이름으로도 export (하위 호환)\nexport type { WebhookTrackingItem as SubscriptionItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// ── Tracking (Tracking* → Trace* alias) ─────────────────────────────────────\n\nexport type { TrackingItem as TraceItem } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingRequest as TraceParams } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingItemError as TraceItemError } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingCacheInfo as TraceCacheInfo } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResult as TraceResult } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResponse as TraceResponse } from '@delivery-saas/shared-types/tracking/tracking'\n\n// ── Courier 조회 ────────────────────────────────────────────────────────────\n\nexport type { CourierInfoResponse as CourierInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { GetCouriersApiResponse as GetCouriersResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Endpoint ────────────────────────────────────────────────────────\n\nexport type { CreateEndpointRequest as CreateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { CreateEndpointApiResponse as CreateEndpointResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { EndpointListItem as EndpointInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListEndpointsApiResponse as ListEndpointsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { UpdateEndpointRequest as UpdateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretRequest as RotateSecretParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretApiResponse as RotateSecretResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Subscription ────────────────────────────────────────────────────\n\nexport type { RegisterTrackingItem as RegisterItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RegisterTrackingApiResponse as RegisterResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { TrackingBatchSummary as SubscriptionSummary } from '@delivery-saas/shared-types/tracking/webhook.types'\nexport type { ListSubscriptionsRequest as ListSubscriptionsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionListItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListSubscriptionsApiResponse as ListSubscriptionsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionDetailApiResponse as SubscriptionDetail } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Batch Results ───────────────────────────────────────────────────────────\n\nexport type { BatchResultItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsRequest as BatchResultsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultEntry } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsApiResponse as BatchResultsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Courier Account Service ─────────────────────────────────────────────────\n\nexport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n BulkUploadItemParams,\n BulkUploadParams,\n DeliveryStatusFilter,\n InquiryParams,\n DashboardParams,\n CancelDeliveriesParams,\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n CreatePrintSessionParams,\n PrintSessionResponse,\n BulkUploadHistoryInfo,\n BulkUploadHistoryItemInfo,\n} from '@delivery-saas/shared-types/courier/sdk'\n\n// ── Courier Shared Types (reused in SDK responses) ──────────────────────────\n\n// BulkUploadResultItem re-typed: deliveryItem contains JSON (no Timestamp methods at runtime)\nimport type {\n BulkUploadResponse as _BulkUploadResponse,\n BulkUploadResultItem as _BulkUploadResultItem,\n} from '@delivery-saas/shared-types/courier/bulkUpload'\n\n/** Individual bulk upload result item (SDK-safe: deliveryItem is raw JSON) */\nexport type BulkUploadResultItem = Omit<_BulkUploadResultItem, 'deliveryItem'> & {\n /** Courier delivery data (raw JSON object, only present when tracking number is updated) */\n deliveryItem?: Record<string, unknown>\n}\n\n/** Bulk upload response */\nexport type BulkUploadResponse = Omit<_BulkUploadResponse, 'results'> & {\n /** Individual item results (same order as request items) */\n results: BulkUploadResultItem[]\n}\nexport type { BulkUploadStatus } from '@delivery-saas/shared-types/courier/bulkUploadHistory'\nexport type { AccountInquiryResponse, AccountInquiryItem } from '@delivery-saas/shared-types/courier/accountInquiry'\nexport type { DashboardStatsResponse, DashboardSummary, DashboardStatsItem } from '@delivery-saas/shared-types/dashboard/index'\n"],"mappings":"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","names":["CourierDeliveryStatus","exports"]}
package/dist/index.d.cts CHANGED
@@ -631,12 +631,21 @@ interface DashboardParams {
631
631
  /** End date (YYYY-MM-DD) */
632
632
  toDate: string;
633
633
  }
634
- /** Parameters for cancelling deliveries */
634
+ /**
635
+ * Parameters for cancelling deliveries
636
+ *
637
+ * Three usage patterns:
638
+ * 1. historyId only → cancel all deliveries in history + soft delete
639
+ * 2. historyId + courierDeliveryIds → partial cancel within history
640
+ * 3. courierDeliveryIds only → direct courier cancel (no history update)
641
+ */
635
642
  interface CancelDeliveriesParams {
636
643
  /** Courier account key */
637
644
  courierAccountKey: string;
638
- /** Courier delivery IDs to cancel */
639
- courierDeliveryIds: string[];
645
+ /** Bulk upload history ID (for history-based cancel) */
646
+ historyId?: string;
647
+ /** Courier delivery IDs to cancel (required if historyId is omitted) */
648
+ courierDeliveryIds?: string[];
640
649
  }
641
650
  /** SDK-facing bulk upload history item (Timestamp → ISO string) */
642
651
  interface BulkUploadHistoryItemInfo {
@@ -715,13 +724,6 @@ interface HistoryDetailResponse {
715
724
  /** Live delivery status for items in this upload (from courier API) */
716
725
  detailItems: AccountInquiryItem[];
717
726
  }
718
- /** Parameters for deleting/cancelling a bulk upload history */
719
- interface DeleteHistoryParams {
720
- /** Courier account key (required for ownership verification) */
721
- courierAccountKey: string;
722
- /** Specific delivery IDs to cancel (omit for full cancel/delete) */
723
- courierDeliveryIds?: string[];
724
- }
725
727
  /** Parameters for creating a print session */
726
728
  interface CreatePrintSessionParams {
727
729
  /** Courier account key */
@@ -1352,29 +1354,6 @@ declare class HistoriesResource {
1352
1354
  * const delivered = detailItems.filter(d => d.isDelivered)
1353
1355
  */
1354
1356
  get(historyId: string, params: HistoryDetailParams): Promise<HistoryDetailResponse>;
1355
- /**
1356
- * 대량 등록 이력을 삭제(취소)합니다.
1357
- *
1358
- * `courierDeliveryIds`를 지정하면 부분 취소, 생략하면 전체 취소(soft delete)입니다.
1359
- * 택배사 API를 호출하여 실제 접수도 취소합니다.
1360
- *
1361
- * @param historyId - 이력 ID
1362
- * @param params - 삭제 파라미터 (courierAccountKey 필수)
1363
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정
1364
- *
1365
- * @example
1366
- * // 전체 취소
1367
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
1368
- * courierAccountKey: 'your-key',
1369
- * })
1370
- *
1371
- * // 부분 취소
1372
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
1373
- * courierAccountKey: 'your-key',
1374
- * courierDeliveryIds: ['7705241632'],
1375
- * })
1376
- */
1377
- delete(historyId: string, params: DeleteHistoryParams): Promise<void>;
1378
1357
  }
1379
1358
 
1380
1359
  declare class DeliveriesResource {
@@ -1449,19 +1428,33 @@ declare class DeliveriesResource {
1449
1428
  */
1450
1429
  dashboard(params: DashboardParams): Promise<DashboardStatsResponse>;
1451
1430
  /**
1452
- * 등록된 배송을 취소합니다.
1431
+ * 배송을 취소합니다. 3가지 사용 방식을 지원합니다.
1453
1432
  *
1454
- * **주의**: 등록 7일 이내의 배송만 취소 가능합니다.
1455
- * 7일 이상 경과한 배송은 택배사에서 조회되지 않아 취소할 수 없습니다.
1456
- * 지원하지 않는 택배사의 경우 에러가 반환됩니다.
1433
+ * 1. **historyId만**: 해당 이력의 전체 배송 취소 + 이력 soft delete
1434
+ * 2. **historyId + courierDeliveryIds**: 이력 부분 취소
1435
+ * 3. **courierDeliveryIds만**: 택배사 직접 취소 (이력 무관, 최근 7일 이내)
1457
1436
  *
1458
- * 이력 단위 취소가 필요하면 `client.courier.deliveries.histories.delete()`를 사용하세요.
1437
+ * `historyId`와 `courierDeliveryIds` 하나는 반드시 필요합니다.
1459
1438
  *
1460
- * @param params - 취소 파라미터 (courierDeliveryId 목록)
1461
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정
1439
+ * @param params - 취소 파라미터
1440
+ * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 이력
1462
1441
  * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음
1463
1442
  *
1464
1443
  * @example
1444
+ * // 이력 전체 취소
1445
+ * await client.courier.deliveries.cancel({
1446
+ * courierAccountKey: 'your-key',
1447
+ * historyId: '202603221456_a1b2c',
1448
+ * })
1449
+ *
1450
+ * // 이력 내 부분 취소
1451
+ * await client.courier.deliveries.cancel({
1452
+ * courierAccountKey: 'your-key',
1453
+ * historyId: '202603221456_a1b2c',
1454
+ * courierDeliveryIds: ['7705241632'],
1455
+ * })
1456
+ *
1457
+ * // 직접 취소 (이력 없이)
1465
1458
  * await client.courier.deliveries.cancel({
1466
1459
  * courierAccountKey: 'your-key',
1467
1460
  * courierDeliveryIds: ['7705241632', '7705241633'],
@@ -1622,4 +1615,4 @@ declare class DeliveryAPIClient {
1622
1615
  constructor(options: DeliveryAPIClientOptions);
1623
1616
  }
1624
1617
 
1625
- export { type AccountInquiryItem, type AccountInquiryResponse, AccountsResource, ApiError, type ApiErrorCode, type BatchResultEntry, type BatchResultItem, type BatchResultsRequest as BatchResultsParams, type BatchResultsApiResponse as BatchResultsResponse, type BulkUploadHistoryInfo, type BulkUploadHistoryItemInfo, type BulkUploadItemParams, type BulkUploadParams, type BulkUploadResponse, type BulkUploadResultItem, type BulkUploadStatus, type CancelDeliveriesParams, type CourierAccountDetail, type CourierAccountInfo, CourierDeliveryStatus, type CourierInfoResponse as CourierInfo, CourierResource, type CreateEndpointRequest as CreateEndpointParams, type CreateEndpointApiResponse as CreateEndpointResponse, type CreatePrintSessionParams, type DashboardParams, type DashboardStatsItem, type DashboardStatsResponse, type DashboardSummary, type DeleteHistoryParams, DeliveriesResource, DeliveryAPIClient, type DeliveryAPIClientOptions, type DeliveryStatusFilter, type EndpointListItem as EndpointInfo, type GetCouriersApiResponse as GetCouriersResponse, HistoriesResource, type HistoryDetailParams, type HistoryDetailResponse, type InquiryParams, type ListEndpointsApiResponse as ListEndpointsResponse, type ListHistoriesParams, type ListHistoriesResponse, type ListSubscriptionsRequest as ListSubscriptionsParams, type ListSubscriptionsApiResponse as ListSubscriptionsResponse, PrintResource, type PrintSessionResponse, type RegisterAccountParams, type RegisterAccountResponse, type RegisterTrackingItem as RegisterItem, type RegisterTrackingApiResponse as RegisterResponse, type RotateSecretRequest as RotateSecretParams, type RotateSecretApiResponse as RotateSecretResponse, type SubscriptionDetailApiResponse as SubscriptionDetail, type WebhookTrackingItem as SubscriptionItem, type SubscriptionListItem, type TrackingBatchSummary as SubscriptionSummary, type TrackingCacheInfo as TraceCacheInfo, type TrackingItem as TraceItem, type TrackingItemError as TraceItemError, type TrackingRequest as TraceParams, type TrackingResponse as TraceResponse, type TrackingResult as TraceResult, type TrackingErrorCode, type TrackingProgress, type UnifiedTrackingResponse, type UpdateEndpointRequest as UpdateEndpointParams, type WebhookPayload, type WebhookTrackingItem };
1618
+ export { type AccountInquiryItem, type AccountInquiryResponse, AccountsResource, ApiError, type ApiErrorCode, type BatchResultEntry, type BatchResultItem, type BatchResultsRequest as BatchResultsParams, type BatchResultsApiResponse as BatchResultsResponse, type BulkUploadHistoryInfo, type BulkUploadHistoryItemInfo, type BulkUploadItemParams, type BulkUploadParams, type BulkUploadResponse, type BulkUploadResultItem, type BulkUploadStatus, type CancelDeliveriesParams, type CourierAccountDetail, type CourierAccountInfo, CourierDeliveryStatus, type CourierInfoResponse as CourierInfo, CourierResource, type CreateEndpointRequest as CreateEndpointParams, type CreateEndpointApiResponse as CreateEndpointResponse, type CreatePrintSessionParams, type DashboardParams, type DashboardStatsItem, type DashboardStatsResponse, type DashboardSummary, DeliveriesResource, DeliveryAPIClient, type DeliveryAPIClientOptions, type DeliveryStatusFilter, type EndpointListItem as EndpointInfo, type GetCouriersApiResponse as GetCouriersResponse, HistoriesResource, type HistoryDetailParams, type HistoryDetailResponse, type InquiryParams, type ListEndpointsApiResponse as ListEndpointsResponse, type ListHistoriesParams, type ListHistoriesResponse, type ListSubscriptionsRequest as ListSubscriptionsParams, type ListSubscriptionsApiResponse as ListSubscriptionsResponse, PrintResource, type PrintSessionResponse, type RegisterAccountParams, type RegisterAccountResponse, type RegisterTrackingItem as RegisterItem, type RegisterTrackingApiResponse as RegisterResponse, type RotateSecretRequest as RotateSecretParams, type RotateSecretApiResponse as RotateSecretResponse, type SubscriptionDetailApiResponse as SubscriptionDetail, type WebhookTrackingItem as SubscriptionItem, type SubscriptionListItem, type TrackingBatchSummary as SubscriptionSummary, type TrackingCacheInfo as TraceCacheInfo, type TrackingItem as TraceItem, type TrackingItemError as TraceItemError, type TrackingRequest as TraceParams, type TrackingResponse as TraceResponse, type TrackingResult as TraceResult, type TrackingErrorCode, type TrackingProgress, type UnifiedTrackingResponse, type UpdateEndpointRequest as UpdateEndpointParams, type WebhookPayload, type WebhookTrackingItem };
package/dist/index.d.ts CHANGED
@@ -631,12 +631,21 @@ interface DashboardParams {
631
631
  /** End date (YYYY-MM-DD) */
632
632
  toDate: string;
633
633
  }
634
- /** Parameters for cancelling deliveries */
634
+ /**
635
+ * Parameters for cancelling deliveries
636
+ *
637
+ * Three usage patterns:
638
+ * 1. historyId only → cancel all deliveries in history + soft delete
639
+ * 2. historyId + courierDeliveryIds → partial cancel within history
640
+ * 3. courierDeliveryIds only → direct courier cancel (no history update)
641
+ */
635
642
  interface CancelDeliveriesParams {
636
643
  /** Courier account key */
637
644
  courierAccountKey: string;
638
- /** Courier delivery IDs to cancel */
639
- courierDeliveryIds: string[];
645
+ /** Bulk upload history ID (for history-based cancel) */
646
+ historyId?: string;
647
+ /** Courier delivery IDs to cancel (required if historyId is omitted) */
648
+ courierDeliveryIds?: string[];
640
649
  }
641
650
  /** SDK-facing bulk upload history item (Timestamp → ISO string) */
642
651
  interface BulkUploadHistoryItemInfo {
@@ -715,13 +724,6 @@ interface HistoryDetailResponse {
715
724
  /** Live delivery status for items in this upload (from courier API) */
716
725
  detailItems: AccountInquiryItem[];
717
726
  }
718
- /** Parameters for deleting/cancelling a bulk upload history */
719
- interface DeleteHistoryParams {
720
- /** Courier account key (required for ownership verification) */
721
- courierAccountKey: string;
722
- /** Specific delivery IDs to cancel (omit for full cancel/delete) */
723
- courierDeliveryIds?: string[];
724
- }
725
727
  /** Parameters for creating a print session */
726
728
  interface CreatePrintSessionParams {
727
729
  /** Courier account key */
@@ -1352,29 +1354,6 @@ declare class HistoriesResource {
1352
1354
  * const delivered = detailItems.filter(d => d.isDelivered)
1353
1355
  */
1354
1356
  get(historyId: string, params: HistoryDetailParams): Promise<HistoryDetailResponse>;
1355
- /**
1356
- * 대량 등록 이력을 삭제(취소)합니다.
1357
- *
1358
- * `courierDeliveryIds`를 지정하면 부분 취소, 생략하면 전체 취소(soft delete)입니다.
1359
- * 택배사 API를 호출하여 실제 접수도 취소합니다.
1360
- *
1361
- * @param historyId - 이력 ID
1362
- * @param params - 삭제 파라미터 (courierAccountKey 필수)
1363
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정
1364
- *
1365
- * @example
1366
- * // 전체 취소
1367
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
1368
- * courierAccountKey: 'your-key',
1369
- * })
1370
- *
1371
- * // 부분 취소
1372
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
1373
- * courierAccountKey: 'your-key',
1374
- * courierDeliveryIds: ['7705241632'],
1375
- * })
1376
- */
1377
- delete(historyId: string, params: DeleteHistoryParams): Promise<void>;
1378
1357
  }
1379
1358
 
1380
1359
  declare class DeliveriesResource {
@@ -1449,19 +1428,33 @@ declare class DeliveriesResource {
1449
1428
  */
1450
1429
  dashboard(params: DashboardParams): Promise<DashboardStatsResponse>;
1451
1430
  /**
1452
- * 등록된 배송을 취소합니다.
1431
+ * 배송을 취소합니다. 3가지 사용 방식을 지원합니다.
1453
1432
  *
1454
- * **주의**: 등록 7일 이내의 배송만 취소 가능합니다.
1455
- * 7일 이상 경과한 배송은 택배사에서 조회되지 않아 취소할 수 없습니다.
1456
- * 지원하지 않는 택배사의 경우 에러가 반환됩니다.
1433
+ * 1. **historyId만**: 해당 이력의 전체 배송 취소 + 이력 soft delete
1434
+ * 2. **historyId + courierDeliveryIds**: 이력 부분 취소
1435
+ * 3. **courierDeliveryIds만**: 택배사 직접 취소 (이력 무관, 최근 7일 이내)
1457
1436
  *
1458
- * 이력 단위 취소가 필요하면 `client.courier.deliveries.histories.delete()`를 사용하세요.
1437
+ * `historyId`와 `courierDeliveryIds` 하나는 반드시 필요합니다.
1459
1438
  *
1460
- * @param params - 취소 파라미터 (courierDeliveryId 목록)
1461
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정
1439
+ * @param params - 취소 파라미터
1440
+ * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 이력
1462
1441
  * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음
1463
1442
  *
1464
1443
  * @example
1444
+ * // 이력 전체 취소
1445
+ * await client.courier.deliveries.cancel({
1446
+ * courierAccountKey: 'your-key',
1447
+ * historyId: '202603221456_a1b2c',
1448
+ * })
1449
+ *
1450
+ * // 이력 내 부분 취소
1451
+ * await client.courier.deliveries.cancel({
1452
+ * courierAccountKey: 'your-key',
1453
+ * historyId: '202603221456_a1b2c',
1454
+ * courierDeliveryIds: ['7705241632'],
1455
+ * })
1456
+ *
1457
+ * // 직접 취소 (이력 없이)
1465
1458
  * await client.courier.deliveries.cancel({
1466
1459
  * courierAccountKey: 'your-key',
1467
1460
  * courierDeliveryIds: ['7705241632', '7705241633'],
@@ -1622,4 +1615,4 @@ declare class DeliveryAPIClient {
1622
1615
  constructor(options: DeliveryAPIClientOptions);
1623
1616
  }
1624
1617
 
1625
- export { type AccountInquiryItem, type AccountInquiryResponse, AccountsResource, ApiError, type ApiErrorCode, type BatchResultEntry, type BatchResultItem, type BatchResultsRequest as BatchResultsParams, type BatchResultsApiResponse as BatchResultsResponse, type BulkUploadHistoryInfo, type BulkUploadHistoryItemInfo, type BulkUploadItemParams, type BulkUploadParams, type BulkUploadResponse, type BulkUploadResultItem, type BulkUploadStatus, type CancelDeliveriesParams, type CourierAccountDetail, type CourierAccountInfo, CourierDeliveryStatus, type CourierInfoResponse as CourierInfo, CourierResource, type CreateEndpointRequest as CreateEndpointParams, type CreateEndpointApiResponse as CreateEndpointResponse, type CreatePrintSessionParams, type DashboardParams, type DashboardStatsItem, type DashboardStatsResponse, type DashboardSummary, type DeleteHistoryParams, DeliveriesResource, DeliveryAPIClient, type DeliveryAPIClientOptions, type DeliveryStatusFilter, type EndpointListItem as EndpointInfo, type GetCouriersApiResponse as GetCouriersResponse, HistoriesResource, type HistoryDetailParams, type HistoryDetailResponse, type InquiryParams, type ListEndpointsApiResponse as ListEndpointsResponse, type ListHistoriesParams, type ListHistoriesResponse, type ListSubscriptionsRequest as ListSubscriptionsParams, type ListSubscriptionsApiResponse as ListSubscriptionsResponse, PrintResource, type PrintSessionResponse, type RegisterAccountParams, type RegisterAccountResponse, type RegisterTrackingItem as RegisterItem, type RegisterTrackingApiResponse as RegisterResponse, type RotateSecretRequest as RotateSecretParams, type RotateSecretApiResponse as RotateSecretResponse, type SubscriptionDetailApiResponse as SubscriptionDetail, type WebhookTrackingItem as SubscriptionItem, type SubscriptionListItem, type TrackingBatchSummary as SubscriptionSummary, type TrackingCacheInfo as TraceCacheInfo, type TrackingItem as TraceItem, type TrackingItemError as TraceItemError, type TrackingRequest as TraceParams, type TrackingResponse as TraceResponse, type TrackingResult as TraceResult, type TrackingErrorCode, type TrackingProgress, type UnifiedTrackingResponse, type UpdateEndpointRequest as UpdateEndpointParams, type WebhookPayload, type WebhookTrackingItem };
1618
+ export { type AccountInquiryItem, type AccountInquiryResponse, AccountsResource, ApiError, type ApiErrorCode, type BatchResultEntry, type BatchResultItem, type BatchResultsRequest as BatchResultsParams, type BatchResultsApiResponse as BatchResultsResponse, type BulkUploadHistoryInfo, type BulkUploadHistoryItemInfo, type BulkUploadItemParams, type BulkUploadParams, type BulkUploadResponse, type BulkUploadResultItem, type BulkUploadStatus, type CancelDeliveriesParams, type CourierAccountDetail, type CourierAccountInfo, CourierDeliveryStatus, type CourierInfoResponse as CourierInfo, CourierResource, type CreateEndpointRequest as CreateEndpointParams, type CreateEndpointApiResponse as CreateEndpointResponse, type CreatePrintSessionParams, type DashboardParams, type DashboardStatsItem, type DashboardStatsResponse, type DashboardSummary, DeliveriesResource, DeliveryAPIClient, type DeliveryAPIClientOptions, type DeliveryStatusFilter, type EndpointListItem as EndpointInfo, type GetCouriersApiResponse as GetCouriersResponse, HistoriesResource, type HistoryDetailParams, type HistoryDetailResponse, type InquiryParams, type ListEndpointsApiResponse as ListEndpointsResponse, type ListHistoriesParams, type ListHistoriesResponse, type ListSubscriptionsRequest as ListSubscriptionsParams, type ListSubscriptionsApiResponse as ListSubscriptionsResponse, PrintResource, type PrintSessionResponse, type RegisterAccountParams, type RegisterAccountResponse, type RegisterTrackingItem as RegisterItem, type RegisterTrackingApiResponse as RegisterResponse, type RotateSecretRequest as RotateSecretParams, type RotateSecretApiResponse as RotateSecretResponse, type SubscriptionDetailApiResponse as SubscriptionDetail, type WebhookTrackingItem as SubscriptionItem, type SubscriptionListItem, type TrackingBatchSummary as SubscriptionSummary, type TrackingCacheInfo as TraceCacheInfo, type TrackingItem as TraceItem, type TrackingItemError as TraceItemError, type TrackingRequest as TraceParams, type TrackingResponse as TraceResponse, type TrackingResult as TraceResult, type TrackingErrorCode, type TrackingProgress, type UnifiedTrackingResponse, type UpdateEndpointRequest as UpdateEndpointParams, type WebhookPayload, type WebhookTrackingItem };
package/dist/index.js CHANGED
@@ -526,39 +526,6 @@ var HistoriesResource = class {
526
526
  this.auth
527
527
  );
528
528
  }
529
- /**
530
- * 대량 등록 이력을 삭제(취소)합니다.
531
- *
532
- * `courierDeliveryIds`를 지정하면 부분 취소, 생략하면 전체 취소(soft delete)입니다.
533
- * 택배사 API를 호출하여 실제 접수도 취소합니다.
534
- *
535
- * @param historyId - 이력 ID
536
- * @param params - 삭제 파라미터 (courierAccountKey 필수)
537
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정
538
- *
539
- * @example
540
- * // 전체 취소
541
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
542
- * courierAccountKey: 'your-key',
543
- * })
544
- *
545
- * // 부분 취소
546
- * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {
547
- * courierAccountKey: 'your-key',
548
- * courierDeliveryIds: ['7705241632'],
549
- * })
550
- */
551
- async delete(historyId, params) {
552
- await request(
553
- `/v1/courier/deliveries/bulk-upload-histories/${historyId}`,
554
- {
555
- method: "DELETE",
556
- params: { courierAccountKey: params.courierAccountKey },
557
- body: params.courierDeliveryIds ? { courierDeliveryIds: params.courierDeliveryIds } : void 0
558
- },
559
- this.auth
560
- );
561
- }
562
529
  };
563
530
 
564
531
  // src/resources/deliveries.ts
@@ -659,19 +626,33 @@ var DeliveriesResource = class {
659
626
  );
660
627
  }
661
628
  /**
662
- * 등록된 배송을 취소합니다.
629
+ * 배송을 취소합니다. 3가지 사용 방식을 지원합니다.
663
630
  *
664
- * **주의**: 등록 7일 이내의 배송만 취소 가능합니다.
665
- * 7일 이상 경과한 배송은 택배사에서 조회되지 않아 취소할 수 없습니다.
666
- * 지원하지 않는 택배사의 경우 에러가 반환됩니다.
631
+ * 1. **historyId만**: 해당 이력의 전체 배송 취소 + 이력 soft delete
632
+ * 2. **historyId + courierDeliveryIds**: 이력 부분 취소
633
+ * 3. **courierDeliveryIds만**: 택배사 직접 취소 (이력 무관, 최근 7일 이내)
667
634
  *
668
- * 이력 단위 취소가 필요하면 `client.courier.deliveries.histories.delete()`를 사용하세요.
635
+ * `historyId`와 `courierDeliveryIds` 하나는 반드시 필요합니다.
669
636
  *
670
- * @param params - 취소 파라미터 (courierDeliveryId 목록)
671
- * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정
637
+ * @param params - 취소 파라미터
638
+ * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 이력
672
639
  * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음
673
640
  *
674
641
  * @example
642
+ * // 이력 전체 취소
643
+ * await client.courier.deliveries.cancel({
644
+ * courierAccountKey: 'your-key',
645
+ * historyId: '202603221456_a1b2c',
646
+ * })
647
+ *
648
+ * // 이력 내 부분 취소
649
+ * await client.courier.deliveries.cancel({
650
+ * courierAccountKey: 'your-key',
651
+ * historyId: '202603221456_a1b2c',
652
+ * courierDeliveryIds: ['7705241632'],
653
+ * })
654
+ *
655
+ * // 직접 취소 (이력 없이)
675
656
  * await client.courier.deliveries.cancel({
676
657
  * courierAccountKey: 'your-key',
677
658
  * courierDeliveryIds: ['7705241632', '7705241633'],
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../shared-types/src/courier/CourierDeliveryStatus.ts","../src/http.ts","../src/resources/tracking.ts","../src/resources/endpoints.ts","../src/resources/subscriptions.ts","../src/resources/webhooks.ts","../src/resources/accounts.ts","../src/resources/histories.ts","../src/resources/deliveries.ts","../src/resources/print.ts","../src/resources/courier.ts","../src/client.ts","../src/types.ts"],"sourcesContent":["/**\n * 택배 배송 상태 코드\n *\n * 모든 택배사의 상태를 하나의 통합 코드로 정규화합니다.\n */\nexport enum CourierDeliveryStatus {\n // 접수/준비 단계\n PENDING = 'PENDING', // 접수 대기\n REGISTERED = 'REGISTERED', // 접수 완료\n PICKUP_READY = 'PICKUP_READY', // 집하 준비\n\n // 배송 진행 단계\n PICKED_UP = 'PICKED_UP', // 집하 완료\n IN_TRANSIT = 'IN_TRANSIT', // 배송 중\n OUT_FOR_DELIVERY = 'OUT_FOR_DELIVERY', // 배송 출발\n\n // 완료 단계\n DELIVERED = 'DELIVERED', // 배송 완료\n\n // 예외 상태\n FAILED = 'FAILED', // 배송 실패\n RETURNED = 'RETURNED', // 반송\n CANCELLED = 'CANCELLED', // 취소\n HOLD = 'HOLD', // 보류\n UNKNOWN = 'UNKNOWN', // 알 수 없음\n}","import type { ApiErrorCode } from './types'\n\nexport const BASE_URL = 'https://api.deliveryapi.co.kr'\n\n/** 서버가 반환하는 공통 응답 포맷 (SDK 내부 파싱용) */\ninterface ApiResponse<T = unknown> {\n isSuccess: boolean\n data?: T\n errorCode?: ApiErrorCode\n error?: string\n message?: string\n}\n\n/**\n * API 호출 실패 시 throw 되는 에러 클래스\n *\n * @example\n * try {\n * await client.tracking.trace({ items: [...] })\n * } catch (err) {\n * if (err instanceof ApiError) {\n * console.error(err.code) // 'RATE_LIMITED'\n * console.error(err.status) // 429\n * console.error(err.message) // '요청 횟수가 플랜 한도를 초과했습니다'\n * }\n * }\n */\nexport class ApiError extends Error {\n /**\n * 기계가 읽는 에러 코드\n *\n * 이 값을 기준으로 분기 처리하세요.\n */\n readonly code: ApiErrorCode | string\n /** HTTP 상태 코드 */\n readonly status: number\n /**\n * 에러 상세 데이터 (에러 종류에 따라 포함될 수 있음)\n *\n * 예) `INVALID_ITEMS` 에러 시 잘못된 항목 목록:\n * `[{ courierCode, trackingNumber, errorCode }]`\n */\n readonly data?: unknown\n\n constructor(code: ApiErrorCode | string, message: string, status: number, data?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.code = code\n this.status = status\n this.data = data\n }\n}\n\n/** API Key 인증 정보 */\nexport interface AuthCredentials {\n apiKey: string\n secretKey: string\n}\n\n/** 내부 HTTP 요청 함수 */\nexport async function request<T>(\n path: string,\n options: { method?: string; body?: unknown; params?: Record<string, string | number | boolean | undefined> },\n auth: AuthCredentials,\n): Promise<T> {\n let url = `${BASE_URL}${path}`\n\n if (options.params) {\n const qs = Object.entries(options.params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&')\n if (qs) url += `?${qs}`\n }\n\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${auth.apiKey}:${auth.secretKey}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n })\n\n const json = (await res.json()) as ApiResponse<T>\n\n if (!json.isSuccess) {\n throw new ApiError(\n json.errorCode ?? 'INTERNAL_ERROR',\n json.error ?? json.message ?? `HTTP ${res.status}`,\n res.status,\n json.data,\n )\n }\n\n return json.data as T\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { GetCouriersResponse, TraceResponse } from '../types'\n\nexport class TrackingResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 지원 택배사 목록을 조회합니다.\n *\n * 택배사 코드(`trackingApiCode`)는 `trace()`의 `courierCode` 파라미터에 사용합니다.\n *\n * @example\n * const { couriers } = await client.tracking.getCouriers()\n * // couriers: [{ trackingApiCode: 'cj', displayName: 'CJ대한통운' }, ...]\n */\n async getCouriers(): Promise<GetCouriersResponse> {\n return request<GetCouriersResponse>(\n '/v1/tracking/couriers',\n {},\n this.auth,\n )\n }\n\n /**\n * 송장번호로 배송 정보를 조회합니다.\n *\n * - 여러 건을 배열로 전달할 수 있습니다.\n * - 결과는 요청 순서와 동일한 인덱스로 반환됩니다.\n * - 일부 아이템이 실패해도 전체 요청이 실패하지 않습니다. `results[].success`로 건별 확인하세요.\n *\n * **과금 안내**: `NOT_FOUND` 에러는 과금됩니다. `results[].error.billable`로 확인하세요.\n *\n * @throws {ApiError} API 인증 실패, 요청 한도 초과 등 전체 요청 실패 시\n *\n * @example\n * const { results } = await client.tracking.trace({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' },\n * { courierCode: 'lotte', trackingNumber: '9876543210', clientId: 'order_002' },\n * ],\n * })\n *\n * for (const result of results) {\n * if (result.success) {\n * console.log(result.data?.deliveryStatus) // 'DELIVERED'\n * } else {\n * console.warn(result.error?.code) // 'NOT_FOUND'\n * }\n * }\n */\n async trace(params: {\n items: { courierCode: string; trackingNumber: string; clientId?: string }[]\n includeProgresses?: boolean\n }): Promise<TraceResponse> {\n return request<TraceResponse>(\n '/v1/tracking/trace',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n CreateEndpointResponse,\n ListEndpointsResponse,\n RotateSecretResponse,\n} from '../types'\n\nexport class EndpointsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 웹훅 엔드포인트를 등록합니다.\n *\n * 등록 시 서버에서 해당 URL로 테스트 POST 요청을 전송하여 연결 가능 여부를 검증합니다.\n * 응답의 `webhookSecret`은 **이 응답에서만 평문으로 반환**됩니다.\n * 분실 시 `rotateSecret()`으로 재발급해야 합니다.\n *\n * @throws {ApiError} `WEBHOOK_ENDPOINT_LIMIT` — 엔드포인트 등록 한도 초과\n * @throws {ApiError} `WEBHOOK_ENDPOINT_UNREACHABLE` — URL 검증 실패 (서버에서 테스트 POST 전송 시 200 응답 없음)\n *\n * @example\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * console.log(endpoint.endpointId) // 'ep_xxxx'\n * console.log(endpoint.webhookSecret) // 반드시 저장하세요!\n */\n async create(params: {\n /** 웹훅을 수신할 URL (`https://` 필수) */\n url: string\n /** 엔드포인트 이름 (관리용) */\n name: string\n /** 서명 시크릿 직접 지정 (미제공 시 서버 자동 생성, 최소 5자) */\n webhookSecret?: string\n }): Promise<CreateEndpointResponse> {\n return request<CreateEndpointResponse>(\n '/v1/webhooks/endpoints',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 웹훅 엔드포인트 목록을 조회합니다.\n *\n * @example\n * const { endpoints } = await client.webhooks.endpoints.list()\n * const active = endpoints.filter(ep => ep.status === 'active')\n * console.log(active[0].endpointId) // 'ep_xxxx'\n */\n async list(): Promise<ListEndpointsResponse> {\n return request<ListEndpointsResponse>(\n '/v1/webhooks/endpoints',\n {},\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트 이름을 수정합니다.\n *\n * URL은 변경할 수 없습니다. URL을 변경해야 한다면 삭제 후 재등록하세요.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.update('ep_xxxx', { name: '스테이징 서버' })\n */\n async update(endpointId: string, params: {\n /** 새 엔드포인트 이름 */\n name: string\n }): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'PUT', body: params },\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트를 삭제합니다.\n *\n * 해당 엔드포인트에 연결된 구독도 함께 삭제됩니다 (cascade).\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.delete('ep_xxxx')\n */\n async delete(endpointId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 웹훅 서명 시크릿을 재발급합니다.\n *\n * 기존 시크릿은 즉시 무효화됩니다.\n * 새 시크릿은 **이 응답에서만 평문으로 반환**됩니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * const { webhookSecret } = await client.webhooks.endpoints.rotateSecret('ep_xxxx')\n * console.log(webhookSecret) // 새 시크릿 — 반드시 저장하세요!\n */\n async rotateSecret(endpointId: string, params?: {\n /** 새 시크릿 직접 지정 (미제공 시 서버 자동 생성) */\n webhookSecret?: string\n }): Promise<RotateSecretResponse> {\n return request<RotateSecretResponse>(\n `/v1/webhooks/endpoints/${endpointId}/rotate`,\n { method: 'POST', body: params ?? {} },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BatchResultsResponse,\n ListSubscriptionsParams,\n ListSubscriptionsResponse,\n RegisterResponse,\n SubscriptionDetail,\n} from '../types'\n\nexport class SubscriptionsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배 추적 구독을 등록합니다.\n *\n * ## 구독형 (`recurring: true`)\n * 배송 완료 또는 최대 14일까지 주기적으로 폴링합니다.\n * - `endpointId` 있음: 상태가 변경될 때마다 웹훅(`tracking.polled`)을 발송하고, 배송 완료 또는 기간 만료 시 `tracking.completed` 웹훅을 발송 후 자동 종료\n * - `endpointId` 없음: 웹훅 없이 폴링만 수행. `get(requestId)`으로 현재 상태를 직접 조회\n *\n * ## 일회성 (`recurring: false`)\n * 등록 즉시 1회 크롤 후 종료합니다. 폴링을 반복하지 않습니다.\n * - `endpointId` 있음: 크롤 완료 시 웹훅 1회 발송\n * - `endpointId` 없음: 웹훅 없이 크롤만 수행. `get(requestId)`으로 결과를 직접 조회\n *\n * @example\n * // 구독형 — 배송 완료까지 상태 변경 시마다 웹훅 수신\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n * // sub.requestId로 구독 관리 (cancel, get)\n *\n * @example\n * // 일회성 — 웹훅 없이 즉시 크롤 후 결과 직접 조회\n * const req = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'lotte', trackingNumber: '9876543210' }],\n * recurring: false,\n * })\n * const detail = await client.webhooks.subscriptions.get(req.requestId)\n * console.log(detail.items[0].currentStatus) // 'DELIVERED'\n */\n async register(params:\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 반복 구독. 배송 완료 또는 14일까지 주기적으로 폴링. */\n recurring: true\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 상태 변경마다 웹훅 발송.\n * 생략 시 웹훅 없이 폴링만 수행하며 `get(requestId)`으로 결과를 직접 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 일회성. 등록 즉시 1회 크롤 후 종료. `endpointId` 없으면 `get(requestId)`으로 결과 조회. */\n recurring: false\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 크롤 완료 후 웹훅 1회 발송.\n * 생략 시 웹훅 없이 크롤만 수행하며 `get(requestId)`으로 결과를 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n ): Promise<RegisterResponse> {\n return request<RegisterResponse>(\n '/v1/webhooks/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 구독 목록을 조회합니다.\n *\n * 커서 기반 페이지네이션을 지원합니다.\n * 다음 페이지가 있으면 응답의 `nextCursor`를 다음 호출의 `cursor` 파라미터로 전달하세요.\n *\n * @example\n * let cursor: string | undefined\n * do {\n * const page = await client.webhooks.subscriptions.list({ cursor, limit: 50 })\n * for (const sub of page.subscriptions) {\n * console.log(sub.requestId, sub.isActive)\n * }\n * cursor = page.nextCursor\n * } while (cursor)\n */\n async list(params?: ListSubscriptionsParams): Promise<ListSubscriptionsResponse> {\n return request<ListSubscriptionsResponse>(\n '/v1/webhooks/subscriptions',\n { params: { cursor: params?.cursor, limit: params?.limit, status: params?.status, from: params?.from, to: params?.to } },\n this.auth,\n )\n }\n\n /**\n * 구독 상세 정보를 조회합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * const detail = await client.webhooks.subscriptions.get('req_xxxx')\n * for (const item of detail.items) {\n * console.log(item.trackingNumber, item.currentStatus)\n * }\n */\n async get(requestId: string): Promise<SubscriptionDetail> {\n return request<SubscriptionDetail>(\n `/v1/webhooks/subscriptions/${requestId}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 구독을 취소합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * await client.webhooks.subscriptions.cancel('req_xxxx')\n */\n async cancel(requestId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/subscriptions/${requestId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 여러 송장번호의 최신 배송 정보를 한 번에 조회합니다.\n *\n * 해당 계정에 등록된 구독 중 일치하는 아이템의 최신 상태를 반환합니다.\n *\n * @example\n * const { results } = await client.webhooks.subscriptions.batchResults({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1111111111' },\n * { courierCode: 'lotte', trackingNumber: '2222222222' },\n * ],\n * })\n * for (const r of results) {\n * console.log(r.currentStatus, r.isDelivered)\n * }\n */\n async batchResults(params: {\n items: { courierCode: string; trackingNumber: string }[]\n }): Promise<BatchResultsResponse> {\n return request<BatchResultsResponse>(\n '/v1/webhooks/results',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { EndpointsResource } from './endpoints'\nimport { SubscriptionsResource } from './subscriptions'\n\n/**\n * 웹훅 리소스\n *\n * - `endpoints` — 웹훅 수신 URL 등록/관리\n * - `subscriptions` — 택배 추적 구독 등록/관리\n *\n * @example\n * const client = new DeliveryAPIClient({ apiKey: '...', secretKey: '...' })\n *\n * // 1. 엔드포인트 등록\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * // ⚠️ endpoint.webhookSecret 을 안전하게 보관하세요!\n *\n * // 2. 택배 추적 구독\n * const sub = await client.webhooks.subscriptions.register({\n * endpointId: endpoint.endpointId,\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * })\n *\n * // 3. 구독 상태 조회\n * const detail = await client.webhooks.subscriptions.get(sub.requestId)\n */\nexport class WebhooksResource {\n /**\n * 웹훅 엔드포인트 관리\n *\n * - `create()` — 수신 URL 등록\n * - `list()` — 목록 조회\n * - `update()` — 이름 수정\n * - `delete()` — 삭제\n * - `rotateSecret()` — 서명 시크릿 재발급\n */\n readonly endpoints: EndpointsResource\n\n /**\n * 웹훅 구독 관리\n *\n * - `register()` — 택배 추적 구독 등록\n * - `list()` — 구독 목록\n * - `get()` — 구독 상세\n * - `cancel()` — 구독 취소\n * - `batchResults()` — 다건 최신 상태 조회\n */\n readonly subscriptions: SubscriptionsResource\n\n constructor(auth: AuthCredentials) {\n this.endpoints = new EndpointsResource(auth)\n this.subscriptions = new SubscriptionsResource(auth)\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n} from '../types'\n\nexport class AccountsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배사 계정을 등록합니다.\n *\n * 롯데택배, CJ대한통운 계정을 등록할 수 있습니다.\n * CJ대한통운은 2FA(OTP) 인증이 필요할 수 있으며, 이 경우 `COURIER_OTP_REQUIRED` 에러가 발생합니다.\n *\n * @param params - 계정 등록 파라미터\n * @returns 등록된 계정 정보 (courierAccountKey 포함)\n * @throws {ApiError} COURIER_OTP_REQUIRED — CJ 계정 OTP 인증 필요\n * @throws {ApiError} COURIER_AUTH_FAILED — 계정 인증 실패 (아이디/비밀번호 오류)\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-lotte-id',\n * accountPassword: 'my-password',\n * accountName: '메인 롯데 계정',\n * })\n * console.log(account.courierAccountKey) // 이후 API 호출에 사용\n */\n async register(params: RegisterAccountParams): Promise<RegisterAccountResponse> {\n return request<RegisterAccountResponse>(\n '/v1/courier/accounts/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 택배사 계정 목록을 조회합니다.\n *\n * @returns 계정 목록 (courierAccountKey, providerId, isActive 등)\n *\n * @example\n * const accounts = await client.courier.accounts.list()\n * const active = accounts.filter(a => a.isActive)\n * console.log(active[0].courierAccountKey)\n */\n async list(): Promise<CourierAccountInfo[]> {\n return request<CourierAccountInfo[]>(\n '/v1/courier/accounts',\n {},\n this.auth,\n )\n }\n\n /**\n * 특정 택배사 계정의 상세 정보를 조회합니다.\n *\n * 목록 조회와 달리 `accountPassword` 필드가 포함됩니다 (항상 마스킹된 값).\n * `expiresAt` 필드는 포함되지 않습니다.\n *\n * @param accountKey - 조회할 계정의 courierAccountKey\n * @returns 계정 상세 정보\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const detail = await client.courier.accounts.get('your-account-key')\n * console.log(detail.accountId) // 'my-lotte-id'\n * console.log(detail.accountPassword) // '(암호화하여 저장중)'\n */\n async get(accountKey: string): Promise<CourierAccountDetail> {\n return request<CourierAccountDetail>(\n `/v1/courier/accounts/${accountKey}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 택배사 계정을 삭제합니다.\n *\n * @param accountKey - 삭제할 계정의 courierAccountKey\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * await client.courier.accounts.delete('your-account-key')\n */\n async delete(accountKey: string): Promise<void> {\n await request<unknown>(\n `/v1/courier/accounts/${accountKey}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n DeleteHistoryParams,\n} from '../types'\n\nexport class HistoriesResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 대량 등록 이력 목록을 조회합니다.\n *\n * @param params - 조회 파라미터 (providerId 필수)\n * @returns 이력 목록 (histories 배열)\n *\n * @example\n * const { histories } = await client.courier.deliveries.histories.list({\n * providerId: 'lotte',\n * courierAccountKey: 'your-key',\n * limit: 20,\n * })\n * const completed = histories.filter(h => h.status === 'completed')\n */\n async list(params: ListHistoriesParams): Promise<ListHistoriesResponse> {\n return request<ListHistoriesResponse>(\n '/v1/courier/deliveries/bulk-upload-histories',\n {\n method: 'GET',\n params: {\n providerId: params.providerId,\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n limit: params.limit,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 대량 등록 이력의 상세 정보를 조회합니다.\n *\n * 택배사 API를 호출하여 실시간 배송 상태를 함께 반환합니다.\n *\n * @param historyId - 이력 ID\n * @param params - 조회 파라미터 (courierAccountKey 필수)\n * @returns 이력 정보 + 실시간 배송 상태 (detailItems)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정\n *\n * @example\n * const { history, detailItems } = await client.courier.deliveries.histories.get(\n * '202603221456_a1b2c',\n * { courierAccountKey: 'your-key' },\n * )\n * const delivered = detailItems.filter(d => d.isDelivered)\n */\n async get(historyId: string, params: HistoryDetailParams): Promise<HistoryDetailResponse> {\n return request<HistoryDetailResponse>(\n `/v1/courier/deliveries/bulk-upload-histories/${historyId}/detail`,\n {\n method: 'GET',\n params: { courierAccountKey: params.courierAccountKey },\n },\n this.auth,\n )\n }\n\n /**\n * 대량 등록 이력을 삭제(취소)합니다.\n *\n * `courierDeliveryIds`를 지정하면 부분 취소, 생략하면 전체 취소(soft delete)입니다.\n * 택배사 API를 호출하여 실제 접수도 취소합니다.\n *\n * @param historyId - 이력 ID\n * @param params - 삭제 파라미터 (courierAccountKey 필수)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정\n *\n * @example\n * // 전체 취소\n * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {\n * courierAccountKey: 'your-key',\n * })\n *\n * // 부분 취소\n * await client.courier.deliveries.histories.delete('202603221456_a1b2c', {\n * courierAccountKey: 'your-key',\n * courierDeliveryIds: ['7705241632'],\n * })\n */\n async delete(historyId: string, params: DeleteHistoryParams): Promise<void> {\n await request<unknown>(\n `/v1/courier/deliveries/bulk-upload-histories/${historyId}`,\n {\n method: 'DELETE',\n params: { courierAccountKey: params.courierAccountKey },\n body: params.courierDeliveryIds\n ? { courierDeliveryIds: params.courierDeliveryIds }\n : undefined,\n },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BulkUploadParams,\n BulkUploadResponse,\n InquiryParams,\n AccountInquiryResponse,\n DashboardParams,\n DashboardStatsResponse,\n CancelDeliveriesParams,\n} from '../types'\nimport { HistoriesResource } from './histories'\n\nexport class DeliveriesResource {\n /** 대량 등록 이력 관리 */\n readonly histories: HistoriesResource\n\n constructor(private readonly auth: AuthCredentials) {\n this.histories = new HistoriesResource(auth)\n }\n\n /**\n * 택배를 대량 등록합니다. 최대 1,000건까지 한 번에 등록 가능합니다.\n *\n * 등록 직후에는 관리번호(courierDeliveryId)만 발급됩니다.\n * 송장번호(trackingNumber)는 **송장 출력 시점에 발급**됩니다.\n *\n * HTTP 200으로 응답하며, `success`는 전체 성공 여부입니다.\n * 부분 실패가 가능하므로 반드시 `results[].success`로 개별 확인하세요.\n *\n * @param params - 대량 등록 요청 파라미터\n * @returns 등록 결과 (부분 성공 포함, results[].success로 개별 확인)\n * @throws {ApiError} RATE_LIMITED — 요청 한도 초과\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const result = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: 'your-key',\n * items: [{\n * clientOrderId: 'ORD-001',\n * receiverName: '홍길동',\n * receiverPhone1: '01012345678',\n * receiverAddress: '서울특별시 중구 세종대로 110',\n * productName: '테스트 상품',\n * quantity: 1,\n * }],\n * })\n * const failed = result.results.filter(r => !r.success)\n * const ids = result.results.filter(r => r.success).map(r => r.courierDeliveryId)\n */\n async bulkUpload(params: BulkUploadParams): Promise<BulkUploadResponse> {\n return request<BulkUploadResponse>(\n '/v1/courier/deliveries/bulk-upload',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 목록을 조회합니다.\n *\n * 택배사 API를 실시간으로 호출하여 최신 배송 상태를 반환합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 목록 (items) + 요약 통계 (summary)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const result = await client.courier.deliveries.inquiry({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(result.summary.delivered) // 배송 완료 건수\n * const pending = result.items.filter(i => i.deliveryStatus === 'PENDING')\n */\n async inquiry(params: InquiryParams): Promise<AccountInquiryResponse> {\n return request<AccountInquiryResponse>(\n '/v1/courier/deliveries/inquiry',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 통계(대시보드)를 조회합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 통계 (items: 상세 행, summary: 요약)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const stats = await client.courier.deliveries.dashboard({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(stats.summary.totalCount) // 전체 건수\n * console.log(stats.summary.delivered) // 배송 완료 건수\n */\n async dashboard(params: DashboardParams): Promise<DashboardStatsResponse> {\n return request<DashboardStatsResponse>(\n '/v1/courier/deliveries/dashboard',\n {\n method: 'GET',\n params: {\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 등록된 배송을 취소합니다.\n *\n * **주의**: 등록 후 7일 이내의 배송만 취소 가능합니다.\n * 7일 이상 경과한 배송은 택배사에서 조회되지 않아 취소할 수 없습니다.\n * 지원하지 않는 택배사의 경우 에러가 반환됩니다.\n *\n * 이력 단위 취소가 필요하면 `client.courier.deliveries.histories.delete()`를 사용하세요.\n *\n * @param params - 취소 파라미터 (courierDeliveryId 목록)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음\n *\n * @example\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * courierDeliveryIds: ['7705241632', '7705241633'],\n * })\n */\n async cancel(params: CancelDeliveriesParams): Promise<void> {\n await request<unknown>(\n '/v1/courier/deliveries/cancel',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { CreatePrintSessionParams, PrintSessionResponse } from '../types'\n\nexport class PrintResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 송장 출력 세션을 생성합니다.\n *\n * 세션 ID로 출력 페이지(`https://print.deliveryapi.co.kr?session={sessionId}`)에 접속할 수 있습니다.\n * 세션은 **10분 유효, 1회용**입니다. OZ Viewer 설치가 필요합니다.\n *\n * `courierTrackingIds` 또는 `bulkUploadHistoryId` 중 하나를 지정하세요.\n *\n * **중요**: 대부분의 택배사에서 송장번호(trackingNumber)는 이 출력 시점에 발급됩니다.\n * 출력 후 `client.courier.deliveries.inquiry()`로 발급된 송장번호를 확인하세요.\n *\n * @param params - 출력 세션 생성 파라미터\n * @returns 세션 정보 (sessionId, expiresAt)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 배송 ID\n *\n * @example\n * // 개별 ID로 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * courierTrackingIds: ['7705241632', '7705241633'],\n * })\n * // 브라우저에서 출력 페이지 열기\n * window.open(`https://print.deliveryapi.co.kr?session=${session.sessionId}`)\n *\n * @example\n * // 이력 전체 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * bulkUploadHistoryId: '202603221456_a1b2c',\n * })\n */\n async createSession(params: CreatePrintSessionParams): Promise<PrintSessionResponse> {\n return request<PrintSessionResponse>(\n '/v1/courier/print/sessions',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { AccountsResource } from './accounts'\nimport { DeliveriesResource } from './deliveries'\nimport { PrintResource } from './print'\n\n/**\n * 택배 계정 서비스 리소스\n *\n * 택배사 계정을 등록하고, 택배를 대량 등록·조회·취소하며, 송장을 출력합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * @example\n * // 전체 플로우: 계정 등록 → 대량 등록 → 송장 출력 → 배송 추적\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-id',\n * accountPassword: 'my-password',\n * })\n *\n * const upload = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: account.courierAccountKey,\n * items: [{ clientOrderId: 'ORD-001', receiverName: '홍길동', ... }],\n * })\n *\n * const session = await client.courier.print.createSession({\n * courierAccountKey: account.courierAccountKey,\n * providerId: 'lotte',\n * courierTrackingIds: upload.results.filter(r => r.success).map(r => r.courierDeliveryId!),\n * })\n * // 출력 후 trackingNumber가 발급됨 → inquiry로 확인 → webhooks로 추적\n */\nexport class CourierResource {\n /** 택배사 계정 관리 (등록, 조회, 삭제) */\n readonly accounts: AccountsResource\n /** 배송 관리 (대량 등록, 조회, 대시보드, 취소, 이력) */\n readonly deliveries: DeliveriesResource\n /** 송장 출력 (세션 생성) */\n readonly print: PrintResource\n\n constructor(auth: AuthCredentials) {\n this.accounts = new AccountsResource(auth)\n this.deliveries = new DeliveriesResource(auth)\n this.print = new PrintResource(auth)\n }\n}\n","import { BASE_URL } from './http'\nimport { TrackingResource } from './resources/tracking'\nimport { WebhooksResource } from './resources/webhooks'\nimport { CourierResource } from './resources/courier'\n\n/** `DeliveryAPIClient` 생성 옵션 */\nexport interface DeliveryAPIClientOptions {\n /**\n * API Key\n *\n * 대시보드에서 발급한 API Key입니다.\n */\n apiKey: string\n /**\n * Secret Key\n *\n * API Key에 연결된 Secret Key입니다.\n * 클라이언트 사이드(브라우저)에 노출되지 않도록 주의하세요.\n */\n secretKey: string\n}\n\n/**\n * DeliveryAPI 클라이언트\n *\n * API Key + Secret Key로 인증합니다.\n * 모든 요청은 `Authorization: Bearer {apiKey}:{secretKey}` 헤더로 전송됩니다.\n *\n * @example\n * import { DeliveryAPIClient } from 'deliveryapi'\n *\n * const client = new DeliveryAPIClient({\n * apiKey: 'pk_live_xxxx',\n * secretKey: 'sk_live_xxxx',\n * })\n *\n * // 택배 조회\n * const { results } = await client.tracking.trace({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * })\n *\n * // 웹훅 구독\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n */\nexport class DeliveryAPIClient {\n /**\n * 택배 조회 API\n *\n * 송장번호로 배송 정보를 즉시 조회합니다.\n *\n * - `getCouriers()` — 지원 택배사 목록\n * - `trace()` — 송장번호 조회 (단건/다건)\n */\n readonly tracking: TrackingResource\n\n /**\n * 웹훅 API\n *\n * 배송 상태 변경 시 웹훅으로 알림을 받습니다.\n *\n * **`webhooks.endpoints`** — 수신 URL 등록/관리\n * **`webhooks.subscriptions`** — 택배 추적 구독 등록/관리\n */\n readonly webhooks: WebhooksResource\n\n /**\n * 택배 계정 서비스 API\n *\n * 택배사 계정 등록, 택배 대량 등록·조회·취소, 송장 출력을 제공합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * **`courier.accounts`** — 택배사 계정 관리\n * **`courier.deliveries`** — 대량 등록, 배송 조회/취소, 이력\n * **`courier.print`** — 송장 출력 세션 생성\n */\n readonly courier: CourierResource\n\n /** API Base URL (`https://api.deliveryapi.co.kr`) */\n readonly baseUrl: string = BASE_URL\n\n constructor(options: DeliveryAPIClientOptions) {\n const auth = { apiKey: options.apiKey, secretKey: options.secretKey }\n this.tracking = new TrackingResource(auth)\n this.webhooks = new WebhooksResource(auth)\n this.courier = new CourierResource(auth)\n }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// DeliveryAPI SDK — Public Types\n//\n// 모든 타입은 @delivery-saas/shared-types (단일 진실 소스)에서 import.\n// SDK 공개 API 네이밍은 alias re-export로 유지.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── 도메인 타입 (그대로 re-export) ──────────────────────────────────────────\n\nexport { CourierDeliveryStatus } from '@delivery-saas/shared-types/courier/CourierDeliveryStatus'\nexport type { ApiErrorCode } from '@delivery-saas/shared-types/api/apiErrorCode'\nexport type { TrackingErrorCode, TrackingProgress, UnifiedTrackingResponse } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { WebhookPayload, WebhookTrackingItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// WebhookTrackingItem을 SubscriptionItem 이름으로도 export (하위 호환)\nexport type { WebhookTrackingItem as SubscriptionItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// ── Tracking (Tracking* → Trace* alias) ─────────────────────────────────────\n\nexport type { TrackingItem as TraceItem } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingRequest as TraceParams } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingItemError as TraceItemError } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingCacheInfo as TraceCacheInfo } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResult as TraceResult } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResponse as TraceResponse } from '@delivery-saas/shared-types/tracking/tracking'\n\n// ── Courier 조회 ────────────────────────────────────────────────────────────\n\nexport type { CourierInfoResponse as CourierInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { GetCouriersApiResponse as GetCouriersResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Endpoint ────────────────────────────────────────────────────────\n\nexport type { CreateEndpointRequest as CreateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { CreateEndpointApiResponse as CreateEndpointResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { EndpointListItem as EndpointInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListEndpointsApiResponse as ListEndpointsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { UpdateEndpointRequest as UpdateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretRequest as RotateSecretParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretApiResponse as RotateSecretResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Subscription ────────────────────────────────────────────────────\n\nexport type { RegisterTrackingItem as RegisterItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RegisterTrackingApiResponse as RegisterResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { TrackingBatchSummary as SubscriptionSummary } from '@delivery-saas/shared-types/tracking/webhook.types'\nexport type { ListSubscriptionsRequest as ListSubscriptionsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionListItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListSubscriptionsApiResponse as ListSubscriptionsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionDetailApiResponse as SubscriptionDetail } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Batch Results ───────────────────────────────────────────────────────────\n\nexport type { BatchResultItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsRequest as BatchResultsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultEntry } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsApiResponse as BatchResultsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Courier Account Service ─────────────────────────────────────────────────\n\nexport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n BulkUploadItemParams,\n BulkUploadParams,\n DeliveryStatusFilter,\n InquiryParams,\n DashboardParams,\n CancelDeliveriesParams,\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n DeleteHistoryParams,\n CreatePrintSessionParams,\n PrintSessionResponse,\n BulkUploadHistoryInfo,\n BulkUploadHistoryItemInfo,\n} from '@delivery-saas/shared-types/courier/sdk'\n\n// ── Courier Shared Types (reused in SDK responses) ──────────────────────────\n\n// BulkUploadResultItem re-typed: deliveryItem contains JSON (no Timestamp methods at runtime)\nimport type {\n BulkUploadResponse as _BulkUploadResponse,\n BulkUploadResultItem as _BulkUploadResultItem,\n} from '@delivery-saas/shared-types/courier/bulkUpload'\n\n/** Individual bulk upload result item (SDK-safe: deliveryItem is raw JSON) */\nexport type BulkUploadResultItem = Omit<_BulkUploadResultItem, 'deliveryItem'> & {\n /** Courier delivery data (raw JSON object, only present when tracking number is updated) */\n deliveryItem?: Record<string, unknown>\n}\n\n/** Bulk upload response */\nexport type BulkUploadResponse = Omit<_BulkUploadResponse, 'results'> & {\n /** Individual item results (same order as request items) */\n results: BulkUploadResultItem[]\n}\nexport type { BulkUploadStatus } from '@delivery-saas/shared-types/courier/bulkUploadHistory'\nexport type { AccountInquiryResponse, AccountInquiryItem } from '@delivery-saas/shared-types/courier/accountInquiry'\nexport type { DashboardStatsResponse, DashboardSummary, DashboardStatsItem } from '@delivery-saas/shared-types/dashboard/index'\n"],"mappings":"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","names":["CourierDeliveryStatus"]}
1
+ {"version":3,"sources":["../../shared-types/src/courier/CourierDeliveryStatus.ts","../src/http.ts","../src/resources/tracking.ts","../src/resources/endpoints.ts","../src/resources/subscriptions.ts","../src/resources/webhooks.ts","../src/resources/accounts.ts","../src/resources/histories.ts","../src/resources/deliveries.ts","../src/resources/print.ts","../src/resources/courier.ts","../src/client.ts","../src/types.ts"],"sourcesContent":["/**\n * 택배 배송 상태 코드\n *\n * 모든 택배사의 상태를 하나의 통합 코드로 정규화합니다.\n */\nexport enum CourierDeliveryStatus {\n // 접수/준비 단계\n PENDING = 'PENDING', // 접수 대기\n REGISTERED = 'REGISTERED', // 접수 완료\n PICKUP_READY = 'PICKUP_READY', // 집하 준비\n\n // 배송 진행 단계\n PICKED_UP = 'PICKED_UP', // 집하 완료\n IN_TRANSIT = 'IN_TRANSIT', // 배송 중\n OUT_FOR_DELIVERY = 'OUT_FOR_DELIVERY', // 배송 출발\n\n // 완료 단계\n DELIVERED = 'DELIVERED', // 배송 완료\n\n // 예외 상태\n FAILED = 'FAILED', // 배송 실패\n RETURNED = 'RETURNED', // 반송\n CANCELLED = 'CANCELLED', // 취소\n HOLD = 'HOLD', // 보류\n UNKNOWN = 'UNKNOWN', // 알 수 없음\n}","import type { ApiErrorCode } from './types'\n\nexport const BASE_URL = 'https://api.deliveryapi.co.kr'\n\n/** 서버가 반환하는 공통 응답 포맷 (SDK 내부 파싱용) */\ninterface ApiResponse<T = unknown> {\n isSuccess: boolean\n data?: T\n errorCode?: ApiErrorCode\n error?: string\n message?: string\n}\n\n/**\n * API 호출 실패 시 throw 되는 에러 클래스\n *\n * @example\n * try {\n * await client.tracking.trace({ items: [...] })\n * } catch (err) {\n * if (err instanceof ApiError) {\n * console.error(err.code) // 'RATE_LIMITED'\n * console.error(err.status) // 429\n * console.error(err.message) // '요청 횟수가 플랜 한도를 초과했습니다'\n * }\n * }\n */\nexport class ApiError extends Error {\n /**\n * 기계가 읽는 에러 코드\n *\n * 이 값을 기준으로 분기 처리하세요.\n */\n readonly code: ApiErrorCode | string\n /** HTTP 상태 코드 */\n readonly status: number\n /**\n * 에러 상세 데이터 (에러 종류에 따라 포함될 수 있음)\n *\n * 예) `INVALID_ITEMS` 에러 시 잘못된 항목 목록:\n * `[{ courierCode, trackingNumber, errorCode }]`\n */\n readonly data?: unknown\n\n constructor(code: ApiErrorCode | string, message: string, status: number, data?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.code = code\n this.status = status\n this.data = data\n }\n}\n\n/** API Key 인증 정보 */\nexport interface AuthCredentials {\n apiKey: string\n secretKey: string\n}\n\n/** 내부 HTTP 요청 함수 */\nexport async function request<T>(\n path: string,\n options: { method?: string; body?: unknown; params?: Record<string, string | number | boolean | undefined> },\n auth: AuthCredentials,\n): Promise<T> {\n let url = `${BASE_URL}${path}`\n\n if (options.params) {\n const qs = Object.entries(options.params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&')\n if (qs) url += `?${qs}`\n }\n\n const res = await fetch(url, {\n method: options.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${auth.apiKey}:${auth.secretKey}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n })\n\n const json = (await res.json()) as ApiResponse<T>\n\n if (!json.isSuccess) {\n throw new ApiError(\n json.errorCode ?? 'INTERNAL_ERROR',\n json.error ?? json.message ?? `HTTP ${res.status}`,\n res.status,\n json.data,\n )\n }\n\n return json.data as T\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { GetCouriersResponse, TraceResponse } from '../types'\n\nexport class TrackingResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 지원 택배사 목록을 조회합니다.\n *\n * 택배사 코드(`trackingApiCode`)는 `trace()`의 `courierCode` 파라미터에 사용합니다.\n *\n * @example\n * const { couriers } = await client.tracking.getCouriers()\n * // couriers: [{ trackingApiCode: 'cj', displayName: 'CJ대한통운' }, ...]\n */\n async getCouriers(): Promise<GetCouriersResponse> {\n return request<GetCouriersResponse>(\n '/v1/tracking/couriers',\n {},\n this.auth,\n )\n }\n\n /**\n * 송장번호로 배송 정보를 조회합니다.\n *\n * - 여러 건을 배열로 전달할 수 있습니다.\n * - 결과는 요청 순서와 동일한 인덱스로 반환됩니다.\n * - 일부 아이템이 실패해도 전체 요청이 실패하지 않습니다. `results[].success`로 건별 확인하세요.\n *\n * **과금 안내**: `NOT_FOUND` 에러는 과금됩니다. `results[].error.billable`로 확인하세요.\n *\n * @throws {ApiError} API 인증 실패, 요청 한도 초과 등 전체 요청 실패 시\n *\n * @example\n * const { results } = await client.tracking.trace({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' },\n * { courierCode: 'lotte', trackingNumber: '9876543210', clientId: 'order_002' },\n * ],\n * })\n *\n * for (const result of results) {\n * if (result.success) {\n * console.log(result.data?.deliveryStatus) // 'DELIVERED'\n * } else {\n * console.warn(result.error?.code) // 'NOT_FOUND'\n * }\n * }\n */\n async trace(params: {\n items: { courierCode: string; trackingNumber: string; clientId?: string }[]\n includeProgresses?: boolean\n }): Promise<TraceResponse> {\n return request<TraceResponse>(\n '/v1/tracking/trace',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n CreateEndpointResponse,\n ListEndpointsResponse,\n RotateSecretResponse,\n} from '../types'\n\nexport class EndpointsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 웹훅 엔드포인트를 등록합니다.\n *\n * 등록 시 서버에서 해당 URL로 테스트 POST 요청을 전송하여 연결 가능 여부를 검증합니다.\n * 응답의 `webhookSecret`은 **이 응답에서만 평문으로 반환**됩니다.\n * 분실 시 `rotateSecret()`으로 재발급해야 합니다.\n *\n * @throws {ApiError} `WEBHOOK_ENDPOINT_LIMIT` — 엔드포인트 등록 한도 초과\n * @throws {ApiError} `WEBHOOK_ENDPOINT_UNREACHABLE` — URL 검증 실패 (서버에서 테스트 POST 전송 시 200 응답 없음)\n *\n * @example\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * console.log(endpoint.endpointId) // 'ep_xxxx'\n * console.log(endpoint.webhookSecret) // 반드시 저장하세요!\n */\n async create(params: {\n /** 웹훅을 수신할 URL (`https://` 필수) */\n url: string\n /** 엔드포인트 이름 (관리용) */\n name: string\n /** 서명 시크릿 직접 지정 (미제공 시 서버 자동 생성, 최소 5자) */\n webhookSecret?: string\n }): Promise<CreateEndpointResponse> {\n return request<CreateEndpointResponse>(\n '/v1/webhooks/endpoints',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 웹훅 엔드포인트 목록을 조회합니다.\n *\n * @example\n * const { endpoints } = await client.webhooks.endpoints.list()\n * const active = endpoints.filter(ep => ep.status === 'active')\n * console.log(active[0].endpointId) // 'ep_xxxx'\n */\n async list(): Promise<ListEndpointsResponse> {\n return request<ListEndpointsResponse>(\n '/v1/webhooks/endpoints',\n {},\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트 이름을 수정합니다.\n *\n * URL은 변경할 수 없습니다. URL을 변경해야 한다면 삭제 후 재등록하세요.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.update('ep_xxxx', { name: '스테이징 서버' })\n */\n async update(endpointId: string, params: {\n /** 새 엔드포인트 이름 */\n name: string\n }): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'PUT', body: params },\n this.auth,\n )\n }\n\n /**\n * 웹훅 엔드포인트를 삭제합니다.\n *\n * 해당 엔드포인트에 연결된 구독도 함께 삭제됩니다 (cascade).\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * await client.webhooks.endpoints.delete('ep_xxxx')\n */\n async delete(endpointId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/endpoints/${endpointId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 웹훅 서명 시크릿을 재발급합니다.\n *\n * 기존 시크릿은 즉시 무효화됩니다.\n * 새 시크릿은 **이 응답에서만 평문으로 반환**됩니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 엔드포인트\n *\n * @example\n * const { webhookSecret } = await client.webhooks.endpoints.rotateSecret('ep_xxxx')\n * console.log(webhookSecret) // 새 시크릿 — 반드시 저장하세요!\n */\n async rotateSecret(endpointId: string, params?: {\n /** 새 시크릿 직접 지정 (미제공 시 서버 자동 생성) */\n webhookSecret?: string\n }): Promise<RotateSecretResponse> {\n return request<RotateSecretResponse>(\n `/v1/webhooks/endpoints/${endpointId}/rotate`,\n { method: 'POST', body: params ?? {} },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BatchResultsResponse,\n ListSubscriptionsParams,\n ListSubscriptionsResponse,\n RegisterResponse,\n SubscriptionDetail,\n} from '../types'\n\nexport class SubscriptionsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배 추적 구독을 등록합니다.\n *\n * ## 구독형 (`recurring: true`)\n * 배송 완료 또는 최대 14일까지 주기적으로 폴링합니다.\n * - `endpointId` 있음: 상태가 변경될 때마다 웹훅(`tracking.polled`)을 발송하고, 배송 완료 또는 기간 만료 시 `tracking.completed` 웹훅을 발송 후 자동 종료\n * - `endpointId` 없음: 웹훅 없이 폴링만 수행. `get(requestId)`으로 현재 상태를 직접 조회\n *\n * ## 일회성 (`recurring: false`)\n * 등록 즉시 1회 크롤 후 종료합니다. 폴링을 반복하지 않습니다.\n * - `endpointId` 있음: 크롤 완료 시 웹훅 1회 발송\n * - `endpointId` 없음: 웹훅 없이 크롤만 수행. `get(requestId)`으로 결과를 직접 조회\n *\n * @example\n * // 구독형 — 배송 완료까지 상태 변경 시마다 웹훅 수신\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n * // sub.requestId로 구독 관리 (cancel, get)\n *\n * @example\n * // 일회성 — 웹훅 없이 즉시 크롤 후 결과 직접 조회\n * const req = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'lotte', trackingNumber: '9876543210' }],\n * recurring: false,\n * })\n * const detail = await client.webhooks.subscriptions.get(req.requestId)\n * console.log(detail.items[0].currentStatus) // 'DELIVERED'\n */\n async register(params:\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 반복 구독. 배송 완료 또는 14일까지 주기적으로 폴링. */\n recurring: true\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 상태 변경마다 웹훅 발송.\n * 생략 시 웹훅 없이 폴링만 수행하며 `get(requestId)`으로 결과를 직접 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n | {\n /** 추적할 택배 목록 */\n items: {\n /** 택배사 코드 (예: `'cj'`, `'lotte'`, `'hanjin'`) */\n courierCode: string\n /** 송장번호 */\n trackingNumber: string\n /**\n * 클라이언트 매핑 ID (선택)\n *\n * 주문번호 등 내부 식별자. 웹훅 페이로드에 그대로 포함되어 반환됩니다.\n */\n clientId?: string\n }[]\n /** 일회성. 등록 즉시 1회 크롤 후 종료. `endpointId` 없으면 `get(requestId)`으로 결과 조회. */\n recurring: false\n /**\n * 웹훅 수신 엔드포인트 ID (선택)\n *\n * 제공 시 크롤 완료 후 웹훅 1회 발송.\n * 생략 시 웹훅 없이 크롤만 수행하며 `get(requestId)`으로 결과를 조회합니다.\n */\n endpointId?: string\n /**\n * 이용자 정의 메타데이터 (선택)\n *\n * 웹훅 페이로드의 `metadata` 필드에 그대로 포함되어 반환됩니다.\n */\n metadata?: Record<string, string>\n }\n ): Promise<RegisterResponse> {\n return request<RegisterResponse>(\n '/v1/webhooks/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 구독 목록을 조회합니다.\n *\n * 커서 기반 페이지네이션을 지원합니다.\n * 다음 페이지가 있으면 응답의 `nextCursor`를 다음 호출의 `cursor` 파라미터로 전달하세요.\n *\n * @example\n * let cursor: string | undefined\n * do {\n * const page = await client.webhooks.subscriptions.list({ cursor, limit: 50 })\n * for (const sub of page.subscriptions) {\n * console.log(sub.requestId, sub.isActive)\n * }\n * cursor = page.nextCursor\n * } while (cursor)\n */\n async list(params?: ListSubscriptionsParams): Promise<ListSubscriptionsResponse> {\n return request<ListSubscriptionsResponse>(\n '/v1/webhooks/subscriptions',\n { params: { cursor: params?.cursor, limit: params?.limit, status: params?.status, from: params?.from, to: params?.to } },\n this.auth,\n )\n }\n\n /**\n * 구독 상세 정보를 조회합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * const detail = await client.webhooks.subscriptions.get('req_xxxx')\n * for (const item of detail.items) {\n * console.log(item.trackingNumber, item.currentStatus)\n * }\n */\n async get(requestId: string): Promise<SubscriptionDetail> {\n return request<SubscriptionDetail>(\n `/v1/webhooks/subscriptions/${requestId}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 구독을 취소합니다.\n *\n * @throws {ApiError} `NOT_FOUND` — 존재하지 않는 구독\n *\n * @example\n * await client.webhooks.subscriptions.cancel('req_xxxx')\n */\n async cancel(requestId: string): Promise<void> {\n await request<unknown>(\n `/v1/webhooks/subscriptions/${requestId}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n\n /**\n * 여러 송장번호의 최신 배송 정보를 한 번에 조회합니다.\n *\n * 해당 계정에 등록된 구독 중 일치하는 아이템의 최신 상태를 반환합니다.\n *\n * @example\n * const { results } = await client.webhooks.subscriptions.batchResults({\n * items: [\n * { courierCode: 'cj', trackingNumber: '1111111111' },\n * { courierCode: 'lotte', trackingNumber: '2222222222' },\n * ],\n * })\n * for (const r of results) {\n * console.log(r.currentStatus, r.isDelivered)\n * }\n */\n async batchResults(params: {\n items: { courierCode: string; trackingNumber: string }[]\n }): Promise<BatchResultsResponse> {\n return request<BatchResultsResponse>(\n '/v1/webhooks/results',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { EndpointsResource } from './endpoints'\nimport { SubscriptionsResource } from './subscriptions'\n\n/**\n * 웹훅 리소스\n *\n * - `endpoints` — 웹훅 수신 URL 등록/관리\n * - `subscriptions` — 택배 추적 구독 등록/관리\n *\n * @example\n * const client = new DeliveryAPIClient({ apiKey: '...', secretKey: '...' })\n *\n * // 1. 엔드포인트 등록\n * const endpoint = await client.webhooks.endpoints.create({\n * url: 'https://my-server.com/webhook',\n * name: '운영 서버',\n * })\n * // ⚠️ endpoint.webhookSecret 을 안전하게 보관하세요!\n *\n * // 2. 택배 추적 구독\n * const sub = await client.webhooks.subscriptions.register({\n * endpointId: endpoint.endpointId,\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890', clientId: 'order_001' }],\n * recurring: true,\n * })\n *\n * // 3. 구독 상태 조회\n * const detail = await client.webhooks.subscriptions.get(sub.requestId)\n */\nexport class WebhooksResource {\n /**\n * 웹훅 엔드포인트 관리\n *\n * - `create()` — 수신 URL 등록\n * - `list()` — 목록 조회\n * - `update()` — 이름 수정\n * - `delete()` — 삭제\n * - `rotateSecret()` — 서명 시크릿 재발급\n */\n readonly endpoints: EndpointsResource\n\n /**\n * 웹훅 구독 관리\n *\n * - `register()` — 택배 추적 구독 등록\n * - `list()` — 구독 목록\n * - `get()` — 구독 상세\n * - `cancel()` — 구독 취소\n * - `batchResults()` — 다건 최신 상태 조회\n */\n readonly subscriptions: SubscriptionsResource\n\n constructor(auth: AuthCredentials) {\n this.endpoints = new EndpointsResource(auth)\n this.subscriptions = new SubscriptionsResource(auth)\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n} from '../types'\n\nexport class AccountsResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 택배사 계정을 등록합니다.\n *\n * 롯데택배, CJ대한통운 계정을 등록할 수 있습니다.\n * CJ대한통운은 2FA(OTP) 인증이 필요할 수 있으며, 이 경우 `COURIER_OTP_REQUIRED` 에러가 발생합니다.\n *\n * @param params - 계정 등록 파라미터\n * @returns 등록된 계정 정보 (courierAccountKey 포함)\n * @throws {ApiError} COURIER_OTP_REQUIRED — CJ 계정 OTP 인증 필요\n * @throws {ApiError} COURIER_AUTH_FAILED — 계정 인증 실패 (아이디/비밀번호 오류)\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-lotte-id',\n * accountPassword: 'my-password',\n * accountName: '메인 롯데 계정',\n * })\n * console.log(account.courierAccountKey) // 이후 API 호출에 사용\n */\n async register(params: RegisterAccountParams): Promise<RegisterAccountResponse> {\n return request<RegisterAccountResponse>(\n '/v1/courier/accounts/register',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 등록된 택배사 계정 목록을 조회합니다.\n *\n * @returns 계정 목록 (courierAccountKey, providerId, isActive 등)\n *\n * @example\n * const accounts = await client.courier.accounts.list()\n * const active = accounts.filter(a => a.isActive)\n * console.log(active[0].courierAccountKey)\n */\n async list(): Promise<CourierAccountInfo[]> {\n return request<CourierAccountInfo[]>(\n '/v1/courier/accounts',\n {},\n this.auth,\n )\n }\n\n /**\n * 특정 택배사 계정의 상세 정보를 조회합니다.\n *\n * 목록 조회와 달리 `accountPassword` 필드가 포함됩니다 (항상 마스킹된 값).\n * `expiresAt` 필드는 포함되지 않습니다.\n *\n * @param accountKey - 조회할 계정의 courierAccountKey\n * @returns 계정 상세 정보\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const detail = await client.courier.accounts.get('your-account-key')\n * console.log(detail.accountId) // 'my-lotte-id'\n * console.log(detail.accountPassword) // '(암호화하여 저장중)'\n */\n async get(accountKey: string): Promise<CourierAccountDetail> {\n return request<CourierAccountDetail>(\n `/v1/courier/accounts/${accountKey}`,\n {},\n this.auth,\n )\n }\n\n /**\n * 택배사 계정을 삭제합니다.\n *\n * @param accountKey - 삭제할 계정의 courierAccountKey\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * await client.courier.accounts.delete('your-account-key')\n */\n async delete(accountKey: string): Promise<void> {\n await request<unknown>(\n `/v1/courier/accounts/${accountKey}`,\n { method: 'DELETE' },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n} from '../types'\n\nexport class HistoriesResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 대량 등록 이력 목록을 조회합니다.\n *\n * @param params - 조회 파라미터 (providerId 필수)\n * @returns 이력 목록 (histories 배열)\n *\n * @example\n * const { histories } = await client.courier.deliveries.histories.list({\n * providerId: 'lotte',\n * courierAccountKey: 'your-key',\n * limit: 20,\n * })\n * const completed = histories.filter(h => h.status === 'completed')\n */\n async list(params: ListHistoriesParams): Promise<ListHistoriesResponse> {\n return request<ListHistoriesResponse>(\n '/v1/courier/deliveries/bulk-upload-histories',\n {\n method: 'GET',\n params: {\n providerId: params.providerId,\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n limit: params.limit,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 대량 등록 이력의 상세 정보를 조회합니다.\n *\n * 택배사 API를 호출하여 실시간 배송 상태를 함께 반환합니다.\n *\n * @param historyId - 이력 ID\n * @param params - 조회 파라미터 (courierAccountKey 필수)\n * @returns 이력 정보 + 실시간 배송 상태 (detailItems)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 이력 또는 계정\n *\n * @example\n * const { history, detailItems } = await client.courier.deliveries.histories.get(\n * '202603221456_a1b2c',\n * { courierAccountKey: 'your-key' },\n * )\n * const delivered = detailItems.filter(d => d.isDelivered)\n */\n async get(historyId: string, params: HistoryDetailParams): Promise<HistoryDetailResponse> {\n return request<HistoryDetailResponse>(\n `/v1/courier/deliveries/bulk-upload-histories/${historyId}/detail`,\n {\n method: 'GET',\n params: { courierAccountKey: params.courierAccountKey },\n },\n this.auth,\n )\n }\n\n}\n","import { request, type AuthCredentials } from '../http'\nimport type {\n BulkUploadParams,\n BulkUploadResponse,\n InquiryParams,\n AccountInquiryResponse,\n DashboardParams,\n DashboardStatsResponse,\n CancelDeliveriesParams,\n} from '../types'\nimport { HistoriesResource } from './histories'\n\nexport class DeliveriesResource {\n /** 대량 등록 이력 관리 */\n readonly histories: HistoriesResource\n\n constructor(private readonly auth: AuthCredentials) {\n this.histories = new HistoriesResource(auth)\n }\n\n /**\n * 택배를 대량 등록합니다. 최대 1,000건까지 한 번에 등록 가능합니다.\n *\n * 등록 직후에는 관리번호(courierDeliveryId)만 발급됩니다.\n * 송장번호(trackingNumber)는 **송장 출력 시점에 발급**됩니다.\n *\n * HTTP 200으로 응답하며, `success`는 전체 성공 여부입니다.\n * 부분 실패가 가능하므로 반드시 `results[].success`로 개별 확인하세요.\n *\n * @param params - 대량 등록 요청 파라미터\n * @returns 등록 결과 (부분 성공 포함, results[].success로 개별 확인)\n * @throws {ApiError} RATE_LIMITED — 요청 한도 초과\n * @throws {ApiError} FORBIDDEN — 계정 슬롯 한도 초과\n *\n * @example\n * const result = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: 'your-key',\n * items: [{\n * clientOrderId: 'ORD-001',\n * receiverName: '홍길동',\n * receiverPhone1: '01012345678',\n * receiverAddress: '서울특별시 중구 세종대로 110',\n * productName: '테스트 상품',\n * quantity: 1,\n * }],\n * })\n * const failed = result.results.filter(r => !r.success)\n * const ids = result.results.filter(r => r.success).map(r => r.courierDeliveryId)\n */\n async bulkUpload(params: BulkUploadParams): Promise<BulkUploadResponse> {\n return request<BulkUploadResponse>(\n '/v1/courier/deliveries/bulk-upload',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 목록을 조회합니다.\n *\n * 택배사 API를 실시간으로 호출하여 최신 배송 상태를 반환합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 목록 (items) + 요약 통계 (summary)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const result = await client.courier.deliveries.inquiry({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(result.summary.delivered) // 배송 완료 건수\n * const pending = result.items.filter(i => i.deliveryStatus === 'PENDING')\n */\n async inquiry(params: InquiryParams): Promise<AccountInquiryResponse> {\n return request<AccountInquiryResponse>(\n '/v1/courier/deliveries/inquiry',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n\n /**\n * 택배사 계정의 배송 통계(대시보드)를 조회합니다.\n *\n * @param params - 조회 파라미터\n * @returns 배송 통계 (items: 상세 행, summary: 요약)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정\n *\n * @example\n * const stats = await client.courier.deliveries.dashboard({\n * courierAccountKey: 'your-key',\n * fromDate: '2026-03-01',\n * toDate: '2026-03-22',\n * })\n * console.log(stats.summary.totalCount) // 전체 건수\n * console.log(stats.summary.delivered) // 배송 완료 건수\n */\n async dashboard(params: DashboardParams): Promise<DashboardStatsResponse> {\n return request<DashboardStatsResponse>(\n '/v1/courier/deliveries/dashboard',\n {\n method: 'GET',\n params: {\n courierAccountKey: params.courierAccountKey,\n fromDate: params.fromDate,\n toDate: params.toDate,\n },\n },\n this.auth,\n )\n }\n\n /**\n * 배송을 취소합니다. 3가지 사용 방식을 지원합니다.\n *\n * 1. **historyId만**: 해당 이력의 전체 배송 취소 + 이력 soft delete\n * 2. **historyId + courierDeliveryIds**: 이력 내 부분 취소\n * 3. **courierDeliveryIds만**: 택배사 직접 취소 (이력 무관, 최근 7일 이내)\n *\n * `historyId`와 `courierDeliveryIds` 중 하나는 반드시 필요합니다.\n *\n * @param params - 취소 파라미터\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 이력\n * @throws {ApiError} INVALID_PARAMS — 택배사가 배송 취소를 지원하지 않음\n *\n * @example\n * // 이력 전체 취소\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * historyId: '202603221456_a1b2c',\n * })\n *\n * // 이력 내 부분 취소\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * historyId: '202603221456_a1b2c',\n * courierDeliveryIds: ['7705241632'],\n * })\n *\n * // 직접 취소 (이력 없이)\n * await client.courier.deliveries.cancel({\n * courierAccountKey: 'your-key',\n * courierDeliveryIds: ['7705241632', '7705241633'],\n * })\n */\n async cancel(params: CancelDeliveriesParams): Promise<void> {\n await request<unknown>(\n '/v1/courier/deliveries/cancel',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import { request, type AuthCredentials } from '../http'\nimport type { CreatePrintSessionParams, PrintSessionResponse } from '../types'\n\nexport class PrintResource {\n constructor(private readonly auth: AuthCredentials) {}\n\n /**\n * 송장 출력 세션을 생성합니다.\n *\n * 세션 ID로 출력 페이지(`https://print.deliveryapi.co.kr?session={sessionId}`)에 접속할 수 있습니다.\n * 세션은 **10분 유효, 1회용**입니다. OZ Viewer 설치가 필요합니다.\n *\n * `courierTrackingIds` 또는 `bulkUploadHistoryId` 중 하나를 지정하세요.\n *\n * **중요**: 대부분의 택배사에서 송장번호(trackingNumber)는 이 출력 시점에 발급됩니다.\n * 출력 후 `client.courier.deliveries.inquiry()`로 발급된 송장번호를 확인하세요.\n *\n * @param params - 출력 세션 생성 파라미터\n * @returns 세션 정보 (sessionId, expiresAt)\n * @throws {ApiError} NOT_FOUND — 존재하지 않는 계정 또는 배송 ID\n *\n * @example\n * // 개별 ID로 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * courierTrackingIds: ['7705241632', '7705241633'],\n * })\n * // 브라우저에서 출력 페이지 열기\n * window.open(`https://print.deliveryapi.co.kr?session=${session.sessionId}`)\n *\n * @example\n * // 이력 전체 출력\n * const session = await client.courier.print.createSession({\n * courierAccountKey: 'your-key',\n * providerId: 'lotte',\n * bulkUploadHistoryId: '202603221456_a1b2c',\n * })\n */\n async createSession(params: CreatePrintSessionParams): Promise<PrintSessionResponse> {\n return request<PrintSessionResponse>(\n '/v1/courier/print/sessions',\n { method: 'POST', body: params },\n this.auth,\n )\n }\n}\n","import type { AuthCredentials } from '../http'\nimport { AccountsResource } from './accounts'\nimport { DeliveriesResource } from './deliveries'\nimport { PrintResource } from './print'\n\n/**\n * 택배 계정 서비스 리소스\n *\n * 택배사 계정을 등록하고, 택배를 대량 등록·조회·취소하며, 송장을 출력합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * @example\n * // 전체 플로우: 계정 등록 → 대량 등록 → 송장 출력 → 배송 추적\n * const account = await client.courier.accounts.register({\n * providerId: 'lotte',\n * accountId: 'my-id',\n * accountPassword: 'my-password',\n * })\n *\n * const upload = await client.courier.deliveries.bulkUpload({\n * courierAccountKey: account.courierAccountKey,\n * items: [{ clientOrderId: 'ORD-001', receiverName: '홍길동', ... }],\n * })\n *\n * const session = await client.courier.print.createSession({\n * courierAccountKey: account.courierAccountKey,\n * providerId: 'lotte',\n * courierTrackingIds: upload.results.filter(r => r.success).map(r => r.courierDeliveryId!),\n * })\n * // 출력 후 trackingNumber가 발급됨 → inquiry로 확인 → webhooks로 추적\n */\nexport class CourierResource {\n /** 택배사 계정 관리 (등록, 조회, 삭제) */\n readonly accounts: AccountsResource\n /** 배송 관리 (대량 등록, 조회, 대시보드, 취소, 이력) */\n readonly deliveries: DeliveriesResource\n /** 송장 출력 (세션 생성) */\n readonly print: PrintResource\n\n constructor(auth: AuthCredentials) {\n this.accounts = new AccountsResource(auth)\n this.deliveries = new DeliveriesResource(auth)\n this.print = new PrintResource(auth)\n }\n}\n","import { BASE_URL } from './http'\nimport { TrackingResource } from './resources/tracking'\nimport { WebhooksResource } from './resources/webhooks'\nimport { CourierResource } from './resources/courier'\n\n/** `DeliveryAPIClient` 생성 옵션 */\nexport interface DeliveryAPIClientOptions {\n /**\n * API Key\n *\n * 대시보드에서 발급한 API Key입니다.\n */\n apiKey: string\n /**\n * Secret Key\n *\n * API Key에 연결된 Secret Key입니다.\n * 클라이언트 사이드(브라우저)에 노출되지 않도록 주의하세요.\n */\n secretKey: string\n}\n\n/**\n * DeliveryAPI 클라이언트\n *\n * API Key + Secret Key로 인증합니다.\n * 모든 요청은 `Authorization: Bearer {apiKey}:{secretKey}` 헤더로 전송됩니다.\n *\n * @example\n * import { DeliveryAPIClient } from 'deliveryapi'\n *\n * const client = new DeliveryAPIClient({\n * apiKey: 'pk_live_xxxx',\n * secretKey: 'sk_live_xxxx',\n * })\n *\n * // 택배 조회\n * const { results } = await client.tracking.trace({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * })\n *\n * // 웹훅 구독\n * const sub = await client.webhooks.subscriptions.register({\n * items: [{ courierCode: 'cj', trackingNumber: '1234567890' }],\n * recurring: true,\n * endpointId: 'ep_xxxx',\n * })\n */\nexport class DeliveryAPIClient {\n /**\n * 택배 조회 API\n *\n * 송장번호로 배송 정보를 즉시 조회합니다.\n *\n * - `getCouriers()` — 지원 택배사 목록\n * - `trace()` — 송장번호 조회 (단건/다건)\n */\n readonly tracking: TrackingResource\n\n /**\n * 웹훅 API\n *\n * 배송 상태 변경 시 웹훅으로 알림을 받습니다.\n *\n * **`webhooks.endpoints`** — 수신 URL 등록/관리\n * **`webhooks.subscriptions`** — 택배 추적 구독 등록/관리\n */\n readonly webhooks: WebhooksResource\n\n /**\n * 택배 계정 서비스 API\n *\n * 택배사 계정 등록, 택배 대량 등록·조회·취소, 송장 출력을 제공합니다.\n * 현재 롯데택배, CJ대한통운을 지원합니다.\n *\n * **`courier.accounts`** — 택배사 계정 관리\n * **`courier.deliveries`** — 대량 등록, 배송 조회/취소, 이력\n * **`courier.print`** — 송장 출력 세션 생성\n */\n readonly courier: CourierResource\n\n /** API Base URL (`https://api.deliveryapi.co.kr`) */\n readonly baseUrl: string = BASE_URL\n\n constructor(options: DeliveryAPIClientOptions) {\n const auth = { apiKey: options.apiKey, secretKey: options.secretKey }\n this.tracking = new TrackingResource(auth)\n this.webhooks = new WebhooksResource(auth)\n this.courier = new CourierResource(auth)\n }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// DeliveryAPI SDK — Public Types\n//\n// 모든 타입은 @delivery-saas/shared-types (단일 진실 소스)에서 import.\n// SDK 공개 API 네이밍은 alias re-export로 유지.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── 도메인 타입 (그대로 re-export) ──────────────────────────────────────────\n\nexport { CourierDeliveryStatus } from '@delivery-saas/shared-types/courier/CourierDeliveryStatus'\nexport type { ApiErrorCode } from '@delivery-saas/shared-types/api/apiErrorCode'\nexport type { TrackingErrorCode, TrackingProgress, UnifiedTrackingResponse } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { WebhookPayload, WebhookTrackingItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// WebhookTrackingItem을 SubscriptionItem 이름으로도 export (하위 호환)\nexport type { WebhookTrackingItem as SubscriptionItem } from '@delivery-saas/shared-types/tracking/webhook.types'\n\n// ── Tracking (Tracking* → Trace* alias) ─────────────────────────────────────\n\nexport type { TrackingItem as TraceItem } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingRequest as TraceParams } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingItemError as TraceItemError } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingCacheInfo as TraceCacheInfo } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResult as TraceResult } from '@delivery-saas/shared-types/tracking/tracking'\nexport type { TrackingResponse as TraceResponse } from '@delivery-saas/shared-types/tracking/tracking'\n\n// ── Courier 조회 ────────────────────────────────────────────────────────────\n\nexport type { CourierInfoResponse as CourierInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { GetCouriersApiResponse as GetCouriersResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Endpoint ────────────────────────────────────────────────────────\n\nexport type { CreateEndpointRequest as CreateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { CreateEndpointApiResponse as CreateEndpointResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { EndpointListItem as EndpointInfo } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListEndpointsApiResponse as ListEndpointsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { UpdateEndpointRequest as UpdateEndpointParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretRequest as RotateSecretParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RotateSecretApiResponse as RotateSecretResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Webhook Subscription ────────────────────────────────────────────────────\n\nexport type { RegisterTrackingItem as RegisterItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { RegisterTrackingApiResponse as RegisterResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { TrackingBatchSummary as SubscriptionSummary } from '@delivery-saas/shared-types/tracking/webhook.types'\nexport type { ListSubscriptionsRequest as ListSubscriptionsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionListItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { ListSubscriptionsApiResponse as ListSubscriptionsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { SubscriptionDetailApiResponse as SubscriptionDetail } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Batch Results ───────────────────────────────────────────────────────────\n\nexport type { BatchResultItem } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsRequest as BatchResultsParams } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultEntry } from '@delivery-saas/shared-types/tracking/trackingApi.types'\nexport type { BatchResultsApiResponse as BatchResultsResponse } from '@delivery-saas/shared-types/tracking/trackingApi.types'\n\n// ── Courier Account Service ─────────────────────────────────────────────────\n\nexport type {\n RegisterAccountParams,\n RegisterAccountResponse,\n CourierAccountInfo,\n CourierAccountDetail,\n BulkUploadItemParams,\n BulkUploadParams,\n DeliveryStatusFilter,\n InquiryParams,\n DashboardParams,\n CancelDeliveriesParams,\n ListHistoriesParams,\n ListHistoriesResponse,\n HistoryDetailParams,\n HistoryDetailResponse,\n CreatePrintSessionParams,\n PrintSessionResponse,\n BulkUploadHistoryInfo,\n BulkUploadHistoryItemInfo,\n} from '@delivery-saas/shared-types/courier/sdk'\n\n// ── Courier Shared Types (reused in SDK responses) ──────────────────────────\n\n// BulkUploadResultItem re-typed: deliveryItem contains JSON (no Timestamp methods at runtime)\nimport type {\n BulkUploadResponse as _BulkUploadResponse,\n BulkUploadResultItem as _BulkUploadResultItem,\n} from '@delivery-saas/shared-types/courier/bulkUpload'\n\n/** Individual bulk upload result item (SDK-safe: deliveryItem is raw JSON) */\nexport type BulkUploadResultItem = Omit<_BulkUploadResultItem, 'deliveryItem'> & {\n /** Courier delivery data (raw JSON object, only present when tracking number is updated) */\n deliveryItem?: Record<string, unknown>\n}\n\n/** Bulk upload response */\nexport type BulkUploadResponse = Omit<_BulkUploadResponse, 'results'> & {\n /** Individual item results (same order as request items) */\n results: BulkUploadResultItem[]\n}\nexport type { BulkUploadStatus } from '@delivery-saas/shared-types/courier/bulkUploadHistory'\nexport type { AccountInquiryResponse, AccountInquiryItem } from '@delivery-saas/shared-types/courier/accountInquiry'\nexport type { DashboardStatsResponse, DashboardSummary, DashboardStatsItem } from '@delivery-saas/shared-types/dashboard/index'\n"],"mappings":"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","names":["CourierDeliveryStatus"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deliveryapi",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "DeliveryAPI SDK — 택배 조회, 웹훅, 택배 계정 서비스 B2B SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",