commit 81404db98c17b26ae58048212e7823b4023007e4 Author: swtmath Date: Wed Mar 4 13:40:32 2026 +0700 init diff --git a/PPh 21/PPh 21 - Pengesahan Baru.bru b/PPh 21/PPh 21 - Pengesahan Baru.bru new file mode 100644 index 0000000..a168acb --- /dev/null +++ b/PPh 21/PPh 21 - Pengesahan Baru.bru @@ -0,0 +1,90 @@ +meta { + name: PPh 21 - Pengesahan Baru + type: http + seq: 1 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/bulanan/new + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "fgJnsBupot": "21", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBp21": { + "sertifikatInsentifDipotong": "N/A", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-35", + "statusPtkp": "TK/2", + "penghasilanKotorSebelumnya": 0, + "penghasilanKotor": 10000000, + "normaPenghasilan": 100, + "tarif": 1.5, + "pphDipotong": 150000, + "dokReferensi": [ + { + "dokReferensi": "OTHER", + "nomorDokumen": "-", + "tanggal_Dokumen": "2025-01-01" + } + ] + } + } + } +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} + +script:post-response { + // Parse response JSON + const responseJson = res.body; + + // Extract nomorBupot and idBupot from taxSlipResponse.result + const nomorBupot = responseJson?.taxSlipResponse?.result?.nomorBupot; + const idBupot = responseJson?.taxSlipResponse?.result?.idBupot; + + // Set environment variables if values exist + if (nomorBupot) { + bru.setEnvVar("nomorBupot", nomorBupot); + console.log("nomorBupot set: " + nomorBupot); + } + + if (idBupot) { + bru.setEnvVar("idBupot", idBupot); + console.log("idBupot set: " + idBupot); + } +} diff --git a/PPh 21/pph21-cancel.bru b/PPh 21/pph21-cancel.bru new file mode 100644 index 0000000..0e06fe0 --- /dev/null +++ b/PPh 21/pph21-cancel.bru @@ -0,0 +1,33 @@ +meta { + name: pph21-cancel + type: http + seq: 3 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/cancel + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipCancel": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "nomorBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "21", + "tglPembatalan": "2025-01-01", + "userId": "3174061502560010", + "npwpNikPenandatangan": "3174061502560010", + "passphrasePenandatangan": "Pajak123@@" + } + } +} diff --git a/PPh 21/pph21-edit.bru b/PPh 21/pph21-edit.bru new file mode 100644 index 0000000..3221203 --- /dev/null +++ b/PPh 21/pph21-edit.bru @@ -0,0 +1,92 @@ +meta { + name: pph21-edit + type: http + seq: 2 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/bulanan/edit + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "nomorBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "21", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBp21": { + "sertifikatInsentifDipotong": "N/A", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-35", + "statusPtkp": "TK/2", + "penghasilanKotorSebelumnya": 0, + "penghasilanKotor": 10010000, + "normaPenghasilan": 100, + "tarif": 1.5, + "pphDipotong": 150150, + "dokReferensi": [ + { + "dokReferensi": "ANNOUNCEMENT", + "nomorDokumen": "Inv/Apr-008", + "tanggal_Dokumen": "2025-01-01" + } + ] + } + } + } +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} + +script:post-response { + // Parse response JSON + const responseJson = res.body; + + // Extract nomorBupot and idBupot from taxSlipResponse.result + const nomorBupot = responseJson?.taxSlipResponse?.result?.nomorBupot; + const idBupot = responseJson?.taxSlipResponse?.result?.idBupot; + + // Set environment variables if values exist + if (nomorBupot) { + bru.setEnvVar("nomorBupot", nomorBupot); + console.log("nomorBupot set: " + nomorBupot); + } + + if (idBupot) { + bru.setEnvVar("idBupot", idBupot); + console.log("idBupot set: " + idBupot); + } +} diff --git a/PPh 21/pph21-pdf.bru b/PPh 21/pph21-pdf.bru new file mode 100644 index 0000000..4bae6e9 --- /dev/null +++ b/PPh 21/pph21-pdf.bru @@ -0,0 +1,29 @@ +meta { + name: pph21-pdf + type: http + seq: 5 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/pdf + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "21" + } + } +} diff --git a/PPh 21/pph21-status.bru b/PPh 21/pph21-status.bru new file mode 100644 index 0000000..db3a72e --- /dev/null +++ b/PPh 21/pph21-status.bru @@ -0,0 +1,29 @@ +meta { + name: pph21-status + type: http + seq: 4 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/status + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "21" + } + } +} diff --git a/PPh A0/PPh A0 - Pengesahan Baru.bru b/PPh A0/PPh A0 - Pengesahan Baru.bru new file mode 100644 index 0000000..e0ecd48 --- /dev/null +++ b/PPh A0/PPh A0 - Pengesahan Baru.bru @@ -0,0 +1,86 @@ +meta { + name: PPh A0 - Pengesahan Baru + type: http + seq: 1 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/bulanan/new + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "fgJnsBupot": "A0", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBpA0": { + "foreignEmployee": "Resident", + "passportNo": "", + "countryCode": "IDN", + "statusPtkp": "TK/2", + "posisiJabatan": "Staf", + "sertifikatInsentifDipotong": "N/A", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-01", + "penghasilanKotor": 14240688, + "tarif": 5, + "pphDipotong": 712034 + } + } + } + +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} + +script:post-response { + // Parse response JSON + const responseJson = res.body; + + // Extract nomorBupot and idBupot from taxSlipResponse.result + const nomorBupot = responseJson?.taxSlipResponse?.result?.nomorBupot; + const idBupot = responseJson?.taxSlipResponse?.result?.idBupot; + + // Set environment variables if values exist + if (nomorBupot) { + bru.setEnvVar("nomorBupot", nomorBupot); + console.log("nomorBupot set: " + nomorBupot); + } + + if (idBupot) { + bru.setEnvVar("idBupot", idBupot); + console.log("idBupot set: " + idBupot); + } +} diff --git a/PPh A0/ppha0-cancel.bru b/PPh A0/ppha0-cancel.bru new file mode 100644 index 0000000..0e84c57 --- /dev/null +++ b/PPh A0/ppha0-cancel.bru @@ -0,0 +1,33 @@ +meta { + name: PPh A0 - Pembatalan + type: http + seq: 4 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/cancel + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipCancel": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "nomorBupot": "25000J28F", + "idBupot": "c0042abf-7cb2-49c9-9489-032db5fb4811", + "fgJnsBupot": "A0", + "tglPembatalan": "2025-01-01", + "userId": "3174061502560010", + "npwpNikPenandatangan": "3174061502560010", + "passphrasePenandatangan": "Pajak123@@" + } + } +} diff --git a/PPh A0/ppha0-edit.bru b/PPh A0/ppha0-edit.bru new file mode 100644 index 0000000..113a383 --- /dev/null +++ b/PPh A0/ppha0-edit.bru @@ -0,0 +1,53 @@ +meta { + name: PPh A0 - Penggantian + type: http + seq: 5 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/bulanan/edit + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "nomorBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "A0", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBpA0": { + "foreignEmployee": "Resident", + "passportNo": "", + "countryCode": "IDN", + "statusPtkp": "TK/2", + "posisiJabatan": "Staf", + "sertifikatInsentifDipotong": "N/A", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-01", + "penghasilanKotor": 14241688, + "tarif": 5, + "pphDipotong": 712084 + } + } + } + +} diff --git a/PPh A0/ppha0-pdf.bru b/PPh A0/ppha0-pdf.bru new file mode 100644 index 0000000..810bfc4 --- /dev/null +++ b/PPh A0/ppha0-pdf.bru @@ -0,0 +1,29 @@ +meta { + name: PPh A0 - Unduh PDF + type: http + seq: 4 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/pdf + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "A0" + } + } +} diff --git a/PPh A0/ppha0-status.bru b/PPh A0/ppha0-status.bru new file mode 100644 index 0000000..857bb7f --- /dev/null +++ b/PPh A0/ppha0-status.bru @@ -0,0 +1,29 @@ +meta { + name: PPh A0 - Periksa Status + type: http + seq: 4 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/status + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "A0" + } + } +} diff --git a/PPh A1/PPh A1 - Pengesahan Baru.bru b/PPh A1/PPh A1 - Pengesahan Baru.bru new file mode 100644 index 0000000..23812cb --- /dev/null +++ b/PPh A1/PPh A1 - Pengesahan Baru.bru @@ -0,0 +1,110 @@ +meta { + name: PPh A1 - Pengesahan Baru + type: http + seq: 1 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/tahunan/new + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "yearlyIncome": { + "alamat": "JL MATRAMAN DALAM I NO.32, RT002/RW008, PEGANGSAAN, MENTENG, KOTA ADM. JAKARTA PUSAT, DKI JAKARTA, 10320", + "blnPenghasilanDisetahunkan": 12, + "fgPemberiKerjaSelanjutnya": "No", + "fgStatusPemotonganPph": "FullYear", + "idTku": "0717166367077000000000", + "jnsKelamin": "M", + "kodeObjekPajak": "21-100-01", + "masaPajakAwal": "01", + "masaPajakAkhir": "12", + "nama": "NAMA3171064907980002", + "namaPenandatangan": "NAMA3174061502560010", + "nominalPtkp": 54000000, + "npwp": "3171064907980002", + "npwpNikPenandatangan": "3174061502560010", + "npwpPemotong": "0717166367077000", + "passphrasePenandatangan": "Pajak123@@", + "pkpSetahunDisetahunkan": 120000000, + "pph21DapatDikreditkan": 0, + "pph21DariBupotSebelumnya": 0, + "pph21KurangLebihBayar": 0, + "pph21SetahunDisetahunkan": 5775000, + "pph21Terutang": 5775000, + "pph21WithheldDtp": 0, + "statusPtkp": "TK/0", + "tahunPajak": 2025, + "tglPemotongan": "2025-12-31", + "totalPenghasilanBruto": 180000000, + "totalPenghasilanNeto": 168000000, + "totalPenghasilanNetoDariBupotSebelumnya": 0, + "totalPenghasilanNetoPph21": 168000000, + "totalPengurang": 12000000, + "userId": "3174061502560010", + "dataBpA1": { + "fgKaryawanAsing": "Resident", + "passport": "", + "kdNegara": "IDN", + "posisiJabatan": "Manager", + "gajiPensiun": 150000000, + "tunjanganPPh": 0, + "tunjanganPPhGrossUp": "No", + "tunjanganLainnyaLembur": 30000000, + "honorarium": 0, + "premiAsuransi": 0, + "Natura": 0, + "tantiemBonus": 0, + "biayaJabatan": 6000000, + "iuranPensiun": 6000000, + "Zakat": 0, + "fgFasilitas": "N/A" + } + } + } + +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} + +script:post-response { + // Parse response JSON + const responseJson = res.body; + + // Extract nomorBupot and idBupot from taxSlipResponse.result + const nomorBupot = responseJson?.taxSlipResponse?.result?.nomorBupot; + const idBupot = responseJson?.taxSlipResponse?.result?.idBupot; + + // Set environment variables if values exist + if (nomorBupot) { + bru.setEnvVar("nomorBupot", nomorBupot); + console.log("nomorBupot set: " + nomorBupot); + } + + if (idBupot) { + bru.setEnvVar("idBupot", idBupot); + console.log("idBupot set: " + idBupot); + } +} diff --git a/PPh A1/ppha1-cancel.bru b/PPh A1/ppha1-cancel.bru new file mode 100644 index 0000000..b96ef19 --- /dev/null +++ b/PPh A1/ppha1-cancel.bru @@ -0,0 +1,49 @@ +meta { + name: PPh A1 - Pembatalan + type: http + seq: 3 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/cancel + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipCancel": { + "npwpPemotong": "0717166367077000", + "tahunPajak": 2025, + "nomorBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "A1", + "tglPembatalan": "2025-12-31", + "userId": "3174061502560010", + "npwpNikPenandatangan": "3174061502560010", + "passphrasePenandatangan": "Pajak123@@" + } + } + +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} diff --git a/PPh A1/ppha1-edit.bru b/PPh A1/ppha1-edit.bru new file mode 100644 index 0000000..b49444a --- /dev/null +++ b/PPh A1/ppha1-edit.bru @@ -0,0 +1,112 @@ +meta { + name: PPh A1 - Penggantian + type: http + seq: 2 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/tahunan/edit + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "yearlyIncome": { + "alamat": "JL MATRAMAN DALAM I NO.32, RT002/RW008, PEGANGSAAN, MENTENG, KOTA ADM. JAKARTA PUSAT, DKI JAKARTA, 10320", + "blnPenghasilanDisetahunkan": 12, + "fgPemberiKerjaSelanjutnya": "No", + "fgStatusPemotonganPph": "FullYear", + "idTku": "0717166367077000000000", + "jnsKelamin": "M", + "kodeObjekPajak": "21-100-01", + "masaPajakAwal": "01", + "masaPajakAkhir": "12", + "nama": "NAMA3171064907980002", + "namaPenandatangan": "NAMA3174061502560010", + "nominalPtkp": 54000000, + "npwp": "3171064907980002", + "npwpNikPenandatangan": "3174061502560010", + "npwpPemotong": "0717166367077000", + "passphrasePenandatangan": "Pajak123@@", + "pkpSetahunDisetahunkan": 120000000, + "pph21DapatDikreditkan": 0, + "pph21DariBupotSebelumnya": 0, + "pph21KurangLebihBayar": 0, + "pph21SetahunDisetahunkan": 5775000, + "pph21Terutang": 5775000, + "pph21WithheldDtp": 0, + "statusPtkp": "TK/0", + "tahunPajak": 2025, + "tglPemotongan": "2025-12-31", + "totalPenghasilanBruto": 180000000, + "totalPenghasilanNeto": 168000000, + "totalPenghasilanNetoDariBupotSebelumnya": 0, + "totalPenghasilanNetoPph21": 168000000, + "totalPengurang": 12000000, + "userId": "3174061502560010", + "nomorBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "dataBpA1": { + "fgKaryawanAsing": "Resident", + "passport": "", + "kdNegara": "IDN", + "posisiJabatan": "Manager", + "gajiPensiun": 150000000, + "tunjanganPPh": 0, + "tunjanganPPhGrossUp": "No", + "tunjanganLainnyaLembur": 30000000, + "honorarium": 0, + "premiAsuransi": 0, + "Natura": 0, + "tantiemBonus": 0, + "biayaJabatan": 6000000, + "iuranPensiun": 6000000, + "Zakat": 0, + "fgFasilitas": "N/A" + } + } + } + +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} + +script:post-response { + // Parse response JSON + const responseJson = res.body; + + // Extract nomorBupot and idBupot from taxSlipResponse.result + const nomorBupot = responseJson?.taxSlipResponse?.result?.nomorBupot; + const idBupot = responseJson?.taxSlipResponse?.result?.idBupot; + + // Set environment variables if values exist + if (nomorBupot) { + bru.setEnvVar("nomorBupot", nomorBupot); + console.log("nomorBupot set: " + nomorBupot); + } + + if (idBupot) { + bru.setEnvVar("idBupot", idBupot); + console.log("idBupot set: " + idBupot); + } +} diff --git a/PPh A1/ppha1-pdf.bru b/PPh A1/ppha1-pdf.bru new file mode 100644 index 0000000..51ce8ba --- /dev/null +++ b/PPh A1/ppha1-pdf.bru @@ -0,0 +1,45 @@ +meta { + name: PPh A1 - Unduh PDF + type: http + seq: 5 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/pdf + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipVerification": { + "npwpPemotong": "0717166367077000", + "tahunPajak": 2025, + "noBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "A1" + } + } + +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} diff --git a/PPh A1/ppha1-status.bru b/PPh A1/ppha1-status.bru new file mode 100644 index 0000000..2cb1f48 --- /dev/null +++ b/PPh A1/ppha1-status.bru @@ -0,0 +1,45 @@ +meta { + name: PPh A1 - Periksa Status + type: http + seq: 4 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/ifs/api/wit/status + body: json + auth: none +} + +headers { + tokens: {{accessToken}} +} + +body:json { + { + "idPel": {{idpel}}, + "requestID": "{{requestID}}", + "taxSlipVerification": { + "npwpPemotong": "0717166367077000", + "tahunPajak": 2025, + "noBupot": "{{nomorBupot}}", + "idBupot": "{{idBupot}}", + "fgJnsBupot": "A1" + } + } + +} + +script:pre-request { + // Generate new UUID for requestID + function generateUUID() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + const newUUID = generateUUID(); + bru.setEnvVar("requestID", newUUID); + console.log("New requestID generated: " + newUUID); +} diff --git a/agents.md b/agents.md new file mode 100644 index 0000000..50c2b7e --- /dev/null +++ b/agents.md @@ -0,0 +1,292 @@ +# SoluTax Bruno API Collection - Agents Documentation + +## Project Overview + +This is a **Bruno API collection** for testing and interacting with the **SoluTax IFS WIT API** developed by PT Sarana Prima Telematika. The collection provides integration capabilities with Indonesia's tax system (DJP - Direktorat Jenderal Pajak) for electronic withholding tax slips (Bukti Potong). + +### Purpose + +The API collection enables management of electronic tax withholding slips for Indonesian payroll and tax compliance: + +- **PPh 21** - Employee income tax withholding (monthly/non-final) +- **PPh A0** - Permanent employee monthly withholding +- **PPh A1** - Permanent employee annual withholding + +### Technologies Used + +- **Bruno** - Git-friendly, offline-first API client +- **Bru** - Plain text markup language for API requests +- **Node.js** - Minimal project structure (package-lock.json present) + +--- + +## Project Structure + +``` +solutax/ +├── bruno.json # Bruno collection configuration +├── agents.md # This file - AI agent documentation +├── QWEN.md # Project overview and context +├── spesifikasi.md # Full API specification document (Indonesian) +├── token.bru # Authentication token request +├── ppha0-new.bru # PPh A0 - Pengesahan (Create) +├── ppha0-edit.bru # PPh A0 - Penggantian (Replace) +├── ppha0-cancel.bru # PPh A0 - Pembatalan (Cancel) +├── ppha0-status.bru # PPh A0 - Periksa Status (Check) +├── ppha0-pdf.bru # PPh A0 - Unduh PDF (Download) +├── test.bru # Test request file +├── package-lock.json # Node.js lock file +├── environments/ +│ ├── solutax.bru # Development environment variables +│ └── solutax.json # Environment configuration +└── sample result/ + ├── ppha0_new_result_sample.json + └── token_result_sample.json +``` + +--- + +## API Endpoints Summary + +### 1. Token Authentication + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/auth/gettoken` | POST | Get JWT access token using Basic Auth | + +**Security**: Basic Authentication (username/password) + +### 2. PPh 21 Withholding Slips (Monthly/Non-Final) + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/ifs/api/wit/bulanan/new` | POST | Create and approve new PPh 21 slip | +| `/ifs/api/wit/bulanan/edit` | POST | Replace/modify existing PPh 21 slip | +| `/ifs/api/wit/cancel` | POST | Cancel a PPh 21 slip | +| `/ifs/api/wit/status` | POST | Check status of PPh 21 slip | +| `/ifs/api/wit/pdf` | POST | Download PDF of PPh 21 slip | + +### 3. PPh A0 Withholding Slips (Permanent Employee Monthly) + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/ifs/api/wit/bulanan/new` | POST | Create and approve new PPh A0 slip | +| `/ifs/api/wit/bulanan/edit` | POST | Replace/modify existing PPh A0 slip | +| `/ifs/api/wit/cancel` | POST | Cancel a PPh A0 slip | +| `/ifs/api/wit/status` | POST | Check status of PPh A0 slip | +| `/ifs/api/wit/pdf` | POST | Download PDF of PPh A0 slip | + +### 4. PPh A1 Withholding Slips (Permanent Employee Annual) + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/ifs/api/wit/tahunan/new` | POST | Create and approve new PPh A1 slip | +| `/ifs/api/wit/tahunan/edit` | POST | Replace/modify existing PPh A1 slip | +| `/ifs/api/wit/cancel` | POST | Cancel a PPh A1 slip | +| `/ifs/api/wit/status` | POST | Check status of PPh A1 slip | +| `/ifs/api/wit/pdf` | POST | Download PDF of PPh A1 slip | + +--- + +## Agent Workflows + +### Workflow 1: Authentication and Token Management + +**Goal**: Obtain and manage access tokens for API requests + +1. **Get Token** + - Execute `token.bru` + - Uses Basic Auth with credentials from `auth:basic` block + - Response contains `access_token`, `idpel`, and `expires_in` + - Token automatically set as `accessToken` environment variable + - Customer ID set as `idpel` environment variable + +### Workflow 2: Create New Tax Slip (PPh A0 Example) + +**Goal**: Create and approve a new withholding tax slip + +1. **Execute ppha0-new.bru** + - Generates new UUID for `requestID` + - Sends monthly income data with taxpayer information + - Includes `dataBpA0` object with tax calculation details + - Response extracts and stores `nomorBupot` and `idBupot` + +### Workflow 3: Replace/Modify Existing Slip + +**Goal**: Update an existing approved tax slip + +1. **Execute ppha0-edit.bru** + - Requires existing `nomorBupot` and `idBupot` + - Sends updated data with all required fields + - New approval number assigned upon success + +### Workflow 4: Cancel Tax Slip + +**Goal**: Cancel an approved tax slip + +1. **Execute ppha0-cancel.bru** + - Generates new UUID for `requestID` + - Requires `nomorBupot` and `idBupot` to cancel + - Includes `tglPembatalan` (cancellation date) + - Requires electronic signature credentials + +### Workflow 5: Check Slip Status + +**Goal**: Verify status of a tax slip (after create, edit, or cancel) + +1. **Execute ppha0-status.bru** + - Queries `taxSlipVerification` object + - Returns status: `NORMAL-DONE`, `AMENDED`, or `CANCELLED-Done` + - Includes verification timestamp + +### Workflow 6: Download PDF + +**Goal**: Retrieve PDF document of approved tax slip + +1. **Execute ppha0-pdf.bru** + - Requires `nomorBupot` and `idBupot` + - Response contains `data` field with Base64-encoded PDF + - File name typically matches `nomorBuktiPotong` + +--- + +## Key Concepts + +### Request Structure + +All requests follow a consistent pattern: + +| Field | Type | Description | +|-------|------|-------------| +| `idPel` | Number | Customer ID (extracted from token response) | +| `requestID` | String (GUID) | Unique request identifier (auto-generated) | +| `monthlyIncome` / `yearlyIncome` / `taxSlip*` | Object | Endpoint-specific data payload | + +### Response Structure + +All responses follow a consistent pattern: + +| Field | Description | +|-------|-------------| +| `kodestatus` / `statusCode` | HTTP status code (200 = success) | +| `keterangan` / `statusMessage` | Status description | +| `data` / `result` / `taxSlipResponse` | Response payload | +| `idPel` / `responseID` | Tracking identifiers | + +### Common Status Codes + +| Code | Meaning | +|------|---------| +| 200 | Success | +| 401 | Unauthorized (invalid/expired token) | +| 500 | Server error (e.g., invalid User ID) | + +### Slip Status Values + +| Status | Meaning | +|--------|---------| +| `NORMAL-DONE` | Original slip approved | +| `AMENDED` | Slip was replaced/modified | +| `CANCELLED-Done` | Slip was cancelled | + +--- + +## Environment Variables + +The following environment variables are used: + +| Variable | Description | Source | +|----------|-------------|--------| +| `accessToken` | JWT authentication token | Token response | +| `idpel` | Customer ID | Token response | +| `requestID` | Unique request GUID | Auto-generated or env | +| `nomorBupot` | Tax slip number | New/Edit response | +| `idBupot` | Tax slip ID (UUID) | New/Edit response | + +--- + +## Configuration + +### Bruno Collection Config (`bruno.json`) + +```json +{ + "version": "1", + "name": "solutax", + "type": "collection", + "ignore": ["node_modules", ".git", "QWEN.md", "spesifikasi.md"] +} +``` + +### API Base URL + +``` +https://ifswit-solutax-ctas-dev.spt.co.id +``` + +**Note**: This is the development/ctas-dev environment. + +--- + +## Testing Workflow + +### Step-by-Step Process + +1. **Get Token** + - Execute `token.bru` first + - Verify `accessToken` is set in environment + +2. **Create Slip** + - Execute `ppha0-new.bru` + - Note the `nomorBupot` and `idBupot` from response + +3. **Verify Status** + - Execute `ppha0-status.bru` + - Confirm `statusBupot` is `NORMAL-DONE` + +4. **Download PDF** (optional) + - Execute `ppha0-pdf.bru` + - Decode Base64 data to PDF file + +5. **Modify Slip** (if needed) + - Execute `ppha0-edit.bru` + - Verify new `nomorBupot` assigned + +6. **Cancel Slip** (if needed) + - Execute `ppha0-cancel.bru` + - Verify `statusBupot` becomes `CANCELLED-Done` + +--- + +## Important Notes + +1. **Language**: All API documentation and field names are in Indonesian (Bahasa Indonesia) + +2. **Environment**: This is a development/DEV environment (CTAS-DEV) + +3. **Token Expiration**: Monitor `expires_in` field; tokens will expire and require renewal + +4. **NPWP Validation**: Tax ID numbers (NPWP) are validated on all endpoints + +5. **Electronic Signature**: Passphrase required for penandatangan (signatory) on create/edit/cancel operations + +6. **Pre-request Scripts**: Some files auto-generate UUIDs for `requestID` using JavaScript + +7. **Post-response Scripts**: Some files extract and store response values as environment variables + +--- + +## Documentation References + +- [spesifikasi.md](./spesifikasi.md) - Complete API specification (Indonesian) +- [QWEN.md](./QWEN.md) - Project overview and context +- [Official Bruno Docs](https://docs.usebruno.com/) +- [SoluTax API Specification](https://ifswit-solutax-ctas-dev.spt.co.id) - API base URL + +--- + +## Contact Information + +**Developer**: PT Sarana Prima Telematika +**Year**: 2026 +**Version**: 1.0 diff --git a/bruno.json b/bruno.json new file mode 100644 index 0000000..879f08b --- /dev/null +++ b/bruno.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "name": "solutax", + "type": "collection", + "ignore": [ + "node_modules", + ".git", + "QWEN.md", + "spesifikasi.md", + "sample result" + ] +} \ No newline at end of file diff --git a/environments/solutax copy.json b/environments/solutax copy.json new file mode 100644 index 0000000..e9a2455 --- /dev/null +++ b/environments/solutax copy.json @@ -0,0 +1,45 @@ +{ + "name": "solutax", + "variables": [ + { + "name": "accessToken", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUb2tlbi5Gb3IuVGhlLlNvbHVUYXguQXBpLldpdGhBdXRoIiwianRpIjoiNTdlYmU0ZGYtYzRlMC00MDE0LWJjZmEtOWNiMjM5ODFmNTk4IiwiaWF0IjoiMTc3MTU1ODE0MCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiOTk5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InVzZXJhbmRhbCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6InVzM3JBbmQ0bCIsImV4cCI6MTc3MTY0NDU0MCwiaXNzIjoic29sdXRheC5hcGkiLCJhdWQiOiJzb2x1dGF4LmFwaS5jbGllbnQifQ._WYyDaBo_c2_u9s8pEkc-yDHHHzkEBarBlZI9-i_Zws", + "type": "text", + "enabled": true, + "secret": false + }, + { + "name": "requestID", + "value": "d2edc0a8-5aa9-4622-972a-fdee07b6fab7", + "type": "text", + "enabled": true, + "secret": false + }, + { + "name": "idpel", + "value": "999", + "type": "text", + "enabled": true, + "secret": false + }, + { + "name": "nomorBupot", + "value": "25000JB0D", + "type": "text", + "enabled": true, + "secret": false + }, + { + "name": "idBupot", + "value": "02357ce6-b9f6-495a-8761-ccc9100256b9", + "type": "text", + "enabled": true, + "secret": false + } + ], + "info": { + "type": "bruno-environment", + "exportedAt": "2026-02-20T03:30:36.311Z", + "exportedUsing": "Bruno/v3.1.2" + } +} \ No newline at end of file diff --git a/environments/solutax.bru b/environments/solutax.bru new file mode 100644 index 0000000..35aea3f --- /dev/null +++ b/environments/solutax.bru @@ -0,0 +1,4 @@ +vars { + accessToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUb2tlbi5Gb3IuVGhlLlNvbHVUYXguQXBpLldpdGhBdXRoIiwianRpIjoiNTQ5ODhmNjktMjA4Mi00MTQ4LThkYWMtNDZjNmMwZmU2MGFkIiwiaWF0IjoiMTc3MTU0NzE3NyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiOTk5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InVzZXJhbmRhbCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6InVzM3JBbmQ0bCIsImV4cCI6MTc3MTYzMzU3NywiaXNzIjoic29sdXRheC5hcGkiLCJhdWQiOiJzb2x1dGF4LmFwaS5jbGllbnQifQ.iLs7f2eJTA8PwNGnq1Y8t2p7E_ShwLQGNjLNRNSKbWM + requestID: b6ee24b6-18ac-46e7-abd7-b97c6b6f9921 +} diff --git a/environments/solutax.json b/environments/solutax.json new file mode 100644 index 0000000..9bf225c --- /dev/null +++ b/environments/solutax.json @@ -0,0 +1,31 @@ +{ + "name": "solutax", + "variables": [ + { + "name": "accessToken", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUb2tlbi5Gb3IuVGhlLlNvbHVUYXguQXBpLldpdGhBdXRoIiwianRpIjoiNjFhZjA0MDQtNzI5My00ZThmLWI2YTQtYzMxMTNkMzUwZGY3IiwiaWF0IjoiMTc3MTQ4NDA2OSIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiOTk5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InVzZXJhbmRhbCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6InVzM3JBbmQ0bCIsImV4cCI6MTc3MTU3MDQ2OSwiaXNzIjoic29sdXRheC5hcGkiLCJhdWQiOiJzb2x1dGF4LmFwaS5jbGllbnQifQ.eurL_YIs7b8bAX_6MC8fG3WHF0MNHfbNYyourna9tVE", + "type": "text", + "enabled": true, + "secret": false + }, + { + "name": "idpel", + "value": 999, + "type": "text", + "enabled": true, + "secret": false + }, + { + "name": "requestID", + "value": "b6ee24b6-18ac-46e7-abd7-b97c6b6f9921", + "type": "text", + "enabled": true, + "secret": false + } + ], + "info": { + "type": "bruno-environment", + "exportedAt": "2026-02-19T07:04:47.831Z", + "exportedUsing": "Bruno/v3.1.2" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2d3b9fa --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "solutax", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/sample result/ppha0_new_result_sample.json b/sample result/ppha0_new_result_sample.json new file mode 100644 index 0000000..dc19607 --- /dev/null +++ b/sample result/ppha0_new_result_sample.json @@ -0,0 +1,15 @@ +{ + "idPel": 999, + "responseID": "d61d2dad-d20d-4338-be40-02f8c068f3b8", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000JB01", + "idBupot": "019b3442-e591-4a6b-8a4d-40f05e64508a", + "tanggalSP2D": "", + "timestamp": "2026-02-20T07:39:59" + } + } +} \ No newline at end of file diff --git a/sample result/token_result_sample.json b/sample result/token_result_sample.json new file mode 100644 index 0000000..1151340 --- /dev/null +++ b/sample result/token_result_sample.json @@ -0,0 +1,10 @@ +{ + "kodestatus": 200, + "keterangan": "Berhasil", + "data": { + "idpel": 999, + "adminName": "userandal", + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUb2tlbi5Gb3IuVGhlLlNvbHVUYXguQXBpLldpdGhBdXRoIiwianRpIjoiNmFhZDg3YTktZWI3ZC00ODE1LWFjNGYtM2YyMTQwOGM5ZmZhIiwiaWF0IjoiMTc3MTQ4MjQ5MyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiOTk5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InVzZXJhbmRhbCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6InVzM3JBbmQ0bCIsImV4cCI6MTc3MTU2ODg5MywiaXNzIjoic29sdXRheC5hcGkiLCJhdWQiOiJzb2x1dGF4LmFwaS5jbGllbnQifQ.NFXU-NNhBFDLPn7lNV_5DPmOhHL3suf6fkWZpw0GhG4", + "expires_in": "20/02/2026 13.28.13" + } +} \ No newline at end of file diff --git a/spesifikasi.md b/spesifikasi.md new file mode 100644 index 0000000..78aa2db --- /dev/null +++ b/spesifikasi.md @@ -0,0 +1,2200 @@ +# SPESIFIKASI API SoluTax IFS WIT V1.0 + +**PT Sarana Prima Telematika** + +**2026** + +--- + +## DAFT ISI + +- [A. TUJUAN](#a-tujuan) +- [B. RUANG LINGKUP](#b-ruang-lingkup) +- [C. FITUR-FITUR](#c-fitur-fitur) + - [1. Token](#1-token) + - [2. Bukti Potong PPh 21](#2-bukti-potong-pph-21) + - [A. Pengesahan Bukti Potong PPh 21](#a-pengesahan-bukti-potong-pph-21) + - [B. Penggantian Bukti Potong PPh 21](#b-penggantian-bukti-potong-pph-21) + - [C. Pembatalan Bukti Potong PPh 21](#c-pembatalan-bukti-potong-pph-21) + - [D. Periksa Status Bukti Potong PPh 21](#d-periksa-status-bukti-potong-pph-21) + - [E. Unduh PDF Bukti Potong PPh 21](#eunduh-pdf-bukti-potong-pph-21) + - [3. Bukti Potong PPh A0](#3-bukti-potong-pph-a0) + - [A. Pengesahan Bukti Potong PPh A0](#a-pengesahan-bukti-potong-pph-a0) + - [B. Penggantian Bukti Potong PPh A0](#b-penggantian-bukti-potong-pph-a0) + - [C. Pembatalan Bukti Potong PPh A0](#c-pembatalan-bukti-potong-pph-a0) + - [D. Periksa Status Bukti Potong PPh A0](#d-periksa-status-bukti-potong-pph-a0) + - [E. Unduh PDF Bukti Potong PPh A0](#eunduh-pdf-bukti-potong-pph-a0) + - [4. Bukti Potong PPh A1](#4-bukti-potong-pph-a1) + - [A. Pengesahan Bukti Potong PPh A1](#a-pengesahan-bukti-potong-pph-a1) + - [B. Penggantian Bukti Potong PPh A1](#b-penggantian-bukti-potong-pph-a1) + - [C. Pembatalan Bukti Potong PPh A1](#c-pembatalan-bukti-potong-pph-a1) + - [D. Periksa Status Bukti Potong PPh A1](#d-periksa-status-bukti-potong-pph-a1) + - [E. Unduh PDF Bukti Potong PPh A1](#eunduh-pdf-bukti-potong-pph-a1) + +--- + +## A. TUJUAN + +Dokumen ini dibuat sebagai panduan pelanggan PT. Sarana Prima Telematika dalam mengembangkan API client SoluTax IFS WIT. + +## B. RUANG LINGKUP + +API SoluTax IFS WIT yang dikembangkan oleh PT. Sarana Prima Telematika meliputi: + +1. Bukti Potong PPh 21 (Tidak Final / Final) +2. Bukti Potong PPh A0 (Pegawai Tetap Bulanan) +3. Bukti Potong PPh A1 (Pegawai Tetap Tahunan) + +## C. FITUR-FITUR + +### 1. Token + +Token digunakan untuk autentikasi menjalankan fungsi API IFS SoluTax WIT. + +**Api EndPoint:** `/auth/gettoken` + +**Method:** POST + +**Security:** Basic auth + +#### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| User | String | User untuk mendapatkan Token | +| Password | String | Password untuk mendapatkan Token | + +#### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| Data | Array | Berisi data hasil dari permintaan token yang terdiri dari elemen: | +| | | - Idpel = kode pelanggan | +| | | - adminName = nama user | +| | | - access_token = token | +| | | - expires_in = masa kadaluarsa token | +| Kodestatus | Number | Berisi kode hasil response permintaan token | +| Keterangan | String | Berisi penjelasan dari kodestatus hasil response | +| | | 0 = unauthorized | +| | | 1 = sukses | + +#### Contoh Response: Berhasil + +```json +{ + "kodestatus": 200, + "keterangan": "Berhasil", + "data": { + "idpel": 999, + "adminName": "admin", + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUb2tlbi5Gb3IuVGhlLlNvbHVUYXguQXBpLldpdGhBdXRoIiwianRpIjoiMjVkMDYyYWItZmU3NS00NjYwLTgzYTQtNTJiZWZjMDA3NmYwIiwiaWF0IjoiMTc2NjczNzA0MiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiOTk5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6ImFkbWluIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIjoiZGV2QHNvbHV0YXgiLCJleHAiOjE3NjY4MjM0NDIsImlzcyI6InNvbHV0YXguYXBpIiwiYXVkIjoic29sdXRheC5hcGkuY2xpZW50In0.N9TcJINUZQyZRrsBFt_sYGSTWstYe4f3d60OLcGwvvQ", + "expires_in": "27/12/2025 15.17.22" + } +} +``` + +#### Contoh Response: Gagal + +```json +{ + "kodestatus": 401, + "keterangan": "Unauthorized", + "data": null +} +``` + +--- + +### 2. Bukti Potong PPh 21 + +#### A. Pengesahan Bukti Potong PPh 21 + +Digunakan untuk merekam dan mengesahkan bukti potong PPh Pasal 21 ke DJP. Apabila proses berhasil, DJP akan memberikan respons berupa nomor bukti potong dan ID bukti potong pengesahan. + +**Api EndPoint:** `/ifs/api/wit/bulanan/new` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang mengirim request | +| requestID | string | ID unik request dari client | +| monthlyIncome | object | Objek data penghasilan bulanan | +| | | | +| **monthlyIncome:** | | | +| npwpPemotong | string | NPWP pihak pemotong pajak | +| idTkuPemotong | string | ID TKU pihak pemotong | +| masaPajak | string | Masa pajak (bulan) | +| tahunPajak | number | Tahun pajak | +| npwpDipotong | string | NPWP/NIK pihak yang dipotong | +| idTkuDipotong | string | ID TKU pihak yang dipotong | +| Nama | string | Nama pihak yang dipotong | +| fgJnsBupot | string | Jenis Bukti Potong (21) | +| tglPemotongan | string (date) | Tanggal pemotongan pajak | +| npwpNikPenandatangan | string | NPWP/NIK penandatangan | +| namaPenandatangan | string | Nama penandatangan | +| passphrasePenandatangan | string | Passphrase tanda tangan elektronik | +| userId | string | User ID yang melakukan transaksi | +| dataBp21 | object | Objek detail Bukti Potong PPh Pasal 21 | +| | | | +| **dataBp21:** | | | +| sertifikatInsentifDipotong | string | Jenis insentif pajak: | +| | | Kode | Keterangan | +| | | N/A | Tanpa Fasilitas | +| | | TaExAr21 | Surat Keterangan Bebas (SKB) Pemotongan PPh Pasal 21 | +| | | DTP | PPh Ditanggung Pemerintah (DTP) | +| | | ETC | Fasilitas Lainnya | +| nomorSertifikatInsentif | string | Nomor sertifikat insentif (jika ada) | +| kodeObjekPajak | string | Kode objek pajak PPh 21 | +| statusPtkp | string | Status PTKP: | +| | | TK/0, TK/1, TK/2, TK/3 | +| | | K/0, K/1, K/2, K/3 | +| penghasilanKotorSebelumnya | number | Penghasilan kotor sebelumnya | +| penghasilanKotor | number | Penghasilan kotor bulan berjalan | +| normaPenghasilan | number | Persentase norma penghasilan | +| Tarif | number | Tarif PPh yang dikenakan | +| pphDipotong | number | Nilai PPh yang dipotong | +| dokReferensi | array | Daftar dokumen referensi | +| | | | +| **dokReferensi:** | | | +| dokReferensi | string | Kode | Keterangan | +| | | ANNOUNCEMENT | Pengumuman | +| | | COMMERCIALINVOICE | Surat Tagihan | +| | | CONTRACT | Kontrak | +| | | CURRENTACCOUNT | Jasa Giro | +| | | DECREE | Decree | +| | | DEEDOFENGAGEMENT | Akta Perjanjian | +| | | DEEDOFGENERAL | Akta RUPS | +| | | OTHER | Lainnya | +| | | OTHERFACILITYDOC | Dokumen Fasilitas Lainnya | +| | | PAYMENTPROOF | Bukti Pembayaran | +| | | STATEMENTLETTER | Surat Pernyataan | +| | | TAXINVOICE | Faktur Pajak | +| | | TAXREGULATIONDOC | Dokumen Perpajakan | +| | | TRADECONFIRMATION | Trade Confirmation | +| nomorDokumen | string | Nomor Dokumen Referensi | +| tanggal_Dokumen | string (date) | Tanggal dokumen referensi | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3301", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "fgJnsBupot": "21", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBp21": { + "sertifikatInsentifDipotong": "DTP", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-35", + "statusPtkp": "TK/2", + "penghasilanKotorSebelumnya": 0, + "penghasilanKotor": 10000000, + "normaPenghasilan": 100, + "tarif": 1.5, + "pphDipotong": 150000, + "dokReferensi": [ + { + "dokReferensi": "ANNOUNCEMENT", + "nomorDokumen": "Inv/Apr-008", + "tanggal_Dokumen": "2025-01-01" + } + ] + } + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| responseID | String | ID unik respons dari sistem | +| taxSlipResponse | Object | Objek hasil pemrosesan bukti potong | +| | | | +| **taxSlipResponse:** | | | +| Status | String | Status proses (1 = sukses, 0 = gagal) | +| statusCode | String | Kode status HTTP | +| statusMessage | String | Pesan status hasil pemrosesan | +| Result | Object | Detail hasil pembuatan bukti potong | +| | | | +| **Result:** | | | +| nomorBupot | String | Nomor bukti potong elektronik | +| idBupot | String | ID unik bukti potong | +| Timestamp | string (datetime) | Waktu pemrosesan sistem (ISO 8601) | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "9e44fc83-58b8-453e-a35d-ac1a259a9112", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000J24H", + "idBupot": "ecbbdc78-0caa-4e5d-89e6-ab1981eda38b", + "timestamp": "2026-01-06T02:04:16" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### B. Penggantian Bukti Potong PPh 21 + +Digunakan untuk mengganti data Bukti Potong PPh 21 yang sudah berhasil disahkan DJP. Apabila proses berhasil, DJP akan memberikan respons berupa nomor bukti potong dan ID bukti potong pengesahan. + +**Api EndPoint:** `/ifs/api/wit/bulanan/edit` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| monthlyIncome | Object | Objek data penghasilan bulanan dan bukti potong | +| | | | +| **monthlyIncome:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| idTkuPemotong | String | ID TKU pemotong pajak | +| masaPajak | String | Masa pajak (format MM) | +| tahunPajak | Number | Tahun pajak | +| npwpDipotong | String | NPWP pihak yang dipotong pajaknya | +| idTkuDipotong | String | ID TKU pihak yang dipotong | +| Nama | String | Nama wajib pajak yang dipotong | +| nomorBupot | String | Nomor bukti potong hasil pengesahan | +| idBupot | String | ID bukti potong hasil pengesahan | +| fgJnsBupot | String | Flag jenis bukti potong (21/A0) | +| tglPemotongan | String (date) | Tanggal pemotongan pajak (YYYY-MM-DD) | +| npwpNikPenandatangan | String | NPWP/NIK penandatangan | +| namaPenandatangan | String | Nama penandatangan dokumen | +| passphrasePenandatangan | String | Passphrase untuk otorisasi penandatangan | +| userId | String | ID user pemroses data | +| dataBp21 | Object | Detail perhitungan PPh Pasal 21 | +| | | | +| **dataBp21:** | | | +| sertifikatInsentifDipotong | String | Status kepemilikan sertifikat insentif | +| nomorSertifikatInsentif | String | Nomor sertifikat insentif | +| kodeObjekPajak | String | Kode objek pajak | +| statusPtkp | String | Status PTKP: | +| | | TK/0, TK/1, TK/2, TK/3 | +| | | K/0, K/1, K/2, K/3 | +| penghasilanKotorSebelumnya | String | Total penghasilan kotor sebelum periode berjalan | +| penghasilanKotor | String | Penghasilan kotor periode berjalan | +| normaPenghasilan | Number | Persentase norma penghasilan | +| Tarif | Number | Tarif pajak (%) | +| pphDipotong | Number | Nilai PPh yang dipotong | +| dokReferensi | Number | Daftar dokumen referensi pendukung | +| | | | +| **dokReferensi:** | | | +| dokReferensi | Number | Kode | Keterangan | +| | | ANNOUNCEMENT | Pengumuman | +| | | COMMERCIALINVOICE | Surat Tagihan | +| | | CONTRACT | Kontrak | +| | | CURRENTACCOUNT | Jasa Giro | +| | | DECREE | Decree | +| | | DEEDOFENGAGEMENT | Akta Perjanjian | +| | | DEEDOFGENERAL | Akta RUPS | +| | | OTHER | Lainnya | +| | | OTHERFACILITYDOC | Dokumen Fasilitas Lainnya | +| | | PAYMENTPROOF | Bukti Pembayaran | +| | | STATEMENTLETTER | Surat Pernyataan | +| | | TAXINVOICE | Faktur Pajak | +| | | TAXREGULATIONDOC | Dokumen Perpajakan | +| | | TRADECONFIRMATION | Trade Confirmation | +| nomorDokumen | String | Nomor dokumen referensi | +| tanggal_Dokumen | String | Tanggal dokumen referensi | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3302", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "nomorBup00J28Eot": "250", + "idBupot": "0cd1d89b-1e31-4c8f-a548-7f51bd2e37a0", + "fgJnsBupot": "21", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBp21": { + "sertifikatInsentifDipotong": "DTP", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-35", + "statusPtkp": "TK/2", + "penghasilanKotorSebelumnya": 0, + "penghasilanKotor": 10000000, + "normaPenghasilan": 100, + "tarif": 1.5, + "pphDipotong": 150000, + "dokReferensi": [ + { + "dokReferensi": "ANNOUNCEMENT", + "nomorDokumen": "Inv/Apr-008", + "tanggal_Dokumen": "2025-01-01" + } + ] + } + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | String | ID unik respons dari sistem | +| taxSlipResponse | Object | Objek hasil pemrosesan bukti potong | +| Status | String | Status proses (1 = sukses, 0 = gagal) | +| statusCode | String | Kode status HTTP | +| statusMessage | String | Pesan status hasil pemrosesan | +| Result | Object | Detail hasil pembuatan/pembaruan bukti potong | +| | | | +| **Result:** | | | +| nomorBupot | String | Nomor bukti potong elektronik | +| idBupot | String | ID unik bukti potong | +| Timestamp | string (datetime) | Waktu pemrosesan sistem (ISO 8601) | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "2ba73950-f37a-4bf9-8247-df15f89aa488", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000J28E", + "idBupot": "1656ead9-038b-40b6-a37b-c8328ff57dc8", + "timestamp": "2026-01-06T19:35:51" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### C. Pembatalan Bukti Potong PPh 21 + +Fungsi ini digunakan untuk membatalkan bukti potong PPh 21. + +**Api EndPoint:** `/ifs/api/wit/cancel` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang mengirim request | +| requestID | string | ID unik request dari client | +| taxSlipCancel | object | Objek permintaan pembatalan bukti potong | +| | | | +| **taxSlipCancel:** | | | +| npwpPemotong | string | NPWP pihak pemotong pajak | +| tahunPajak | number | Tahun pajak bukti potong | +| nomorBupot | string | Nomor Bukti Potong yang akan dibatalkan | +| idBupot | string | ID unik Bukti Potong dalam sistem | +| fgJnsBupot | string | Flag jenis Bukti Potong (21) | +| tglPembatalan | string (date) | Tanggal pembatalan bukti potong | +| userId | string | User ID yang melakukan pembatalan | +| npwpNikPenandatangan | string | NPWP/NIK penandatangan pembatalan | +| passphrasePenandatangan | string | Passphrase tanda tangan elektronik | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3303", + "taxSlipCancel": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "nomorBupot": "25000J28F", + "idBupot": "c0042abf-7cb2-49c9-9489-032db5fb4811", + "fgJnsBupot": "21", + "tglPembatalan": "2025-01-01", + "userId": "3174061502560010", + "npwpNikPenandatangan": "3174061502560010", + "passphrasePenandatangan": "Pajak123@@" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan atau identitas unik pemohon | +| responseID | string (GUID) | ID unik response dalam format GUID untuk tracking request | +| taxSlipResponse | object | Objek hasil response terkait tax slip | +| Status | string | Status proses (1 = sukses, 0 gagal) | +| statusCode | string | Kode status response (contoh: "200" = berhasil) | +| statusMessage | string | Pesan status yang menjelaskan hasil proses | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "ce726d7f-2c48-4589-8676-ec1bc37869d4", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success" + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### D. Periksa Status Bukti Potong PPh 21 + +Fungsi ini digunakan untuk periksa status hasil pengesahan, perubahan atau pembatalan bukti potong PPh 21. + +**Api EndPoint:** `/ifs/api/wit/status` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| taxSlipVerification | Object | Objek data verifikasi bukti potong | +| | | | +| **taxSlipVerification:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| tahunPajak | Number | Tahun pajak | +| noBupot | String | Nomor bukti potong | +| idBupot | String | ID unik bukti potong | +| fgJnsBupot | String | Flag jenis bukti potong (21) | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3305", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "25000J24H", + "idBupot": "ecbbdc78-0caa-4e5d-89e6-ab1981eda38b", + "fgJnsBupot": "21" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | string | ID unik respons dari sistem | +| printedTaxSlipResponse | object | Objek hasil verifikasi bukti potong | +| Status | string | Status proses (1 = sukses, 0 = gagal) | +| statusCode | string | Kode status HTTP | +| statusMessage | string | Pesan status hasil verifikasi | +| Result | object | Detail hasil verifikasi bukti potong | +| | | | +| **Result:** | | | +| npwpPemotong | string | NPWP/ID penerima penghasilan | +| statusBupot | string | Status bukti potong: | +| | | Pengesahan: NORMAL-DONE | +| | | Penggantian: AMENDED | +| | | Pembatalan: CANCELLED-Done | +| kodeObjekPajak | string | Kode objek pajak | +| pphDipotong | number | Nilai PPh yang dipotong | +| Timestamp | string (datetime) | Waktu proses verifikasi sistem | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "3c8fe213-fb73-49c3-896b-40e975dc2697", + "printedTaxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "npwpPemotong": "1091031210912281", + "statusBupot": "NORMAL-DONE", + "kodeObjekPajak": "21-100-35", + "pphDipotong": 200000, + "timestamp": "2026-01-22 08:57:58" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. NPWP tidak valid/tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "5c49882a-3bd5-4ab3-b614-b2dff9c3de97", + "taxSlipVerificationResponse": { + "status": "0", + "statusCode": "BadRequest", + "statusMessage": "{\"status\":\"0\",\"statusCode\":\"401\",\"statusMessage\":\"Unauthorized\",\"result\":null}" + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### E. Unduh PDF Bukti Potong PPh 21 + +Fungsi ini digunakan untuk mengunduh PDF Bukti Potong PPh 21 yang telah disahkan oleh DJP baik itu untuk bukti potong pengesahan, penggantian maupun pembatalan. + +**Api EndPoint:** `/ifs/api/wit/pdf` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| Nama Field | Tipe Data | Deskripsi | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| taxSlipVerification | Object | Objek data verifikasi bukti potong | +| | | | +| **taxSlipVerification:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| tahunPajak | Number | Tahun pajak | +| noBupot | String | Nomor bukti potong | +| idBupot | String | ID unik bukti potong | +| fgJnsBupot | String | Flag jenis bukti potong (21) | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3301", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "25000J24H", + "idBupot": "ecbbdc78-0caa-4e5d-89e6-ab1981eda38b", + "fgJnsBupot": "21" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | String | ID unik respons dari sistem | +| printedTaxSlipResponse | Object | Objek hasil proses cetak bukti potong | +| Status | String | Status proses (1 = sukses, 0 = gagal) | +| statusCode | String | Kode status sistem | +| statusMessage | String | Pesan status hasil proses | +| result | Object | Detail hasil proses cetak bukti potong | +| | | | +| **result:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| statusBupot | string | Status bukti potong: | +| | | Pengesahan: NORMAL-DONE | +| | | Penggantian: AMENDED | +| | | Pembatalan: CANCELLED-Done | +| kodeObjekPajak | String | Kode objek pajak | +| pphDipotong | number | Nilai PPh yang dipotong | +| timestamp | string (datetime) | Waktu proses sistem | +| data | string | PDF dalam format base64string | +| nomorBuktiPotong | String | Nomor bukti potong | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "ccc618cc-67de-472e-860a-cc95e1b778ad", + "printedTaxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Berhasil mengunduh cetakan bukti potong", + "result": { + "npwpPemotong": "1091031210912281", + "statusBupot": "NORMAL-DONE", + "kodeObjekPajak": "21-100-35", + "pphDipotong": 200000, + "timestamp": "2026-01-06 02:11:41", + "data": "JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvU...RhcnR4cmVmDQozMzQ1Mw0KJSVFT0Y=", + "nomorBuktiPotong": "25000J24H" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. NPWP tidak valid/tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "5c49882a-3bd5-4ab3-b614-b2dff9c3de97", + "taxSlipVerificationResponse": { + "status": "0", + "statusCode": "BadRequest", + "statusMessage": "{\"status\":\"0\",\"statusCode\":\"401\",\"statusMessage\":\"Unauthorized\",\"result\":null}" + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +### 3. Bukti Potong PPh A0 + +#### A. Pengesahan Bukti Potong PPh A0 + +Digunakan untuk merekam dan mengesahkan bukti potong PPh Pasal A0 baru ke DJP. Apabila proses berhasil, DJP akan memberikan respons berupa nomor bukti potong dan ID bukti potong pengesahan. + +**Api EndPoint:** `/ifs/api/wit/bulanan/new` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang mengirim request | +| requestID | string | ID unik request dari client | +| monthlyIncome | object | Objek data penghasilan bulanan | +| | | | +| **monthlyIncome:** | | | +| npwpPemotong | string | NPWP pihak pemotong pajak | +| idTkuPemotong | string | ID TKU pihak pemotong | +| masaPajak | string | Masa pajak (bulan) | +| tahunPajak | number | Tahun pajak | +| npwpDipotong | string | NPWP/NIK pihak yang dipotong | +| idTkuDipotong | string | ID TKU pihak yang dipotong | +| Nama | string | Nama pihak yang dipotong | +| fgJnsBupot | string | Flag jenis Bukti Potong (A0) | +| tglPemotongan | string (date) | Tanggal pemotongan pajak | +| npwpNikPenandatangan | string | NPWP/NIK penandatangan | +| namaPenandatangan | string | Nama penandatangan | +| passphrasePenandatangan | string | Passphrase tanda tangan elektronik | +| userId | string | User ID yang melakukan transaksi | +| dataBpA0 | object | Objek detail Bukti Potong PPh 21 jenis A0 | +| | | | +| **dataBpA0:** | | | +| foreignEmployee | string | Status pegawai: | +| | | Nilai | Keterangan | +| | | Resident | Pegawai dalam negeri | +| | | Foreign | Pegawai Asing | +| passportNo | string | Nomor paspor (wajib jika pegawai asing) | +| countryCode | string | Kode negara pegawai | +| statusPtkp | string | Status PTKP: | +| | | TK/0, TK/1, TK/2, TK/3 | +| | | K/0, K/1, K/2, K/3 | +| posisiJabatan | string | Posisi atau jabatan pegawai | +| sertifikatInsentifDipotong | string | Jenis insentif pajak: | +| | | Kode | Keterangan | +| | | N/A | Tanpa Fasilitas | +| | | TaExAr21 | Surat Keterangan Bebas (SKB) Pemotongan PPh Pasal 21 | +| | | DTP | PPh Ditanggung Pemerintah (DTP) | +| | | ETC | Fasilitas Lainnya | +| nomorSertifikatInsentif | string | Nomor sertifikat insentif (jika ada) | +| kodeObjekPajak | string | Kode objek pajak PPh 21 | +| penghasilanKotor | number | Total penghasilan bruto | +| Tarif | number | Tarif PPh yang dikenakan (%) | +| pphDipotong | number | Nilai PPh yang dipotong | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3301", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "fgJnsBupot": "A0", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBpA0": { + "foreignEmployee": "Resident", + "passportNo": "", + "countryCode": "IDN", + "statusPtkp": "TK/2", + "posisiJabatan": "Staf", + "sertifikatInsentifDipotong": "N/A", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-01", + "penghasilanKotor": 14240688, + "tarif": 5, + "pphDipotong": 712034 + } + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan yang mengirim request | +| responseID | String | ID unik response yang dihasilkan oleh sistem | +| taxSlipResponse | Object | Objek utama response bukti potong | +| Status | String | Status proses (1 = berhasil, 0 = gagal) | +| statusCode | String | Kode status hasil proses (mengacu HTTP Status Code) | +| statusMessage | String | Pesan hasil proses dari sistem | +| Result | Object | Objek hasil pembuatan bukti potong | +| | | | +| **Result:** | | | +| nomorBupot | String | Nomor Bukti Potong yang dihasilkan | +| idBupot | String | ID unik Bukti Potong dalam sistem | +| Timestamp | string (ISO 8601 datetime) | Waktu sistem saat proses berhasil dilakukan | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "6cac173d-d7f7-4f8a-9071-8acc8cdf6fbf", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000J28F", + "idBupot": "c0042abf-7cb2-49c9-9489-032db5fb4811", + "timestamp": "2026-01-06T20:09:59" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### B. Penggantian Bukti Potong PPh A0 + +Digunakan untuk merubah data Bukti Potong PPh A0 yang sudah berhasil disahkan DJP. Apabila proses berhasil, DJP akan memberikan respons berupa nomor bukti potong dan ID bukti potong pengesahan. + +**Api EndPoint:** `/ifs/api/wit/bulanan/edit` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang mengirim request | +| requestID | string | ID unik request dari client | +| monthlyIncome | object | Objek data penghasilan bulanan | +| | | | +| **monthlyIncome:** | | | +| npwpPemotong | string | NPWP pihak pemotong pajak | +| idTkuPemotong | string | ID TKU pihak pemotong | +| masaPajak | string | Masa pajak (bulan) | +| tahunPajak | number | Tahun pajak | +| npwpDipotong | string | NPWP/NIK pihak yang dipotong | +| idTkuDipotong | string | ID TKU pihak yang dipotong | +| Nama | string | Nama pihak yang dipotong | +| nomorBupot | string | Nomor Bukti Potong hasil pengesahan | +| idBupot | string | ID Bukti Potong hasil pengesahan | +| fgJnsBupot | string | Flag jenis Bukti Potong (A0) | +| tglPemotongan | string (date) | Tanggal pemotongan pajak | +| npwpNikPenandatangan | string | NPWP/NIK penandatangan | +| namaPenandatangan | string | Nama penandatangan | +| passphrasePenandatangan | string | Passphrase tanda tangan elektronik | +| userId | string | User ID yang melakukan transaksi | +| dataBpA0 | object | Objek detail Bukti Potong PPh A0 | +| | | | +| **dataBpA0:** | | | +| foreignEmployee | string | Status Pegawai: | +| | | Nilai | Keterangan | +| | | Resident | Pegawai dalam negeri | +| | | Foreign | Pegawai Asing | +| passportNo | string | Nomor paspor (wajib jika pegawai asing) | +| countryCode | string | Kode negara pegawai untuk Resident diisi (IDN) | +| statusPtkp | string | Status PTKP: | +| | | TK/0, TK/1, TK/2, TK/3 | +| | | K/0, K/1, K/2, K/3 | +| posisiJabatan | string | Posisi atau jabatan pegawai | +| sertifikatInsentifDipotong | string | Jenis insentif pajak: | +| | | Kode | Keterangan | +| | | N/A | Tanpa Fasilitas | +| | | TaExAr21 | Surat Keterangan Bebas (SKB) Pemotongan PPh Pasal 21 | +| | | DTP | PPh Ditanggung Pemerintah (DTP) | +| | | ETC | Fasilitas Lainnya | +| nomorSertifikatInsentif | number | Nomor sertifikat insentif (jika ada) | +| kodeObjekPajak | number | Kode objek pajak PPh 21 | +| penghasilanKotor | number | Total penghasilan bruto | +| Tarif | number | Tarif PPh yang dikenakan (%) | +| pphDipotong | number | Nilai PPh yang dipotong | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "REQ-002", + "monthlyIncome": { + "npwpPemotong": "1091031210912281", + "idTkuPemotong": "1091031210912281000000", + "masaPajak": "01", + "tahunPajak": 2025, + "npwpDipotong": "3171065903840003", + "idTkuDipotong": "3171065903840003000000", + "nama": "NAMA3171065903840003", + "nomorBupot": "25000J28F", + "idBupot": "c0042abf-7cb2-49c9-9489-032db5fb4811", + "fgJnsBupot": "A0", + "tglPemotongan": "2025-01-01", + "npwpNikPenandatangan": "3174061502560010", + "namaPenandatangan": "NAMA3174061502560010", + "passphrasePenandatangan": "Pajak123@@", + "userId": "3174061502560010", + "dataBpA0": { + "foreignEmployee": "Resident", + "passportNo": "", + "countryCode": "", + "statusPtkp": "TK/2", + "posisiJabatan": "Staf", + "sertifikatInsentifDipotong": "N/A", + "nomorSertifikatInsentif": "", + "kodeObjekPajak": "21-100-01", + "penghasilanKotor": 14240688, + "tarif": 5, + "pphDipotong": 712034 + } + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang menerima response | +| responseID | String | ID unik response yang dihasilkan sistem | +| taxSlipResponse | Object | Objek utama response bukti potong | +| status | String | Status proses (1 = berhasil, 0 = gagal) | +| statusCode | String | Kode status hasil proses (mengacu HTTP Status Code) | +| statusMessage | String | Pesan hasil proses dari sistem | +| result | Object | Objek hasil proses bukti potong | +| | | | +| **result:** | | | +| nomorBupot | String | Nomor Bukti Potong yang dihasilkan | +| idBupot | String | ID unik Bukti Potong dalam sistem | +| Timestamp | string (ISO 8601 datetime) | Waktu sistem saat proses berhasil | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "ffe979d9-b47f-4ff5-a80a-975900becc6a", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000J28F", + "idBupot": "0342d22e-f5bc-404a-9f33-7c52b9e10917", + "timestamp": "2026-01-06T20:29:41" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### C. Pembatalan Bukti Potong PPh A0 + +Fungsi ini digunakan untuk membatalkan bukti potong PPh A0. + +**Api EndPoint:** `/ifs/api/wit/cancel` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang mengirim request | +| requestID | String | ID unik request dari client | +| taxSlipCancel | object | Objek permintaan pembatalan bukti potong | +| | | | +| **taxSlipCancel:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| tahunPajak | number | Tahun pajak bukti potong | +| nomorBupot | String | Nomor Bukti Potong yang akan dibatalkan | +| idBupot | String | ID unik Bukti Potong dalam sistem | +| fgJnsBupot | String | Flag jenis Bukti Potong (A0) | +| tglPembatalan | string (date) | Tanggal pembatalan bukti potong | +| userId | String | User ID yang melakukan pembatalan | +| npwpNikPenandatangan | String | NPWP/NIK penandatangan pembatalan | +| passphrasePenandatangan | String | Passphrase tanda tangan elektronik | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3301", + "taxSlipCancel": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "nomorBupot": "25000J28F", + "idBupot": "c0042abf-7cb2-49c9-9489-032db5fb4811", + "fgJnsBupot": "A0", + "tglPembatalan": "2025-01-01", + "userId": "3174061502560010", + "npwpNikPenandatangan": "3174061502560010", + "passphrasePenandatangan": "Pajak123@@" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number / integer | ID pelanggan atau identitas unik pemohon | +| responseID | string (GUID) | ID unik response dalam format GUID untuk tracking request | +| taxSlipResponse | object | Objek hasil response terkait tax slip | +| status | string | Status proses (1 = sukses, 0 gagal) | +| statusCode | string | Kode status response (contoh: "200" = berhasil) | +| statusMessage | string | Pesan status yang menjelaskan hasil proses | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "ce726d7f-2c48-4589-8676-ec1bc37869d4", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success" + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### D. Periksa Status Bukti Potong PPh A0 + +Fungsi ini digunakan untuk periksa status hasil pengesahan, perubahan atau pembatalan bukti potong PPh A0. + +**Api EndPoint:** `/ifs/api/wit/status` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| taxSlipVerification | Object | Objek data verifikasi bukti potong | +| | | | +| **taxSlipVerification:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| tahunPajak | Number | Tahun pajak | +| noBupot | String | Nomor bukti potong | +| idBupot | String | ID unik bukti potong | +| fgJnsBupot | String | Flag jenis bukti potong (A0) | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3f2504e0-4f89-11d3-9a0c-0305e82c3301", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "25000J24H", + "idBupot": "ecbbdc78-0caa-4e5d-89e6-ab1981eda38b", + "fgJnsBupot": "A0" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | string | ID unik respons dari sistem | +| printedTaxSlipResponse | object | Objek hasil verifikasi bukti potong | +| Status | string | Status proses (1 = sukses, 0 = gagal) | +| statusCode | string | Kode status HTTP | +| statusMessage | string | Pesan status hasil verifikasi | +| Result | object | Detail hasil verifikasi bukti potong | +| | | | +| **Result:** | | | +| npwpPemotong | string | NPWP/ID penerima penghasilan | +| statusBupot | string | Status bukti potong: | +| | | Pengesahan: NORMAL-DONE | +| | | Penggantian: AMENDED | +| | | Pembatalan: CANCELLED-Done | +| kodeObjekPajak | string | Kode objek pajak | +| pphDipotong | number | Nilai PPh yang dipotong | +| Timestamp | string (datetime) | Waktu proses verifikasi sistem | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "3c8fe213-fb73-49c3-896b-40e975dc2697", + "printedTaxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "npwpPemotong": "1091031210912281", + "statusBupot": "NORMAL-DONE", + "kodeObjekPajak": "21-100-35", + "pphDipotong": 200000, + "timestamp": "2026-01-22 08:57:58" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. NPWP tidak valid/tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "5c49882a-3bd5-4ab3-b614-b2dff9c3de97", + "taxSlipVerificationResponse": { + "status": "0", + "statusCode": "BadRequest", + "statusMessage": "{\"status\":\"0\",\"statusCode\":\"401\",\"statusMessage\":\"Unauthorized\",\"result\":null}" + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### E. Unduh PDF Bukti Potong PPh A0 + +Fungsi ini digunakan untuk mengunduh PDF Bukti Potong PPh A0 yang telah disahkan oleh DJP baik itu untuk bukti potong pengesahan, penggantian maupun pembatalan. + +**Api EndPoint:** `/ifs/api/wit/pdf` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| Nama Field | Tipe Data | Deskripsi | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| taxSlipVerification | Object | Objek data verifikasi bukti potong | +| | | | +| **taxSlipVerification:** | | | +| npwpPemotong | String | NPWP pihak pemotong pajak | +| tahunPajak | Number | Tahun pajak | +| noBupot | String | Nomor bukti potong | +| idBupot | String | ID unik bukti potong | +| fgJnsBupot | String | Flag jenis bukti potong (A0) | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "3c8fe213-fb73-49c3-896b-40e975d77777", + "taxSlipVerification": { + "npwpPemotong": "1091031210912281", + "tahunPajak": 2025, + "noBupot": "25000J24H", + "idBupot": "ecbbdc78-0caa-4e5d-89e6-ab1981eda38b", + "fgJnsBupot": "A0" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | string | ID unik respons dari sistem | +| printedTaxSlipResponse | object | Objek hasil proses cetak bukti potong | +| Status | string | Status proses (1 = sukses, 0 = gagal) | +| statusCode | string | Kode status sistem | +| statusMessage | string | Pesan status hasil proses | +| result | object | Detail hasil proses cetak bukti potong | +| | | | +| **result:** | | | +| npwpPemotong | string | NPWP pihak pemotong pajak | +| statusBupot | string | Status bukti potong: | +| | | Pengesahan: NORMAL-DONE | +| | | Penggantian: AMENDED | +| | | Pembatalan: CANCELLED-Done | +| kodeObjekPajak | string | Kode objek pajak | +| pphDipotong | number | Nilai PPh yang dipotong | +| Timestamp | string (datetime) | Waktu proses sistem | +| Data | string | PDF dalam format base64string | +| nomorBuktiPotong | string | Nomor bukti potong | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "ccc618cc-67de-472e-860a-cc95e1b778ad", + "printedTaxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Berhasil mengunduh cetakan bukti potong", + "result": { + "npwpPemotong": "1091031210912281", + "statusBupot": "NORMAL-DONE", + "kodeObjekPajak": "21-100-35", + "pphDipotong": 200000, + "timestamp": "2026-01-06 02:11:41", + "data": "JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvU...RhcnR4cmVmDQozMzQ1Mw0KJSVFT0Y=", + "nomorBuktiPotong": "25000J24H" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. NPWP tidak valid/tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "5c49882a-3bd5-4ab3-b614-b2dff9c3de97", + "taxSlipVerificationResponse": { + "status": "0", + "statusCode": "BadRequest", + "statusMessage": "{\"status\":\"0\",\"statusCode\":\"401\",\"statusMessage\":\"Unauthorized\",\"result\":null}" + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +### 4. Bukti Potong PPh A1 + +#### A. Pengesahan Bukti Potong PPh A1 + +Digunakan untuk merekam dan mengesahkan bukti potong PPh Pasal A1 baru ke DJP. Apabila proses berhasil, DJP akan memberikan respons berupa nomor bukti potong dan ID bukti potong pengesahan. + +**Api EndPoint:** `/ifs/api/wit/tahunan/new` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan yang mengirim request | +| requestID | string | ID unik request dari client | +| yearlyIncome | object | Objek data penghasilan tahunan (Bukti Potong A1) | +| | | | +| **yearlyIncome:** | | | +| Alamat | string | Alamat lengkap penerima penghasilan | +| blnPenghasilanDisetahunkan | number | Jumlah bulan penghasilan yang disetahunkan | +| fgPemberiKerjaSelanjutnya | string | Status pemberi kerja selanjutnya (Yes/No) | +| fgStatusPemotonganPph | string | Status | Keterangan | +| | | FullYear | Setahun Penuh | +| | | PartialYear | Kurang dari Setahun | +| | | Annualized | Disetahunkan | +| idTku | string | ID TKU pihak pemotong | +| jnsKelamin | string | Jenis kelamin penerima penghasilan (M/F) | +| kodeObjekPajak | string | Kode objek pajak PPh 21 | +| masaPajakAwal | string | Masa pajak awal | +| masaPajakAkhir | string | Masa pajak akhir | +| Nama | string | Nama penerima penghasilan | +| namaPenandatangan | string | Nama penandatangan bukti potong | +| nominalPtkp | number | Nominal PTKP | +| Npwp | string | NPWP/NIK penerima penghasilan | +| npwpNikPenandatangan | string | NPWP/NIK penandatangan | +| npwpPemotong | string | NPWP pihak pemotong | +| passphrasePenandatangan | string | Passphrase tanda tangan elektronik | +| pkpSetahunDisetahunkan | number | PKP setahun yang disetahunkan | +| pph21DapatDikreditkan | number | PPh 21 yang dapat dikreditkan | +| pph21DariBupotSebelumnya | number | PPh 21 dari bukti potong sebelumnya | +| pph21KurangLebihBayar | number | Nilai kurang/lebih bayar PPh 21 | +| pph21SetahunDisetahunkan | number | Total PPh 21 setahun disetahunkan | +| pph21Terutang | number | PPh 21 terutang | +| pph21WithheldDtp | number | PPh 21 yang ditanggung pemerintah | +| statusPtkp | string | Status PTKP: | +| | | TK/0, TK/1, TK/2, TK/3 | +| | | K/0, K/1, K/2, K/3 | +| tahunPajak | number | Tahun pajak | +| tglPemotongan | string (date) | Tanggal pemotongan | +| totalPenghasilanBruto | number | Total penghasilan bruto | +| totalPenghasilanNeto | number | Total penghasilan neto | +| totalPenghasilanNetoDariBupotSebelumnya | number | Penghasilan neto dari bukti potong sebelumnya | +| totalPenghasilanNetoPph21 | number | Total penghasilan neto objek PPh 21 | +| totalPengurang | number | Total pengurang penghasilan | +| userId | string | User ID yang melakukan transaksi | +| dataBpA1 | object | Objek detail Bukti Potong PPh 21 jenis A1 | +| | | | +| **dataBpA1:** | | | +| fgKaryawanAsing | string | Status Pegawai: | +| | | Nilai | Keterangan | +| | | Resident | Pegawai dalam negeri | +| | | Foreign | Pegawai Asing | +| passport | string | Nomor paspor (jika karyawan asing) | +| kdNegara | string | Kode negara karyawan. Untuk pegawai dalam negeri diisi IDN | +| posisiJabatan | string | Posisi atau jabatan | +| gajiPensiun | number | Penghasilan dari gaji/pensiun | +| tunjanganPPh | number | Tunjangan PPh | +| tunjanganPPhGrossUp | string | Status gross up PPh (Yes/No) | +| tunjanganLainnyaLembur | number | Tunjangan lainnya dan lembur | +| honorarium | number | Penghasilan honorarium | +| premiAsuransi | number | Premi asuransi | +| Natura | number | Penghasilan natura | +| tantiemBonus | number | Tantiem atau bonus | +| biayaJabatan | number | Biaya jabatan | +| iuranPensiun | number | Iuran pensiun | +| Zakat | number | Zakat yang dibayarkan | +| fgFasilitas | string | Jenis Fasilitas: | +| | | Kode | Keterangan | +| | | N/A | Tanpa Fasilitas | +| | | TaExAr21 | Surat Keterangan Bebas (SKB) Pemotongan PPh Pasal 21 | +| | | DTP | PPh Ditanggung Pemerintah (DTP) | +| | | ETC | Fasilitas Lainnya | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "a1b2c3d4-1234-4abc-9def-001122334455", + "yearlyIncome": { + "alamat": "JL MATRAMAN DALAM I NO.32, RT002/RW008, PEGANGSAAN, MENTENG, KOTA ADM. JAKARTA PUSAT, DKI JAKARTA, 10320", + "blnPenghasilanDisetahunkan": 5, + "fgPemberiKerjaSelanjutnya": "No", + "fgStatusPemotonganPph": "Annualized", + "idTku": "0717166367077000000000", + "jnsKelamin": "F", + "kodeObjekPajak": "21-100-01", + "masaPajakAwal": "01", + "masaPajakAkhir": "05", + "nama": "NAMA3171064907980002", + "namaPenandatangan": "NAMA3174061502560010", + "nominalPtkp": 67500000, + "npwp": "3171064907980002", + "npwpNikPenandatangan": "3174061502560010", + "npwpPemotong": "0717166367077000", + "passphrasePenandatangan": "Pajak123@@", + "pkpSetahunDisetahunkan": 0, + "pph21DapatDikreditkan": 0, + "pph21DariBupotSebelumnya": 0, + "pph21KurangLebihBayar": 0, + "pph21SetahunDisetahunkan": 0, + "pph21Terutang": 0, + "pph21WithheldDtp": 0, + "statusPtkp": "TK/3", + "tahunPajak": 2025, + "tglPemotongan": "2025-06-30", + "totalPenghasilanBruto": 102500000, + "totalPenghasilanNeto": 97250000, + "totalPenghasilanNetoDariBupotSebelumnya": 0, + "totalPenghasilanNetoPph21": 97250000, + "totalPengurang": 6000000, + "userId": "3174061502560010", + "dataBpA1": { + "fgKaryawanAsing": "Resident", + "passport": "", + "kdNegara": "IDN", + "posisiJabatan": "Staff", + "gajiPensiun": 85000000, + "tunjanganPPh": 0, + "tunjanganPPhGrossUp": "No", + "tunjanganLainnyaLembur": 17500000, + "honorarium": 0, + "premiAsuransi": 0, + "Natura": 0, + "tantiemBonus": 0, + "biayaJabatan": 6000000, + "iuranPensiun": 0, + "Zakat": 0, + "fgFasilitas": "N/A" + } + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| responseID | String | ID unik response | +| taxSlipResponse | Object | Objek response bukti potong | +| Status | String | Status proses (1=sukses, 0=gagal) | +| statusCode | String | Kode status HTTP | +| statusMessage | String | Pesan status | +| Result | Object | Detail hasil | +| | | | +| **Result:** | | | +| nomorBupot | String | Nomor bukti potong | +| idBupot | String | ID bukti potong | +| timestamp | String | Timestamp | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "d4c3b2a1-5678-4def-9012-34567890abcd", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000J29A", + "idBupot": "f1e2d3c4-5678-4abc-9def-0123456789ab", + "timestamp": "2026-01-15T10:30:00" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### B. Penggantian Bukti Potong PPh A1 + +Digunakan untuk merubah data Bukti Potong PPh A1 yang sudah disahkan DJP. + +**Api EndPoint:** `/ifs/api/wit/tahunan/edit` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| requestID | string | ID unik request | +| yearlyIncome | object | Objek data penghasilan tahunan | +| | | | +| **yearlyIncome:** | | | +| Alamat | string | Alamat lengkap | +| blnPenghasilanDisetahunkan | number | Jumlah bulan penghasilan | +| fgPemberiKerjaSelanjutnya | string | Status pemberi kerja (Yes/No) | +| fgStatusPemotonganPph | string | Status pemotongan | +| idTku | string | ID TKU | +| jnsKelamin | string | Jenis kelamin (M/F) | +| kodeObjekPajak | string | Kode objek pajak | +| masaPajakAwal | string | Masa pajak awal | +| masaPajakAkhir | string | Masa pajak akhir | +| Nama | string | Nama penerima | +| namaPenandatangan | string | Nama penandatangan | +| nominalPtkp | number | Nominal PTKP | +| Npwp | string | NPWP | +| npwpNikPenandatangan | string | NPWP penandatangan | +| npwpPemotong | string | NPWP pemotong | +| passphrasePenandatangan | string | Passphrase | +| pkpSetahunDisetahunkan | number | PKP setahun | +| pph21DapatDikreditkan | number | PPh dapat dikreditkan | +| pph21DariBupotSebelumnya | number | PPh dari bupot sebelumnya | +| pph21KurangLebihBayar | number | Kurang/lebih bayar | +| pph21SetahunDisetahunkan | number | PPh setahun disetahunkan | +| pph21Terutang | number | PPh terutang | +| pph21WithheldDtp | number | PPh DTP | +| statusPtkp | string | Status PTKP | +| tahunPajak | number | Tahun pajak | +| tglPemotongan | string | Tanggal pemotongan | +| totalPenghasilanBruto | number | Total penghasilan bruto | +| totalPenghasilanNeto | number | Total penghasilan neto | +| totalPenghasilanNetoDariBupotSebelumnya | number | Neto dari sebelumnya | +| totalPenghasilanNetoPph21 | number | Neto objek PPh 21 | +| totalPengurang | number | Total pengurang | +| userId | string | User ID | +| nomorBupot | string | Nomor bupot yang diganti | +| idBupot | string | ID bupot | +| dataBpA1 | object | Detail bukti potong A1 | +| | | | +| **dataBpA1:** | | | +| fgKaryawanAsing | string | Status karyawan (Resident/Foreign) | +| passport | string | Nomor paspor | +| kdNegara | string | Kode negara | +| posisiJabatan | string | Jabatan | +| gajiPensiun | number | Gaji/pensiun | +| tunjanganPPh | number | Tunjangan PPh | +| tunjanganPPhGrossUp | string | Gross up (Yes/No) | +| tunjanganLainnyaLembur | number | Tunjangan lain/lembur | +| honorarium | number | Honorarium | +| premiAsuransi | number | Premi asuransi | +| Natura | number | Natura | +| tantiemBonus | number | Bonus/tantiem | +| biayaJabatan | number | Biaya jabatan | +| iuranPensiun | number | Iuran pensiun | +| Zakat | number | Zakat | +| fgFasilitas | string | Jenis fasilitas | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "b2c3d4e5-1234-4abc-9def-001122334456", + "yearlyIncome": { + "alamat": "JL MATRAMAN DALAM I NO.32, RT002/RW008, PEGANGSAAN, MENTENG, KOTA ADM. JAKARTA PUSAT, DKI JAKARTA, 10320", + "blnPenghasilanDisetahunkan": 5, + "fgPemberiKerjaSelanjutnya": "No", + "fgStatusPemotonganPph": "Annualized", + "idTku": "0717166367077000000000", + "jnsKelamin": "F", + "kodeObjekPajak": "21-100-01", + "masaPajakAwal": "01", + "masaPajakAkhir": "05", + "nama": "NAMA3171064907980002", + "namaPenandatangan": "NAMA3174061502560010", + "nominalPtkp": 67500000, + "npwp": "3171064907980002", + "npwpNikPenandatangan": "3174061502560010", + "npwpPemotong": "0717166367077000", + "passphrasePenandatangan": "Pajak123@@", + "pkpSetahunDisetahunkan": 0, + "pph21DapatDikreditkan": 0, + "pph21DariBupotSebelumnya": 0, + "pph21KurangLebihBayar": 0, + "pph21SetahunDisetahunkan": 0, + "pph21Terutang": 0, + "pph21WithheldDtp": 0, + "statusPtkp": "TK/3", + "tahunPajak": 2025, + "tglPemotongan": "2025-06-30", + "totalPenghasilanBruto": 102500000, + "totalPenghasilanNeto": 97250000, + "totalPenghasilanNetoDariBupotSebelumnya": 0, + "totalPenghasilanNetoPph21": 97250000, + "totalPengurang": 6000000, + "userId": "3174061502560010", + "nomorBupot": "25000J29A", + "idBupot": "f1e2d3c4-5678-4abc-9def-0123456789ab", + "dataBpA1": { + "fgKaryawanAsing": "Resident", + "passport": "", + "kdNegara": "IDN", + "posisiJabatan": "Staff", + "gajiPensiun": 85000000, + "tunjanganPPh": 0, + "tunjanganPPhGrossUp": "No", + "tunjanganLainnyaLembur": 17500000, + "honorarium": 0, + "premiAsuransi": 0, + "Natura": 0, + "tantiemBonus": 0, + "biayaJabatan": 6000000, + "iuranPensiun": 0, + "Zakat": 0, + "fgFasilitas": "N/A" + } + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| responseID | String | ID unik response | +| taxSlipResponse | Object | Objek response | +| Status | String | Status proses | +| statusCode | String | Kode status HTTP | +| statusMessage | String | Pesan status | +| Result | Object | Detail hasil | +| | | | +| **Result:** | | | +| nomorBupot | String | Nomor bukti potong | +| idBupot | String | ID bukti potong | +| timestamp | String | Timestamp | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "e5f4a3b2-6789-4cba-9fed-1234567890cd", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "nomorBupot": "25000J29A", + "idBupot": "a1b2c3d4-5678-4abc-9def-0123456789ab", + "timestamp": "2026-01-15T11:00:00" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### C. Pembatalan Bukti Potong PPh A1 + +Fungsi ini digunakan untuk membatalkan bukti potong PPh A1. + +**Api EndPoint:** `/ifs/api/wit/cancel` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| requestID | string | ID unik request | +| taxSlipCancel | object | Objek pembatalan | +| | | | +| **taxSlipCancel:** | | | +| npwpPemotong | string | NPWP pemotong | +| tahunPajak | number | Tahun pajak | +| nomorBupot | string | Nomor bupot | +| idBupot | string | ID bupot | +| fgJnsBupot | string | Flag jenis bukti potong (A1) | +| tglPembatalan | string | Tanggal pembatalan | +| userId | string | User ID | +| npwpNikPenandatangan | string | NPWP penandatangan | +| passphrasePenandatangan | string | Passphrase | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "c3d4e5f6-1234-4abc-9def-001122334457", + "taxSlipCancel": { + "npwpPemotong": "0717166367077000", + "tahunPajak": 2025, + "nomorBupot": "25000J29A", + "idBupot": "f1e2d3c4-5678-4abc-9def-0123456789ab", + "fgJnsBupot": "A1", + "tglPembatalan": "2025-07-01", + "userId": "3174061502560010", + "npwpNikPenandatangan": "3174061502560010", + "passphrasePenandatangan": "Pajak123@@" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | string (GUID) | ID unik response | +| taxSlipResponse | object | Objek response | +| status | string | Status proses (1=sukses, 0=gagal) | +| statusCode | string | Kode status | +| statusMessage | string | Pesan status | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "f6e5d4c3-7896-4cba-9fed-2345678901de", + "taxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success" + } +} +``` + +##### Contoh Response: Gagal + +**a. User ID tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "769915a2-c2c1-4d9b-b33c-b8ed1c9f94a7", + "taxSlipResponse": { + "status": "0", + "statusCode": "500", + "statusMessage": "Userid bukan PIC Wajib Pajak yang sah." + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### D. Periksa Status Bukti Potong PPh A1 + +Fungsi ini digunakan untuk periksa status bukti potong PPh A1. + +**Api EndPoint:** `/ifs/api/wit/status` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| taxSlipVerification | Object | Objek verifikasi | +| | | | +| **taxSlipVerification:** | | | +| npwpPemotong | String | NPWP pemotong | +| tahunPajak | Number | Tahun pajak | +| noBupot | String | Nomor bukti potong | +| idBupot | String | ID bukti potong | +| fgJnsBupot | String | Flag jenis bukti potong (A1) | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "d4e5f6a7-1234-4abc-9def-001122334458", + "taxSlipVerification": { + "npwpPemotong": "0717166367077000", + "tahunPajak": 2025, + "noBupot": "25000J29A", + "idBupot": "f1e2d3c4-5678-4abc-9def-0123456789ab", + "fgJnsBupot": "A1" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | string | ID unik respons | +| printedTaxSlipResponse | object | Objek response | +| Status | string | Status proses | +| statusCode | string | Kode status HTTP | +| statusMessage | string | Pesan status | +| Result | object | Detail hasil verifikasi | +| | | | +| **Result:** | | | +| npwpPemotong | string | NPWP pemotong | +| statusBupot | string | Status bukti potong | +| kodeObjekPajak | string | Kode objek pajak | +| pphDipotong | number | Nilai PPh dipotong | +| Timestamp | string | Timestamp verifikasi | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "a7b6c5d4-8901-4def-9fed-3456789012ef", + "printedTaxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Success", + "result": { + "npwpPemotong": "0717166367077000", + "statusBupot": "NORMAL-DONE", + "kodeObjekPajak": "21-100-01", + "pphDipotong": 5950000, + "timestamp": "2026-01-22 09:15:30" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. NPWP tidak valid/tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "5c49882a-3bd5-4ab3-b614-b2dff9c3de97", + "taxSlipVerificationResponse": { + "status": "0", + "statusCode": "BadRequest", + "statusMessage": "{\"status\":\"0\",\"statusCode\":\"401\",\"statusMessage\":\"Unauthorized\",\"result\":null}" + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +#### E. Unduh PDF Bukti Potong PPh A1 + +Fungsi ini digunakan untuk mengunduh PDF Bukti Potong PPh A1. + +**Api EndPoint:** `/ifs/api/wit/pdf` + +**Method:** POST + +**Header:** Token + +##### REQUEST + +| Nama Field | Tipe Data | Deskripsi | +|------------|-----------|-----------| +| idPel | Number | ID pelanggan | +| requestID | String | ID unik permintaan | +| taxSlipVerification | Object | Objek verifikasi | +| | | | +| **taxSlipVerification:** | | | +| npwpPemotong | String | NPWP pemotong | +| tahunPajak | Number | Tahun pajak | +| noBupot | String | Nomor bukti potong | +| idBupot | String | ID bukti potong | +| fgJnsBupot | String | Flag jenis bukti potong (A1) | + +##### Contoh Request + +```json +{ + "idPel": 999, + "requestID": "e5f6a7b8-1234-4abc-9def-001122334459", + "taxSlipVerification": { + "npwpPemotong": "0717166367077000", + "tahunPajak": 2025, + "noBupot": "25000J29A", + "idBupot": "f1e2d3c4-5678-4abc-9def-0123456789ab", + "fgJnsBupot": "A1" + } +} +``` + +##### RESPONSE + +| NAMA FIELD | TIPE DATA | DESKRIPSI | +|------------|-----------|-----------| +| idPel | number | ID pelanggan | +| responseID | string | ID unik respons | +| printedTaxSlipResponse | Object | Objek response | +| Status | string | Status proses | +| statusCode | string | Kode status | +| statusMessage | string | Pesan status | +| result | Object | Detail hasil | +| | | | +| **result:** | | | +| npwpPemotong | string | NPWP pemotong | +| statusBupot | string | Status bukti potong | +| kodeObjekPajak | string | Kode objek pajak | +| pphDipotong | number | Nilai PPh dipotong | +| timestamp | string | Timestamp | +| data | string | PDF dalam format base64 | +| nomorBuktiPotong | string | Nomor bukti potong | + +##### Contoh Response: Berhasil + +```json +{ + "idPel": 999, + "responseID": "b8a9c8d7-9012-4efb-9fed-4567890123fg", + "printedTaxSlipResponse": { + "status": "1", + "statusCode": "200", + "statusMessage": "Berhasil mengunduh cetakan bukti potong", + "result": { + "npwpPemotong": "0717166367077000", + "statusBupot": "NORMAL-DONE", + "kodeObjekPajak": "21-100-01", + "pphDipotong": 5950000, + "timestamp": "2026-01-22 09:30:00", + "data": "JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+Pg0KZW5kb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMyAwIFI+DQplbmRvYmoNCjQgMCBvYmoNClBERiAvVGFiaW5kZXIgMQ0KZW5kb2JqDQp4CmVuZHN0cmVhbQplbmRvYmoNCnRyYWlsZXINCjw8L1R5cGUvWE9iamVjdC9SZXNvdXJjZXMgMiAwIFI+Pg0Kc3RhcnR4cmVmDQo0NTANCiUlRU9G", + "nomorBuktiPotong": "25000J29A" + } + } +} +``` + +##### Contoh Response: Gagal + +**a. NPWP tidak valid/tidak sesuai** + +```json +{ + "idPel": 999, + "responseID": "5c49882a-3bd5-4ab3-b614-b2dff9c3de97", + "taxSlipVerificationResponse": { + "status": "0", + "statusCode": "BadRequest", + "statusMessage": "{\"status\":\"0\",\"statusCode\":\"401\",\"statusMessage\":\"Unauthorized\",\"result\":null}" + } +} +``` + +**b. Token tidak valid** + +```json +{ + "status": "0", + "statusCode": "401", + "statusMessage": "Unauthorized: token validation error" +} +``` + +--- + +## Catatan Penting + +1. **Autentikasi**: Semua endpoint (kecuali Token) memerlukan token autentikasi pada header request. + +2. **Format Tanggal**: Format tanggal yang digunakan adalah `YYYY-MM-DD`. + +3. **Format NPWP**: NPWP harus terdiri dari 15 digit tanpa tanda baca. + +4. **Error Handling**: Jika request gagal, response akan berisi `status: 0` dengan `statusCode` dan `statusMessage` yang menjelaskan penyebab kegagalan. + +5. **Token Kadaluarsa**: Token memiliki masa berlaku. Jika token kadaluarsa, request akan ditolak dengan status `401 Unauthorized`. + +6. **Base64 Encoding**: Response untuk endpoint unduh PDF akan mengembalikan data PDF dalam format Base64 string. + +--- + +*Dokumen ini dibuat oleh PT Sarana Prima Telematika - 2026* diff --git a/token.bru b/token.bru new file mode 100644 index 0000000..27e079f --- /dev/null +++ b/token.bru @@ -0,0 +1,30 @@ +meta { + name: Token + type: http + seq: 2 +} + +post { + url: https://ifswit-solutax-ctas-dev.spt.co.id/auth/gettoken + body: none + auth: basic +} + +auth:basic { + username: us3rAnd4l + password: p@5s4ndal001 +} + +script:post-response { + // Parse response body and extract access_token + const response = res.body; + + // Check if access_token and idpel exist in response + if (response && response.data) { + bru.setEnvVar("accessToken", response.data.access_token); + bru.setEnvVar("idpel", response.data.idpel.toString()); + console.log("Access token and idpel extracted and set as environment variables"); + } else { + console.log("No data found in response"); + } +}