Pefindo Biro Kredit/ Eagle API-2/ TMB Staging/ Rev. 2 — 18 Aug 2026
A field-level reference for the credit report Pefindo serves to member MILIKIRUMAH, measured across 17 live subjects and 4,162 facilities — from single-facility thin files to a 705-facility portfolio. It documents what arrives, what never does, and the four places the payload will mislead you if you read it literally.
Product 132 is a substantially reduced tier against the P1 structure spec. The spec describes ~170 debtor fields and ~90 per facility. What arrives is exactly 40 and exactly 13 — identical on every one of the 17 subjects tested, whether they had one facility or 705.
Evidence base
Every claim here is measured, not inferred from the spec. 17 subjects drawn from
Pefindo's own staging test lists — including a list explicitly titled
"Debitur dengan agunan personal" (debtors with personal collateral) and one
titled "fasilitas banyak" (many facilities). Counts in the
n / 17 column say how many subjects support each finding.
GET /api/v1/getToken
data.token, valid 3600 s.POST /api/v1/product/search
inquiry_id plus candidates carrying id_pefindo.POST /api/v1/product/generateReport
event_id UUID. Reuse is rejected with code 35.GET /api/v1/product/getReport/eventId/{uuid}
One poll cycle was enough for all 17 subjects, including the 705-facility one — report build time does not scale visibly with portfolio size.
POST /api/v1/product/search { "type": "PERSONAL", "product_id": 132, "inquiry_reason": 15, "reference_code": "your-correlation-id", "params": [ { "id_type": "KTP", "id_no": "3529116903740002", "name": "TRI MURYATUN", "date_of_birth": "1982-12-17" } ] }
Entitlement
Product 132 with reason 15 is what MILIKIRUMAH is provisioned
for. Documented products 123 and 148 return
"Akses tidak diberikan"; reasons 12/13/14
from appendix 3.4.3 return "Inquiry Reason Tidak Valid" — Eagle does not
recognise them at all.
The important column is n / 17. Several sections are not simply
"present" or "absent" — they appear for some subjects and not others, with no
relationship to portfolio size.
| Section | Type | n / 17 | Row counts seen | Verdict |
|---|---|---|---|---|
| report.header | object | 17 | 3 fields | Always |
| report.debitur | object | 17 | 40 fields | Always |
| report.fasilitas | array | 17 | 1 – 705 | Always |
| scoring (top level) | array | 17 | 13 | Always |
| report.riwayat_identitas_debitur | array | 14 | 5, 9, 10, 23 | Usually |
| report.summary_riwayat_debitur | array | 6 | 13, 24 | Sometimes |
| report.permintaan_data | array | 0 | — | Never |
| report.summary_permintaan_data | array | 0 | — | Never |
| report.pengurus | array | 0 | — | Never |
| report.other_data | array | 0 | — | Never |
| fasilitas[].riwayat_fasilitas | array | 0 | 0 / 4,162 fac. | Never |
| fasilitas[].agunan | array | 0 | 0 / 4,162 fac. | Never |
| fasilitas[].penjamin | array | 0 | 0 / 4,162 fac. | Never |
| CurrentContract · otherDataSource | null | 0 | null | Null |
| InquiriesAnalysis · PastDueInformation | null | 0 | null | Null |
| RepaymentInformation | null | 0 | null | Null |
Revised in this edition
An earlier draft, based on two subjects, recorded
summary_riwayat_debitur as reliably present. It is not — it appears for
6 of 17 subjects. Critically, absence does not track portfolio size:
subjects with 705, 677 and 524 facilities returned zero months of history,
while others with comparable portfolios returned 24. Nothing in the payload predicts
which you will get.
Trap 1 — scoring is not inside report
scoring[] is a sibling of report, not a
child of it, though the API doc's worked example nests it. Reading
report.scoring returned an empty result on all 17 subjects — no error,
no empty array, just a missing key. Read payload.scoring.
Six of the 17 subjects came from a Pefindo staging list titled
"Debitur dengan agunan personal" — debtors with personal collateral.
All six returned agunan absent on every facility. Across all 17 subjects
and all 4,162 facilities, the count of facilities carrying agunan,
riwayat_fasilitas, or penjamin is zero.
These blocks are withheld at this tier, not merely sparse.
The same 40 keys on all 17 subjects. Every id_* field is a code requiring
a lookup table. Note the absence of the sector-prefixed aggregates
(bank_*, mf_*, p2p_*…) the spec describes —
no sector breakdown exists at this tier.
| Field | Type | Meaning | Example |
|---|---|---|---|
| nama_lengkap_debitur | string | Full name | TRI MURYATUN |
| nama_sesuai_identitas | string | Name as on ID document | TRI MURYATUN |
| nomor_identitas | string | KTP number | 3529116903740002 |
| npwp | string | Tax number | 3529116903740002 |
| id_debitur_golden_record | int | Pefindo ID — the stable subject key | 102171282000021 |
| tanggal_lahir | string | Date of birth | 1982-12-17 |
| tempat_lahir | string | Place of birth | SUMENEP |
| nama_gadis_ibu_kandung | string | Mother's maiden name | HJ ARIFAH |
| id_jenis_kelamin | string | Gender · L / P | P |
| id_status_perkawinan | string | Marital status | 1 |
| id_status_gelar | string | Education level | 00 |
| id_pekerjaan | string | Occupation code | 099 |
| tempat_bekerja | string | Employer | SUMENEP |
| alamat_tempat_bekerja | string | Employer address | SUMENEP |
| alamat_debitur | string | Address | DUSUN KACANGAN… |
| kecamatan | string | District | PAKAMBAN LAOK |
| kelurahan | string | Sub-district | PAKAMBAN LAOK |
| id_lokasi | string | Location code — use instead of city | 69465 |
| id_kabupaten_kota | string | City — "0000" on every subject tested | 0000 |
| id_negara | string | Country | ID |
| string | TRIMURYATUN@… | ||
| telepon | string | Phone | 081999026024 |
| telepon_seluler | string | Mobile — trailing spaces | "081999026024 " |
| id_tipe_debitur | int | Debtor type · 1 = individual | 1 |
| id_golongan_debitur | string | Debtor group | S14 |
| id_sektor_ekonomi | string | Economic sector | X-013000 |
| jml_aktif_fasilitas | int | Open facilities | 8 |
| jml_tutup_fasilitas | int | Closed facilities | 137 |
| jml_fasilitas_tertunggak | int | Delinquent facilities | 0 |
| jml_fasilitas_surat_berharga | int | Securities facilities | 0 |
| jml_plafon | int | Total credit limit — opaque, Trap 3 | 156,893,774 |
| jml_saldo_terutang | float | Total outstanding — opaque, Trap 3 | 361,778,471 |
| jml_tunggakan | float | Total overdue | 20,000.0 |
| tunggakan_terburuk | float | Worst overdue amount | 20,000.0 |
| jml_hari_tunggakan | int | Total days past due | 180 |
| jml_hari_tunggakan_terburuk | int | Worst DPD — unreliable, Trap 2 | 0 |
| kolektabilitas_terburuk | int | Worst collectibility — unreliable, Trap 2 | 2 |
| tgl_buka_fasilitas_terakhir | string | Last facility opened | 2023-11-30 |
| tgl_tutup_fasilitas_terakhir | string | Last facility closed | 2024-04-05 |
| tgl_tunggakan_terakhir | null | Last overdue date — null on every subject | null |
Identical field set on all 4,162 facilities observed. No nama_ljk — the
lender resolves from id_pelapor. No id_kolektabilitas — there
is no per-facility collectibility at this tier.
| Field | Type | Meaning | Observed range |
|---|---|---|---|
| id_pelapor | int | Lender id — signed 32-bit, often negative | 253 distinct values |
| id_jenis_kredit | string | Credit type | 10 distinct codes |
| id_kondisi | int | Facility condition | 1,3,4,5,6,8,9,10,13 |
| fase_fasilitas | int | 1 = open, 2 = closed | 1 · 2 |
| plafon | float/int | Credit limit | 0 – 170,000,000 |
| baki_debet | float/int | Principal outstanding | 0 – … |
| nominal_tunggakan | float | Overdue amount | 0 – … |
| tunggakan_terburuk | float/int | Worst overdue amount | 0 – … |
| jumlah_hari_tunggakan | int | Current days past due | mostly 0 |
| jml_hari_tunggakan_terburuk | int | Worst days past due | 0 – 23 |
| tanggal_awal_kredit_atau_pembiayaan | string | Start date | 2011 – 2024 |
| tanggal_akhir | string | End date | 2011 – 2024 |
| tahun_bulan_data | string | Reporting period of this row | 2017-03 – 2024-05 |
| id_kondisi | Meaning | Count | Signal |
|---|---|---|---|
| 3 | Lunas — settled | 3,822 | Good |
| 1 | Fasilitas Aktif — active | 152 | Neutral |
| 4 | Dihapusbukukan — written off | 44 | Adverse |
| 13 | Lunas dengan diskon — settled at a discount | 40 | Adverse |
| 9 | Dialihkan ke fasilitas lain | 36 | Watch |
| 8 | Dialihkan atau dijual ke pelapor lain | 35 | Watch |
| 10 | Dialihkan ke pihak lain non-pelapor | 25 | Watch |
| 6 | Lunas karena pengambilalihan agunan — collateral seized | 8 | Adverse |
| 5 | Hapus tagih — debt forgiven | 1 | Adverse |
Use condition, not DPD, as the adverse signal
Facility-level jumlah_hari_tunggakan was 0 on almost every
facility tested, and jml_hari_tunggakan_terburuk never exceeded
23 days. Yet one 705-facility subject carries 14 written-off facilities.
Delinquency is simply not expressed through the DPD fields at this tier —
id_kondisi is where it shows up. Build adverse rules on condition codes.
All 253 distinct id_pelapor values resolved against the
reporter registry extracted from Pefindo's structure workbook — a 100% hit rate across
4,162 facilities. Sector must then be inferred from the lender's name: that yields
bank 60.4%, multifinance 17.6%, and 22.0% unclassified, since names
like "PT Woka Internasional" carry no sector marker.
Three fields per month at portfolio level: no amounts, no per-lender attribution. Present for only 6 of 17 subjects, at either 13 or 24 rows.
| Field | Type | Meaning |
|---|---|---|
| tahun_bulan_data | string | Month-end period, newest first |
| kolektabilitas_terburuk | string | Worst collectibility that month · 1 Lancar → 5 Macet |
| jml_hari_tunggakan_terburuk | int | Worst days past due that month · seen up to 2,653 |
Trap 2 — the debtor aggregates understate the history
debitur.kolektabilitas_terburuk was null on 6 of 17
subjects, and on 4 of the 6 subjects that had history it reported a
better grade than the history contains. One subject reads 2
(Dalam Perhatian Khusus) against a history holding ten months at 5
(Macet) and 266 days past due; another reads null against a history
reaching Macet.
Taken together the field is unusable on 10 of 17 subjects. Always
compute worst-case across summary_riwayat_debitur where it exists, and
fall back to id_kondisi write-off flags where it does not.
| Period | Collectibility | DPD | Status |
|---|---|---|---|
| 2024-05 → 2023-05 | 1 · Lancar | 0 | 13 months clean |
| 2023-04 | 2 · Dalam Perhatian Khusus | 20 | Watch |
| 2023-03 → 2022-12 | 5 · Macet | 180 | Default |
| 2022-11 → 2022-10 | 5 · Macet | 266 | Default |
| 2022-09 → 2022-06 | 5 · Macet | 264 | Default |
Exactly 13 entries on every subject, oldest first, ending with a score dated the day of the request. Present universally — but calculable on only 10 of 17.
| Field | Type | Meaning | Example |
|---|---|---|---|
| period | string | Scoring period | 2026-08-18 |
| score | int | Score — 9999 is a sentinel | 624 |
| pod | float/int | Probability of default, % | 10.23 |
| risk_grade | string | Grade code | RRD1 |
| risk_grade_desc | string | Grade description | Risiko Tinggi |
| risk_desc | string | Risk description | Risiko Tinggi |
| reason_code | array | Up to 5 reason codes | ["NSS1","MSD6"] |
| reason_desc | array | Matching descriptions | … |
| id_pefindo | string | Subject key | 102171282000021 |
Grades observed across all series, best to worst:
RRC1, RRC2, RRC3, RRD1,
RRD2, RRD3, RRE1, RRE3, plus
XX for unscorable. Response language follows the language
parameter on generateReport: 01 Bahasa, 02 English.
Trap 3 — 9999 is not a score
Seven of 17 subjects returned score: 9999, risk_grade: "XX",
pod: 100, reason ND01 — "score cannot be calculated, at
least 2 months of payment information required in the last 24 months". That is a
sentinel meaning unscorable, not a score of 9999 or a 100% default
probability. At 41% of subjects this is a common path, not an edge
case. Gate on score == 9999 || risk_grade == "XX".
Scorability does not follow portfolio size: one single-facility subject scored 582, another single-facility subject was unscorable.
Trap 4 — the money aggregates do not reconcile
An earlier draft reported that jml_saldo_terutang ties exactly to
sum(baki_debet) + sum(nominal_tunggakan). Across 15 subjects it ties on
only 5; on the rest it is understated by 5–20%.
jml_plafon is worse: it matches the sum of all facility limits on 3
subjects, matches the open-facility sum on 5, and matches neither on 7 —
one subject reports 746 M against a facility total of 8.18 bn.
Treat both as opaque bureau-computed figures. Do not derive them, do not validate against them, and do not compute utilisation from their ratio.
tgl_permintaan is a Java ZonedDateTime:
2026-08-18T11:06:47.187796165+07:00[Asia/Jakarta]. Strip the bracketed
zone id before parsing.telepon_seluler carries trailing spaces. Trim all strings.id_pelapor values are signed 32-bit and frequently negative
(−2079932240). Do not assume unsigned.float or int inconsistently for the
same field across records. Coerce.id_kabupaten_kota was "0000" on every subject tested —
city is effectively unavailable; use id_lokasi.tgl_tunggakan_terakhir was null on every subject tested.31 not found,
32 still processing), while others arrive as HTTP 400 or 500 with
code: 99. Always read code; HTTP status alone is not a
success signal.data.token. Pefindo's own Postman script reads
data.access_token. Accept either.event_id must be unique per request and is the only handle for
re-fetching a report or its PDF. Persist it with the application record.As a fallback bureau source, product 132 answers portfolio-level questions and facility-level ones not at all. Two of its most useful signals are also conditional on data that arrives only sometimes.
| Underwriting question | Supported | Source · coverage |
|---|---|---|
| Does this person have credit history? | Yes | fasilitas[] · 17/17 |
| What is their credit score and PD? | Often | scoring[] · 10/17 calculable |
| How much do they owe in total? | Approx | aggregates · do not reconcile |
| How many lenders, and who? | Yes | id_pelapor · 253/253 resolved |
| Has anything been written off? | Yes | id_kondisi 4/5/6/13 |
| Have they defaulted in 24 months, how badly? | Sometimes | summary_riwayat_debitur · 6/17 |
| Current delinquency and days past due? | No | DPD fields ~always 0 |
| Which facility went bad, and with whom? | No | needs riwayat_fasilitas |
| Per-facility collectibility? | No | no id_kolektabilitas |
| Month-by-month balance and arrears trend? | No | needs riwayat_fasilitas |
| Credit-hungry — recent inquiry velocity? | No | permintaan_data · 0/17 |
| What collateral secures the exposure? | No | agunan · 0/4,162 facilities |
| Exposure split by lender sector? | Partial | inferred · 22% unclassified |
riwayat_fasilitas, agunan and permintaan_data
available on a higher tier, or withheld from all API products? The
"debitur dengan agunan personal" subjects returned no collateral at all.summary_riwayat_debitur arrive for some subjects and not
others, with no relation to portfolio size?debitur.kolektabilitas_terburuk and
jml_hari_tunggakan_terburuk disagree with the history they summarise,
and why is the former frequently null?jml_plafon and jml_saldo_terutang computed, given
they match neither the full nor the open facility totals?123 (IdScore+) be enabled for comparison?Rev. 2 · compiled from 17 live captures against tmb-eagle-api.idscoresystem.id, 18 Aug 2026 · member MILIKIRUMAH · product 132 · inquiry reason 15 · 4,162 facilities · 253 distinct lenders · staging test data