API Gateway — Overview

API ini digunakan oleh client/partner untuk mengirim data Order dan ASN (Advanced Shipping Notice) ke sistem LOZY. Semua request harus menggunakan API key untuk autentikasi.

Protocol
HTTPS
Format
JSON
Auth
API Key (Header)
Rate Limit
100 req/min

Authentication

Semua request harus menyertakan API key di header:

X-API-Key: your_api_key_here

API key diberikan oleh tim LOZY saat onboarding. Jika API key invalid atau tidak disertakan, response:

HTTP/1.1 401 Unauthorized

{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or missing API key"
  }
}
Jangan share API key ke pihak lain. Jika bocor, hubungi tim LOZY untuk regenerate.

Base URL

ProductionNeed Confirm
Staginghttps://dummy-api-staging.lozy.co.id/v1

Error Handling

Semua error response mengikuti format yang sama:

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Human-readable error message",
    "details": [
      {"field": "items[0].sku", "message": "SKU is required"}
    ]
  }
}
Error Codes
HTTP StatusCodeDeskripsi
400VALIDATION_ERRORRequest body invalid
401UNAUTHORIZEDAPI key invalid/missing
404NOT_FOUNDResource tidak ditemukan
409DUPLICATEData sudah ada (conflict)
422UNPROCESSABLEData valid tapi tidak bisa diproses
429RATE_LIMITEDToo many requests
500INTERNAL_ERRORServer error

Order API

POST /v1/orders

Buat order baru di sistem LOZY.

Request Headers
Content-Type: application/json
X-API-Key: your_api_key_here
Request Body
FieldTypeRequiredDeskripsi
order_idstringYesID unik order dari sistem kamu
marketplacestringYesshopee, tiktok, lazada, zalora, tokopedia, manual
marketplace_order_idstringNoOrder ID dari marketplace
statusstringYesnew, processing, packed, shipped, delivered, cancelled
customerobjectYesData customer (lihat di bawah)
itemsarrayYesItem order (min 1)
shippingobjectNoInfo pengiriman
paymentobjectNoInfo pembayaran
notesstringNoCatatan order
warehouse_codestringNoKode gudang tujuan
customer object
FieldTypeRequiredDeskripsi
namestringYesNama penerima
phonestringYesNo. telepon
emailstringNoEmail
addressobjectYesAlamat pengiriman
customer.address object
FieldTypeRequired
streetstringYes
districtstringNo
citystringYes
provincestringYes
postal_codestringYes
countrystringNo
items[] object
FieldTypeRequiredDeskripsi
skustringYesSKU produk
namestringYesNama produk
qtyintegerYesJumlah
pricenumberYesHarga per item
totalnumberNoTotal (qty × price)
weight_gramnumberNoBerat per item (gram)
variantstringNoVarian (size/color/etc)
Example Request
curl -X POST https://api.lozy.co.id/v1/orders \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{
    "order_id": "ORD-2024-00123",
    "marketplace": "shopee",
    "marketplace_order_id": "240115ABCDEF",
    "status": "new",
    "customer": {
      "name": "John Doe",
      "phone": "08123456789",
      "email": "john@example.com",
      "address": {
        "street": "Jl. Sudirman No. 1, RT 01/RW 02",
        "district": "Setiabudi",
        "city": "Jakarta Selatan",
        "province": "DKI Jakarta",
        "postal_code": "12190",
        "country": "ID"
      }
    },
    "items": [
      {
        "sku": "SKU-BLK-L-001",
        "name": "Kaos Polos Hitam L",
        "qty": 2,
        "price": 75000,
        "total": 150000,
        "weight_gram": 200,
        "variant": "Hitam / L"
      },
      {
        "sku": "SKU-WHT-M-002",
        "name": "Kaos Polos Putih M",
        "qty": 1,
        "price": 70000,
        "total": 70000,
        "weight_gram": 200,
        "variant": "Putih / M"
      }
    ],
    "shipping": {
      "courier": "JNE",
      "service": "REG",
      "cost": 15000,
      "tracking_number": null
    },
    "payment": {
      "method": "marketplace",
      "total_amount": 235000,
      "currency": "IDR"
    },
    "notes": "Tolong packing bubble wrap",
    "warehouse_code": "WH-JKT-01"
  }'
Response 201 Created
{
  "success": true,
  "data": {
    "id": "lozy_ord_abc123",
    "order_id": "ORD-2024-00123",
    "marketplace": "shopee",
    "status": "new",
    "items_count": 2,
    "total_amount": 235000,
    "created_at": "2024-01-15T10:30:00Z"
  },
  "message": "Order created successfully"
}

PUT /v1/orders/:order_id

Update order yang sudah ada. Hanya kirim field yang berubah.

curl -X PUT https://api.lozy.co.id/v1/orders/ORD-2024-00123 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{
    "status": "processing",
    "shipping": {
      "tracking_number": "JNE1234567890"
    }
  }'
Response 200 OK
{
  "success": true,
  "data": {
    "order_id": "ORD-2024-00123",
    "status": "processing",
    "updated_at": "2024-01-15T14:00:00Z"
  },
  "message": "Order updated successfully"
}

GET /v1/orders/:order_id

Ambil detail order.

curl -H "X-API-Key: your_api_key_here" \
  https://api.lozy.co.id/v1/orders/ORD-2024-00123
Response 200 OK
{
  "success": true,
  "data": {
    "id": "lozy_ord_abc123",
    "order_id": "ORD-2024-00123",
    "marketplace": "shopee",
    "marketplace_order_id": "240115ABCDEF",
    "status": "processing",
    "customer": { "name": "John Doe", "phone": "08123456789", ... },
    "items": [ ... ],
    "shipping": { "courier": "JNE", "tracking_number": "JNE1234567890" },
    "payment": { "total_amount": 235000 },
    "created_at": "2024-01-15T10:30:00Z",
    "updated_at": "2024-01-15T14:00:00Z"
  }
}

GET /v1/orders

List orders dengan filter dan pagination.

Query ParamTypeDeskripsi
statusstringFilter by status
marketplacestringFilter by marketplace
date_fromstringFrom date (ISO format)
date_tostringTo date (ISO format)
pageintegerHalaman (default: 1)
limitintegerPer halaman (default: 20, max: 100)
curl -H "X-API-Key: your_api_key_here" \
  "https://api.lozy.co.id/v1/orders?status=new&marketplace=shopee&page=1&limit=20"

POST /v1/orders/:order_id/cancel

Cancel order. Hanya bisa di-cancel jika status masih new atau processing.

curl -X POST https://api.lozy.co.id/v1/orders/ORD-2024-00123/cancel \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{
    "reason": "Customer requested cancellation",
    "cancelled_by": "customer"
  }'
Response 200 OK
{
  "success": true,
  "data": { "order_id": "ORD-2024-00123", "status": "cancelled" },
  "message": "Order cancelled successfully"
}
Order yang sudah shipped atau delivered tidak bisa di-cancel. Response: 422 Unprocessable.

ASN API (Advanced Shipping Notice)

ASN digunakan untuk memberitahu gudang LOZY bahwa akan ada barang masuk dari supplier/partner.

POST /v1/asn

Buat ASN baru.

Request Body
FieldTypeRequiredDeskripsi
asn_numberstringYesNomor ASN unik dari sistem kamu
reference_numberstringNoNomor PO/referensi
warehouse_codestringYesKode gudang tujuan
supplierobjectYesInfo supplier
expected_arrivalstringYesTanggal perkiraan tiba (ISO date: 2024-01-15)
itemsarrayYesItem yang dikirim (min 1)
shippingobjectNoInfo pengiriman
notesstringNoCatatan
supplier object
FieldTypeRequired
codestringYes
namestringYes
contactstringNo
phonestringNo
items[] object
FieldTypeRequiredDeskripsi
skustringYesSKU produk
namestringYesNama produk
qty_expectedintegerYesJumlah yang diharapkan
unitstringNoSatuan (default: pcs)
batch_numberstringNoNomor batch
expiry_datestringNoTanggal kadaluarsa
cost_pricenumberNoHarga beli per item
shipping object (opsional)
FieldTypeDeskripsi
courierstringNama kurir/ekspedisi
tracking_numberstringNo. resi
shipped_atstringWaktu pengiriman (ISO)
Example Request
curl -X POST https://api.lozy.co.id/v1/asn \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{
    "asn_number": "ASN-2024-00045",
    "reference_number": "PO-2024-100",
    "warehouse_code": "WH-JKT-01",
    "supplier": {
      "code": "SUP-001",
      "name": "PT Supplier Utama",
      "contact": "Budi",
      "phone": "08111222333"
    },
    "expected_arrival": "2024-01-20",
    "items": [
      {
        "sku": "SKU-BLK-L-001",
        "name": "Kaos Polos Hitam L",
        "qty_expected": 200,
        "unit": "pcs",
        "batch_number": "BATCH-JAN-001",
        "cost_price": 35000
      },
      {
        "sku": "SKU-WHT-M-002",
        "name": "Kaos Polos Putih M",
        "qty_expected": 150,
        "unit": "pcs",
        "batch_number": "BATCH-JAN-001",
        "cost_price": 33000
      }
    ],
    "shipping": {
      "courier": "JNE Trucking",
      "tracking_number": "JNECARGO123456",
      "shipped_at": "2024-01-18T09:00:00Z"
    },
    "notes": "Batch produksi Januari 2024"
  }'
Response 201 Created
{
  "success": true,
  "data": {
    "id": "lozy_asn_xyz789",
    "asn_number": "ASN-2024-00045",
    "warehouse_code": "WH-JKT-01",
    "status": "pending",
    "items_count": 2,
    "total_qty_expected": 350,
    "expected_arrival": "2024-01-20",
    "created_at": "2024-01-15T08:00:00Z"
  },
  "message": "ASN created successfully"
}

PUT /v1/asn/:asn_number

Update ASN. Bisa update items, shipping info, expected arrival, dll.

curl -X PUT https://api.lozy.co.id/v1/asn/ASN-2024-00045 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{
    "expected_arrival": "2024-01-22",
    "shipping": {
      "tracking_number": "JNECARGO999999",
      "shipped_at": "2024-01-19T10:00:00Z"
    },
    "notes": "Terlambat 2 hari karena cuaca"
  }'
Response 200 OK
{
  "success": true,
  "data": { "asn_number": "ASN-2024-00045", "status": "in_transit", "updated_at": "..." },
  "message": "ASN updated successfully"
}

GET /v1/asn/:asn_number

Ambil detail ASN termasuk status penerimaan di gudang.

curl -H "X-API-Key: your_api_key_here" \
  https://api.lozy.co.id/v1/asn/ASN-2024-00045
Response 200 OK
{
  "success": true,
  "data": {
    "id": "lozy_asn_xyz789",
    "asn_number": "ASN-2024-00045",
    "reference_number": "PO-2024-100",
    "warehouse_code": "WH-JKT-01",
    "status": "received",
    "supplier": { "code": "SUP-001", "name": "PT Supplier Utama" },
    "expected_arrival": "2024-01-22",
    "actual_arrival": "2024-01-22T09:30:00Z",
    "items": [
      {
        "sku": "SKU-BLK-L-001",
        "name": "Kaos Polos Hitam L",
        "qty_expected": 200,
        "qty_received": 198,
        "qty_damaged": 2,
        "status": "received"
      },
      {
        "sku": "SKU-WHT-M-002",
        "name": "Kaos Polos Putih M",
        "qty_expected": 150,
        "qty_received": 150,
        "qty_damaged": 0,
        "status": "received"
      }
    ],
    "shipping": { "courier": "JNE Trucking", "tracking_number": "JNECARGO999999" },
    "received_by": "Ahmad (Staff Gudang)",
    "created_at": "2024-01-15T08:00:00Z",
    "updated_at": "2024-01-22T09:30:00Z"
  }
}
ASN Status Flow
pending → in_transit → arrived → receiving → received → closed
                                                         ↘ partially_received
StatusDeskripsi
pendingASN dibuat, belum dikirim
in_transitBarang dalam perjalanan
arrivedBarang tiba di gudang, belum di-check
receivingSedang proses penerimaan/QC
receivedSemua item diterima
partially_receivedSebagian item diterima (ada yang kurang/rusak)
closedASN ditutup/final

GET /v1/asn

List ASN dengan filter.

Query ParamTypeDeskripsi
statusstringFilter by status
warehouse_codestringFilter by warehouse
supplier_codestringFilter by supplier
date_fromstringExpected arrival from
date_tostringExpected arrival to
pageintegerHalaman (default: 1)
limitintegerPer halaman (max: 100)
curl -H "X-API-Key: your_api_key_here" \
  "https://api.lozy.co.id/v1/asn?status=pending&warehouse_code=WH-JKT-01"

POST /v1/asn/:asn_number/confirm-received

Konfirmasi penerimaan barang di gudang. Kirim qty yang benar-benar diterima per item.

curl -X POST https://api.lozy.co.id/v1/asn/ASN-2024-00045/confirm-received \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{
    "received_by": "Ahmad - Staff Gudang",
    "received_at": "2024-01-22T09:30:00Z",
    "items": [
      {
        "sku": "SKU-BLK-L-001",
        "qty_received": 198,
        "qty_damaged": 2,
        "damage_notes": "2 pcs kotor terkena air"
      },
      {
        "sku": "SKU-WHT-M-002",
        "qty_received": 150,
        "qty_damaged": 0
      }
    ],
    "notes": "Overall kondisi baik"
  }'
Response 200 OK
{
  "success": true,
  "data": {
    "asn_number": "ASN-2024-00045",
    "status": "partially_received",
    "total_expected": 350,
    "total_received": 348,
    "total_damaged": 2,
    "discrepancy": -2
  },
  "message": "ASN receiving confirmed"
}
Jika total_received === total_expected, status otomatis jadi received.
Jika ada selisih, status jadi partially_received.

LOZY API Gateway Documentation v1.0

Webhook Docs