{
  "info": {
    "_postman_id": "0b7d95fd-e684-4696-9f11-customer-oms-open-api",
    "name": "FKTG Customer OMS Open API",
    "description": "FKTG Customer OMS: Rate API, Ship API (AWB and house label PDF included), Tracking API.\n\nFlow:\n1. Set baseUrl, clientId, clientSecret variables\n2. Run Auth > Issue Access Token\n3. Run Rate API > Quote Rates, compare quotes and copy the chosen service_code to selectedServiceCode\n4. Run Ship API > Create Shipment - Selected FKTG service code once, then use the stored shipmentId\n\nPolicy notes:\n- Duplicate prevention key: company_id + external_shipment_ref\n- fktg_awb is a 12-digit numeric string\n- Update/cancel allowed only before warehouse inbound scan\n- Rate quote API returns margin-applied prices across eligible carrier/services\n- Unsupported incoterms/carrier/service/country combinations may return 422\nToken is opaque. Required scopes: rates.read for quote, shipments.read for all GET, shipments.write for create/PATCH/cancel. Production is not a sandbox. Items PATCH replaces the whole array including PIDs.\nCompare Rate quotes, copy the chosen service_code to selectedServiceCode, then create one shipment. Do not run every create example to compare prices. Codes in examples are synthetic; the collection does not choose a service automatically.\nShip calculates and saves freight automatically from submitted weight/dimensions and the chosen service; estimated_rate is returned and available on detail/PATCH. Never send your own total_cost. Rate failure422 RATE_UNAVAILABLE saves no shipment changes. Measurement/extra fees may change final billing; no payment or release is triggered.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://www.fktg.co.kr/api/open/v1",
      "type": "string"
    },
    {
      "key": "clientId",
      "value": "hugo_client",
      "type": "string"
    },
    {
      "key": "clientSecret",
      "value": "your-secret",
      "type": "string"
    },
    {
      "key": "accessToken",
      "value": "",
      "type": "string"
    },
    {
      "key": "shipmentId",
      "value": "shp_0123456789abcdef0123456789abcdef",
      "type": "string"
    },
    {
      "key": "externalShipmentRef",
      "value": "ORD-20260422-1001-1",
      "type": "string"
    },
    {
      "key": "fktgAwb",
      "value": "483920174625",
      "type": "string"
    },
    {
      "key": "quoteDestinationCountry",
      "value": "US",
      "type": "string"
    },
    {
      "key": "quoteDestinationCity",
      "value": "New York",
      "type": "string"
    },
    {
      "key": "quoteDestinationState",
      "value": "NY",
      "type": "string"
    },
    {
      "key": "quoteDestinationPostalCode",
      "value": "10001",
      "type": "string"
    },
    {
      "key": "selectedServiceCode",
      "value": "FKTG-SVC-0123456789ABCDEF0123456789ABCDEF",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Auth",
      "item": [
        {
          "name": "Issue Access Token",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('access_token exists', function () {",
                  "  pm.expect(json.access_token).to.be.a('string').and.not.empty;",
                  "});",
                  "pm.collectionVariables.set('accessToken', json.access_token);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": \"{{clientId}}\",\n  \"client_secret\": \"{{clientSecret}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/auth/token",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "auth",
                "token"
              ]
            },
            "description": "Issue a Bearer access token using client_id and client_secret. The returned token is automatically saved into the collection variable accessToken."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Rate API",
      "auth": {
        "type": "bearer",
        "bearer": [
          {
            "key": "token",
            "value": "{{accessToken}}",
            "type": "string"
          }
        ]
      },
      "item": [
        {
          "name": "Quote Rates",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('response has quotes array', function () {",
                  "  pm.expect(json.quotes).to.be.an('array');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"weight\": 1.2,\n  \"dimensions\": {\n    \"length\": 25,\n    \"width\": 15,\n    \"height\": 10\n  },\n  \"recipient\": {\n    \"city\": \"{{quoteDestinationCity}}\",\n    \"state\": \"{{quoteDestinationState}}\",\n    \"country\": \"{{quoteDestinationCountry}}\",\n    \"postal_code\": \"{{quoteDestinationPostalCode}}\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/rates/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "rates",
                "quotes"
              ]
            },
            "description": "Fetch customer-facing shipping quotes across eligible carrier/services. Returned prices already include company margin/discount settings and peak surcharge logic. Omitted packaging declarations use BOX for ordinary boxes. MY PACKAGE is explanatory carrier wording; use BOX, never MY_PACKAGE. UPS Freight requires eligible actual packaging and loaded-package counts."
          },
          "response": []
        },
        {
          "name": "Quote Rates - BOX",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('response has quotes array', function () {",
                  "  pm.expect(json.quotes).to.be.an('array');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"weight\": 1.2,\n  \"dimensions\": {\n    \"length\": 25,\n    \"width\": 15,\n    \"height\": 10\n  },\n  \"recipient\": {\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"incoterms\": \"DAP\",\n  \"declared_packaging_type\": \"BOX\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/rates/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "rates",
                "quotes"
              ]
            },
            "description": "BOX synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services. Array package declarations take precedence over top-level declarations; omitted array values default to BOX."
          },
          "response": []
        },
        {
          "name": "Quote Rates - CRATE",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('response has quotes array', function () {",
                  "  pm.expect(json.quotes).to.be.an('array');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"weight\": 10,\n  \"dimensions\": {\n    \"length\": 50,\n    \"width\": 40,\n    \"height\": 30\n  },\n  \"recipient\": {\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"incoterms\": \"DAP\",\n  \"declared_packaging_type\": \"CRATE\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/rates/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "rates",
                "quotes"
              ]
            },
            "description": "CRATE synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services. Array package declarations take precedence over top-level declarations; omitted array values default to BOX."
          },
          "response": []
        },
        {
          "name": "Quote Rates - PALLET",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('response has quotes array', function () {",
                  "  pm.expect(json.quotes).to.be.an('array');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"weight\": 80,\n  \"dimensions\": {\n    \"length\": 120,\n    \"width\": 100,\n    \"height\": 80\n  },\n  \"recipient\": {\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"incoterms\": \"DAP\",\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 80,\n      \"length\": 120,\n      \"width\": 100,\n      \"height\": 80,\n      \"declared_packaging_type\": \"PALLET\",\n      \"declared_pallet_piece_count\": 12\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/rates/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "rates",
                "quotes"
              ]
            },
            "description": "PALLET synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services. Array package declarations take precedence over top-level declarations; omitted array values default to BOX."
          },
          "response": []
        },
        {
          "name": "Quote Rates - SKID",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('response has quotes array', function () {",
                  "  pm.expect(json.quotes).to.be.an('array');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"weight\": 80,\n  \"dimensions\": {\n    \"length\": 120,\n    \"width\": 100,\n    \"height\": 80\n  },\n  \"recipient\": {\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"incoterms\": \"DAP\",\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 80,\n      \"length\": 120,\n      \"width\": 100,\n      \"height\": 80,\n      \"declared_packaging_type\": \"SKID\",\n      \"declared_pallet_piece_count\": 12\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/rates/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "rates",
                "quotes"
              ]
            },
            "description": "SKID synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services. Array package declarations take precedence over top-level declarations; omitted array values default to BOX."
          },
          "response": []
        },
        {
          "name": "Quote Selected FKTG Service",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 200', function () {",
                  "  pm.response.to.have.status(200);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "pm.test('response has quotes array', function () {",
                  "  pm.expect(json.quotes).to.be.an('array');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"weight\": 1.2,\n  \"dimensions\": {\n    \"length\": 25,\n    \"width\": 15,\n    \"height\": 10\n  },\n  \"recipient\": {\n    \"city\": \"{{quoteDestinationCity}}\",\n    \"state\": \"{{quoteDestinationState}}\",\n    \"country\": \"{{quoteDestinationCountry}}\",\n    \"postal_code\": \"{{quoteDestinationPostalCode}}\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10\n    }\n  ],\n  \"service_code\": \"{{selectedServiceCode}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/rates/quotes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "rates",
                "quotes"
              ]
            },
            "description": "Fetch customer-facing shipping quotes across eligible carrier/services. Returned prices already include company margin/discount settings and peak surcharge logic. Omitted packaging declarations use BOX for ordinary boxes. MY PACKAGE is explanatory carrier wording; use BOX, never MY_PACKAGE. UPS Freight requires eligible actual packaging and loaded-package counts."
          },
          "response": [
            {
              "name": "Created with saved estimate (synthetic)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"weight\": 1.2,\n  \"dimensions\": {\n    \"length\": 25,\n    \"width\": 15,\n    \"height\": 10\n  },\n  \"recipient\": {\n    \"city\": \"{{quoteDestinationCity}}\",\n    \"state\": \"{{quoteDestinationState}}\",\n    \"country\": \"{{quoteDestinationCountry}}\",\n    \"postal_code\": \"{{quoteDestinationPostalCode}}\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10\n    }\n  ],\n  \"service_code\": \"{{selectedServiceCode}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/rates/quotes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "rates",
                    "quotes"
                  ]
                },
                "description": "Fetch customer-facing shipping quotes across eligible carrier/services. Returned prices already include company margin/discount settings and peak surcharge logic. Omitted packaging declarations use BOX for ordinary boxes. MY PACKAGE is explanatory carrier wording; use BOX, never MY_PACKAGE. UPS Freight requires eligible actual packaging and loaded-package counts."
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"shipment_id\": \"shp_0123456789abcdef0123456789abcdef\",\n  \"fktg_awb\": \"483920174625\",\n  \"external_order_id\": \"SYNTHETIC-ORDER-1\",\n  \"external_shipment_ref\": \"SYNTHETIC-ORDER-1-P1\",\n  \"status\": \"created\",\n  \"message\": \"발송물이 성공적으로 생성되었습니다.\",\n  \"service_code\": \"FKTG-SVC-0123456789ABCDEF0123456789ABCDEF\",\n  \"estimated_rate\": {\n    \"currency\": \"KRW\",\n    \"total_cost\": 42000,\n    \"charged_weight\": 3,\n    \"requires_carrier_confirmation\": false,\n    \"dimensions_complete\": true,\n    \"calculated_at\": \"2026-11-05T00:00:00.000Z\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Ship API",
      "auth": {
        "type": "bearer",
        "bearer": [
          {
            "key": "token",
            "value": "{{accessToken}}",
            "type": "string"
          }
        ]
      },
      "item": [
        {
          "name": "Create Shipment - Selected FKTG service code",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 201', function () {",
                  "  pm.response.to.have.status(201);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "if (json.shipment_id) pm.collectionVariables.set('shipmentId', json.shipment_id);",
                  "if (json.external_shipment_ref) pm.collectionVariables.set('externalShipmentRef', json.external_shipment_ref);",
                  "if (json.fktg_awb) pm.collectionVariables.set('fktgAwb', json.fktg_awb);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_order_id\": \"ORD-20260422-1001\",\n  \"external_shipment_ref\": \"{{externalShipmentRef}}\",\n  \"external_order_ref\": \"MALL-10000421\",\n  \"external_channel\": \"hugo-shop\",\n  \"order_datetime\": \"2026-04-22T10:20:00+09:00\",\n  \"incoterms\": \"DAP\",\n  \"sender\": {\n    \"company_name\": \"HUGO SHOP\",\n    \"name\": \"홍길동\",\n    \"phone\": \"01012345678\",\n    \"email\": \"ops@hugoshop.com\",\n    \"address_line1\": \"Seoul, Korea\"\n  },\n  \"sender_ioss\": null,\n  \"recipient\": {\n    \"name\": \"John Smith\",\n    \"phone\": \"+1-302-555-1234\",\n    \"email\": \"john@example.com\",\n    \"address_line1\": \"350 5th Ave\",\n    \"address_line2\": \"Floor 10\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postal_code\": \"10001\",\n    \"country\": \"US\",\n    \"tax_id\": null\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10\n    },\n    {\n      \"package_index\": 2,\n      \"weight\": 2.1,\n      \"length\": 40,\n      \"width\": 20,\n      \"height\": 10\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"SKU-001\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test Product\",\n      \"quantity\": 2,\n      \"unit_price\": 12.5,\n      \"unit_weight\": 0.5,\n      \"origin_country\": null,\n      \"hs_code\": null\n    }\n  ],\n  \"memo\": \"Gift wrap requested\",\n  \"service_code\": \"{{selectedServiceCode}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments"
              ]
            },
            "description": "Set selectedServiceCode to the chosen Rate quote. This creates one shipment. The sample code is not a live service."
          },
          "response": [
            {
              "name": "Created with saved estimate (synthetic)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"external_order_id\": \"ORD-20260422-1001\",\n  \"external_shipment_ref\": \"{{externalShipmentRef}}\",\n  \"external_order_ref\": \"MALL-10000421\",\n  \"external_channel\": \"hugo-shop\",\n  \"order_datetime\": \"2026-04-22T10:20:00+09:00\",\n  \"incoterms\": \"DAP\",\n  \"sender\": {\n    \"company_name\": \"HUGO SHOP\",\n    \"name\": \"홍길동\",\n    \"phone\": \"01012345678\",\n    \"email\": \"ops@hugoshop.com\",\n    \"address_line1\": \"Seoul, Korea\"\n  },\n  \"sender_ioss\": null,\n  \"recipient\": {\n    \"name\": \"John Smith\",\n    \"phone\": \"+1-302-555-1234\",\n    \"email\": \"john@example.com\",\n    \"address_line1\": \"350 5th Ave\",\n    \"address_line2\": \"Floor 10\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postal_code\": \"10001\",\n    \"country\": \"US\",\n    \"tax_id\": null\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10\n    },\n    {\n      \"package_index\": 2,\n      \"weight\": 2.1,\n      \"length\": 40,\n      \"width\": 20,\n      \"height\": 10\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"SKU-001\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test Product\",\n      \"quantity\": 2,\n      \"unit_price\": 12.5,\n      \"unit_weight\": 0.5,\n      \"origin_country\": null,\n      \"hs_code\": null\n    }\n  ],\n  \"memo\": \"Gift wrap requested\",\n  \"service_code\": \"{{selectedServiceCode}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{baseUrl}}/shipments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "shipments"
                  ]
                },
                "description": "Set selectedServiceCode to the chosen Rate quote. This creates one shipment. The sample code is not a live service."
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"shipment_id\": \"shp_0123456789abcdef0123456789abcdef\",\n  \"fktg_awb\": \"483920174625\",\n  \"external_order_id\": \"SYNTHETIC-ORDER-1\",\n  \"external_shipment_ref\": \"SYNTHETIC-ORDER-1-P1\",\n  \"status\": \"created\",\n  \"message\": \"발송물이 성공적으로 생성되었습니다.\",\n  \"service_code\": \"FKTG-SVC-0123456789ABCDEF0123456789ABCDEF\",\n  \"estimated_rate\": {\n    \"currency\": \"KRW\",\n    \"total_cost\": 42000,\n    \"charged_weight\": 3,\n    \"requires_carrier_confirmation\": false,\n    \"dimensions_complete\": true,\n    \"calculated_at\": \"2026-11-05T00:00:00.000Z\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Create Shipment - Legacy carrier and service_name",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 201', function () {",
                  "  pm.response.to.have.status(201);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "if (json.shipment_id) pm.collectionVariables.set('shipmentId', json.shipment_id);",
                  "if (json.external_shipment_ref) pm.collectionVariables.set('externalShipmentRef', json.external_shipment_ref);",
                  "if (json.fktg_awb) pm.collectionVariables.set('fktgAwb', json.fktg_awb);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_order_id\": \"ORD-20260422-1001\",\n  \"external_shipment_ref\": \"{{externalShipmentRef}}\",\n  \"external_order_ref\": \"MALL-10000421\",\n  \"external_channel\": \"hugo-shop\",\n  \"order_datetime\": \"2026-04-22T10:20:00+09:00\",\n  \"carrier\": \"FEDEX\",\n  \"service_name\": \"International Priority\",\n  \"incoterms\": \"DAP\",\n  \"sender\": {\n    \"company_name\": \"HUGO SHOP\",\n    \"name\": \"홍길동\",\n    \"phone\": \"01012345678\",\n    \"email\": \"ops@hugoshop.com\",\n    \"address_line1\": \"Seoul, Korea\"\n  },\n  \"sender_ioss\": null,\n  \"recipient\": {\n    \"name\": \"John Smith\",\n    \"phone\": \"+1-302-555-1234\",\n    \"email\": \"john@example.com\",\n    \"address_line1\": \"350 5th Ave\",\n    \"address_line2\": \"Floor 10\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postal_code\": \"10001\",\n    \"country\": \"US\",\n    \"tax_id\": null\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10\n    },\n    {\n      \"package_index\": 2,\n      \"weight\": 2.1,\n      \"length\": 40,\n      \"width\": 20,\n      \"height\": 10\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"SKU-001\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test Product\",\n      \"quantity\": 2,\n      \"unit_price\": 12.5,\n      \"unit_weight\": 0.5,\n      \"origin_country\": null,\n      \"hs_code\": null\n    }\n  ],\n  \"memo\": \"Gift wrap requested\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments"
              ]
            },
            "description": "Create a shipment. Duplicate prevention key is company_id + external_shipment_ref. Success stores shipmentId and fktgAwb collection variables. EU B2C SALE requires explicit M-PID and NS-PID per item; they may be identical. Use Amazon ASIN/FNSKU or the platform/store SKU. Optional S-PID is an international-standard manufacturer/brand barcode. Omitted packaging declarations use BOX for ordinary boxes. MY PACKAGE is explanatory carrier wording; use BOX, never MY_PACKAGE. UPS Freight requires eligible actual packaging and loaded-package counts."
          },
          "response": []
        },
        {
          "name": "Create Shipment - BOX",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 201', function () {",
                  "  pm.response.to.have.status(201);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "if (json.shipment_id) pm.collectionVariables.set('shipmentId', json.shipment_id);",
                  "if (json.external_shipment_ref) pm.collectionVariables.set('externalShipmentRef', json.external_shipment_ref);",
                  "if (json.fktg_awb) pm.collectionVariables.set('fktgAwb', json.fktg_awb);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_order_id\": \"SYNTHETIC-BOX-1\",\n  \"external_shipment_ref\": \"SYNTHETIC-BOX-1-P1\",\n  \"carrier\": \"FEDEX\",\n  \"service_name\": \"International Priority\",\n  \"incoterms\": \"DAP\",\n  \"export_reason\": \"SALE\",\n  \"sender\": {\n    \"company_name\": \"Example Shop\",\n    \"name\": \"Test Sender\",\n    \"phone\": \"01000000000\",\n    \"address_line1\": \"Synthetic Seoul address\"\n  },\n  \"recipient\": {\n    \"name\": \"Test Recipient\",\n    \"phone\": \"+10000000000\",\n    \"address_line1\": \"Synthetic address\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.2,\n      \"length\": 25,\n      \"width\": 15,\n      \"height\": 10,\n      \"declared_packaging_type\": \"BOX\"\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"TEST-SKU-1\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test product\",\n      \"quantity\": 1,\n      \"unit_price\": 10,\n      \"invoice_currency\": \"USD\",\n      \"origin_country\": \"KR\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments"
              ]
            },
            "description": "BOX synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services."
          },
          "response": []
        },
        {
          "name": "Create Shipment - CRATE",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 201', function () {",
                  "  pm.response.to.have.status(201);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "if (json.shipment_id) pm.collectionVariables.set('shipmentId', json.shipment_id);",
                  "if (json.external_shipment_ref) pm.collectionVariables.set('externalShipmentRef', json.external_shipment_ref);",
                  "if (json.fktg_awb) pm.collectionVariables.set('fktgAwb', json.fktg_awb);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_order_id\": \"SYNTHETIC-CRATE-1\",\n  \"external_shipment_ref\": \"SYNTHETIC-CRATE-1-P1\",\n  \"carrier\": \"FEDEX\",\n  \"service_name\": \"International Priority\",\n  \"incoterms\": \"DAP\",\n  \"export_reason\": \"SALE\",\n  \"sender\": {\n    \"company_name\": \"Example Shop\",\n    \"name\": \"Test Sender\",\n    \"phone\": \"01000000000\",\n    \"address_line1\": \"Synthetic Seoul address\"\n  },\n  \"recipient\": {\n    \"name\": \"Test Recipient\",\n    \"phone\": \"+10000000000\",\n    \"address_line1\": \"Synthetic address\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 10,\n      \"length\": 50,\n      \"width\": 40,\n      \"height\": 30,\n      \"declared_packaging_type\": \"CRATE\"\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"TEST-SKU-1\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test product\",\n      \"quantity\": 1,\n      \"unit_price\": 10,\n      \"invoice_currency\": \"USD\",\n      \"origin_country\": \"KR\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments"
              ]
            },
            "description": "CRATE synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services."
          },
          "response": []
        },
        {
          "name": "Create Shipment - PALLET",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 201', function () {",
                  "  pm.response.to.have.status(201);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "if (json.shipment_id) pm.collectionVariables.set('shipmentId', json.shipment_id);",
                  "if (json.external_shipment_ref) pm.collectionVariables.set('externalShipmentRef', json.external_shipment_ref);",
                  "if (json.fktg_awb) pm.collectionVariables.set('fktgAwb', json.fktg_awb);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_order_id\": \"SYNTHETIC-PALLET-1\",\n  \"external_shipment_ref\": \"SYNTHETIC-PALLET-1-P1\",\n  \"carrier\": \"UPS\",\n  \"service_name\": \"Worldwide Express Freight\",\n  \"incoterms\": \"DAP\",\n  \"export_reason\": \"SALE\",\n  \"sender\": {\n    \"company_name\": \"Example Shop\",\n    \"name\": \"Test Sender\",\n    \"phone\": \"01000000000\",\n    \"address_line1\": \"Synthetic Seoul address\"\n  },\n  \"recipient\": {\n    \"name\": \"Test Recipient\",\n    \"phone\": \"+10000000000\",\n    \"address_line1\": \"Synthetic address\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 80,\n      \"length\": 120,\n      \"width\": 100,\n      \"height\": 80,\n      \"declared_packaging_type\": \"PALLET\",\n      \"declared_pallet_piece_count\": 12\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"TEST-SKU-1\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test product\",\n      \"quantity\": 24,\n      \"unit_price\": 10,\n      \"invoice_currency\": \"USD\",\n      \"origin_country\": \"KR\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments"
              ]
            },
            "description": "PALLET synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services."
          },
          "response": []
        },
        {
          "name": "Create Shipment - SKID",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('status is 201', function () {",
                  "  pm.response.to.have.status(201);",
                  "});",
                  "",
                  "var json = pm.response.json();",
                  "if (json.shipment_id) pm.collectionVariables.set('shipmentId', json.shipment_id);",
                  "if (json.external_shipment_ref) pm.collectionVariables.set('externalShipmentRef', json.external_shipment_ref);",
                  "if (json.fktg_awb) pm.collectionVariables.set('fktgAwb', json.fktg_awb);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"external_order_id\": \"SYNTHETIC-SKID-1\",\n  \"external_shipment_ref\": \"SYNTHETIC-SKID-1-P1\",\n  \"carrier\": \"UPS\",\n  \"service_name\": \"Worldwide Express Freight\",\n  \"incoterms\": \"DAP\",\n  \"export_reason\": \"SALE\",\n  \"sender\": {\n    \"company_name\": \"Example Shop\",\n    \"name\": \"Test Sender\",\n    \"phone\": \"01000000000\",\n    \"address_line1\": \"Synthetic Seoul address\"\n  },\n  \"recipient\": {\n    \"name\": \"Test Recipient\",\n    \"phone\": \"+10000000000\",\n    \"address_line1\": \"Synthetic address\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"country\": \"US\",\n    \"postal_code\": \"10001\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 80,\n      \"length\": 120,\n      \"width\": 100,\n      \"height\": 80,\n      \"declared_packaging_type\": \"SKID\",\n      \"declared_pallet_piece_count\": 12\n    }\n  ],\n  \"items\": [\n    {\n      \"sku\": \"TEST-SKU-1\",\n      \"name_kr\": \"테스트 상품\",\n      \"name_en\": \"Test product\",\n      \"quantity\": 24,\n      \"unit_price\": 10,\n      \"invoice_currency\": \"USD\",\n      \"origin_country\": \"KR\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments"
              ]
            },
            "description": "SKID synthetic example. Use an available quoted carrier/service and a unique external_shipment_ref when creating. PALLET/SKID requires the actual loaded-package count (1..99999 per unit; total <=99999), not the pallet count or item quantity. UPS BOX/CRATE cannot use Freight; PALLET/SKID cannot use UPS parcel services."
          },
          "response": []
        },
        {
          "name": "Get Shipment by Shipment ID",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}"
              ]
            },
            "description": "Fetch shipment detail using the public shipment_id returned by create or reference lookup."
          },
          "response": []
        },
        {
          "name": "Get Shipment by External Shipment Ref",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/shipments/external/{{externalShipmentRef}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "external",
                "{{externalShipmentRef}}"
              ]
            },
            "description": "Fetch shipment detail by client-side external_shipment_ref."
          },
          "response": []
        },
        {
          "name": "Get Shipment by FKTG AWB",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/shipments/fktg-awb/{{fktgAwb}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "fktg-awb",
                "{{fktgAwb}}"
              ]
            },
            "description": "Fetch shipment detail by 12-digit fktg_awb."
          },
          "response": []
        },
        {
          "name": "Update Shipment",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"incoterms\": \"DDP\",\n  \"sender_ioss\": \"IM2760000742\",\n  \"recipient\": {\n    \"phone\": \"+1-302-555-5678\",\n    \"address_line1\": \"11 Madison Ave\",\n    \"city\": \"New York\",\n    \"state\": \"NY\",\n    \"postal_code\": \"10010\",\n    \"country\": \"US\"\n  },\n  \"packages\": [\n    {\n      \"package_index\": 1,\n      \"weight\": 1.4,\n      \"length\": 30,\n      \"width\": 18,\n      \"height\": 12\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}"
              ]
            },
            "description": "Update shipment before warehouse inbound scan. Unsupported updates return 409 or 422 depending on the cause. Packages is a full replacement: at the same package_index, omit declared_packaging_type to retain it, or send null to clear it; a new package defaults to BOX when omitted. Omitted declared_pallet_piece_count retains the saved count; null clears it only if the effective packaging/service does not require it. Warehouse packaging_type/pallet_piece_count are read-only."
          },
          "response": []
        },
        {
          "name": "Cancel Shipment",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}",
                "cancel"
              ]
            },
            "description": "Cancel shipment before warehouse inbound scan."
          },
          "response": []
        },
        {
          "name": "Get AWB",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}/awb",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}",
                "awb"
              ]
            },
            "description": "Ship API: fetch fktg_awb and the saved agent/carrier number carrier_awb. carrier_awb is null until assigned; keep numbers as strings. This GET does not issue a carrier label."
          },
          "response": []
        },
        {
          "name": "Download Label PDF",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}/label",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}",
                "label"
              ]
            },
            "description": "Ship API: download the FKTG house label as application/pdf binary, with one page per package. This is not a paid carrier label."
          },
          "response": []
        },
        {
          "name": "Update Selected FKTG Service",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_code\": \"{{selectedServiceCode}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}"
              ]
            },
            "description": "Update shipment before warehouse inbound scan. Unsupported updates return 409 or 422 depending on the cause. Packages is a full replacement: at the same package_index, omit declared_packaging_type to retain it, or send null to clear it; a new package defaults to BOX when omitted. Omitted declared_pallet_piece_count retains the saved count; null clears it only if the effective packaging/service does not require it. Warehouse packaging_type/pallet_piece_count are read-only."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Tracking API",
      "auth": {
        "type": "bearer",
        "bearer": [
          {
            "key": "token",
            "value": "{{accessToken}}",
            "type": "string"
          }
        ]
      },
      "item": [
        {
          "name": "Get Tracking",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/shipments/{{shipmentId}}/tracking",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "shipments",
                "{{shipmentId}}",
                "tracking"
              ]
            },
            "description": "Tracking API: fetch stored status and customer-visible events for your company shipment. Requires shipments.read; polling does not trigger a live carrier refresh."
          },
          "response": []
        }
      ]
    }
  ]
}
