본문으로 건너뛰기
FKTG — From Korea To Global
문서 목차

FKTG DEVELOPERS

Customer OMS API

자사몰의 주문을 FKTG 발송으로 연결하세요. Rate API로 운임을 조회하고, Ship API로 발송을 관리하며, Tracking API로 배송 상태를 확인합니다.

LLM에 이렇게 전달하세요

  1. 전달용 Markdown 파일을 내려받아 사용하는 LLM에 첨부합니다.
  2. 아래 지시문과 자사몰의 개발 언어·주문 처리 방식을 알려줍니다.
  3. 합성 데이터 검증 후, 승인한 범위에서 운영 연동을 시작합니다.

파일 하나에 LLM 개발 지침과 전체 OpenAPI가 들어 있습니다. Client Secret, 토큰과 실제 고객 정보는 LLM 대화에 붙여 넣지 마세요.

첨부한 FKTG 연동 가이드와 OpenAPI를 기준으로 우리 자사몰에 연동해줘.
먼저 기존 주문 모델, 백엔드, 비밀 관리와 테스트 방식을 확인해.
Rate API로 운임 조회, Ship API로 발송 생성·조회·수정·취소·Agent AWB 조회·house label PDF 다운로드, Tracking API로 배송 상태 조회를 구현해.
공개 shipment_id와 external_shipment_ref를 저장하고, EU PID와 중복·timeout 대사 규칙을 지켜.
API 키는 대화에 요청하지 말고 서버의 환경변수로 읽어. 합성 데이터와 mock으로 먼저 검증해.
운영 API 호출은 내가 승인한 뒤 실행하고, 실제 검증한 범위와 미검증 항목을 구분해 보고해.

운영 Base URL

https://www.fktg.co.kr/api/open/v1

별도 샌드박스는 제공되지 않습니다. 이 페이지는 문서이며 API 요청을 실행하지 않습니다.

인증과 권한

발급받은 Client ID와 Client Secret으로 토큰을 요청하고, 이후 요청에 Authorization: Bearer <access_token>을 보냅니다. 토큰은 해석하지 않는 문자열로 다루고 expires_in을 기준으로 갱신하세요. 키와 토큰은 서버에서만 사용합니다.

사용 가능한 권한은 credential마다 다릅니다. 운임은 rates.read, 조회는 shipments.read, 생성·수정·취소는 shipments.write가 필요합니다. 고객 포털 API 설정에서 확인하세요.

POST/api/open/v1/auth/token

Issue access token

권한: Client ID + Client Secret

필드와 요청·응답 보기

Issue a Bearer access token using client_id and client_secret.

요청 본문 필드

client_idstring · 필수
client_secretstring · 필수

중첩 필드의 제약과 전체 응답 스키마는 OpenAPI 원문을 확인하세요.

요청 예제 · 합성 데이터

{
  "client_id": "hugo_client",
  "client_secret": "secret_example_value"
}
200
Token issued successfully
400
Invalid request body
401
Invalid credentials
403
Revoked credential
404
404 error; see error.code and correlation_id
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support

Rate API

견적을 비교해 service_code 하나와 예상 운임을 확인한 뒤 Ship API로 발송물 한 건을 생성합니다. Rate는 운송장을 만들거나 가격을 예약하지 않습니다. 기존 carrier + service_name 요청도 지원합니다. requires_carrier_confirmation과 운송 조건을 확인하고, 확정 청구액으로 오해하지 않도록 예상 운임으로 표시하세요.

POST/api/open/v1/rates/quotes

Quote customer-facing rates across eligible carrier services

권한: rates.read

필드와 요청·응답 보기

Returns all applicable carrier/service quotes for the authenticated company. Omitted declared_packaging_type defaults to BOX. For one handling unit, use the top-level field; when packages is present, each array entry takes precedence and its omitted declaration defaults to BOX, without inheriting the top-level declaration. PALLET/SKID requires the actual declared_pallet_piece_count for every unit. UPS BOX/CRATE is not eligible for Worldwide Express Freight; PALLET/SKID is not eligible for UPS parcel services. Destination-country filtering, active flags, internal service inclusion rules, company carrier pricing settings, margins/discounts, and peak surcharge rules are applied. If one carrier quote fails, successful quotes are still returned and failures are listed in `unavailable_quotes`. A YunExpress destination missing from an allowlist-only local coverage table can return a contracted-rate quote with optional `requires_carrier_confirmation: true`. Display a carrier-confirmation notice alongside the price; quote success is not proof of carrier acceptance. Acceptance is resolved when the label is issued. Explicit blocked destinations and other country, service, weight and customs restrictions still apply. Quoting never creates a YunExpress order or calls its price-trial API. Required credential scope: rates.read. Return eligible services without creating a shipment, FKTG AWB or carrier label. Compare quotes, select one service_code and submit one Ship create request. A quote does not reserve a price or guarantee carrier acceptance. Optional service_code filters to that one eligible service; unknown, inactive or ineligible selections return 422 CARRIER_SERVICE_NOT_CUSTOMER_SELECTABLE without falling back. Malformed codes return 400 INVALID_REQUEST.

요청 본문 필드

declared_packaging_typestring | null · 선택
Sender-declared final handling unit. BOX means a paper carton or customer packaging (MY PACKAGE); CRATE means a wooden box; PALLET means a pallet; SKID means a skid. MY_PACKAGE is not an input value. Omission defaults to BOX on creation and rate quotes; existing ordinary-box requests need no new field. For rate quotes, packages entries take precedence over top-level declarations and do not inherit them. On PATCH, omission preserves the saved declaration for the same package_index and defaults to BOX for a new package; explicit null clears it. Legacy or explicitly cleared declarations can read back as null. Separate from warehouse-confirmed packaging_type. UPS BOX/CRATE cannot use Worldwide Express Freight; PALLET/SKID cannot use UPS parcel services. Each PALLET/SKID needs declared_pallet_piece_count. An incompatible service returns HTTP 422 CARRIER_SERVICE_NOT_CUSTOMER_SELECTABLE or INVALID_PACKAGING_SERVICE depending on the validation stage; a provider may return no quote.
declared_pallet_piece_countinteger | null · 선택
Number of individual packages loaded on this pallet or skid, not the number of pallets or product units. Required for PALLET/SKID and UPS Worldwide Express Freight, including legacy rows without a declared type. Each handling unit requires its own count; no automatic default is applied. The total cannot exceed 99999. On package PATCH, omission preserves the saved count; null clears it only when the effective service and packaging do not require it.
weightnumber · 필수
dimensionsobject · 필수
recipientobject · 필수
packagesarray · 선택
Per-unit declared_packaging_type (BOX, CRATE, PALLET, SKID or null) takes precedence over the top-level declaration. Omission on each unit defaults to BOX; PALLET/SKID requires declared_pallet_piece_count. Top-level declarations are not copied to the array.
item_countinteger · 선택
Required for EU27. Declared Item count: group matching HS first 6 digits + product name + origin; quantity does not multiply the count. Yun local quote policy before 2026-11-01 KST: KRW5400/item; after: KRW9000/item (EUR3 duty + EUR2 handling at KRW1800/EUR). VAT advance fees billed separately later. Existing acceptance limits unchanged; deployment and account billing must be verified.
incotermsstring · 선택
FedEx DAP/DDP; UPS DAP/DDP; YUN BR DAP only, all other destinations DDP; SF US DDP only, flexible services DAP/DDP elsewhere, E-Commerce Express CD DAP only for TH/TW/HK/CN/SG/VN/MO/PH and DDP otherwise. Invalid combinations rejected; no silent payer change. Existing create compatibility: Yun non-BR and some SF-CD DAP requests normalize to DDP with explicit INCOTERMS_NORMALIZED_TO_DDP warning. Obtain payer consent and request DDP explicitly. Quotes do not normalize. PATCH rejects invalid incoterms with 422; it does not normalize DAP to DDP.
service_codestring · 선택
Stable opaque FKTG service identifier returned by Rate API. Not a provider-native service code. Use the returned value verbatim; do not derive it from carrier/name or an internal ID.

중첩 필드의 제약과 전체 응답 스키마는 OpenAPI 원문을 확인하세요.

요청 예제 · 합성 데이터

{
  "weight": 1.2,
  "dimensions": {
    "length": 25,
    "width": 15,
    "height": 10
  },
  "recipient": {
    "city": "New York",
    "state": "NY",
    "country": "US",
    "postal_code": "10001"
  }
}

성공 응답 예제 · 합성 데이터

{
  "success": true,
  "request": {
    "weight": 1.2,
    "dimensions": {
      "length": 25,
      "width": 15,
      "height": 10
    },
    "recipient": {
      "city": "New York",
      "state": "NY",
      "country": "US",
      "postal_code": "10001"
    }
  },
  "quotes": [
    {
      "carrier_id": "example-ups",
      "carrier_code": "UPS",
      "carrier_name": "UPS",
      "service_name": "Worldwide Expedited",
      "currency": "KRW",
      "total_cost": 9900,
      "charged_weight": 1.2,
      "volume_weight_divisor": 5000,
      "service_code": "FKTG-SVC-0123456789ABCDEF0123456789ABCDEF"
    }
  ],
  "unavailable_quotes": [
    {
      "carrier_id": "example-fedex",
      "carrier_code": "FEDEX",
      "carrier_name": "FedEx",
      "service_name": "International Priority",
      "reason": "Rate quote unavailable",
      "service_code": "FKTG-SVC-FEDCBA9876543210FEDCBA9876543210"
    }
  ]
}
200
Quotes resolved successfully
400
Invalid JSON or schema validation failure
401
Unauthorized
403
403 error; see error.code and correlation_id
404
404 error; see error.code and correlation_id
409
409 error; see error.code and correlation_id
422
No eligible services available for the requested destination
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support

Ship API

생성 응답의 공개 shipment_id를 저장해 모든 후속 요청에 사용하세요. 기존 발송물은 외부 참조 또는 FKTG 운송장 번호(AWB)로 조회할 수 있습니다. 내부 DB ID는 필요하지 않습니다.

Ship에 보낸 중량·규격과 선택 서비스로 서버가 운임을 계산해 발송물과 함께 저장합니다. 생성·조회·PATCH의 estimated_rate로 저장된 예상 운임을 확인하세요. 운임에 영향을 주는 수정은 금액도 함께 갱신하며, 계산에 실패하면 등록·수정하지 않습니다. 실측·추가요금에 따라 최종 청구액은 달라질 수 있습니다.

  1. 1운임 조회
  2. 2발송 생성
  3. 3공개 ID 저장
  4. 4조회·수정
  5. 5라벨·tracking
  6. 6허용 상태에서 취소
  • PATCH의 items와 packages는 전체 교체입니다. 유지할 항목도 모두 보내세요.
  • GET /shipments/{shipmentId}/awb로 FKTG 번호와 에이전트 운송장번호(carrier_awb)를 조회합니다. 에이전트 번호가 아직 저장되지 않았다면 null이며, 번호는 선행 0을 유지하는 문자열로 보관하세요.
  • GET /shipments/{shipmentId}/label은 application/pdf 바이너리를 반환합니다. House label은 FKTG 관리용이며 실제 운송사 라벨 발급이나 출고 완료를 뜻하지 않습니다.
  • 취소 가능 여부는 서버가 상태를 확인합니다. 취소가 운송사 void나 결제 환불을 의미하지 않습니다.
POST/api/open/v1/shipments

Create shipment

권한: shipments.write

필드와 요청·응답 보기

Create a shipment in FKTG OMS. Omitted packages[].declared_packaging_type defaults to BOX, preserving existing ordinary-box requests. Declare CRATE, PALLET or SKID when applicable. UPS Worldwide Express Freight requires eligible actual packaging and declared_pallet_piece_count; default BOX compatibility does not make an ordinary box eligible for Freight. Duplicate prevention: - The request is treated as unique by company_id + external_shipment_ref. - Re-using the same external_shipment_ref returns 409 conflict. Policy notes: - packages must contain at least one package. - items must contain at least one item. - HS Code and origin country are optional. - sender_ioss is optional. - EU destinations require export_reason; EU sales to individual recipients require merchantProductId and nonStandardManufacturerProductId on every item. - standardManufacturerProductId is optional. PID fields are strings and preserve leading zeroes. - Unsupported carrier/service/incoterms/destination combinations return 422. Required credential scope: shipments.write. Use an FKTG service_code from Rate. Without a code, legacy carrier + service_name remains supported. If a supplied carrier or name disagrees with the code, return 422 SERVICE_SELECTION_CONFLICT; never silently select another service. Unknown/disabled codes return 422 CARRIER_SERVICE_NOT_ACTIVE, ambiguous legacy names return 422 CARRIER_SERVICE_AMBIGUOUS, and destination/packaging restrictions still apply. Malformed code strings return 400 INVALID_REQUEST. The server calculates the selected service rate from the submitted package weights/dimensions, recipient, incoterms and declaration items under the authenticated company pricing, then saves freight and its snapshot atomically with the shipment. No client-supplied amount or quote token is required. Internal calculation requires no extra rates.read scope. Calculation failure returns 422 RATE_UNAVAILABLE before shipment creation; no zero-fare registration is accepted. This saves an estimate, not payment or release approval. Yun supports one package per shipment; multiple packages return422 CARRIER_MULTI_PIECE_UNSUPPORTED before any write. Older registration acceptance did not imply rating or label support.

요청 본문 필드

external_order_idstring · 필수
external_shipment_refstring · 필수
Unique per company scope
external_order_refstring | null · 선택
external_channelstring | null · 선택
order_datetimestring | null · 선택
carrierstring · 선택
incotermsstring · 필수
FedEx DAP/DDP; UPS DAP/DDP; YUN BR DAP only, all other destinations DDP; SF US DDP only, flexible services DAP/DDP elsewhere, E-Commerce Express CD DAP only for TH/TW/HK/CN/SG/VN/MO/PH and DDP otherwise. Invalid combinations rejected; no silent payer change. Existing create compatibility: Yun non-BR and some SF-CD DAP requests normalize to DDP with explicit INCOTERMS_NORMALIZED_TO_DDP warning. Obtain payer consent and request DDP explicitly. Quotes do not normalize. PATCH rejects invalid incoterms with 422; it does not normalize DAP to DDP.
senderobject · 필수
sender_iossstring | null · 선택
Optional. Useful for EU destinations.
export_reasonstring · 선택
Required for EU destinations. Use the actual purpose; missing EU purpose returns 422 INVALID_EU_EXPORT_REASON.
recipientobject · 필수
packagesarray · 필수
Each final handling unit accepts declared_packaging_type: BOX (paper carton/customer packaging, MY PACKAGE), CRATE (wooden box), PALLET or SKID; explicit null is allowed. Omission defaults to BOX. PALLET/SKID requires declared_pallet_piece_count.
itemsarray · 필수
memostring | null · 선택
service_namestring · 선택
Legacy selection: exact Rate service_name together with carrier. Optional when service_code is provided; if supplied, it must match that code.
service_codestring · 선택
Stable opaque FKTG service identifier returned by Rate API. Not a provider-native service code. Use the returned value verbatim; do not derive it from carrier/name or an internal ID.

중첩 필드의 제약과 전체 응답 스키마는 OpenAPI 원문을 확인하세요.

요청 예제 · 합성 데이터

{
  "external_order_id": "ORD-20260422-1001",
  "external_shipment_ref": "ORD-20260422-1001-1",
  "external_order_ref": "MALL-10000421",
  "external_channel": "hugo-shop",
  "order_datetime": "2026-04-22T10:20:00+09:00",
  "incoterms": "DAP",
  "sender": {
    "company_name": "HUGO SHOP",
    "name": "홍길동",
    "phone": "01012345678",
    "email": "ops@hugoshop.com",
    "address_line1": "Seoul, Korea"
  },
  "sender_ioss": null,
  "recipient": {
    "name": "John Smith",
    "phone": "+1-302-555-1234",
    "email": "john@example.com",
    "address_line1": "350 5th Ave",
    "address_line2": "Floor 10",
    "address_line3": "Suite 1001",
    "city": "New York",
    "state": "NY",
    "postal_code": "10001",
    "country": "US",
    "tax_id": null
  },
  "packages": [
    {
      "package_index": 1,
      "weight": 1.2,
      "length": 25,
      "width": 15,
      "height": 10
    },
    {
      "package_index": 2,
      "weight": 2.1,
      "length": 40,
      "width": 20,
      "height": 10
    }
  ],
  "items": [
    {
      "sku": "SKU-001",
      "name_kr": "테스트 상품",
      "name_en": "Test Product",
      "quantity": 2,
      "unit_price": 12.5,
      "unit_weight": 0.5,
      "origin_country": null,
      "hs_code": null
    }
  ],
  "memo": "Gift wrap requested",
  "service_code": "FKTG-SVC-0123456789ABCDEF0123456789ABCDEF"
}

성공 응답 예제 · 합성 데이터

{
  "success": true,
  "shipment_id": "shp_0123456789abcdef0123456789abcdef",
  "fktg_awb": "483920174625",
  "external_order_id": "SYNTHETIC-ORDER-1",
  "external_shipment_ref": "SYNTHETIC-ORDER-1-P1",
  "status": "created",
  "message": "발송물이 성공적으로 생성되었습니다.",
  "service_code": "FKTG-SVC-0123456789ABCDEF0123456789ABCDEF",
  "estimated_rate": {
    "currency": "KRW",
    "total_cost": 42000,
    "charged_weight": 3,
    "requires_carrier_confirmation": false,
    "dimensions_complete": true,
    "calculated_at": "2026-11-05T00:00:00.000Z"
  }
}
201
Shipment created successfully
400
Invalid JSON or schema validation failure
401
Unauthorized
403
403 error; see error.code and correlation_id
404
404 error; see error.code and correlation_id
409
Duplicate external_shipment_ref
422
Unsupported carrier/service/incoterms policy or unknown carrier service
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
GET/api/open/v1/shipments/{shipmentId}

Get shipment by shipment ID

권한: shipments.read

필드와 요청·응답 보기

Required credential scope: shipments.read.

shipmentId path · 필수
Stable opaque public shipment ID, never an internal database UUID

성공 응답 예제 · 합성 데이터

{
  "success": true,
  "shipment_id": "shp_0123456789abcdef0123456789abcdef",
  "fktg_awb": "123456789012",
  "carrier_awb": null,
  "external_order_id": "ORDER",
  "external_shipment_ref": "REF",
  "status": "created",
  "carrier": null,
  "carrier_name": null,
  "service_name": null,
  "export_reason": "SALE",
  "recipient": {
    "name": "Synthetic Name",
    "company_name": null,
    "phone": "000",
    "email": null,
    "address_line1": "Synthetic address",
    "address_line2": null,
    "address_line3": null,
    "city": "Berlin",
    "state": null,
    "postal_code": "10115",
    "country": "DE"
  },
  "package_summary": {
    "package_count": 1,
    "actual_weight": 1,
    "billable_weight": 1,
    "packages": [
      {
        "package_index": 1,
        "declared_packaging_type": null,
        "declared_pallet_piece_count": null,
        "packaging_type": null,
        "pallet_piece_count": null,
        "weight": 1,
        "billable_weight": 1,
        "length": 10,
        "width": 10,
        "height": 10
      }
    ]
  },
  "items": [
    {
      "sku": "SKU",
      "name_kr": "테스트",
      "name_en": "Test",
      "quantity": 1,
      "unit_price": 1,
      "invoice_currency": "EUR",
      "unit_weight": 1,
      "origin_country": "KR",
      "origin_country_code": "KR",
      "hs_code": "610910",
      "merchantProductId": "SHOP-001",
      "nonStandardManufacturerProductId": "MODEL-001",
      "standardManufacturerProductId": "0012345678905"
    }
  ],
  "timestamps": {
    "created_at": null,
    "updated_at": null,
    "status_updated_at": null,
    "external_updated_at": null
  },
  "service_code": null,
  "estimated_rate": null
}
200
Shipment found
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
PATCH/api/open/v1/shipments/{shipmentId}

Update shipment by shipment ID

권한: shipments.write

필드와 요청·응답 보기

Shipment update is allowed only before the shipment reaches FKTG warehouse inbound scan. Packages is a full replacement. For a matching package_index, an omitted declared_packaging_type preserves the saved declaration; for a new package, omission defaults to BOX. Explicit null clears the declaration. Warehouse-confirmed packaging_type and pallet_piece_count are read-only. Once the shipment enters `received_at_warehouse` or later equivalent state, updates are rejected. Required credential scope: shipments.write. Use an FKTG service_code from Rate. Without a code, legacy carrier + service_name remains supported. If a supplied carrier or name disagrees with the code, return 422 SERVICE_SELECTION_CONFLICT; never silently select another service. Unknown/disabled codes return 422 CARRIER_SERVICE_NOT_ACTIVE, ambiguous legacy names return 422 CARRIER_SERVICE_AMBIGUOUS, and destination/packaging restrictions still apply. Malformed code strings return 400 INVALID_REQUEST. Omitted selection fields retain the existing selection behavior. State, PID, packaging and incoterms validation still apply. Price-affecting changes recalculate freight from effective saved/new inputs. Shipment changes, price and snapshot commit together after locking and checking updated_at; concurrent edits return 409 and require re-fetch. Rate failure leaves previous data and freight unchanged. Metadata-only changes retain the saved estimate. Yun supports one package per shipment; multiple packages return422 CARRIER_MULTI_PIECE_UNSUPPORTED before any write. Older registration acceptance did not imply rating or label support.

shipmentId path · 필수
Stable opaque public shipment ID, never an internal database UUID

요청 본문 필드

external_order_refstring | null · 선택
external_channelstring | null · 선택
carrierstring · 선택
incotermsstring · 선택
FedEx DAP/DDP; UPS DAP/DDP; YUN BR DAP only, all other destinations DDP; SF US DDP only, flexible services DAP/DDP elsewhere, E-Commerce Express CD DAP only for TH/TW/HK/CN/SG/VN/MO/PH and DDP otherwise. Invalid combinations rejected; no silent payer change. Existing create compatibility: Yun non-BR and some SF-CD DAP requests normalize to DDP with explicit INCOTERMS_NORMALIZED_TO_DDP warning. Obtain payer consent and request DDP explicitly. Quotes do not normalize. PATCH rejects invalid incoterms with 422; it does not normalize DAP to DDP.
memostring | null · 선택
sender_iossstring | null · 선택
senderobject · 선택
recipientobject · 선택
packagesarray · 선택
Full replacement. declared_packaging_type accepts BOX, CRATE, PALLET, SKID or null. At the same package_index, omission preserves the saved declaration; omission on a new unit defaults to BOX. Explicit null clears the declaration.
itemsarray · 선택
service_namestring · 선택
export_reasonstring · 선택
Required for EU destinations. Use the actual purpose; missing EU purpose returns 422 INVALID_EU_EXPORT_REASON.
service_codestring · 선택
Stable opaque FKTG service identifier returned by Rate API. Not a provider-native service code. Use the returned value verbatim; do not derive it from carrier/name or an internal ID.

중첩 필드의 제약과 전체 응답 스키마는 OpenAPI 원문을 확인하세요.

요청 예제 · 합성 데이터

{
  "incoterms": "DDP",
  "sender_ioss": "IM2760000742",
  "recipient": {
    "phone": "+1-302-555-5678",
    "address_line1": "11 Madison Ave",
    "city": "New York",
    "state": "NY",
    "postal_code": "10010",
    "country": "US"
  },
  "packages": [
    {
      "package_index": 1,
      "weight": 1.4,
      "length": 30,
      "width": 18,
      "height": 12
    }
  ],
  "items": [
    {
      "sku": "SKU-001",
      "name_kr": "테스트 상품",
      "name_en": "Test Product",
      "quantity": 2,
      "unit_price": 12.5,
      "unit_weight": 0.5,
      "origin_country": null,
      "hs_code": null
    }
  ]
}
200
Shipment updated successfully
400
Invalid JSON or schema validation failure
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
Shipment can no longer be updated
422
Unsupported carrier/service/incoterms policy
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
GET/api/open/v1/shipments/external/{externalShipmentRef}

Get shipment by external shipment reference

권한: shipments.read

필드와 요청·응답 보기

Required credential scope: shipments.read.

externalShipmentRef path · 필수
Company-scoped external reference (shared across credentials)
200
Shipment found
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
GET/api/open/v1/shipments/fktg-awb/{fktgAwb}

Get shipment by FKTG AWB

권한: shipments.read

필드와 요청·응답 보기

Required credential scope: shipments.read.

fktgAwb path · 필수
12-digit FKTG AWB
200
Shipment found
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
POST/api/open/v1/shipments/{shipmentId}/cancel

Cancel shipment

권한: shipments.write

필드와 요청·응답 보기

Shipment cancel is allowed only before the shipment reaches FKTG warehouse inbound scan. Required credential scope: shipments.write.

shipmentId path · 필수
Stable opaque public shipment ID, never an internal database UUID
200
Shipment cancelled successfully
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
Shipment can no longer be cancelled
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
GET/api/open/v1/shipments/{shipmentId}/awb

Get FKTG and agent waybill numbers

권한: shipments.read

필드와 요청·응답 보기

Ship API returns the saved FKTG number (fktg_awb) and agent/carrier number (carrier_awb). carrier_awb is null until assigned and saved; refetch this endpoint to obtain it later. Preserve both values as strings, including leading zeros. This GET does not issue a carrier label. Required credential scope: shipments.read. Only shipments belonging to the credential's company are accessible.

shipmentId path · 필수
Stable opaque public shipment ID, never an internal database UUID

성공 응답 예제 · 합성 데이터

{
  "success": true,
  "shipment_id": "shp_0123456789abcdef0123456789abcdef",
  "fktg_awb": "123456789012",
  "carrier_awb": "001234567890",
  "external_order_id": "SYNTHETIC-ORDER-1",
  "external_shipment_ref": "SYNTHETIC-ORDER-1-P1",
  "status": "carrier_label_printed"
}
200
AWB data returned
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support
GET/api/open/v1/shipments/{shipmentId}/label

Download FKTG label PDF

권한: shipments.read

필드와 요청·응답 보기

Required credential scope: shipments.read.

shipmentId path · 필수
Stable opaque public shipment ID, never an internal database UUID
200
PDF blob response
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support

Tracking API

공개 shipment_id로 고객사 발송물의 저장된 배송 상태와 이력을 조회합니다. 권한은 shipments.read이며, 고객사 시스템에서 주기적으로 조회(polling)합니다. 매 요청의 실시간 운송사 조회나 상태 변경 webhook은 제공하지 않습니다.

GET/api/open/v1/shipments/{shipmentId}/tracking

Get tracking events

권한: shipments.read

필드와 요청·응답 보기

Required credential scope: shipments.read.

shipmentId path · 필수
Stable opaque public shipment ID, never an internal database UUID
200
Tracking payload returned
400
400 error; see error.code and correlation_id
401
Unauthorized
403
403 error; see error.code and correlation_id
404
Shipment not found
409
409 error; see error.code and correlation_id
422
422 error; see error.code and correlation_id
429
429 error; see error.code and correlation_id
500
500 error; see error.code and correlation_id
503
503 error; retryable=true. Honour Retry-After, then retry the same payload with backoff. See error.code for the fixed server code and correlation_id for support

EU PID

EU27·현재 시스템의 B2C 분류·SALE 조건에서는 export_reason과 품목별 M-PID·NS-PID가 필요합니다. 회사명 기준의 시스템 분류는 법적 B2B/B2C 판정과 다릅니다. GB·NO·CH를 EU27에 포함하지 마세요.

merchantProductId
M-PID · 발송자가 정한 상품 식별자
nonStandardManufacturerProductId
NS-PID · 발송자가 정한 상품 식별자. M-PID와 동일 값 허용
standardManufacturerProductId
S-PID · 선택. 제조자·브랜드가 국제규격으로 부여한 바코드(GTIN·EAN·UPC·ISBN 등)

M-PID와 NS-PID에는 아마존의 ASIN/FNSKU 또는 다른 플랫폼·자사몰의 상품관리코드(SKU)를 각각 입력하세요. 같은 값이어도 되지만 한 필드를 생략하면 자동 복사되지 않습니다.

식별자는 문자열로 보내 선행 0을 보존하세요. recipient.tax_id나 sender_ioss는 상품 PID가 아닙니다. 생성·수정 후 GET으로 저장된 품목별 PID를 다시 확인하세요.

오류와 재시도

HTTP 상태와 error.code를 함께 확인하세요. 문의에는 correlation_id를 사용하고, Secret·토큰·주소·전화번호·통관 식별값을 로그에 남기지 마세요.

400 / 422
요청 형식·필수 필드·운송 조건을 수정합니다.
401 / 403
토큰 만료, credential 상태와 실제 scope를 확인합니다. 무한 갱신하지 않습니다.
404
조회 값과 회사 범위를 확인합니다. 다른 회사의 발송물은 조회할 수 없습니다.
409
중복 참조 또는 수정·취소 불가 상태입니다. 업무 code에 따라 기존 발송물 조회나 운영팀 확인으로 연결합니다.
429 / 5xx / timeout
Retry-After가 있으면 따르고 backoff를 적용합니다. 생성 응답이 불명확하면 먼저 같은 외부 참조로 조회합니다.

중복 기준은 회사 전체의 external_shipment_ref입니다. 응답이 늦다고 새 참조로 다시 생성하지 마세요. Idempotency-Key 지원을 가정하면 안 됩니다.

자사몰은 조회 API를 polling해서 상태를 동기화합니다. 공개 outbound webhook, 재고·피킹 API는 이 연동 계약에 포함되지 않습니다. 별도 WMS 연동 callback은 일반 고객의 Ship API와 구분됩니다.

파일 다운로드

LLM에는 전달용 파일 하나를, 개발 도구에는 OpenAPI 또는 Postman 파일을 사용하세요.

연동 문의Customer OMS API · v1.2.0