Langsung ke konten

Cari

    Menu dokumentasi

    Pesanan diterima kurir

    EVENT shipment.booked POST ke URL webhook kamu

    Pengiriman berpindah ke booked: kurir menerima pesanan dan saldo yang ditahan dipakai.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: shipment.bookedshipment.awb_readyshipment.status_updatedshipment.deliveredshipment.failedshipment.cancelled

    data object, wajib

    -

    data.shipment Shipment, wajib

    -

    data.previousStatus string, wajib

    Status sebelum perubahan ini.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    Contoh payload

    {
      "id": "evt_3f2a1b0c9d8e7f6a5b4c3d2e",
      "type": "shipment.booked",
      "createdAt": "2026-10-11T03:02:10.000Z",
      "livemode": true,
      "data": {
        "shipment": {
          "id": "OH0HZ3K7Q2M4XB",
          "livemode": true,
          "status": "booked",
          "statusLabel": "Menunggu resi",
          "stage": "manifested",
          "courier": {
            "code": "jne",
            "name": "JNE"
          },
          "service": {
            "rateCode": "REG23",
            "name": "Reguler",
            "etd": {
              "min": 1,
              "max": 2,
              "unit": "DAY"
            }
          },
          "awb": null,
          "shipper": {
            "name": "Toko Contoh Jaya",
            "phone": "6281200000001",
            "email": "gudang@contoh.test",
            "address": "Jl. Contoh Raya No. 1, RT 01/RW 02, Setiabudi",
            "location": {
              "province": "DKI Jakarta",
              "city": "Jakarta Selatan",
              "district": "Setia Budi",
              "subdistrict": "Setiabudi",
              "zipcode": "12910"
            },
            "latlng": null
          },
          "receiver": {
            "name": "Dimas Pratama",
            "phone": "6281300000102",
            "email": null,
            "address": "Jl. Penerima No. 2, dekat masjid, Lebak Gede",
            "location": {
              "province": "Jawa Barat",
              "city": "Bandung",
              "district": "Coblong",
              "subdistrict": "Lebak Gede",
              "zipcode": "40132"
            },
            "latlng": null
          },
          "items": [
            {
              "name": "Kaos katun",
              "sku": "KAOS-HITAM-L",
              "qty": 2,
              "weightKg": 0.5,
              "value": 85000,
              "dimensions": {
                "lengthCm": 25,
                "widthCm": 20,
                "heightCm": 5
              },
              "itemType": "REGULAR"
            }
          ],
          "parcel": {
            "weightKg": 1,
            "chargeableWeightKg": 1,
            "declaredValue": 170000
          },
          "insurance": {
            "insured": false,
            "price": 0
          },
          "pricing": {
            "courierPrice": 12000,
            "insurancePrice": 0,
            "serviceFee": 0,
            "total": 12000
          },
          "pickup": {
            "type": "DROP",
            "time": null
          },
          "tracking": {
            "lastCheckedAt": "2026-10-11T04:10:00.000Z",
            "origin": "JAKARTA",
            "destination": "BANDUNG",
            "courierStatus": "MANIFESTED",
            "events": [
              {
                "at": "2026-10-11T04:05:00.000Z",
                "rawDate": "2026-10-11 11:05:00",
                "description": "SHIPMENT RECEIVED BY JNE COUNTER OFFICER AT [JAKARTA]"
              }
            ]
          },
          "timeline": [
            {
              "status": "submitting",
              "label": "Sedang diproses",
              "at": "2026-10-11T03:01:00.000Z",
              "note": null
            },
            {
              "status": "booked",
              "label": "Menunggu resi",
              "at": "2026-10-11T03:01:04.000Z",
              "note": null
            },
            {
              "status": "awb_ready",
              "label": "Resi terbit",
              "at": "2026-10-11T03:02:10.000Z",
              "note": null
            }
          ],
          "error": null,
          "externalRef": "INV-2026-10-0412",
          "notes": null,
          "payment": null,
          "source": "api",
          "createdAt": "2026-10-11T03:01:00.000Z",
          "updatedAt": "2026-10-11T04:10:00.000Z",
          "bookedAt": "2026-10-11T03:01:04.000Z",
          "deliveredAt": null
        },
        "previousStatus": "submitting"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Resi terbit

    EVENT shipment.awb_ready POST ke URL webhook kamu

    Nomor resi sudah ada di data.shipment.awb dan label siap dicetak.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: shipment.bookedshipment.awb_readyshipment.status_updatedshipment.deliveredshipment.failedshipment.cancelled

    data object, wajib

    -

    data.shipment Shipment, wajib

    -

    data.previousStatus string, wajib

    Status sebelum perubahan ini.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    Contoh payload

    {
      "id": "evt_3f2a1b0c9d8e7f6a5b4c3d2e",
      "type": "shipment.awb_ready",
      "createdAt": "2026-10-11T03:02:10.000Z",
      "livemode": true,
      "data": {
        "shipment": {
          "id": "OH0HZ3K7Q2M4XB",
          "livemode": true,
          "status": "awb_ready",
          "statusLabel": "Resi terbit",
          "stage": "manifested",
          "courier": {
            "code": "jne",
            "name": "JNE"
          },
          "service": {
            "rateCode": "REG23",
            "name": "Reguler",
            "etd": {
              "min": 1,
              "max": 2,
              "unit": "DAY"
            }
          },
          "awb": "CGK0123456789012",
          "shipper": {
            "name": "Toko Contoh Jaya",
            "phone": "6281200000001",
            "email": "gudang@contoh.test",
            "address": "Jl. Contoh Raya No. 1, RT 01/RW 02, Setiabudi",
            "location": {
              "province": "DKI Jakarta",
              "city": "Jakarta Selatan",
              "district": "Setia Budi",
              "subdistrict": "Setiabudi",
              "zipcode": "12910"
            },
            "latlng": null
          },
          "receiver": {
            "name": "Dimas Pratama",
            "phone": "6281300000102",
            "email": null,
            "address": "Jl. Penerima No. 2, dekat masjid, Lebak Gede",
            "location": {
              "province": "Jawa Barat",
              "city": "Bandung",
              "district": "Coblong",
              "subdistrict": "Lebak Gede",
              "zipcode": "40132"
            },
            "latlng": null
          },
          "items": [
            {
              "name": "Kaos katun",
              "sku": "KAOS-HITAM-L",
              "qty": 2,
              "weightKg": 0.5,
              "value": 85000,
              "dimensions": {
                "lengthCm": 25,
                "widthCm": 20,
                "heightCm": 5
              },
              "itemType": "REGULAR"
            }
          ],
          "parcel": {
            "weightKg": 1,
            "chargeableWeightKg": 1,
            "declaredValue": 170000
          },
          "insurance": {
            "insured": false,
            "price": 0
          },
          "pricing": {
            "courierPrice": 12000,
            "insurancePrice": 0,
            "serviceFee": 0,
            "total": 12000
          },
          "pickup": {
            "type": "DROP",
            "time": null
          },
          "tracking": {
            "lastCheckedAt": "2026-10-11T04:10:00.000Z",
            "origin": "JAKARTA",
            "destination": "BANDUNG",
            "courierStatus": "MANIFESTED",
            "events": [
              {
                "at": "2026-10-11T04:05:00.000Z",
                "rawDate": "2026-10-11 11:05:00",
                "description": "SHIPMENT RECEIVED BY JNE COUNTER OFFICER AT [JAKARTA]"
              }
            ]
          },
          "timeline": [
            {
              "status": "submitting",
              "label": "Sedang diproses",
              "at": "2026-10-11T03:01:00.000Z",
              "note": null
            },
            {
              "status": "booked",
              "label": "Menunggu resi",
              "at": "2026-10-11T03:01:04.000Z",
              "note": null
            },
            {
              "status": "awb_ready",
              "label": "Resi terbit",
              "at": "2026-10-11T03:02:10.000Z",
              "note": null
            }
          ],
          "error": null,
          "externalRef": "INV-2026-10-0412",
          "notes": null,
          "payment": null,
          "source": "api",
          "createdAt": "2026-10-11T03:01:00.000Z",
          "updatedAt": "2026-10-11T04:10:00.000Z",
          "bookedAt": "2026-10-11T03:01:04.000Z",
          "deliveredAt": null
        },
        "previousStatus": "booked"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Status perjalanan berubah

    EVENT shipment.status_updated POST ke URL webhook kamu

    Perpindahan ke picked_up, in_transit, out_for_delivery, problem, returned, atau cancel_requested.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: shipment.bookedshipment.awb_readyshipment.status_updatedshipment.deliveredshipment.failedshipment.cancelled

    data object, wajib

    -

    data.shipment Shipment, wajib

    -

    data.previousStatus string, wajib

    Status sebelum perubahan ini.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    Contoh payload

    {
      "id": "evt_3f2a1b0c9d8e7f6a5b4c3d2e",
      "type": "shipment.status_updated",
      "createdAt": "2026-10-11T03:02:10.000Z",
      "livemode": true,
      "data": {
        "shipment": {
          "id": "OH0HZ3K7Q2M4XB",
          "livemode": true,
          "status": "in_transit",
          "statusLabel": "Dalam perjalanan",
          "stage": "in_transit",
          "courier": {
            "code": "jne",
            "name": "JNE"
          },
          "service": {
            "rateCode": "REG23",
            "name": "Reguler",
            "etd": {
              "min": 1,
              "max": 2,
              "unit": "DAY"
            }
          },
          "awb": "CGK0123456789012",
          "shipper": {
            "name": "Toko Contoh Jaya",
            "phone": "6281200000001",
            "email": "gudang@contoh.test",
            "address": "Jl. Contoh Raya No. 1, RT 01/RW 02, Setiabudi",
            "location": {
              "province": "DKI Jakarta",
              "city": "Jakarta Selatan",
              "district": "Setia Budi",
              "subdistrict": "Setiabudi",
              "zipcode": "12910"
            },
            "latlng": null
          },
          "receiver": {
            "name": "Dimas Pratama",
            "phone": "6281300000102",
            "email": null,
            "address": "Jl. Penerima No. 2, dekat masjid, Lebak Gede",
            "location": {
              "province": "Jawa Barat",
              "city": "Bandung",
              "district": "Coblong",
              "subdistrict": "Lebak Gede",
              "zipcode": "40132"
            },
            "latlng": null
          },
          "items": [
            {
              "name": "Kaos katun",
              "sku": "KAOS-HITAM-L",
              "qty": 2,
              "weightKg": 0.5,
              "value": 85000,
              "dimensions": {
                "lengthCm": 25,
                "widthCm": 20,
                "heightCm": 5
              },
              "itemType": "REGULAR"
            }
          ],
          "parcel": {
            "weightKg": 1,
            "chargeableWeightKg": 1,
            "declaredValue": 170000
          },
          "insurance": {
            "insured": false,
            "price": 0
          },
          "pricing": {
            "courierPrice": 12000,
            "insurancePrice": 0,
            "serviceFee": 0,
            "total": 12000
          },
          "pickup": {
            "type": "DROP",
            "time": null
          },
          "tracking": {
            "lastCheckedAt": "2026-10-11T04:10:00.000Z",
            "origin": "JAKARTA",
            "destination": "BANDUNG",
            "courierStatus": "MANIFESTED",
            "events": [
              {
                "at": "2026-10-11T04:05:00.000Z",
                "rawDate": "2026-10-11 11:05:00",
                "description": "SHIPMENT RECEIVED BY JNE COUNTER OFFICER AT [JAKARTA]"
              }
            ]
          },
          "timeline": [
            {
              "status": "submitting",
              "label": "Sedang diproses",
              "at": "2026-10-11T03:01:00.000Z",
              "note": null
            },
            {
              "status": "booked",
              "label": "Menunggu resi",
              "at": "2026-10-11T03:01:04.000Z",
              "note": null
            },
            {
              "status": "awb_ready",
              "label": "Resi terbit",
              "at": "2026-10-11T03:02:10.000Z",
              "note": null
            }
          ],
          "error": null,
          "externalRef": "INV-2026-10-0412",
          "notes": null,
          "payment": null,
          "source": "api",
          "createdAt": "2026-10-11T03:01:00.000Z",
          "updatedAt": "2026-10-11T04:10:00.000Z",
          "bookedAt": "2026-10-11T03:01:04.000Z",
          "deliveredAt": null
        },
        "previousStatus": "picked_up"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Paket terkirim

    EVENT shipment.delivered POST ke URL webhook kamu

    Paket diterima penerima.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: shipment.bookedshipment.awb_readyshipment.status_updatedshipment.deliveredshipment.failedshipment.cancelled

    data object, wajib

    -

    data.shipment Shipment, wajib

    -

    data.previousStatus string, wajib

    Status sebelum perubahan ini.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    Contoh payload

    {
      "id": "evt_3f2a1b0c9d8e7f6a5b4c3d2e",
      "type": "shipment.delivered",
      "createdAt": "2026-10-11T03:02:10.000Z",
      "livemode": true,
      "data": {
        "shipment": {
          "id": "OH0HZ3K7Q2M4XB",
          "livemode": true,
          "status": "delivered",
          "statusLabel": "Terkirim",
          "stage": "delivered",
          "courier": {
            "code": "jne",
            "name": "JNE"
          },
          "service": {
            "rateCode": "REG23",
            "name": "Reguler",
            "etd": {
              "min": 1,
              "max": 2,
              "unit": "DAY"
            }
          },
          "awb": "CGK0123456789012",
          "shipper": {
            "name": "Toko Contoh Jaya",
            "phone": "6281200000001",
            "email": "gudang@contoh.test",
            "address": "Jl. Contoh Raya No. 1, RT 01/RW 02, Setiabudi",
            "location": {
              "province": "DKI Jakarta",
              "city": "Jakarta Selatan",
              "district": "Setia Budi",
              "subdistrict": "Setiabudi",
              "zipcode": "12910"
            },
            "latlng": null
          },
          "receiver": {
            "name": "Dimas Pratama",
            "phone": "6281300000102",
            "email": null,
            "address": "Jl. Penerima No. 2, dekat masjid, Lebak Gede",
            "location": {
              "province": "Jawa Barat",
              "city": "Bandung",
              "district": "Coblong",
              "subdistrict": "Lebak Gede",
              "zipcode": "40132"
            },
            "latlng": null
          },
          "items": [
            {
              "name": "Kaos katun",
              "sku": "KAOS-HITAM-L",
              "qty": 2,
              "weightKg": 0.5,
              "value": 85000,
              "dimensions": {
                "lengthCm": 25,
                "widthCm": 20,
                "heightCm": 5
              },
              "itemType": "REGULAR"
            }
          ],
          "parcel": {
            "weightKg": 1,
            "chargeableWeightKg": 1,
            "declaredValue": 170000
          },
          "insurance": {
            "insured": false,
            "price": 0
          },
          "pricing": {
            "courierPrice": 12000,
            "insurancePrice": 0,
            "serviceFee": 0,
            "total": 12000
          },
          "pickup": {
            "type": "DROP",
            "time": null
          },
          "tracking": {
            "lastCheckedAt": "2026-10-11T04:10:00.000Z",
            "origin": "JAKARTA",
            "destination": "BANDUNG",
            "courierStatus": "MANIFESTED",
            "events": [
              {
                "at": "2026-10-11T04:05:00.000Z",
                "rawDate": "2026-10-11 11:05:00",
                "description": "SHIPMENT RECEIVED BY JNE COUNTER OFFICER AT [JAKARTA]"
              }
            ]
          },
          "timeline": [
            {
              "status": "submitting",
              "label": "Sedang diproses",
              "at": "2026-10-11T03:01:00.000Z",
              "note": null
            },
            {
              "status": "booked",
              "label": "Menunggu resi",
              "at": "2026-10-11T03:01:04.000Z",
              "note": null
            },
            {
              "status": "awb_ready",
              "label": "Resi terbit",
              "at": "2026-10-11T03:02:10.000Z",
              "note": null
            }
          ],
          "error": null,
          "externalRef": "INV-2026-10-0412",
          "notes": null,
          "payment": null,
          "source": "api",
          "createdAt": "2026-10-11T03:01:00.000Z",
          "updatedAt": "2026-10-11T04:10:00.000Z",
          "bookedAt": "2026-10-11T03:01:04.000Z",
          "deliveredAt": "2026-10-12T06:30:00.000Z"
        },
        "previousStatus": "out_for_delivery"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Pesanan gagal dibuat

    EVENT shipment.failed POST ke URL webhook kamu

    Kurir menolak pesanan. Saldo yang ditahan sudah dikembalikan; alasan ada di data.shipment.error.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: shipment.bookedshipment.awb_readyshipment.status_updatedshipment.deliveredshipment.failedshipment.cancelled

    data object, wajib

    -

    data.shipment Shipment, wajib

    -

    data.previousStatus string, wajib

    Status sebelum perubahan ini.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    Contoh payload

    {
      "id": "evt_3f2a1b0c9d8e7f6a5b4c3d2e",
      "type": "shipment.failed",
      "createdAt": "2026-10-11T03:02:10.000Z",
      "livemode": true,
      "data": {
        "shipment": {
          "id": "OH0HZ3K7Q2M4XB",
          "livemode": true,
          "status": "failed",
          "statusLabel": "Gagal",
          "stage": null,
          "courier": {
            "code": "jne",
            "name": "JNE"
          },
          "service": {
            "rateCode": "REG23",
            "name": "Reguler",
            "etd": {
              "min": 1,
              "max": 2,
              "unit": "DAY"
            }
          },
          "awb": null,
          "shipper": {
            "name": "Toko Contoh Jaya",
            "phone": "6281200000001",
            "email": "gudang@contoh.test",
            "address": "Jl. Contoh Raya No. 1, RT 01/RW 02, Setiabudi",
            "location": {
              "province": "DKI Jakarta",
              "city": "Jakarta Selatan",
              "district": "Setia Budi",
              "subdistrict": "Setiabudi",
              "zipcode": "12910"
            },
            "latlng": null
          },
          "receiver": {
            "name": "Dimas Pratama",
            "phone": "6281300000102",
            "email": null,
            "address": "Jl. Penerima No. 2, dekat masjid, Lebak Gede",
            "location": {
              "province": "Jawa Barat",
              "city": "Bandung",
              "district": "Coblong",
              "subdistrict": "Lebak Gede",
              "zipcode": "40132"
            },
            "latlng": null
          },
          "items": [
            {
              "name": "Kaos katun",
              "sku": "KAOS-HITAM-L",
              "qty": 2,
              "weightKg": 0.5,
              "value": 85000,
              "dimensions": {
                "lengthCm": 25,
                "widthCm": 20,
                "heightCm": 5
              },
              "itemType": "REGULAR"
            }
          ],
          "parcel": {
            "weightKg": 1,
            "chargeableWeightKg": 1,
            "declaredValue": 170000
          },
          "insurance": {
            "insured": false,
            "price": 0
          },
          "pricing": {
            "courierPrice": 12000,
            "insurancePrice": 0,
            "serviceFee": 0,
            "total": 12000
          },
          "pickup": {
            "type": "DROP",
            "time": null
          },
          "tracking": {
            "lastCheckedAt": null,
            "origin": null,
            "destination": null,
            "courierStatus": null,
            "events": []
          },
          "timeline": [
            {
              "status": "submitting",
              "label": "Sedang diproses",
              "at": "2026-10-11T03:01:00.000Z",
              "note": null
            }
          ],
          "error": {
            "code": "courier_rejected",
            "message": "Kurir belum bisa memproses pesanan ini. Coba layanan kurir lain. Saldomu tidak terpotong."
          },
          "externalRef": "INV-2026-10-0412",
          "notes": null,
          "payment": null,
          "source": "api",
          "createdAt": "2026-10-11T03:01:00.000Z",
          "updatedAt": "2026-10-11T03:01:00.000Z",
          "bookedAt": null,
          "deliveredAt": null
        },
        "previousStatus": "submitting"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Pembatalan disetujui

    EVENT shipment.cancelled POST ke URL webhook kamu

    Permintaan pembatalan disetujui dan saldo dikembalikan.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: shipment.bookedshipment.awb_readyshipment.status_updatedshipment.deliveredshipment.failedshipment.cancelled

    data object, wajib

    -

    data.shipment Shipment, wajib

    -

    data.previousStatus string, wajib

    Status sebelum perubahan ini.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    Contoh payload

    {
      "id": "evt_3f2a1b0c9d8e7f6a5b4c3d2e",
      "type": "shipment.cancelled",
      "createdAt": "2026-10-11T03:02:10.000Z",
      "livemode": true,
      "data": {
        "shipment": {
          "id": "OH0HZ3K7Q2M4XB",
          "livemode": true,
          "status": "cancelled",
          "statusLabel": "Dibatalkan",
          "stage": "manifested",
          "courier": {
            "code": "jne",
            "name": "JNE"
          },
          "service": {
            "rateCode": "REG23",
            "name": "Reguler",
            "etd": {
              "min": 1,
              "max": 2,
              "unit": "DAY"
            }
          },
          "awb": "CGK0123456789012",
          "shipper": {
            "name": "Toko Contoh Jaya",
            "phone": "6281200000001",
            "email": "gudang@contoh.test",
            "address": "Jl. Contoh Raya No. 1, RT 01/RW 02, Setiabudi",
            "location": {
              "province": "DKI Jakarta",
              "city": "Jakarta Selatan",
              "district": "Setia Budi",
              "subdistrict": "Setiabudi",
              "zipcode": "12910"
            },
            "latlng": null
          },
          "receiver": {
            "name": "Dimas Pratama",
            "phone": "6281300000102",
            "email": null,
            "address": "Jl. Penerima No. 2, dekat masjid, Lebak Gede",
            "location": {
              "province": "Jawa Barat",
              "city": "Bandung",
              "district": "Coblong",
              "subdistrict": "Lebak Gede",
              "zipcode": "40132"
            },
            "latlng": null
          },
          "items": [
            {
              "name": "Kaos katun",
              "sku": "KAOS-HITAM-L",
              "qty": 2,
              "weightKg": 0.5,
              "value": 85000,
              "dimensions": {
                "lengthCm": 25,
                "widthCm": 20,
                "heightCm": 5
              },
              "itemType": "REGULAR"
            }
          ],
          "parcel": {
            "weightKg": 1,
            "chargeableWeightKg": 1,
            "declaredValue": 170000
          },
          "insurance": {
            "insured": false,
            "price": 0
          },
          "pricing": {
            "courierPrice": 12000,
            "insurancePrice": 0,
            "serviceFee": 0,
            "total": 12000
          },
          "pickup": {
            "type": "DROP",
            "time": null
          },
          "tracking": {
            "lastCheckedAt": "2026-10-11T04:10:00.000Z",
            "origin": "JAKARTA",
            "destination": "BANDUNG",
            "courierStatus": "MANIFESTED",
            "events": [
              {
                "at": "2026-10-11T04:05:00.000Z",
                "rawDate": "2026-10-11 11:05:00",
                "description": "SHIPMENT RECEIVED BY JNE COUNTER OFFICER AT [JAKARTA]"
              }
            ]
          },
          "timeline": [
            {
              "status": "submitting",
              "label": "Sedang diproses",
              "at": "2026-10-11T03:01:00.000Z",
              "note": null
            },
            {
              "status": "booked",
              "label": "Menunggu resi",
              "at": "2026-10-11T03:01:04.000Z",
              "note": null
            },
            {
              "status": "awb_ready",
              "label": "Resi terbit",
              "at": "2026-10-11T03:02:10.000Z",
              "note": null
            }
          ],
          "error": null,
          "externalRef": "INV-2026-10-0412",
          "notes": null,
          "payment": null,
          "source": "api",
          "createdAt": "2026-10-11T03:01:00.000Z",
          "updatedAt": "2026-10-11T04:10:00.000Z",
          "bookedAt": "2026-10-11T03:01:04.000Z",
          "deliveredAt": null
        },
        "previousStatus": "cancel_requested"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Isi saldo dibayar

    EVENT topup.paid POST ke URL webhook kamu

    Pembayaran isi saldo dikonfirmasi dan saldo bertambah.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: topup.paid

    data object, wajib

    -

    data.topup Topup, wajib

    -

    data.balance object, wajib

    -

    data.balance.available integer, wajib

    Saldo tersedia setelah isi saldo. Rupiah, bilangan bulat.

    Contoh payload

    {
      "id": "evt_9a8b7c6d5e4f3a2b1c0d9e8f",
      "type": "topup.paid",
      "createdAt": "2026-10-10T02:00:00.000Z",
      "livemode": true,
      "data": {
        "topup": {
          "code": "TU0HZ2Y1X0W9VA",
          "amount": 500000,
          "fee": 723,
          "total": 500723,
          "method": "manual_transfer",
          "status": "paid",
          "statusLabel": "Berhasil",
          "expiresAt": "2026-10-11T01:30:00.000Z",
          "paidAt": "2026-10-10T02:00:00.000Z",
          "createdAt": "2026-10-10T01:30:00.000Z",
          "purpose": null,
          "payment": null,
          "manual": {
            "bankAccounts": [],
            "senderName": null,
            "senderBank": null,
            "uniqueCode": 723,
            "submittedAt": "2026-10-10T01:42:00.000Z",
            "rejectionReason": null,
            "proofUploadId": null
          }
        },
        "balance": {
          "available": 500000
        }
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Tes webhook

    EVENT webhook.test POST ke URL webhook kamu

    Dikirim saat kamu menekan Kirim tes di menu Developer. Tidak perlu dipilih sebagai event.

    Header yang dikirim OngkirHub

    Header yang dikirim OngkirHub
    Field Keterangan
    OngkirHub-Signature string, wajib

    t=,v1=<hex HMAC-SHA256(secret, t + “.” + body mentah)>.

    OngkirHub-Event string, wajib

    Jenis event.

    OngkirHub-Delivery string, wajib

    ID pengiriman webhook (sama untuk setiap percobaan ulang).

    Payload application/json

    Field body permintaan
    Field Keterangan
    id string, wajib

    ID event (evt_…). Simpan untuk mengabaikan event yang sama jika terkirim lebih dari sekali.

    pola ^evt_[0-9a-f]{24}$

    createdAt string (date-time), wajib

    Waktu event.

    livemode boolean, wajib

    False untuk event dari pengiriman uji (kunci test) dan dari Kirim tes.

    type string, wajib

    -

    Nilai: webhook.test

    data object, wajib

    -

    data.message string, wajib

    Pesan tes.

    Contoh payload

    {
      "id": "evt_0a1b2c3d4e5f6a7b8c9d0e1f",
      "type": "webhook.test",
      "createdAt": "2026-10-11T06:00:00.000Z",
      "livemode": false,
      "data": {
        "message": "Tes webhook dari OngkirHub"
      }
    }

    Respons yang diharapkan dari servermu

    • 2XX Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.

    Skema objek

    Objek yang dipakai di halaman ini, dijelaskan sekali di sini.

    Shipment

    Field objek Shipment
    Field Keterangan
    id string, wajib

    ID pengiriman OngkirHub (OH + 12 karakter).

    pola ^OH[0-9A-HJKMNP-TV-Z]{12}$

    livemode boolean, wajib

    False untuk pengiriman dari kunci test (simulasi, tanpa kurir sungguhan).

    status string, wajib

    Status pengiriman di OngkirHub. quoted hanya dipakai untuk bayar per resi dari aplikasi (menunggu pembayaran), yang saat ini tidak tersedia.

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    statusLabel string, wajib

    Label status dalam Bahasa Indonesia.

    stage string | null, wajib

    Tahap perjalanan dari data pelacakan.

    Nilai: manifestedpicked_upin_transitout_for_deliverydeliveredproblemreturnedcancelledunknown

    courier object, wajib

    -

    courier.code string | null, wajib

    -

    Nilai: jnejntjtcsicepatspxlionpospaxelgosendanteraja

    courier.name string, wajib

    Nama kurir.

    service object, wajib

    -

    service.rateCode string, wajib

    Kode layanan.

    service.name string, wajib

    Nama layanan.

    service.etd Etd | null, wajib

    Estimasi waktu sampai dari kurir.

    awb string | null, wajib

    Nomor resi. Null sampai resi terbit (status awb_ready).

    shipper Party, wajib

    -

    receiver Party, wajib

    -

    items array<ShipmentItem>, wajib

    -

    parcel object, wajib

    -

    parcel.weightKg number, wajib

    Total berat.

    parcel.chargeableWeightKg number | null, wajib

    -

    parcel.declaredValue integer, wajib

    Total nilai barang. Rupiah, bilangan bulat.

    insurance object, wajib

    -

    insurance.insured boolean, wajib

    Diasuransikan.

    insurance.price integer, wajib

    Biaya asuransi. Rupiah, bilangan bulat.

    pricing PriceBreakdown, wajib

    -

    pickup object, wajib

    -

    pickup.type string, wajib

    -

    Nilai: PICKUPDROP

    pickup.time string (date-time) | null, wajib

    Jadwal jemput.

    tracking object, wajib

    -

    tracking.lastCheckedAt string (date-time) | null, wajib

    Terakhir data pelacakan diperbarui.

    tracking.origin string | null, wajib

    Asal menurut kurir.

    tracking.destination string | null, wajib

    Tujuan menurut kurir.

    tracking.courierStatus string | null, wajib

    Status menurut kurir.

    tracking.events array<TrackingEvent>, wajib

    Riwayat dari kurir, terbaru dulu.

    timeline array<object>, wajib

    Riwayat status OngkirHub, terlama dulu.

    timeline[].status string, wajib

    -

    Nilai: quotedsubmittingbookedawb_readypicked_upin_transitout_for_deliverydeliveredfailedunknownproblemreturnedcancel_requestedcancelledexpired

    timeline[].label string, wajib

    Label status.

    timeline[].at string (date-time), wajib

    Waktu perubahan.

    timeline[].note string | null, wajib

    Catatan.

    error object | null, wajib

    -

    error.code string, wajib

    -

    Nilai: invalid_requestmethod_not_allowedpayload_too_largeunsupported_media_typeidempotency_key_reusedvalidation_errorunauthenticatedforbiddennot_foundrate_limitedidempotency_conflictquote_expiredno_rates_availablepickup_time_requiredcoordinates_requiredwallet_insufficient_fundsdaily_limit_reachedamount_limit_exceededbooking_disabledcourier_rejectedcourier_service_unavailableorder_reconcilingservice_unavailableservice_timeouttracking_not_foundtracking_courier_requiredtracking_verification_requiredtracking_unsupported_couriertopup_below_minimumtopup_above_limitpayment_method_unavailablepayment_expiredshipment_payment_expiredshipment_needs_rebookingclaim_not_allowedclaim_already_openupload_invalidcancellation_not_allowedmail_unavailablenetwork_errorinternal_error

    error.message string, wajib

    Penjelasan.

    externalRef string | null, wajib

    Referensi milikmu.

    notes string | null, wajib

    Catatan untuk kurir.

    payment object | null, wajib

    Bayar per resi dari aplikasi. Saat ini tidak tersedia: pengiriman dibayar dari saldo, jadi bernilai null kecuali pada pengiriman lama. Pengiriman dari API selalu dibayar dari saldo.

    payment.method string, wajib

    -

    Nilai: walletgateway

    payment.topupCode string | null, wajib

    Kode pembayaran (TU…) untuk bayar per resi.

    payment.paymentMethod string | null, wajib

    Metode pembayaran.

    payment.expiresAt string (date-time) | null, wajib

    Batas bayar.

    payment.paidAt string (date-time) | null, wajib

    Dibayar.

    source string, wajib

    Dibuat dari aplikasi atau API.

    Nilai: appapi

    createdAt string (date-time), wajib

    Dibuat.

    updatedAt string (date-time), wajib

    Terakhir berubah.

    bookedAt string (date-time) | null, wajib

    Diterima kurir untuk diproses.

    deliveredAt string (date-time) | null, wajib

    Diterima penerima.

    Etd

    Estimasi waktu sampai dari kurir.

    Field objek Etd
    Field Keterangan
    min integer, wajib

    Estimasi tercepat.

    max integer, wajib

    Estimasi terlama.

    unit string, wajib

    -

    Nilai: DAYHOURMINUTE

    Party

    Field objek Party
    Field Keterangan
    name string, wajib

    Nama.

    phone string, wajib

    Nomor HP (62…).

    email string | null, wajib

    Email.

    address string, wajib

    Alamat.

    location Location, wajib

    Wilayah tujuan atau asal. Ambil dari GET /v1/locations agar cocok dengan data kurir.

    latlng LatLng | null, wajib

    Titik lokasi. Hanya wajib untuk layanan dengan requiresCoordinates.

    Location

    Wilayah tujuan atau asal. Ambil dari GET /v1/locations agar cocok dengan data kurir.

    Field objek Location
    Field Keterangan
    province string, wajib

    Provinsi, ditulis persis seperti hasil GET /v1/locations.

    city string, wajib

    Kota atau kabupaten.

    district string, wajib

    Kecamatan.

    subdistrict string, wajib

    Kelurahan atau desa.

    zipcode string, wajib

    Kode pos 5 digit.

    pola ^\d{5}$

    LatLng

    Titik lokasi. Hanya wajib untuk layanan dengan requiresCoordinates.

    Field objek LatLng
    Field Keterangan
    lat number, wajib

    Latitude, di dalam wilayah Indonesia.

    min -11.5, maks 6.5

    lng number, wajib

    Longitude, di dalam wilayah Indonesia.

    min 94, maks 141.5

    ShipmentItem

    Field objek ShipmentItem
    Field Keterangan
    name string, wajib

    Nama barang.

    sku string | null, wajib

    SKU.

    qty integer, wajib

    Jumlah.

    weightKg number, wajib

    Berat satu unit dalam kg.

    value integer, wajib

    Nilai satu unit. Rupiah, bilangan bulat.

    dimensions Dimensions | null, wajib

    -

    itemType string, wajib

    -

    Nilai: REGULARORGANICLIQUIDELECTRONIC

    Dimensions

    Field objek Dimensions
    Field Keterangan
    lengthCm number, wajib

    Panjang dalam cm.

    maks 1000

    widthCm number, wajib

    Lebar dalam cm.

    maks 1000

    heightCm number, wajib

    Tinggi dalam cm.

    maks 1000

    PriceBreakdown

    Field objek PriceBreakdown
    Field Keterangan
    courierPrice integer, wajib

    Ongkir dari kurir. Rupiah, bilangan bulat.

    insurancePrice integer, wajib

    Biaya asuransi (0 jika tidak diasuransikan). Rupiah, bilangan bulat.

    serviceFee integer, wajib

    Biaya layanan OngkirHub (saat ini Rp0). Rupiah, bilangan bulat.

    total integer, wajib

    Total yang dipotong dari saldo. Rupiah, bilangan bulat.

    TrackingEvent

    Field objek TrackingEvent
    Field Keterangan
    at string (date-time) | null, wajib

    Waktu kejadian (UTC). Null jika tanggal dari kurir tidak terbaca.

    rawDate string | null, wajib

    Tanggal seperti yang dikirim kurir.

    description string, wajib

    Keterangan dari kurir.

    Topup

    Field objek Topup
    Field Keterangan
    code string, wajib

    Kode isi saldo (TU…).

    amount integer, wajib

    Nominal yang masuk ke saldo. Rupiah, bilangan bulat.

    fee integer, wajib

    Untuk method manual_transfer: kode unik 50 sampai 999 yang ditambahkan ke nominal transfer supaya transfer mudah dikenali. Kode unik tidak masuk ke saldo dan sama dengan manual.uniqueCode (0 pada transfer lama tanpa kode unik). Untuk metode lain: biaya metode pembayaran. Rupiah, bilangan bulat.

    total integer, wajib

    Total yang dibayar, amount ditambah fee. Untuk manual_transfer: nominal persis yang ditransfer. Rupiah, bilangan bulat.

    method string, wajib

    Metode pembayaran. manual_transfer untuk transfer bank yang dicek admin OngkirHub.

    status string, wajib

    -

    Nilai: pendingpaidexpiredfailedcancelled

    statusLabel string, wajib

    Label status.

    expiresAt string (date-time), wajib

    Batas bayar.

    paidAt string (date-time) | null, wajib

    Dibayar. Untuk manual_transfer: waktu admin OngkirHub menyetujui transfer.

    createdAt string (date-time), wajib

    Dibuat.

    purpose object | null, wajib

    Bayar per resi dari aplikasi, hanya pada pembayaran lama karena saat ini tidak tersedia; null untuk isi saldo biasa.

    purpose.kind string, wajib

    -

    Nilai: shipment

    purpose.orderId string, wajib

    ID pengiriman yang dibayar.

    payment object | null, wajib

    Detail pembayaran. Null untuk manual_transfer.

    manual object | null, wajib

    Detail transfer bank (method manual_transfer); null untuk metode lain.

    manual.bankAccounts array<object>, wajib

    Rekening tujuan transfer. Selalu kosong di event webhook.

    manual.bankAccounts[].bank string, wajib

    Nama bank.

    manual.bankAccounts[].accountNumber string, wajib

    Nomor rekening.

    manual.bankAccounts[].accountName string, wajib

    Nama pemilik rekening.

    manual.senderName string | null, wajib

    Nama pengirim, bila diisi.

    manual.senderBank string | null, wajib

    Bank asal, bila diisi.

    manual.uniqueCode integer | null, wajib

    Kode unik dalam rupiah, sama dengan fee. Null pada transfer lama tanpa kode unik.

    min 50, maks 999

    manual.submittedAt string (date-time) | null, wajib

    Waktu pelanggan menekan Saya sudah transfer.

    manual.rejectionReason string | null, wajib

    Alasan admin OngkirHub bila transfer tidak dikonfirmasi.

    manual.proofUploadId string | null, wajib

    ID bukti transfer, bila diunggah.