CIC API Mapping — Enquiry Alerts

How the CBS asks each bureau for enquiry alerts, and how the bureau's answer is read into our alerts (customer, loan type, amount, enquiry date …) — no code change needed.

← Dashboard CIC Configuration
@if (bureau) { {{ bureau.environment }} {{ bureau.whitelisted ? 'Whitelisted' : 'Not whitelisted' }} @if (endpoint && !endpoint.exists) { Not configured yet } @if (dirty) { Unsaved changes } }
@if (error) {
{{ error }}
} @if (info) {
{{ info }}
} @if (bureau?.environment === 'SIMULATOR') {
In SIMULATOR mode the built-in test bureau answers in the shape of the seeded generic mapping. When moving to the bureau's UAT / PRODUCTION, change the paths below to the bureau's own API specification and check them with Test Response.
} @if (loading) {
Loading…
} @if (endpoint && !loading) {
@if (tab === 'response') {

Bureau response → CBS alert "alerts", "errorCode" and "errorMessage" are read from the whole response; every other field from each alert

@for (r of responseRows; track $index; let i = $index) { }
# Bureau response JSON path CBS alert field Transform Default
{{ i + 1 }}
{{ isRoot(r.targetField) ? 'whole response' : 'each alert' }}
@for (f of resultFieldList; track f.key) { }
For dates the transform names the format the bureau sends (e.g. Date ddMMyyyy). The customer is matched by PAN, then Aadhaar (with date of birth or name), then our customer reference.
@for (f of resultFieldList; track f.key) {
{{ f.key }} — {{ f.label }}
}
} @if (tab === 'request') {

CBS value → bureau request Paths like criteria.fromDate build nested JSON; [0] builds arrays

@for (r of requestRows; track $index; let i = $index) { }
# CBS value Bureau JSON path Transform Fixed / default value Mandatory
{{ i + 1 }}
A mandatory value that is empty stops the fetch before the bureau is called.
} @if (tab === 'endpoint') {

Endpoint

Placeholders like {{ '{{' }}bureau.memberCode{{ '}}' }} or {{ '{{' }}fetch.reference{{ '}}' }} are filled in. Authentication headers are added automatically. @if (jsonErrors.headers) { {{ jsonErrors.headers }} }
Constant parts of the request; request mappings are written into it. @if (jsonErrors.body) { {{ jsonErrors.body }} }
} @if (tab === 'test') {

Test response reads a bureau answer through the saved response mapping and matches customers — nothing is saved

@if (testResult) { @if (testResult.errorCode) {
Bureau error {{ testResult.errorCode }}: {{ testResult.errorMessage }}
} @if (!testResult.alertListFound) {
No alert list was found at the path mapped to "alerts". Check that row of the response mapping.
}

{{ testResult.count }} alert(s) read

@if (testResult.items?.length) {
@for (it of testResult.items; track $index) { }
Alert id Customer (bureau) PAN Date Loan type Amount Match
{{ it.alertRef }} {{ it.customerName }} {{ it.pan || it.aadhaar || it.customerRef }} {{ it.enquiryDate }} {{ it.loanType }} {{ it.amount | number: '1.0-0' }} @if (it.ownBank) { Own bank — skipped } @else if (it.clientId) { {{ matchLabels[it.matchType] }} {{ it.clientName }} } @else { Not matched }
}
} } @if (tab === 'preview') {

Preview builds the request from the saved mapping — nothing is sent

Empty = the bureau's look-back window up to today.
@if (previewResult) { @if (previewResult.missingMandatory?.length) {
The fetch would be refused — mandatory values are empty:
}

Request body

{{ prettyJson(previewResult.body) }}

Call

Method
{{ previewResult.method }}
URL
{{ previewResult.url }}
Window
{{ previewResult.fromDate }} → {{ previewResult.toDate }}
Auth
{{ previewResult.authentication }}
@for (h of headerEntries(previewResult.headers); track h.k) {
{{ h.k }}
{{ h.v }}
}
} } }