Menu dokumentasi
Webhook
Event yang dikirim OngkirHub ke URL kamu.
Pesanan diterima kurir
shipment.booked POST ke URL webhook kamu Pengiriman berpindah ke booked: kurir menerima pesanan dan saldo yang ditahan dipakai.
Header yang dikirim OngkirHub
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
data object, wajib | - |
data.shipment Shipment, wajib | - |
data.previousStatus string, wajib | Status sebelum perubahan ini.
Nilai:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Resi terbit
shipment.awb_ready POST ke URL webhook kamu Nomor resi sudah ada di data.shipment.awb dan label siap dicetak.
Header yang dikirim OngkirHub
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
data object, wajib | - |
data.shipment Shipment, wajib | - |
data.previousStatus string, wajib | Status sebelum perubahan ini.
Nilai:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Status perjalanan berubah
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
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
data object, wajib | - |
data.shipment Shipment, wajib | - |
data.previousStatus string, wajib | Status sebelum perubahan ini.
Nilai:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Paket terkirim
shipment.delivered POST ke URL webhook kamu Paket diterima penerima.
Header yang dikirim OngkirHub
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
data object, wajib | - |
data.shipment Shipment, wajib | - |
data.previousStatus string, wajib | Status sebelum perubahan ini.
Nilai:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Pesanan gagal dibuat
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
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
data object, wajib | - |
data.shipment Shipment, wajib | - |
data.previousStatus string, wajib | Status sebelum perubahan ini.
Nilai:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Pembatalan disetujui
shipment.cancelled POST ke URL webhook kamu Permintaan pembatalan disetujui dan saldo dikembalikan.
Header yang dikirim OngkirHub
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
data object, wajib | - |
data.shipment Shipment, wajib | - |
data.previousStatus string, wajib | Status sebelum perubahan ini.
Nilai:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Isi saldo dibayar
topup.paid POST ke URL webhook kamu Pembayaran isi saldo dikonfirmasi dan saldo bertambah.
Header yang dikirim OngkirHub
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
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
-
Diterima. Jawab dalam 10 detik; status lain dianggap gagal dan dicoba ulang.
Tes webhook
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
| Field | Keterangan |
|---|---|
OngkirHub-Signature string, wajib | t= |
OngkirHub-Event string, wajib | Jenis event. |
OngkirHub-Delivery string, wajib | ID pengiriman webhook (sama untuk setiap percobaan ulang). |
Payload application/json
| 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:
|
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
-
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 | 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:
|
statusLabel string, wajib | Label status dalam Bahasa Indonesia. |
stage string | null, wajib | Tahap perjalanan dari data pelacakan.
Nilai:
|
courier object, wajib | - |
courier.code string | null, wajib | -
Nilai:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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 | Keterangan |
|---|---|
min integer, wajib | Estimasi tercepat. |
max integer, wajib | Estimasi terlama. |
unit string, wajib | -
Nilai:
|
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 | 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 | 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 | 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:
|
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 | 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 | 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 | 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:
|
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:
|
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. |