택배조회API 개발 문서

택배 통합 API를 사용하여 여러 택배사의 배송 조회, 등록, 관리를 하나의 인터페이스로 처리할 수 있습니다.

📢 이 문서에 대하여

회사 내부에서 쓰던 API를 외부에 공개하면서 만든 API 문서입니다.

API는 내부적으로 사용하기 위해 보안, 편리성을 극대화하였지만 외부에 공개하면서 이 문서는 완벽하지 않을 수 있습니다.

문서에 미흡한 부분이 있을 수 있습니다.

혹시 API 문서가 잘못된 게 있다고 생각이 든다면 관리자에게 연락주세요.

Base URL

https://api.deliveryapi.co.kr

모든 API 엔드포인트는 /v1 경로를 포함합니다.

모든 timestamp는 UTC 기준 ISO 8601 형식입니다. (예: 2026-03-17T05:17:55.874Z, 끝의 Z가 UTC를 의미)

지원 택배사

  • 롯데택배 (lotte) - 조회, 등록 지원
  • CJ대한통운 (cj) - 조회, 등록 지원
  • 한진택배 (hanjin) - 조회 지원
  • 우체국택배 (post) - 조회 지원
  • 경동택배 (kyungdong) - 조회 지원
  • 대신택배 (daesin) - 조회 지원
  • 로젠택배 (logen) - 조회 지원
  • 합동택배 (hapdong) - 조회 지원
  • 쿠팡택배 (coupang) - 조회 지원
  • 우리택배 (woori) - 조회 지원

해외 택배사 (24개)

해외 택배사는 국가코드.택배사코드 형식의 courierCode를 사용합니다. (예: us.usps, intl.dhl)

  • 미국 — USPS (us.usps), OnTrac (us.ontrac)
  • 영국 — Royal Mail (gb.royalmail), Evri (gb.evri)
  • 일본 — ヤマト運輸 (jp.yamato), Japan Post (jp.post)
  • 독일 — Hermes (de.hermes), GLS (de.gls)
  • 캐나다 — Canada Post (ca.post), Purolator (ca.purolator), Canpar (ca.canpar), Intelcom (ca.intelcom), Loomis Express (ca.loomis), ICS Courier (ca.ics)
  • 호주 — Australia Post (au.post)
  • 글로벌 — DHL (intl.dhl), FedEx (intl.fedex), UPS (intl.ups), TNT (intl.tnt), Chronopost (intl.chronopost), Cainiao (intl.cainiao), Yanwen (intl.yanwen), YunExpress (intl.yunexpress), Deutsche Post (intl.deutsche-post)
💰 해외 택배사 과금 안내

해외 택배사 조회는 1건당 10회로 과금됩니다. (예: 해외 택배 1건 조회 = API 호출 10회 차감)

📦 국내·해외 34개 택배사를 지원합니다.

국내 택배사는 조회 및 등록을 지원하며, 해외 택배사는 조회만 지원합니다.

추가 택배사가 필요하다면 관리자에게 연락주세요.

주요 기능

  • ✅ 송장번호 기반 배송 조회 (계정 불필요)
  • ✅ 택배사 계정 등록 후 배송 등록
  • ✅ 대량 배송 등록 (최대 1,000건)
  • ✅ 발송 내역 조회 및 통계
💡 시작하기

아직 API 키가 없으신가요? 아래 회원가입 API를 통해 무료로 API 키를 발급받으세요.

인증

모든 API 요청은 API Key와 Secret Key를 사용한 인증이 필요합니다.

🔑 API 키 발급

회원가입대시보드에서 API Key와 Secret Key를 발급받을 수 있습니다.

기본 인증 방식

모든 API 호출 시 동일한 인증 헤더를 사용합니다.

Authorization: Bearer {apiKey}:{secretKey}

조회 전용 API 예시

curl -X POST "https://api.deliveryapi.co.kr/v1/tracking/trace" -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" -H "Content-Type: application/json" -d '{"items": [{"courierCode": "lotte", "trackingNumber": "123456789012"}]}'

택배 계정 관련 API 예시

택배 계정 등록, 배송 등록 등의 API도 동일한 인증 방식을 사용합니다.

curl -X POST "https://api.deliveryapi.co.kr/v1/courier/accounts/register" -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" -H "Content-Type: application/json" -d '{"providerId": "lotte", "accountId": "your_id", "accountPassword": "your_pw"}'
⚠️ 주의

위 키는 테스트중에만 사용해야하며 실서비스에는 반드시 발급받은 키로 사용해주세요.

⚠️ 택배 계정 등록 후 추가 키 발급

택배 계정을 등록하면 courierAccountKey가 발급됩니다. 이 키는 배송 등록, 대량 업로드 등 택배 계정이 필요한 API 호출 시 요청 본문에 포함하여 사용합니다.

🔒 보안 주의사항

Secret Key는 절대 클라이언트 사이드 코드(브라우저)에 노출하지 마세요. 서버에서만 사용해야 합니다.

에러 코드

API 응답의 에러는 용도에 따라 3가지로 구분됩니다.

API 에러 코드

최상위 응답의 errorCode 필드로 반환됩니다.

공통

코드 HTTP 설명
UNAUTHORIZED401API 키 누락 또는 유효하지 않음
FORBIDDEN403권한 없음 (유효한 키지만 접근 불가)
MISSING_PARAMS400필수 파라미터 누락
INVALID_PARAMS400파라미터 형식 또는 값이 잘못됨
NOT_FOUND404요청한 리소스가 없음
RATE_LIMITED429요청 횟수 초과
INTERNAL_ERROR500서버 내부 오류
NOT_IMPLEMENTED501해당 택배사에서 지원하지 않는 기능

회원가입 / 이메일 인증

코드 HTTP 설명
EMAIL_ALREADY_EXISTS409이미 가입된 이메일

택배사 계정

코드 HTTP 설명
COURIER_OTP_REQUIRED202OTP 인증 필요 (추가 단계 요구)
COURIER_AUTH_FAILED401택배사 로그인 실패 (자격증명 오류)

웹훅

코드 HTTP 설명
CONFLICT409엔드포인트 URL 중복
WEBHOOK_ENDPOINT_LIMIT429웹훅 엔드포인트 등록 한도 초과
WEBHOOK_ENDPOINT_UNREACHABLE400엔드포인트 URL 도달 불가 또는 200 응답 실패
INVALID_ITEMS400items 배열 내 항목이 잘못됨 (상세는 data에)

배송조회 에러 코드

송장조회 API (/v1/tracking/trace)의 results[].error.code 필드로 반환됩니다.

코드 설명 과금
MISSING_PARAMS필수 파라미터 누락 (courierCode, trackingNumber)X
INVALID_TRACKING_NUMBER송장번호 형식 불일치 (자릿수, checksum 등)X
UNSUPPORTED_COURIER지원하지 않는 택배사 코드X
NOT_FOUND택배사 조회 결과 없음 (택배사 API 호출 완료)O
TRACKING_FAILED시스템/네트워크 오류 (크롤러 실패, 타임아웃 등)X
💡 과금 기준

billable 필드는 해당 요청이 과금 대상인지를 나타냅니다. 택배사 서버에 실제로 조회 요청이 전달된 경우(NOT_FOUND)에만 과금되며, 형식 오류나 시스템 장애는 과금되지 않습니다.

해외 택배사 조회는 1건당 10회로 과금됩니다. (예: 해외 택배 1건 조회 = API 호출 10회 차감)

택배사 계정 에러 코드

택배사 계정 등록/인증 API에서 반환됩니다.

코드 설명
TOKEN_EXPIRED토큰 만료 (재인증 필요)
SESSION_EXPIRED세션 만료 (재인증 필요)
AUTH_FAILED인증 실패 (ID/PW 오류)
OTP_REQUIREDOTP 인증 필요
API_ERROR택배사 API 호출 실패
NETWORK_ERROR네트워크 오류
RATE_LIMIT_EXCEEDEDRate Limit 초과
UNSUPPORTED_FEATURE지원하지 않는 기능
INVALID_REQUEST잘못된 요청
UNKNOWN_ERROR알 수 없는 오류

요청 제한 (Rate Limits)

API의 안정적인 운영을 위해 플랜별 요청 한도와 IP 기반 전역 제한이 적용됩니다.

플랜별 요청 한도

Secret Key에 설정된 플랜에 따라 분/시/일/월 단위로 요청 횟수가 제한됩니다.

플랜 시간
무료10010105
스타터10,0001,00020020
플러스50,0005,0001,00050
그로스100,00010,0002,000100
프로300,00030,0005,000200
비즈니스1,000,000100,00015,000500
엔터프라이즈맞춤 설정 (문의)

IP별 전역 제한

인증 여부와 무관하게, 동일 IP에서 분당 최대 60회까지 요청할 수 있습니다. 이 제한은 모든 플랜에 동일하게 적용됩니다.

제한 초과 시 응답

요청 제한에 도달하면 429 Too Many Requests 응답이 반환됩니다.

{
  "isSuccess": false,
  "statusCode": 429,
  "errorCode": "RATE_LIMITED",
  "error": "Tracking 분당 한도 초과 — 현재 분당 20회 제한이 적용되어 있습니다.",
  "limitType": "minute",   // "ip" | "minute" | "hour" | "day" | "month"
  "limit": 20              // 해당 단위의 최대 허용 횟수
}
필드설명
limitType어떤 단위의 제한에 걸렸는지 — ip, minute, hour, day, month
limit해당 단위의 최대 허용 횟수
retryAfterSeconds(IP 제한 시) 재시도까지 남은 초
reason사람이 읽을 수 있는 상세 사유

사용량에 포함되지 않는 API

다음 API는 요청 한도에 포함되지 않습니다:

  • 웹훅 구독 조회 — GET /v1/webhooks/subscriptions
  • 웹훅 엔드포인트 관리 — GET/POST/PUT/DELETE /v1/webhooks/endpoints
  • 택배사 목록 조회 — GET /v1/tracking/couriers

대량 조회 시 권장사항

배송 상태를 대량으로 추적하려면 웹훅 구독을 사용하세요.

POST /v1/tracking/trace는 단발성 조회(쇼핑몰에서 고객에게 조회 기능 제공 등)에 적합합니다. 주기적으로 배송 상태를 DB에 업데이트해야 한다면, POST /v1/webhooks/register로 웹훅 구독을 등록하면 배송 상태 변경 시 자동으로 콜백을 받을 수 있어 API 호출 횟수를 크게 줄일 수 있습니다.

송장번호 배송 조회

송장번호만으로 배송 현황을 실시간 조회합니다. 택배사 계정이 없어도 사용 가능합니다.

💡 이 API는 단발성 조회에 적합합니다.

쇼핑몰에서 고객에게 배송 현황 조회 기능을 제공하는 등 건별 조회 용도로 설계되었습니다. 대량의 송장을 주기적으로 추적하여 DB를 업데이트해야 한다면, 웹훅 구독 (POST /v1/webhooks/register)을 사용하세요. 배송 상태가 변경될 때마다 자동으로 콜백을 받을 수 있어 API 호출 횟수를 크게 줄이고, 요청 제한에 걸릴 위험도 낮출 수 있습니다.

요청

POST
/v1/tracking/trace

Headers

이름 설명
Authorization Bearer {apiKey}:{secretKey} 필수
Content-Type application/json JSON 형식

Request Body

필드 타입 필수 설명
items Array 필수 조회할 송장 목록 (최대 10개)
items[].courierCode String 필수 택배사 코드 (lotte, cj, hanjin, post, kyungdong, daesin, logen, hapdong, coupang, woori)
items[].trackingNumber String 필수 송장번호 (12자리)
items[].clientId String 선택 클라이언트 주문 ID 등 매핑용 식별자 (응답에 그대로 반환됨)
includeProgresses Boolean 선택 배송 진행 내역 포함 여부 (기본값: true, false 시 progresses 빈 배열 반환)

예시 요청

tracking-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.tracking.trace({
  items: [
    {
      clientId: 'ORDER-2024-001',
      courierCode: 'lotte',
      trackingNumber: '123456789012',
    }
  ]
});

console.log(result);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.tracking.trace(
    items=[
        {
            "clientId": "ORDER-2024-001",
            "courierCode": "lotte",
            "trackingNumber": "123456789012",
        }
    ]
)

print(result)
curl -X POST https://api.deliveryapi.co.kr/v1/tracking/trace \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "items": [
      {
        "clientId": "ORDER-2024-001",
        "courierCode": "lotte",
        "trackingNumber": "123456789012"
      }
    ]
  }'
const response = await fetch('https://api.deliveryapi.co.kr/v1/tracking/trace', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
  },
  body: JSON.stringify({
    items: [
      {
        clientId: 'ORDER-2024-001',
        courierCode: 'lotte',
        trackingNumber: '123456789012'
      }
    ]
  })
});

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/tracking/trace"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
data = {
    "items": [
        {
            "clientId": "ORDER-2024-001",
            "courierCode": "lotte",
            "trackingNumber": "123456789012"
        }
    ]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
import java.net.http.*;
import java.net.URI;

HttpClient client = HttpClient.newHttpClient();

String json = """
    {
      "items": [
        {
          "clientId": "ORDER-2024-001",
          "courierCode": "lotte",
          "trackingNumber": "123456789012"
        }
      ]
    }
    """;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.deliveryapi.co.kr/v1/tracking/trace"))
    .header("Content-Type", "application/json")
    .header("Authorization", "Bearer __API_KEY__:__SECRET_KEY__")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "io"
)

func main() {
    url := "https://api.deliveryapi.co.kr/v1/tracking/trace"

    data := map[string]interface{}{
        "items": []map[string]string{
            {
                "clientId":       "ORDER-2024-001",
                "courierCode":    "lotte",
                "trackingNumber": "123456789012",
            },
        },
    }

    jsonData, _ := json.Marshal(data)
    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", "Bearer __API_KEY__:__SECRET_KEY__")

    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
⚠️ 주의

위 키는 테스트중에만 사용해야하며 실서비스에는 반드시 발급받은 키로 사용해주세요.

응답

📦 통합 응답 타입 (Unified Response)

모든 택배사(롯데, CJ, 한진, 우체국, 경동, 대신, 로젠, 합동, 쿠팡)는 동일한 응답 형식으로 반환됩니다. 택배사별로 별도 처리가 필요 없이 하나의 타입으로 통일된 데이터를 받을 수 있습니다.

{ "isSuccess": true, "data": { "results": [ { "clientId": "ORDER-2024-001", "success": true, "data": { "trackingNumber": "123456789012", "courierCode": "lotte", "courierName": "롯데택배", "deliveryStatus": "IN_TRANSIT", "deliveryStatusText": "배송중", "isDelivered": false, "senderName": "김**", "receiverName": "홍**", "productName": "애플망고 3kg", "dateLastProgress": "2025-12-02 14:30", "progresses": [ { "dateTime": "2025-12-02 14:30", "location": "서울 강남구", "status": "배송중", "statusCode": "IN_TRANSIT", "description": "배송중" } ], "queriedAt": "2025-12-02T14:35:00.000Z" } } ], "summary": { "total": 1, "successful": 1, "failed": 0, "billable": 1 } } }

응답 (실패 시)

송장번호가 택배사에 등록되지 않았거나 형식이 잘못된 경우:

{ "isSuccess": true, "data": { "results": [ { "success": false, "error": { "code": "NOT_FOUND", "message": "조회된 배송 정보가 없습니다. 송장번호를 확인해주세요.", "courierCode": "cj", "trackingNumber": "123456789012", "billable": true } } ], "summary": { "total": 1, "successful": 0, "failed": 1, "billable": 1 } } }

에러 코드

각 아이템별 에러는 results[].error.code로 반환됩니다. 배송조회 에러 코드를 참조하세요.

응답 필드 설명

최상위 구조

필드 타입 설명
isSuccess Boolean API 호출 성공 여부 (인증 실패 등 HTTP 에러 시 false)
data.results Array 각 송장번호별 조회 결과 배열
data.summary.total Number 요청한 총 송장 수
data.summary.successful Number 조회 성공 건수
data.summary.failed Number 조회 실패 건수
data.summary.billable Number 과금 대상 건수 (성공 + NOT_FOUND)

results 항목 (공통)

필드 타입 설명
clientId String? 요청 시 전달된 클라이언트 주문 ID (요청에 포함된 경우만 반환)
success Boolean 개별 조회 성공 여부
data Object? 성공 시 배송 조회 데이터 (아래 data 필드 참조)
error Object? 실패 시 에러 정보 (code, message, courierCode, trackingNumber, billable)
cache Object? 캐시 메타데이터 (fromCache: boolean, cachedAt?: string)

results[].data 필드 (성공 시)

필드 타입 설명
trackingNumber String 송장번호
courierCode String 택배사 코드 (lotte, cj, hanjin, post, kyungdong, daesin, logen, hapdong, coupang, woori)
courierName String 택배사 이름 (예: "롯데택배", "CJ대한통운")
deliveryStatus String 정규화된 배송 상태 코드 (아래 상태 코드 표 참조)
deliveryStatusText String 사용자에게 표시할 상태 텍스트 (예: "배송중", "배송완료")
isDelivered Boolean 배송 완료 여부 (true/false)
senderName String? 보내는 사람 (선택)
receiverName String? 받는 사람 (선택)
productName String? 상품명 (선택)
dateLastProgress String 마지막 배송 이력 시간 (yyyy-MM-dd HH:mm:ss)
progresses Array 배송 진행 이력 배열
queriedAt String 조회 시점 (ISO 8601)

progresses 배열 항목

필드 타입 설명
dateTime String 처리 시간 (yyyy-MM-dd HH:mm:ss)
location String 처리 위치 (터미널, 영업소 등)
status String 상태 설명 (택배사 원본 텍스트)
statusCode String 정규화된 상태 코드
description String? 상세 설명 (선택)

배송 상태 코드

코드 설명
PENDING접수 대기
REGISTERED접수 완료
PICKUP_READY집하 준비
PICKED_UP집하 완료
IN_TRANSIT배송중
OUT_FOR_DELIVERY배송 출발
DELIVERED배송 완료
FAILED배송 실패
RETURNED반송
CANCELLED취소
HOLD보류
UNKNOWN알 수 없음

택배사 목록 조회

지원하는 택배사 목록을 조회합니다.

요청

GET
/v1/tracking/couriers

Headers

이름
Authorization Bearer {apiKey}:{secretKey}

예시 요청

courier-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.tracking.getCouriers();
console.log(result.couriers);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.tracking.get_couriers()
print(result["couriers"])
curl -X GET "https://api.deliveryapi.co.kr/v1/tracking/couriers" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/tracking/couriers',
  {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/tracking/couriers"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}

response = requests.get(url, headers=headers)
print(response.json())
import java.net.http.*;
import java.net.URI;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.deliveryapi.co.kr/v1/tracking/couriers"))
    .header("Authorization", "Bearer __API_KEY__:__SECRET_KEY__")
    .GET()
    .build();

HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {
    req, _ := http.NewRequest("GET",
        "https://api.deliveryapi.co.kr/v1/tracking/couriers", nil)
    req.Header.Set("Authorization", "Bearer __API_KEY__:__SECRET_KEY__")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
⚠️ 주의

테스트용 API 키가 자동으로 적용됩니다. 실제 서비스에서는 발급받은 키를 사용하세요.

응답

{ "isSuccess": true, "data": { "couriers": [ { "trackingApiCode": "lotte", "displayName": "롯데택배" }, { "trackingApiCode": "cj", "displayName": "CJ대한통운" }, { "trackingApiCode": "post", "displayName": "우체국택배" }, { "trackingApiCode": "kyungdong", "displayName": "경동택배" }, { "trackingApiCode": "daesin", "displayName": "대신택배" } ], "total": 5 } }

엔드포인트 관리

웹훅을 수신할 URL(엔드포인트)을 등록하고 관리합니다. 등록 시 발급되는 endpointId를 구독 생성 시 사용합니다.

🔔 웹훅 API 특징
  • 구독형 (recurring: true): 등록 후 최대 14일간 1시간 주기로 자동 폴링, 전체 배달 완료 시 자동 종료
  • 일회성 (recurring: false): 즉시 1회 조회 후 결과를 웹훅으로 전송하고 종료
  • 서명 검증: HMAC-SHA256으로 모든 웹훅 서명 — 위변조 감지 가능
  • 야간 중단: 22:00~07:00 KST 폴링 자동 중단

1. 엔드포인트 생성

웹훅을 수신할 URL을 등록합니다. 등록 시 발급되는 endpointId를 추적 등록 시 사용합니다. API 키당 최대 10개 생성 가능합니다.

POST
/v1/webhooks/endpoints

Headers

이름설명
Authorization Bearer {apiKey}:{secretKey} 필수 - Private 인증
Content-Type application/json JSON 형식

Request Body

필드타입필수설명
url String 필수 알림 받을 웹훅 URL (HTTPS만 허용, 등록 시 테스트 POST 1회 전송)
name String 선택 엔드포인트 이름 (관리용)
webhookSecret String 선택 서명 검증용 시크릿 (미입력 시 자동 생성)
🔑 webhookSecret이란?

여러분의 서버가 받는 웹훅이 진짜 택배API에서 보낸 것인지 확인하기 위한 비밀 열쇠입니다. 이 값으로 모든 웹훅 요청에 서명(HMAC-SHA256)이 포함되며, 서버에서 서명을 검증하면 봇 공격이나 위변조된 가짜 요청을 차단할 수 있습니다. 자세히 알아보기 →

웹훅 URL 등록 조건

등록 시 해당 URL로 테스트 POST 요청이 1회 전송됩니다. Private IP(192.168.x.x, 10.x.x.x, 127.0.0.1 등)로 연결되는 도메인은 보안상 등록이 거부됩니다.

예시 요청

create-endpoint ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const endpoint = await client.webhooks.endpoints.create({
  url: 'https://example.com/webhooks/delivery',
  name: '배송 알림 시스템',
});
// endpoint.webhookSecret을 안전하게 보관하세요 — 이후 조회 불가!
console.log(endpoint.endpointId);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

endpoint = client.webhooks.endpoints.create(
    "https://example.com/webhooks/delivery",
    name="배송 알림 시스템",
)
# endpoint["webhookSecret"]을 안전하게 보관하세요 — 이후 조회 불가!
print(endpoint["endpointId"])
curl -X POST "https://api.deliveryapi.co.kr/v1/webhooks/endpoints" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "url": "https://example.com/webhooks/delivery",
    "name": "배송 알림 시스템"
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/endpoints',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      url: 'https://example.com/webhooks/delivery',
      name: '배송 알림 시스템'
    })
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.post(
  "https://api.deliveryapi.co.kr/v1/webhooks/endpoints",
  headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  },
  json={
    "url": "https://example.com/webhooks/delivery",
    "name": "배송 알림 시스템"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "message": "webhookSecret은 지금만 확인할 수 있습니다. 분실 시 시크릿 재발급이 필요합니다.", "data": { "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8", "url": "https://example.com/webhooks/delivery", "name": "배송 알림 시스템", "webhookSecret": "whsec_0123456789abcdef...", "dateCreated": "2026-01-01T12:00:00.000Z" } }
🔒 중요: webhookSecret 보관

webhookSecret은 웹훅 서명 검증에 필요하며, 생성 시 단 1회만 평문으로 반환됩니다. 안전한 곳에 보관하세요. 분실 시 시크릿 재발급 API를 사용하세요.

2. 엔드포인트 목록 조회

등록된 웹훅 엔드포인트 목록을 조회합니다.

GET
/v1/webhooks/endpoints

예시 요청

list-endpoints ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.webhooks.endpoints.list();
console.log(result.endpoints);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.webhooks.endpoints.list()
print(result["endpoints"])
curl -X GET "https://api.deliveryapi.co.kr/v1/webhooks/endpoints" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/endpoints',
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.get(
  "https://api.deliveryapi.co.kr/v1/webhooks/endpoints",
  headers={
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "data": { "endpoints": [ { "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8", "url": "https://example.com/webhooks/delivery", "name": "배송 알림 시스템", "status": "active", "consecutiveFailures": 0, "dateCreated": "2026-01-01T12:00:00.000Z", "dateModified": "2026-01-01T12:00:00.000Z" } ], "total": 1 } }

3. 엔드포인트 수정

엔드포인트 이름을 변경합니다. URL은 변경할 수 없습니다.

PUT
/v1/webhooks/endpoints/{endpointId}

Request Body

필드타입필수설명
name String 필수 새 엔드포인트 이름

예시 요청

update-endpoint ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

await client.webhooks.endpoints.update(
  'ep_20260101_120000_a1b2c3d4e5f6a7b8',
  { name: '프로덕션 엔드포인트' },
);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

client.webhooks.endpoints.update(
    "ep_20260101_120000_a1b2c3d4e5f6a7b8",
    name="프로덕션 엔드포인트",
)
curl -X PUT "https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{"name": "프로덕션 엔드포인트"}'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8',
  {
    method: 'PUT',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({ name: '프로덕션 엔드포인트' })
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.put(
  "https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8",
  headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  },
  json={"name": "프로덕션 엔드포인트"}
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "message": "엔드포인트가 수정되었습니다" }

4. 엔드포인트 삭제

엔드포인트를 삭제합니다. 삭제 시 연결된 활성 구독이 모두 함께 비활성화됩니다.

DELETE
/v1/webhooks/endpoints/{endpointId}

예시 요청

delete-endpoint ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

await client.webhooks.endpoints.delete('ep_20260101_120000_a1b2c3d4e5f6a7b8');
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

client.webhooks.endpoints.delete("ep_20260101_120000_a1b2c3d4e5f6a7b8")
curl -X DELETE "https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8',
  {
    method: 'DELETE',
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.delete(
  "https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8",
  headers={
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "message": "엔드포인트가 삭제되었습니다" }

5. 웹훅 시크릿 재발급

기존 시크릿을 새 값으로 교체합니다. 재발급 후 기존 시크릿으로 서명된 웹훅은 검증에 실패합니다.

POST
/v1/webhooks/endpoints/{endpointId}/rotate

Request Body

필드타입필수설명
webhookSecret String 선택 새 시크릿 값 (미입력 시 자동 생성)

예시 요청

rotate-secret ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.webhooks.endpoints.rotateSecret(
  'ep_20260101_120000_a1b2c3d4e5f6a7b8',
  { webhookSecret: 'whsec_my_custom_secret_value_here' }
);
// 지정한 시크릿이 그대로 반환됩니다 — 안전하게 보관하세요!
console.log(result.webhookSecret);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.webhooks.endpoints.rotate_secret(
    "ep_20260101_120000_a1b2c3d4e5f6a7b8",
    webhook_secret="whsec_my_custom_secret_value_here",
)
# 지정한 시크릿이 그대로 반환됩니다 — 안전하게 보관하세요!
print(result["webhookSecret"])
curl -X POST "https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8/rotate" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -H "Content-Type: application/json" \
  -d '{"webhookSecret": "whsec_my_custom_secret_value_here"}'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8/rotate',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      webhookSecret: 'whsec_my_custom_secret_value_here'
    })
  }
);
const data = await response.json();
console.log(data.data.webhookSecret); // 지정한 시크릿이 그대로 반환
import requests

response = requests.post(
  "https://api.deliveryapi.co.kr/v1/webhooks/endpoints/ep_20260101_120000_a1b2c3d4e5f6a7b8/rotate",
  headers={
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  },
  json={
    "webhookSecret": "whsec_my_custom_secret_value_here"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "data": { "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8", "webhookSecret": "whsec_my_custom_secret_value_here", "dateRotated": "2026-01-01T13:00:00.000Z" } }

추적 등록 및 조회

운송장을 등록하여 배송 추적을 시작하고, 결과를 조회·취소합니다. 웹훅 수신이 필요한 경우 엔드포인트를 먼저 등록하세요. 엔드포인트 없이도 구독 ID로 직접 조회할 수 있습니다.

6. 추적 등록

운송장을 등록하여 배송 추적을 시작합니다. 구독형(최대 14일 자동 폴링)과 일회성(즉시 1회 조회)을 선택할 수 있습니다.

POST
/v1/webhooks/register

Headers

이름설명
Authorization Bearer {apiKey}:{secretKey} 필수 - Private 인증
Content-Type application/json JSON 형식

Request Body

필드타입필수설명
items Array 필수 추적 항목 배열 (최대 100건)
items[].courierCode String 필수 택배사 코드 (cj, lotte 등)
items[].trackingNumber String 필수 운송장 번호
items[].clientId String 선택 사용자 정의 식별자 (웹훅 페이로드에 포함)
recurring Boolean 필수 true: 구독형(14일 자동 폴링), false: 일회성
endpointId String 선택 웹훅 엔드포인트 ID (미입력 시 웹훅 미전송)
metadata Object 선택 커스텀 데이터 (웹훅 페이로드에 그대로 포함)

예시 요청 (구독형)

register-tracking ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const sub = await client.webhooks.subscriptions.register({
  endpointId: 'ep_20260101_120000_a1b2c3d4e5f6a7b8',
  items: [
    { courierCode: 'cj', trackingNumber: '123456789012', clientId: 'order-12345' },
  ],
  recurring: true,
  metadata: { orderId: 'ORD-12345', customerId: 'CUS-999' },
});
console.log(sub.requestId);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

sub = client.webhooks.subscriptions.register(
    items=[
        {"courierCode": "cj", "trackingNumber": "123456789012", "clientId": "order-12345"},
    ],
    recurring=True,
    endpoint_id="ep_20260101_120000_a1b2c3d4e5f6a7b8",
    metadata={"orderId": "ORD-12345", "customerId": "CUS-999"},
)
print(sub["requestId"])
curl -X POST "https://api.deliveryapi.co.kr/v1/webhooks/register" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8",
    "items": [
      {
        "courierCode": "cj",
        "trackingNumber": "123456789012",
        "clientId": "order-12345"
      }
    ],
    "recurring": true,
    "metadata": {
      "orderId": "ORD-12345",
      "customerId": "CUS-999"
    }
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/register',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      endpointId: 'ep_20260101_120000_a1b2c3d4e5f6a7b8',
      items: [
        {
          courierCode: 'cj',
          trackingNumber: '123456789012',
          clientId: 'order-12345'
        }
      ],
      recurring: true,
      metadata: {
        orderId: 'ORD-12345',
        customerId: 'CUS-999'
      }
    })
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.post(
  "https://api.deliveryapi.co.kr/v1/webhooks/register",
  headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  },
  json={
    "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8",
    "items": [
      {
        "courierCode": "cj",
        "trackingNumber": "123456789012",
        "clientId": "order-12345"
      }
    ],
    "recurring": True,
    "metadata": {
      "orderId": "ORD-12345",
      "customerId": "CUS-999"
    }
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "message": "추적 요청이 등록되었습니다. 결과는 웹훅으로 수신하거나 requestId로 조회할 수 있습니다.", "data": { "requestId": "req_20260101_120000_b2c3d4e5f6a7b8c9", "itemCount": 1, "recurring": true } }
⏰ 폴링 정책
  • 구독형 (recurring: true): 등록 즉시 1회 크롤 후, 이후 매 1시간 간격으로 자동 폴링
  • 일회성 (recurring: false): 즉시 1회 크롤 후 결과 웹훅 전송 → 자동 종료
  • 야간 중단: 22:00~07:00 KST 폴링 자동 중단
  • 14일 제한: 등록 후 14일이 지나면 자동으로 구독 종료
  • 자동 종료: 모든 운송장이 배달 완료되면 tracking.completed 전송 후 자동 종료

7. 구독 목록 조회

등록된 추적 구독 목록을 페이지 단위로 조회합니다.

GET
/v1/webhooks/subscriptions

Query Parameters

파라미터타입필수설명
cursor String 선택 페이지네이션 커서 (이전 응답의 nextCursor)
limit Number 선택 페이지 크기 (1~100, 기본값 50)
status String 선택 상태 필터 (active, completed, cancelled)
from String 선택 시작일 (YYYY-MM-DD) — 해당일 이후 등록된 구독
to String 선택 종료일 (YYYY-MM-DD) — 해당일까지 등록된 구독

예시 요청

list-subscriptions ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.webhooks.subscriptions.list({
  status: 'active',
  limit: 20,
});
console.log(result.subscriptions);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.webhooks.subscriptions.list(status="active", limit=20)
print(result["subscriptions"])
curl -X GET "https://api.deliveryapi.co.kr/v1/webhooks/subscriptions?status=active&limit=20" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/subscriptions?status=active&limit=20',
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.get(
  "https://api.deliveryapi.co.kr/v1/webhooks/subscriptions",
  params={"status": "active", "limit": 20},
  headers={
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "data": { "subscriptions": [ { "requestId": "req_20260101_120000_b2c3d4e5f6a7b8c9", "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8", "recurring": true, "isActive": true, "status": "active", "itemCount": 2, "summary": { "total": 2, "delivered": 0, "active": 2, "failed": 0 }, "dateCreated": "2026-01-01T12:00:00.000Z" } ], "total": 1, "nextCursor": "2026-01-01T12:00:00.000Z" } }
페이지네이션

nextCursor는 다음 페이지가 있을 때만 포함됩니다. 마지막 페이지에서는 이 필드가 생략됩니다. 다음 페이지 조회 시 cursor 쿼리 파라미터에 이 값을 전달하세요.

8. 구독 상세 조회

특정 구독의 상세 정보와 각 운송장의 현재 추적 상태를 조회합니다.

GET
/v1/webhooks/subscriptions/{requestId}

예시 요청

get-subscription ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const detail = await client.webhooks.subscriptions.get(
  'req_20260101_120000_b2c3d4e5f6a7b8c9',
);
console.log(detail.items);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

detail = client.webhooks.subscriptions.get(
    "req_20260101_120000_b2c3d4e5f6a7b8c9",
)
print(detail["items"])
curl -X GET "https://api.deliveryapi.co.kr/v1/webhooks/subscriptions/req_20260101_120000_b2c3d4e5f6a7b8c9" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const requestId = 'req_20260101_120000_b2c3d4e5f6a7b8c9';
const response = await fetch(
  `https://api.deliveryapi.co.kr/v1/webhooks/subscriptions/${requestId}`,
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);
const data = await response.json();
console.log(data);
import requests

request_id = "req_20260101_120000_b2c3d4e5f6a7b8c9"
response = requests.get(
  f"https://api.deliveryapi.co.kr/v1/webhooks/subscriptions/{request_id}",
  headers={
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "data": { "requestId": "req_20260101_120000_b2c3d4e5f6a7b8c9", "endpointId": "ep_20260101_120000_a1b2c3d4e5f6a7b8", "recurring": true, "isActive": true, "status": "active", "itemCount": 1, "summary": { "total": 1, "delivered": 0, "active": 1, "failed": 0 }, "items": [ { "courierCode": "cj", "trackingNumber": "123456789012", "clientId": "order-12345", "currentStatus": "IN_TRANSIT", "previousStatus": "PICKED_UP", "hasChanged": true, "isDelivered": false, "trackingData": { "...배송 조회 데이터 (성공 시)" }, "error": null } ], "lastPolledAt": "2026-01-01T12:00:00.000Z", "nextPollAt": "2026-01-01T13:00:00.000Z", "metadata": { "orderId": "ORD-12345" }, "dateCreated": "2026-01-01T12:00:00.000Z", "dateModified": "2026-01-01T12:00:00.000Z" } }
items 필드 설명
  • trackingData: 조회 성공 시 배송 조회 API와 동일한 형식의 배송 데이터 (선택 필드)
  • error: 조회 실패 시 에러 메시지 (선택 필드)

9. 구독 취소

진행 중인 구독을 취소합니다.

DELETE
/v1/webhooks/subscriptions/{requestId}

예시 요청

cancel-subscription ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

await client.webhooks.subscriptions.cancel(
  'req_20260101_120000_b2c3d4e5f6a7b8c9',
);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

client.webhooks.subscriptions.cancel(
    "req_20260101_120000_b2c3d4e5f6a7b8c9",
)
curl -X DELETE "https://api.deliveryapi.co.kr/v1/webhooks/subscriptions/req_20260101_120000_b2c3d4e5f6a7b8c9" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/subscriptions/req_20260101_120000_b2c3d4e5f6a7b8c9',
  {
    method: 'DELETE',
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.delete(
  "https://api.deliveryapi.co.kr/v1/webhooks/subscriptions/req_20260101_120000_b2c3d4e5f6a7b8c9",
  headers={
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "message": "추적 요청이 취소되었습니다" }

10. 배치 결과 조회

운송장 번호 목록으로 현재 추적 상태를 일괄 조회합니다. 웹훅을 기다리지 않고 즉시 상태를 확인할 때 사용합니다.

POST
/v1/webhooks/results

Request Body

필드타입필수설명
items Array 필수 조회할 운송장 배열
items[].courierCode String 필수 택배사 코드 (cj, lotte 등)
items[].trackingNumber String 필수 운송장 번호

예시 요청

batch-results ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.webhooks.subscriptions.batchResults({
  items: [
    { courierCode: 'cj', trackingNumber: '123456789012' },
    { courierCode: 'lotte', trackingNumber: '987654321098' },
  ],
});
console.log(result.results);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.webhooks.subscriptions.batch_results([
    {"courierCode": "cj", "trackingNumber": "123456789012"},
    {"courierCode": "lotte", "trackingNumber": "987654321098"},
])
print(result["results"])
curl -X POST "https://api.deliveryapi.co.kr/v1/webhooks/results" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "items": [
      {
        "courierCode": "cj",
        "trackingNumber": "123456789012"
      },
      {
        "courierCode": "lotte",
        "trackingNumber": "987654321098"
      }
    ]
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/webhooks/results',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      items: [
        {
          courierCode: 'cj',
          trackingNumber: '123456789012'
        },
        {
          courierCode: 'lotte',
          trackingNumber: '987654321098'
        }
      ]
    })
  }
);
const data = await response.json();
console.log(data);
import requests

response = requests.post(
  "https://api.deliveryapi.co.kr/v1/webhooks/results",
  headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
  },
  json={
    "items": [
      {"courierCode": "cj", "trackingNumber": "123456789012"},
      {"courierCode": "lotte", "trackingNumber": "987654321098"}
    ]
  }
)
print(response.json())

응답 (성공)

{ "isSuccess": true, "data": { "results": [ { "courierCode": "cj", "trackingNumber": "123456789012", "clientId": "order-12345", "requestId": "req_20260101_120000_b2c3d4e5f6a7b8c9", "currentStatus": "IN_TRANSIT", "isDelivered": false, "trackingData": { "...배송 조회 데이터 (성공 시)" }, "lastPolledAt": "2026-01-01T12:00:00.000Z" } ], "total": 1 } }
결과 항목 필드
  • trackingData: 조회 성공 시 배송 조회 API와 동일한 형식의 배송 데이터 (선택 필드)
  • error: 조회 실패 시 에러 메시지 (선택 필드, 실패한 항목에만 포함)
  • clientId: 구독 등록 시 전달한 클라이언트 식별자 (선택 필드)

웹훅 페이로드

추적 등록 후 폴링 결과 또는 완료 시 지정한 엔드포인트 URL로 POST 요청이 전송됩니다.

수신 헤더

헤더예시 값설명
X-Webhook-Id evt_20260101_120000_c3d4... 웹훅 이벤트 고유 ID
X-Webhook-Timestamp 1735729200 Unix 타임스탬프 (초)
X-Webhook-Signature sha256=a1b2c3... HMAC-SHA256 서명
Content-Type application/json JSON 형식

수신 본문

{ "event": "tracking.polled", "requestId": "req_20260101_120000_b2c3d4e5f6a7b8c9", "timestamp": "2026-01-01T12:00:00.000Z", "summary": { "total": 2, "delivered": 1, "active": 1, "hasChanges": true }, "items": [ { "courierCode": "cj", "trackingNumber": "123456789012", "clientId": "order-12345", "currentStatus": "DELIVERED", "previousStatus": "OUT_FOR_DELIVERY", "hasChanged": true, "isDelivered": true, "trackingData": { "...배송 조회 데이터 (성공 시, 선택)" } } ], "metadata": { "orderId": "ORD-12345" } }

이벤트 타입

이벤트발생 시점
tracking.polled 구독형 정기 폴링 시마다 전송 (상태 변경 여부와 무관)
tracking.completed 모든 건 배달 완료 또는 일회성 조회 완료 시 마지막으로 전송

서명 검증

X-Webhook-Signature 헤더를 검증하여 위변조된 요청을 차단하세요.

검증 방법

서명 생성 방식: HMAC-SHA256(webhookSecret, "{timestamp}.{rawBody}")

타임스탬프 허용 오차: 300초 (5분)

예시 (Node.js)

verify-webhook ~ terminal
import crypto from 'crypto'

function verifyWebhook(rawBody, headers, secret) {
  const timestamp = headers['x-webhook-timestamp']
  const signature = headers['x-webhook-signature']

  // 타임스탬프 유효성 확인 (5분 이내)
  const diff = Math.abs(Date.now() / 1000 - Number(timestamp))
  if (diff > 300) throw new Error('Webhook timestamp expired')

  // 서명 검증
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(`${timestamp}.${rawBody}`)
    .digest('hex')

  if (!crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  )) throw new Error('Invalid webhook signature')

  return JSON.parse(rawBody)
}
import hmac
import hashlib
import time
import json

def verify_webhook(raw_body, headers, secret):
    timestamp = headers.get('x-webhook-timestamp')
    signature = headers.get('x-webhook-signature')

    # 타임스탬프 유효성 확인 (5분 이내)
    diff = abs(time.time() - int(timestamp))
    if diff > 300:
        raise Exception('Webhook timestamp expired')

    # 서명 검증
    message = f"{timestamp}.{raw_body}"
    expected = 'sha256=' + hmac.new(
        secret.encode(),
        message.encode(),
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(signature, expected):
        raise Exception('Invalid webhook signature')

    return json.loads(raw_body)

배송 상태 코드

웹훅으로 수신되는 배송 상태 코드는 송장조회 API와 동일합니다. 배송 상태 코드 표를 참조하세요.

DELIVERED 상태가 감지되면 해당 운송장의 구독이 자동 종료됩니다.

📋 주요 동작 정리
  • 폴링 주기: 1시간
  • 야간 폴링 중단: 22:00~07:00 KST
  • 구독 최대 기간: 14일 (이후 자동 종료)
  • 구독당 최대 운송장: 10건
  • API 키당 최대 엔드포인트: 10개
  • 웹훅 전송 타임아웃: 10초 (이후 실패 처리)
  • 연속 실패 자동 비활성화: 5사이클 실패 시 엔드포인트 자동 비활성화

택배사 계정 등록

택배사 계정을 등록합니다. ID/비밀번호 검증 후 자동으로 등록됩니다.

요청

POST
/v1/courier/accounts/register

Headers

이름
AuthorizationBearer {apiKey }: {secretKey }
Content-Typeapplication/json

Request Body

필드타입필수설명
providerIdString필수택배사 코드 ("lotte")
accountIdString필수택배사 로그인 ID
accountPasswordString필수택배사 로그인 비밀번호
accountNameString선택계정 별칭 (관리용)
descriptionString선택계정 설명 (메모용)
smsAutoCaptureBoolean선택SMS 자동 캡처 활성화 여부 (기본값: false)

예시 요청

account-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const account = await client.courier.accounts.register({
  providerId: 'lotte',
  accountId: 'your_lotte_id',
  accountPassword: 'your_lotte_password',
});
console.log(account.courierAccountKey);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

account = client.courier.accounts.register(
    provider_id="lotte",
    account_id="your_lotte_id",
    account_password="your_lotte_password",
)
print(account["courierAccountKey"])
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/accounts/register" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "providerId": "lotte",
    "accountId": "your_lotte_id",
    "accountPassword": "your_lotte_password"
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/courier/accounts/register',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      providerId: 'lotte',
      accountId: 'your_lotte_id',
      accountPassword: 'your_lotte_password'
    })
  }
);

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/accounts/register"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
payload = {
    "providerId": "lotte",
    "accountId": "your_lotte_id",
    "accountPassword": "your_lotte_password"
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "message": "롯데택배 계정이 등록되었습니다.", "data": { "courierAccountKey": "WYA5Rk2hUGKkYNW5Qnkn", "providerId": "lotte", "accountId": "your_lotte_id", "accountName": "", "isActive": true, "requires2FA": false } }

택배사 계정 목록

등록된 택배사 계정 목록을 조회합니다.

요청

GET
/v1/courier/accounts

Headers

이름
AuthorizationBearer {apiKey }: {secretKey }

예시 요청

account-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const accounts = await client.courier.accounts.list();
const active = accounts.filter(a => a.isActive);
console.log(active);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

accounts = client.courier.accounts.list()
active = [a for a in accounts if a["isActive"]]
print(active)
curl -X GET "https://api.deliveryapi.co.kr/v1/courier/accounts" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/courier/accounts',
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/accounts"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}

response = requests.get(url, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "data": [ { "courierAccountKey": "WYA5Rk2hUGKkYNW5Qnkn", "providerId": "lotte", "accountId": "your_lotte_id", "accountName": "본사 계정", "description": "", "isActive": true, "requires2FA": false, "smsAutoCapture": false, "lastInquiryDate": null, "dateCreated": "2025-12-01T10:00:00Z", "expiresAt": null } ] }

택배사 계정 상세

특정 택배사 계정의 상세 정보를 조회합니다.

요청

GET
/v1/courier/accounts/:accountKey

URL 파라미터

필드타입필수설명
accountKeyString필수계정 등록 시 발급된 키

예시 요청

account-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const detail = await client.courier.accounts.get('WYA5Rk2hUGKkYNW5Qnkn');
console.log(detail);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

detail = client.courier.accounts.get("WYA5Rk2hUGKkYNW5Qnkn")
print(detail)
curl -X GET "https://api.deliveryapi.co.kr/v1/courier/accounts/WYA5Rk2hUGKkYNW5Qnkn" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const accountKey = 'WYA5Rk2hUGKkYNW5Qnkn';
const response = await fetch(
  `https://api.deliveryapi.co.kr/v1/courier/accounts/${accountKey }`,
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data);
import requests

account_key = "WYA5Rk2hUGKkYNW5Qnkn"
url = f"https://api.deliveryapi.co.kr/v1/courier/accounts/{account_key }"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}

response = requests.get(url, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "data": { "courierAccountKey": "WYA5Rk2hUGKkYNW5Qnkn", "providerId": "lotte", "accountId": "your_lotte_id", "accountPassword": "(암호화하여 저장중)", "accountName": "본사 계정", "description": "", "isActive": true, "requires2FA": false, "smsAutoCapture": false, "lastInquiryDate": null, "dateCreated": "2025-12-01T10:00:00Z" } }

택배사 계정 삭제

등록된 택배사 계정을 삭제합니다.

요청

DELETE
/v1/courier/accounts/:accountKey

URL 파라미터

필드타입필수설명
accountKeyString필수삭제할 계정 키

예시 요청

account-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

await client.courier.accounts.delete('WYA5Rk2hUGKkYNW5Qnkn');
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

client.courier.accounts.delete("WYA5Rk2hUGKkYNW5Qnkn")
curl -X DELETE "https://api.deliveryapi.co.kr/v1/courier/accounts/WYA5Rk2hUGKkYNW5Qnkn" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const accountKey = 'WYA5Rk2hUGKkYNW5Qnkn';
const response = await fetch(
  `https://api.deliveryapi.co.kr/v1/courier/accounts/${accountKey }`,
  {
    method: 'DELETE',
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data);
import requests

account_key = "WYA5Rk2hUGKkYNW5Qnkn"
url = f"https://api.deliveryapi.co.kr/v1/courier/accounts/{account_key }"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}

response = requests.delete(url, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "message": "계정이 삭제되었습니다." }

배송 현황 조회

등록된 택배 계정으로 발송한 배송 건 목록을 조회합니다.

💡 택배사 계정이 필요합니다. courierAccountKey는 계정 등록 시 발급됩니다.

요청

POST
/v1/courier/deliveries/inquiry

Headers

이름
AuthorizationBearer {apiKey }: {secretKey }
Content-Typeapplication/json

Request Body

필드타입필수설명
courierAccountKeyString필수택배 계정 키
fromDateString필수조회 시작일 (YYYY-MM-DD)
toDateString필수조회 종료일 (YYYY-MM-DD)
statusFilterString선택상태 필터 (all, delivered, not_delivered, in_transit, pending)
includeDetailsBoolean선택상세 정보 포함 여부 (기본 false)

예시 요청

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.courier.deliveries.inquiry({
  courierAccountKey: 'YOUR_ACCOUNT_KEY',
  fromDate: '2026-01-01',
  toDate: '2026-01-31',
});
console.log(result.items);
console.log(result.summary);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.courier.deliveries.inquiry(
    courier_account_key="YOUR_ACCOUNT_KEY",
    from_date="2026-01-01",
    to_date="2026-01-31",
)
print(result["items"])
print(result["summary"])
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/deliveries/inquiry" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "fromDate": "2026-01-01",
    "toDate": "2026-01-31"
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/courier/deliveries/inquiry',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      courierAccountKey: 'YOUR_ACCOUNT_KEY',
      fromDate: '2026-01-01',
      toDate: '2026-01-31'
    })
  }
);

const data = await response.json();
console.log(data.data.items);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/deliveries/inquiry"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
payload = {
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "fromDate": "2026-01-01",
    "toDate": "2026-01-31"
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "data": { "items": [ { "trackingNumber": "123456789012", "courierTrackingId": "7705241632", "receiverName": "홍길동", "receiverAddress": { "fullAddress": "서울특별시 중구 세종대로 110" }, "deliveryStatus": "IN_TRANSIT", "deliveryStatusText": "배송중", "productName": "애플망고 3kg" } ], "summary": { "total": 1, "pending": 0, "inTransit": 1, "delivered": 0, "cancelled": 0, "returned": 0 }, "dateRange": { "from": "2026-01-01", "to": "2026-01-31" }, "courierInfo": { "courierCode": "lotte", "courierName": "롯데택배", "accountId": "your_lotte_id" }, "lastUpdated": "2026-01-31T15:30:00.000Z" } }

대시보드 통계

택배 계정의 기간별 배송 통계를 조회합니다.

요청

GET
/v1/courier/deliveries/dashboard

Query 파라미터

필드타입필수설명
courierAccountKeyString필수택배 계정 키
fromDateString필수시작일 (YYYY-MM-DD)
toDateString필수종료일 (YYYY-MM-DD)

예시 요청

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const stats = await client.courier.deliveries.dashboard({
  courierAccountKey: 'YOUR_ACCOUNT_KEY',
  fromDate: '2026-01-01',
  toDate: '2026-01-31',
});
console.log(stats.summary);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

stats = client.courier.deliveries.dashboard(
    courier_account_key="YOUR_ACCOUNT_KEY",
    from_date="2026-01-01",
    to_date="2026-01-31",
)
print(stats["summary"])
curl -X GET "https://api.deliveryapi.co.kr/v1/courier/deliveries/dashboard?courierAccountKey=YOUR_ACCOUNT_KEY&fromDate=2026-01-01&toDate=2026-01-31" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const params = new URLSearchParams({
  courierAccountKey: 'YOUR_ACCOUNT_KEY',
  fromDate: '2026-01-01',
  toDate: '2026-01-31'
});

const response = await fetch(
  `https://api.deliveryapi.co.kr/v1/courier/deliveries/dashboard?${params }`,
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/deliveries/dashboard"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
params = {
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "fromDate": "2026-01-01",
    "toDate": "2026-01-31"
}

response = requests.get(url, headers=headers, params=params)
print(response.json())

응답

{ "isSuccess": true, "data": { "items": [ { "totCnt": 50, "prtCnt": 45, "nonPrtCnt": 5, "pickCnt": 48, "pickCclCnt": 0, "outCnt": 40, "nonOutCnt": 10, "arvCnt": 35, "nonArvCnt": 15, "dlvcpCnt": 30, "nonDlvCnt": 20, "invRgstCnt": 50, "nonInvRgstCnt": 0, "dlvbCnt": 45, "pcadCnt": 2, "stbhCnt": 3, "pickYmd": "2026-01-15", "fstmIstrYmd": "20260115", "ustRtgSctCd": "01", "ustRtgSctNm": "출고", "ustRtgSct": null, "jobCustCd": "CUST001", "jobCustNm": "홍길동", "pickYmdGrouping": 0, "ustRtgSctCdGrouping": 0, "ustRtgSctNmGrouping": 0, "jobCustCdGrouping": 0, "jobCustNmGrouping": 0 } ], "summary": { "totalCount": 150, "pending": 10, "inTransit": 25, "delivered": 110, "problem": 5 }, "dateRange": { "from": "2026-01-01", "to": "2026-01-31" }, "lastUpdated": "2026-01-31T15:30:00.000Z" } }

배송 대량 등록

택배 계정으로 다건 주문을 일괄 등록합니다.

요청

POST
/v1/courier/deliveries/bulk-upload

Headers

이름
AuthorizationBearer {apiKey }: {secretKey }
Content-Typeapplication/json

Request Body

필드타입필수설명
courierAccountKeyString필수택배 계정 키
itemsArray필수등록할 주문 목록 (최대 1000건)
items[].requestIndexNumber선택요청 순서 (0부터, 응답 매칭용, 미제공 시 자동 부여)
items[].clientOrderIdString필수이용자 주문 ID (추적용)
items[].receiverNameString필수수하인 이름
items[].receiverPhone1String필수수하인 연락처
items[].receiverPhone2String선택수하인 추가 연락처
items[].receiverAddressString필수수하인 주소
items[].receiverDetailAddressString선택수하인 상세 주소
items[].receiverZipCodeString선택수하인 우편번호
items[].senderNameString선택발송인 이름 (미입력 시 계정 기본값 사용)
items[].senderPhone1String선택발송인 연락처 (미입력 시 계정 기본값 사용)
items[].senderPhone2String선택발송인 추가 연락처
items[].senderAddressString선택발송인 주소 (미입력 시 계정 기본값 사용)
items[].senderDetailAddressString선택발송인 상세 주소
items[].senderZipCodeString선택발송인 우편번호
items[].productNameString필수상품명
items[].quantityNumber필수수량
items[].deliveryMessageString선택배송 메시지

예시 요청

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const result = await client.courier.deliveries.bulkUpload({
  courierAccountKey: 'YOUR_ACCOUNT_KEY',
  items: [{
    clientOrderId: 'ORDER-001',
    receiverName: '홍길동',
    receiverPhone1: '01012345678',
    receiverAddress: '서울특별시 중구 세종대로 110',
    productName: '애플망고 3kg',
    quantity: 1,
    deliveryMessage: '부재시 경비실에 맡겨주세요',
  }],
});
const failed = result.results.filter(r => !r.success);
console.log(`등록: ${result.totalUploaded}건, 실패: ${result.totalFailed}건`);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.courier.deliveries.bulk_upload(
    courier_account_key="YOUR_ACCOUNT_KEY",
    items=[{
        "clientOrderId": "ORDER-001",
        "receiverName": "홍길동",
        "receiverPhone1": "01012345678",
        "receiverAddress": "서울특별시 중구 세종대로 110",
        "productName": "애플망고 3kg",
        "quantity": 1,
        "deliveryMessage": "부재시 경비실에 맡겨주세요",
    }],
)
failed = [r for r in result["results"] if not r["success"]]
print(f"등록: {result['totalUploaded']}건, 실패: {result['totalFailed']}건")
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "items": [
      {
        "clientOrderId": "ORDER-001",
        "receiverName": "홍길동",
        "receiverPhone1": "01012345678",
        "receiverPhone2": "",
        "receiverAddress": "서울특별시 중구 세종대로 110",
        "receiverDetailAddress": "1층",
        "receiverZipCode": "04524",
        "senderName": "",
        "senderPhone1": "",
        "senderPhone2": "",
        "senderAddress": "",
        "senderDetailAddress": "",
        "senderZipCode": "",
        "productName": "애플망고 3kg",
        "quantity": 1,
        "deliveryMessage": "부재시 경비실에 맡겨주세요"
      }
    ]
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      courierAccountKey: 'YOUR_ACCOUNT_KEY',
      items: [
        {
          clientOrderId: 'ORDER-001',
          receiverName: '홍길동',
          receiverPhone1: '01012345678',
          receiverPhone2: '',
          receiverAddress: '서울특별시 중구 세종대로 110',
          receiverDetailAddress: '1층',
          receiverZipCode: '04524',
          senderName: '',
          senderPhone1: '',
          senderPhone2: '',
          senderAddress: '',
          senderDetailAddress: '',
          senderZipCode: '',
          productName: '애플망고 3kg',
          quantity: 1,
          deliveryMessage: '부재시 경비실에 맡겨주세요'
        }
      ]
    })
  }
);

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
payload = {
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "items": [
        {
            "clientOrderId": "ORDER-001",
            "receiverName": "홍길동",
            "receiverPhone1": "01012345678",
            "receiverPhone2": "",
            "receiverAddress": "서울특별시 중구 세종대로 110",
            "receiverDetailAddress": "1층",
            "receiverZipCode": "04524",
            "senderName": "",
            "senderPhone1": "",
            "senderPhone2": "",
            "senderAddress": "",
            "senderDetailAddress": "",
            "senderZipCode": "",
            "productName": "애플망고 3kg",
            "quantity": 1,
            "deliveryMessage": "부재시 경비실에 맡겨주세요"
        }
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "data": { "success": true, "historyId": "20260320_1430_abc12", "totalRequested": 1, "totalUploaded": 1, "totalSkipped": 0, "totalFailed": 0, "fileAcptOdrNo": "F20260320143000001", "acptDt": "20260320", "results": [ { "requestIndex": 0, "clientOrderId": "ORDER-001", "success": true, "message": "등록 성공", "trackingNumber": "123456789012", "courierDeliveryId": "7705241632", "quantityOriginal": 1, "quantityUploaded": 1, "skipped": false } ] } }
응답 필드 설명
  • fileAcptOdrNo: 택배사 파일접수 번호 (CJ 등 일부 택배사에서 사용)
  • acptDt: 접수일자 (YYYYMMDD)
  • warning: 일부 항목의 관리번호(courierDeliveryId) 획득 실패 시 경고 메시지 (선택 필드)
  • results[].trackingNumber: 송장번호 (택배사에서 발급된 경우)
  • results[].quantityOriginal: 요청 수량
  • results[].quantityUploaded: 실제 등록 수량
  • results[].skipped: 중복으로 스킵 여부 (true 시 skipReason 포함)

업로드 이력 목록

대량 등록 이력 목록을 조회합니다. 날짜 범위로 필터링할 수 있습니다.

요청

GET
/v1/courier/deliveries/bulk-upload-histories

Query 파라미터

필드타입필수설명
providerIdString필수택배사 코드 ("lotte")
courierAccountKeyString선택특정 계정의 이력만 조회
fromDateString선택시작일 (YYYY-MM-DD)
toDateString선택종료일 (YYYY-MM-DD)
limitNumber선택최대 건수 (기본 50)

예시 요청

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const { histories } = await client.courier.deliveries.histories.list({
  providerId: 'lotte',
  fromDate: '2026-01-01',
  toDate: '2026-01-31',
});
const completed = histories.filter(h => h.status === 'completed');
console.log(completed);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.courier.deliveries.histories.list(
    provider_id="lotte",
    from_date="2026-01-01",
    to_date="2026-01-31",
)
completed = [h for h in result["histories"] if h["status"] == "completed"]
print(completed)
curl -X GET "https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload-histories?providerId=lotte&fromDate=2026-01-01&toDate=2026-01-31" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const params = new URLSearchParams({
  providerId: 'lotte',
  fromDate: '2026-01-01',
  toDate: '2026-01-31'
});

const response = await fetch(
  `https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload-histories?${params }`,
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data.data.histories);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload-histories"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
params = {
    "providerId": "lotte",
    "fromDate": "2026-01-01",
    "toDate": "2026-01-31"
}

response = requests.get(url, headers=headers, params=params)
print(response.json())

응답

{ "isSuccess": true, "message": "업로드 이력 목록 조회 성공", "data": { "histories": [ { "id": "20260320_1430_abc12", "courierAccountKey": "WYA5Rk2hUGKkYNW5Qnkn", "providerId": "lotte", "status": "completed", "totalCount": 10, "successCount": 9, "failCount": 1, "fileAcptOdrNo": null, "dateCreated": "2026-01-15T14:30:00Z", "dateModified": "2026-01-15T14:35:00Z" } ] } }

업로드 이력 상세

특정 업로드 이력의 상세 정보와 현재 배송 상태를 조회합니다. 택배사 API를 실시간으로 호출하여 최신 상태를 반환합니다.

요청

GET
/v1/courier/deliveries/bulk-upload-histories/:historyId/detail

URL 파라미터

필드타입필수설명
historyIdString필수업로드 이력 ID

Query 파라미터

필드타입필수설명
courierAccountKeyString필수택배 계정 키

예시 요청

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const { history, detailItems } = await client.courier.deliveries.histories.get(
  '20260320_1430_abc12',
  { courierAccountKey: 'YOUR_ACCOUNT_KEY' },
);
const delivered = detailItems.filter(d => d.isDelivered);
console.log(history);
console.log(`배송완료: ${delivered.length}건`);
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

result = client.courier.deliveries.histories.get(
    "20260320_1430_abc12",
    courier_account_key="YOUR_ACCOUNT_KEY",
)
delivered = [d for d in result["detailItems"] if d["isDelivered"]]
print(result["history"])
print(f"배송완료: {len(delivered)}건")
curl -X GET "https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload-histories/20260320_1430_abc12/detail?courierAccountKey=YOUR_ACCOUNT_KEY" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__"
const historyId = '20260320_1430_abc12';
const response = await fetch(
  `https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload-histories/${historyId }/detail?courierAccountKey=YOUR_ACCOUNT_KEY`,
  {
    headers: {
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    }
  }
);

const data = await response.json();
console.log(data.data.detailItems);
import requests

history_id = "20260320_1430_abc12"
url = f"https://api.deliveryapi.co.kr/v1/courier/deliveries/bulk-upload-histories/{history_id }/detail"
headers = {
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
params = {
    "courierAccountKey": "YOUR_ACCOUNT_KEY"
}

response = requests.get(url, headers=headers, params=params)
print(response.json())

응답

{ "isSuccess": true, "message": "업로드 상세 조회 성공", "data": { "history": { "id": "202603201954_AFpSY", "providerId": "lotte", "status": "completed", "totalCount": 1, "successCount": 1, "failCount": 0, "items": [ { "requestIndex": 0, "clientOrderId": "ORDER-001", "receiverName": "홍길동", "productName": "애플망고 3kg", "success": true, "message": "등록 완료", "courierDeliveryId": "7705395414" } ], "dateCreated": "2026-03-20T10:34:36.707Z", "dateModified": "2026-03-20T10:34:38.649Z" }, "detailItems": [ { "courierTrackingId": "7705395414", "trackingNumber": "", "orderNumber": "ORDER-001", "courierCode": "lotte", "courierName": "롯데택배", "deliveryStatus": "PENDING", "deliveryStatusText": "대기중", "isDelivered": false, "senderName": "김**", "receiverName": "홍길동", "receiverPhone": "010****5678", "receiverAddress": { "fullAddress": "서울특별시 중구 세종대로 110" }, "productName": "애플망고 3kg", "productQuantity": 1, "pickupDate": "2026-03-20", "deliveryDate": null, "queriedAt": "2026-03-20T15:30:00.000Z" } ] } }

배송 취소

배송을 취소하는 통합 엔드포인트입니다. 파라미터 조합에 따라 3가지 방식으로 동작합니다.

  • historyId만: 해당 이력의 전체 배송 취소 + 이력 soft delete
  • historyId + courierDeliveryIds: 이력 내 부분 취소
  • courierDeliveryIds만: 택배사 직접 취소 (이력 무관, 최근 7일)

이미 발송 처리되었거나 송장번호가 부여된 건은 취소할 수 없습니다.

요청

POST
/v1/courier/deliveries/cancel

Body 파라미터

필드타입필수설명
courierAccountKeyString필수택배 계정 키
historyIdString선택업로드 이력 ID. 지정 시 이력 기반 취소
courierDeliveryIdsString[]선택취소할 배송 관리번호 목록

historyId 또는 courierDeliveryIds 중 하나는 필수입니다.

예시 요청 (이력 전체 취소)

delivery-api ~ terminal
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/deliveries/cancel" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -H "Content-Type: application/json" \
  -d '{
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "historyId": "20260320_1430_abc12"
  }'

예시 요청 (이력 내 부분 취소)

delivery-api ~ terminal
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/deliveries/cancel" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -H "Content-Type: application/json" \
  -d '{
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "historyId": "20260320_1430_abc12",
    "courierDeliveryIds": ["7705459135", "7705459136"]
  }'

예시 요청 (택배사 직접 취소)

delivery-api ~ terminal
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/deliveries/cancel" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -H "Content-Type: application/json" \
  -d '{
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "courierDeliveryIds": ["7705459135"]
  }'

응답 (이력 전체 취소)

{ "isSuccess": true, "message": "업로드가 삭제되었습니다." }

응답 (이력 내 부분 취소)

{ "isSuccess": true, "message": "2건 취소 완료 (3건 유지)" }

응답 (택배사 직접 취소)

{ "isSuccess": true, "message": "1건 취소 완료" }

송장 출력 페이지

delivery-saas는 택배 라벨 출력을 위한 호스팅 출력 페이지를 제공합니다.

PG 결제창처럼, 개발자는 복잡한 OZ Viewer 연동 없이 window.open() 한 줄로 라벨 출력이 가능합니다.

출력 페이지 URL

https://print.deliveryapi.co.kr

사전 요구사항

출력 페이지는 OZ Viewer가 설치된 PC에서만 동작합니다. OZ Viewer가 설치되어 있지 않으면 설치 안내가 표시됩니다.

출력 대상의 courierTrackingId배송 대량 등록 API로 등록한 건 외에도, 택배사 시스템에 유효한 값이면 사용할 수 있습니다.

2가지 사용 방법

출력 페이지를 여는 방법은 2가지가 있습니다. 상황에 맞게 선택하세요.

구분Direct 방식Session 방식
보안API 키가 URL에 노출됨API 키가 URL에 노출되지 않음
구현 난이도간단 (URL 한 줄)API 호출 1회 추가 필요
적합한 환경내부 도구, 관리자 PC외부 공개 서비스, 보안 민감

각 방식의 상세한 사용법은 아래 섹션을 참고하세요.

출력 결과 수신

출력 완료 시 부모 창에 postMessage로 결과가 전달됩니다. 두 방식 모두 동일하게 동작합니다.

필드타입설명
typeString항상 'delivery-print-complete'
successBoolean출력 성공 여부
courierTrackingIdsString[]출력 대상 관리번호 배열
itemsObject[]관리번호 → 송장번호 매핑 배열
items[].courierTrackingIdString관리번호
items[].trackingNumberString | null발급된 송장번호 (미발급 시 null)

응답 예시

{ "type": "delivery-print-complete", "success": true, "courierTrackingIds": ["7705969337", "7705241632"], "items": [ { "courierTrackingId": "7705969337", "trackingNumber": "12345678901234" }, { "courierTrackingId": "7705241632", "trackingNumber": "12345678901235" } ] }

Direct 방식

URL 파라미터에 API 키와 설정을 직접 전달합니다. 가장 간단한 방법입니다.

개발자 본인의 PC에서 사용하는 경우, API 키가 URL에 노출되어도 보안상 큰 문제가 없으므로 이 방식을 추천합니다.

URL 파라미터

파라미터타입필수설명
apiKeyString필수API Key
secretKeyString필수Secret Key
courierAccountKeyString필수택배 계정 키
providerIdString필수택배사 코드 (예: lotte)
idsString조건부택배사 관리번호 (콤마 구분). historyId 미제공 시 필수
historyIdString조건부대량 등록 이력 ID. ids 미제공 시 필수 — 해당 이력의 관리번호를 자동으로 사용하며, 출력 완료 후 출력 일시가 기록됩니다. 둘 다 제공 시 ids는 해당 이력에 포함된 관리번호여야 합니다.

예시 코드

delivery-api ~ terminal
// 출력 페이지 열기 (팝업)
window.open(
  'https://print.deliveryapi.co.kr'
  + '?apiKey=__API_KEY__'
  + '&secretKey=__SECRET_KEY__'
  + '&courierAccountKey=YOUR_ACCOUNT_KEY'
  + '&providerId=lotte'
  + '&ids=7705241632,7705241633',
  'print',
  'width=1200,height=800'
);

// 출력 결과 수신 (선택)
window.addEventListener('message', (e) => {
  if (e.data.type === 'delivery-print-complete') {
    console.log('출력 완료:', e.data.success);
    console.log('대상 ID:', e.data.courierTrackingIds);
  }
});

Session 방식

서버에서 임시 세션을 생성한 뒤, 세션 ID만으로 출력 페이지를 엽니다. API 키가 URL에 노출되지 않습니다.

동작 흐름

  1. 서버에서 POST /v1/courier/print/sessions 호출 → sessionId 발급
  2. 클라이언트에서 sessionId만으로 출력 페이지 열기
  3. 출력 페이지가 내부적으로 세션 정보를 조회하여 동작

세션은 1회용이며, 10분 후 자동 만료됩니다.

세션 생성 API

POST
/v1/courier/print/sessions

Headers

이름
AuthorizationBearer {apiKey }: {secretKey }
Content-Typeapplication/json

Body 파라미터

필드타입필수설명
courierAccountKeyString필수택배 계정 키
providerIdString필수택배사 코드 (예: lotte)
courierTrackingIdsString[]조건부출력할 택배사 관리번호 배열. bulkUploadHistoryId 미제공 시 필수
bulkUploadHistoryIdString조건부대량 등록 이력 ID. courierTrackingIds 미제공 시 필수 — 해당 이력의 관리번호를 자동으로 사용하며, 출력 완료 후 출력 일시가 기록됩니다. 둘 다 제공 시 courierTrackingIds는 해당 이력에 포함된 관리번호여야 합니다.

예시 요청

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

const session = await client.courier.print.createSession({
  courierAccountKey: 'YOUR_ACCOUNT_KEY',
  providerId: 'lotte',
  courierTrackingIds: ['7705241632', '7705241633'],
});
console.log(session.sessionId);
// 출력 URL: https://print.deliveryapi.co.kr?session={sessionId}
# pip install deliveryapi 으로 설치하면 Python에서 바로 사용할 수 있어요
from deliveryapi import DeliveryAPIClient

client = DeliveryAPIClient(
    api_key="__API_KEY__",
    secret_key="__SECRET_KEY__",
)

session = client.courier.print.create_session(
    courier_account_key="YOUR_ACCOUNT_KEY",
    provider_id="lotte",
    courier_tracking_ids=["7705241632", "7705241633"],
)
print(session["sessionId"])
# 출력 URL: https://print.deliveryapi.co.kr?session={sessionId}
curl -X POST "https://api.deliveryapi.co.kr/v1/courier/print/sessions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer __API_KEY__:__SECRET_KEY__" \
  -d '{
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "providerId": "lotte",
    "courierTrackingIds": ["7705241632", "7705241633"]
  }'
const response = await fetch(
  'https://api.deliveryapi.co.kr/v1/courier/print/sessions',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      courierAccountKey: 'YOUR_ACCOUNT_KEY',
      providerId: 'lotte',
      courierTrackingIds: ['7705241632', '7705241633']
    })
  }
);

const data = await response.json();
console.log(data);
import requests

url = "https://api.deliveryapi.co.kr/v1/courier/print/sessions"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer __API_KEY__:__SECRET_KEY__"
}
payload = {
    "courierAccountKey": "YOUR_ACCOUNT_KEY",
    "providerId": "lotte",
    "courierTrackingIds": ["7705241632", "7705241633"]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

응답

{ "isSuccess": true, "message": "출력 세션이 생성되었습니다.", "data": { "sessionId": "3e624664dfe10a9...", "expiresAt": "2026-03-21T03:00:00.000Z" } }

출력 페이지 열기

반환된 sessionId로 출력 페이지를 엽니다:

https://print.deliveryapi.co.kr?session={sessionId}

전체 예시 코드

delivery-api ~ terminal
// npm i deliveryapi 으로 설치하면 Node.js에서 바로 사용할 수 있어요
import { DeliveryAPIClient } from 'deliveryapi';

const client = new DeliveryAPIClient({
  apiKey: '__API_KEY__',
  secretKey: '__SECRET_KEY__',
});

// 1단계: 세션 생성 (서버에서 실행)
const session = await client.courier.print.createSession({
  courierAccountKey: 'YOUR_ACCOUNT_KEY',
  providerId: 'lotte',
  courierTrackingIds: ['7705241632', '7705241633'],
});

// 2단계: 출력 페이지 열기 (클라이언트에서 실행)
window.open(
  `https://print.deliveryapi.co.kr?session=${session.sessionId}`,
  'print',
  'width=1200,height=800',
);

// 출력 결과 수신 (선택)
window.addEventListener('message', (e) => {
  if (e.data.type === 'delivery-print-complete') {
    console.log('출력 완료:', e.data.success);
    console.log('대상 ID:', e.data.courierTrackingIds);
  }
});
// 1단계: 서버에서 세션 생성 (API 키는 서버에서만 사용)
const res = await fetch(
  'https://api.deliveryapi.co.kr/v1/courier/print/sessions',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer __API_KEY__:__SECRET_KEY__'
    },
    body: JSON.stringify({
      courierAccountKey: 'YOUR_ACCOUNT_KEY',
      providerId: 'lotte',
      courierTrackingIds: ['7705241632', '7705241633']
    })
  }
);
const { data: { sessionId } } = await res.json();

// 2단계: 클라이언트에서 세션 ID로 출력 페이지 열기
window.open(
  `https://print.deliveryapi.co.kr?session=${sessionId}`,
  'print',
  'width=1200,height=800'
);

// 출력 결과 수신 (선택)
window.addEventListener('message', (e) => {
  if (e.data.type === 'delivery-print-complete') {
    console.log('출력 완료:', e.data.success);
    console.log('대상 ID:', e.data.courierTrackingIds);
  }
});