This commit is contained in:
2026-03-04 13:40:32 +07:00
commit 81404db98c
25 changed files with 3509 additions and 0 deletions

View File

@@ -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);
}
}

33
PPh 21/pph21-cancel.bru Normal file
View File

@@ -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@@"
}
}
}

92
PPh 21/pph21-edit.bru Normal file
View File

@@ -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);
}
}

29
PPh 21/pph21-pdf.bru Normal file
View File

@@ -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"
}
}
}

29
PPh 21/pph21-status.bru Normal file
View File

@@ -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"
}
}
}

View File

@@ -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);
}
}

33
PPh A0/ppha0-cancel.bru Normal file
View File

@@ -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@@"
}
}
}

53
PPh A0/ppha0-edit.bru Normal file
View File

@@ -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
}
}
}
}

29
PPh A0/ppha0-pdf.bru Normal file
View File

@@ -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"
}
}
}

29
PPh A0/ppha0-status.bru Normal file
View File

@@ -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"
}
}
}

View File

@@ -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);
}
}

49
PPh A1/ppha1-cancel.bru Normal file
View File

@@ -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);
}

112
PPh A1/ppha1-edit.bru Normal file
View File

@@ -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);
}
}

45
PPh A1/ppha1-pdf.bru Normal file
View File

@@ -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);
}

45
PPh A1/ppha1-status.bru Normal file
View File

@@ -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);
}

292
agents.md Normal file
View File

@@ -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

12
bruno.json Normal file
View File

@@ -0,0 +1,12 @@
{
"version": "1",
"name": "solutax",
"type": "collection",
"ignore": [
"node_modules",
".git",
"QWEN.md",
"spesifikasi.md",
"sample result"
]
}

View File

@@ -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"
}
}

4
environments/solutax.bru Normal file
View File

@@ -0,0 +1,4 @@
vars {
accessToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUb2tlbi5Gb3IuVGhlLlNvbHVUYXguQXBpLldpdGhBdXRoIiwianRpIjoiNTQ5ODhmNjktMjA4Mi00MTQ4LThkYWMtNDZjNmMwZmU2MGFkIiwiaWF0IjoiMTc3MTU0NzE3NyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiOTk5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InVzZXJhbmRhbCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6InVzM3JBbmQ0bCIsImV4cCI6MTc3MTYzMzU3NywiaXNzIjoic29sdXRheC5hcGkiLCJhdWQiOiJzb2x1dGF4LmFwaS5jbGllbnQifQ.iLs7f2eJTA8PwNGnq1Y8t2p7E_ShwLQGNjLNRNSKbWM
requestID: b6ee24b6-18ac-46e7-abd7-b97c6b6f9921
}

31
environments/solutax.json Normal file
View File

@@ -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"
}
}

6
package-lock.json generated Normal file
View File

@@ -0,0 +1,6 @@
{
"name": "solutax",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}

2200
spesifikasi.md Normal file
View File

@@ -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*

30
token.bru Normal file
View File

@@ -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");
}
}