API reference

Fraud Reporting

POST/v1/fraud/reports

Report fraud cases involving Congolese identities — identity usurpation, forged documents, SIM swaps, account takeovers, money laundering and more — into RDCPASS’s national fraud case queue, one at a time or in bulk.

Create
POST /v1/fraud/reports
Batch
POST /v1/fraud/reports/batches
Retrieve
GET /v1/fraud/reports/{id}
Webhooks
fraud_report.created · fraud_report.status_changed

Overview

When your teams detect fraud involving a person who holds — or claims to hold — a Congolese identity, file it with RDCPASS. Each report opens a case with its own case_number, is reviewed by RDCPASS’s fraud investigation unit, and is correlated with reports from every other bank, operator and platform connected to the network. A SIM swap reported by a telecom operator in Lubumbashi can therefore protect the same citizen’s bank account in Kinshasa the same afternoon.

Confirmed cases feed the fraud signals returned by other RDCPASS services and, where the facts call for it, are escalated to the competent authorities. You follow each case through its lifecycle with webhooks or by retrieving it.

Like every RDCPASS endpoint, this call requires the full authentication stack described in Authentication and supports the common Idempotency-Key and Prefer: respond-async headers.

Replaces Usurpation Reporting

Usurpation Reporting is now the identity_usurpation type of Fraud Reporting. The legacy path /v1/fraud/usurpation-reports remains an alias: requests sent to it create identity_usurpation reports, and those cases continue to emit the legacy usurpation_report.status_changed webhook alongside fraud_report.status_changed. New integrations should call /v1/fraud/reports.

Request modes

Fraud Reporting supports all four request modes. Use batch mode to import your historical case files in one pass. See Single, batch & async for the full model.

ModeEndpointReturns
Single · synchronousPOST /v1/fraud/reports200 with the fraud_report
Single · asynchronousPOST /v1/fraud/reports + Prefer: respond-async202 with a job
Batch · synchronousPOST /v1/fraud/reports/batches200 with every result — up to 50 items
Batch · asynchronousPOST /v1/fraud/reports/batches + Prefer: respond-async202 with a batch — up to 10,000 items

Fraud types

Every report carries exactly one type. Choose the most specific type that describes the facts; use other only when none applies.

typeDescription
identity_usurpationSomeone used a citizen’s identity — their RDCPASS ID, documents or personal data — to pass as them: opening an account, taking out credit, registering a SIM card.
document_forgeryA falsified, altered or counterfeit identity document was presented: passport, voter card, driving licence, national ID or a supporting document.
account_takeoverAn existing customer account was taken over by a third party, for example after credential theft or a device compromise.
sim_swapA SIM card was replaced or ported without the subscriber’s consent, typically to intercept one-time codes and mobile money.
money_launderingFunds were placed, layered or integrated to disguise their illicit origin (anti-money laundering).
terrorist_financingFunds were collected or moved to support terrorism or a terrorist organisation, whatever their origin.
robberyTheft with violence or threat — for example a cash-in-transit or agent robbery — where the identity of a perpetrator or victim is known.
payment_fraudUnauthorised card, mobile money or bank transfer payments, including card-not-present and merchant fraud.
phishingCredentials or codes were obtained through deceptive messages, calls or websites impersonating a trusted organisation.
social_engineeringThe victim was manipulated into performing the transaction themselves — fake relatives, fake agents, investment or romance scams.
insider_fraudAn employee, agent or contractor abused their authorised access to commit or facilitate fraud.
otherAny fraud that none of the types above describes. Explain the facts in description.

Request body

Send the following fields as JSON. As with every RDCPASS request, this is the plaintext shape before AES-256-GCM encryption — see Authentication.

FieldTypeRequiredDescription
typestring enumYesThe fraud category. One of the values in Fraud types above.
subjectobjectYesThe person the report is about. Provide identifier when you know it; otherwise any combination of full_name, date_of_birth and phone_number. At least one of these must be present.
subject.identifierobjectNoAn identity reference: { "type": "rdcpass_id" | "passport" | "ceni" | "driving_licence" | "national_id", "value": "…" }. rdcpass_id (e.g. COD-2103-0214-4937) gives the fastest correlation.
subject.full_namestringNoThe name as known to you, e.g. "Kabeya Mwamba Tshisekedi".
subject.date_of_birthstringNoYYYY-MM-DD.
subject.phone_numberstringNoE.164 format, e.g. "+243812345678". Strongly recommended for sim_swap, phishing and social_engineering.
descriptionstringYesA factual account of what happened, how it was detected and what action you have already taken. Written for an investigator — no free-form opinions about the subject.
occurred_atstringNoWhen the fraud took place, RFC 3339 timestamp (e.g. "2026-09-24T09:12:00Z").
locationobjectNoWhere it took place: { "province": "Haut-Katanga", "city": "Lubumbashi" }.
amountobjectNoThe financial impact: { "value": 250000, "currency": "CDF" }. value is in the currency’s major unit; currency is CDF or USD.
channelstring enumNoWhere the fraud happened. See Channels below.
evidenceobject[]NoSupporting material. Each item describes one file.
evidence[].typestring enumPer itemimage, document, transaction_log or audio.
evidence[].fileobjectPer itemThe file itself: { "data": "<base64>" } inline, or { "url": "https://…" } that RDCPASS fetches once when the report is created.
evidence[].descriptionstringPer itemWhat the file shows, e.g. "CCTV still from the Gombe branch, 18 June 2025".
reporter_referencestringNoYour own case or ticket number. Echoed back on the report and in every webhook for it.

Channels

channelDescription
branchAt a physical branch, agency or point of sale.
onlineOn a website or web application.
mobile_appIn a mobile application.
ussdOver a USSD session, including mobile money menus.
call_centerBy telephone, through a call centre or customer service line.
otherAny other channel — describe it in description.

Evidence files accompany the case for its whole lifetime and are only accessible to RDCPASS investigators. Accepted formats are JPEG, PNG and PDF for image and document, CSV and PDF for transaction_log, and MP3 or WAV for audio. A signed URL you provide must stay valid for at least 15 minutes after the call.

Example request

A telecom operator reports a SIM swap followed by unauthorised mobile money transfers:

Request body (plaintext, before encryption)
{
  "type": "sim_swap",
  "subject": {
    "identifier": {
      "type": "rdcpass_id",
      "value": "COD-2103-0214-4937"
    },
    "full_name": "Kabeya Mwamba Tshisekedi",
    "phone_number": "+243812345678"
  },
  "description": "SIM card replaced at an unauthorised agent in Lubumbashi, followed within 40 minutes by three mobile money transfers the customer did not initiate.",
  "occurred_at": "2026-09-24T09:12:00Z",
  "location": {
    "province": "Haut-Katanga",
    "city": "Lubumbashi"
  },
  "amount": {
    "value": 2450000,
    "currency": "CDF"
  },
  "channel": "ussd",
  "evidence": [
    {
      "type": "transaction_log",
      "file": {
        "url": "https://files.example-bank.cd/cases/88213/transfers.csv"
      },
      "description": "Wallet transaction export for 24 September 2026"
    }
  ],
  "reporter_reference": "INC-2026-88213"
}

The same call as a full request in your language. Header values are illustrative placeholders — see Authentication to compute them.

report-fraud.sh
# Body shown in plaintext — encrypt it per /docs/authentication before sending.
curl https://api.rdcpass.cd/v1/fraud/reports \
  -X POST \
  -H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
  -H "X-RDCPASS-Timestamp: 1790418900" \
  -H "X-RDCPASS-Nonce: 3c7e1a9d-2b4f-4d6a-8e15-9f0b7c2d4a61" \
  -H "X-RDCPASS-IV: q2Vh8Zk1pX0rT7mB" \
  -H "X-RDCPASS-Signature: b61d4e...9a07" \
  -H "Idempotency-Key: 5f0c2a8e-7d41-4b39-a6e2-1c9d8b3f7a50" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "sim_swap",
    "subject": {
      "identifier": {
        "type": "rdcpass_id",
        "value": "COD-2103-0214-4937"
      },
      "full_name": "Kabeya Mwamba Tshisekedi",
      "phone_number": "+243812345678"
    },
    "description": "SIM card replaced at an unauthorised agent in Lubumbashi, followed within 40 minutes by three mobile money transfers the customer did not initiate.",
    "occurred_at": "2026-09-24T09:12:00Z",
    "location": {
      "province": "Haut-Katanga",
      "city": "Lubumbashi"
    },
    "amount": {
      "value": 2450000,
      "currency": "CDF"
    },
    "channel": "ussd",
    "evidence": [
      {
        "type": "transaction_log",
        "file": {
          "url": "https://files.example-bank.cd/cases/88213/transfers.csv"
        },
        "description": "Wallet transaction export for 24 September 2026"
      }
    ],
    "reporter_reference": "INC-2026-88213"
  }'
200 OK
{
  "id": "frd_5c8e1a7d42",
  "object": "fraud_report",
  "livemode": true,
  "case_number": "RDC-FRD-2026-004812",
  "status": "received",
  "type": "sim_swap",
  "reporter_reference": "INC-2026-88213",
  "created_at": "2026-09-26T10:15:02Z"
}

Response

A successful synchronous call returns 200 OK with the new fraud_report.

FieldTypeDescription
idstringUnique identifier of the report, prefixed frd_.
objectstringAlways "fraud_report".
livemodebooleantrue in production, false in sandbox.
case_numberstringHuman-readable case number, e.g. RDC-FRD-2026-004812. Quote it in any correspondence with RDCPASS or the authorities.
statusstring enumCurrent lifecycle status. Always "received" at creation. See Case lifecycle.
typestring enumThe fraud type you submitted.
reporter_referencestring | nullYour reporter_reference, or null.
created_atstringWhen the case was opened (RFC 3339).

Case lifecycle

Every case moves from received to under_review, then to one of three terminal statuses. Each change emits fraud_report.status_changed.

statusMeaning
receivedThe report is accepted and queued. Nothing has been assessed yet.
under_reviewAn RDCPASS investigator is assessing the report and correlating it with other cases and signals.
confirmedThe fraud is established. The subject’s identity is flagged across RDCPASS services where appropriate.
dismissedThe report was not substantiated or was a duplicate. No further action.
escalated_to_authoritiesThe case was referred to the competent judicial, police or financial intelligence authorities. You may be contacted for further information.

Retrieve a report

Fetch the current state of a case at any time with GET /v1/fraud/reports/{id}:

curl https://api.rdcpass.cd/v1/fraud/reports/frd_5c8e1a7d42 \
  -H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
  -H "X-RDCPASS-Timestamp: 1790418900" \
  -H "X-RDCPASS-Nonce: 3c7e1a9d-2b4f-4d6a-8e15-9f0b7c2d4a61" \
  -H "X-RDCPASS-Signature: b61d4e...9a07"
200 OK
{
  "id": "frd_5c8e1a7d42",
  "object": "fraud_report",
  "livemode": true,
  "case_number": "RDC-FRD-2026-004812",
  "status": "under_review",
  "type": "sim_swap",
  "reporter_reference": "INC-2026-88213",
  "created_at": "2026-09-26T10:15:02Z"
}

Webhooks

Two events cover the life of a case. Both use the standard envelope and signature described in webhooks.

EventSent when
fraud_report.createdA case is opened — including every case created from a batch or an async job.
fraud_report.status_changedA case changes status. data.previous_attributes.status holds the prior value.
usurpation_report.status_changedLegacy event, still delivered for cases created through /v1/fraud/usurpation-reports.
fraud_report.created
{
  "id": "evt_2d6f8a1c3e",
  "object": "event",
  "type": "fraud_report.created",
  "livemode": true,
  "created_at": "2026-09-26T10:15:02Z",
  "data": {
    "object": {
      "id": "frd_5c8e1a7d42",
      "object": "fraud_report",
      "case_number": "RDC-FRD-2026-004812",
      "status": "received",
      "type": "sim_swap",
      "reporter_reference": "INC-2026-88213"
    }
  }
}
fraud_report.status_changed
{
  "id": "evt_8b3e0f7a91",
  "object": "event",
  "type": "fraud_report.status_changed",
  "livemode": true,
  "created_at": "2026-09-29T14:32:00Z",
  "data": {
    "object": {
      "id": "frd_5c8e1a7d42",
      "object": "fraud_report",
      "case_number": "RDC-FRD-2026-004812",
      "type": "sim_swap",
      "status": "confirmed",
      "reporter_reference": "INC-2026-88213"
    },
    "previous_attributes": { "status": "under_review" }
  }
}

Batch: bulk historical case import

When you connect to RDCPASS, import the fraud cases you have already investigated so they strengthen the network from day one. Send up to 10,000 cases per asynchronous batch; each item takes the same fields as a single report, plus a required reference of your own that is echoed back in the results.

# Historical case import — body shown in plaintext; encrypt it per /docs/authentication
curl https://api.rdcpass.cd/v1/fraud/reports/batches \
  -X POST \
  -H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
  -H "X-RDCPASS-Timestamp: 1790418900" \
  -H "X-RDCPASS-Nonce: 3c7e1a9d-2b4f-4d6a-8e15-9f0b7c2d4a61" \
  -H "X-RDCPASS-IV: q2Vh8Zk1pX0rT7mB" \
  -H "X-RDCPASS-Signature: b61d4e...9a07" \
  -H "Idempotency-Key: 5f0c2a8e-7d41-4b39-a6e2-1c9d8b3f7a50" \
  -H "Prefer: respond-async" \
  -H "Content-Type: application/json" \
  -d @historical-cases.json
historical-cases.json
{
  "items": [
    {
      "reference": "case-2025-00114",
      "type": "document_forgery",
      "subject": { "full_name": "Mbuyi Ilunga Nsimba", "date_of_birth": "1991-11-03" },
      "description": "Forged voter card presented to open a savings account at the Gombe branch.",
      "occurred_at": "2025-06-18T11:40:00Z",
      "location": { "province": "Kinshasa", "city": "Kinshasa" },
      "channel": "branch"
    },
    {
      "reference": "case-2025-00167",
      "type": "payment_fraud",
      "subject": { "identifier": { "type": "rdcpass_id", "value": "COD-1907-5521-0386" } },
      "description": "Card-not-present purchases disputed by the cardholder after a phishing SMS.",
      "occurred_at": "2025-08-02T19:05:00Z",
      "location": { "province": "Nord-Kivu", "city": "Goma" },
      "amount": { "value": 1480, "currency": "USD" },
      "channel": "online"
    }
  ]
}
202 Accepted
{
  "id": "bat_7c2e91f04a",
  "object": "batch",
  "service": "fraud_reporting",
  "status": "pending",
  "total_items": 3840,
  "processed_items": 0,
  "succeeded_items": 0,
  "failed_items": 0,
  "created_at": "2026-09-26T10:15:00Z",
  "completed_at": null,
  "results_url": "/v1/batches/bat_7c2e91f04a/results"
}

When the batch finishes you receive batch.completed (or batch.completed_with_errors). Page through the per-item results with GET /v1/batches/{batch_id}/results:

GET /v1/batches/bat_7c2e91f04a/results
{
  "object": "list",
  "data": [
    {
      "reference": "case-2025-00114",
      "status": "succeeded",
      "result": {
        "id": "frd_91a3e0c5b7",
        "object": "fraud_report",
        "livemode": true,
        "case_number": "RDC-FRD-2026-004813",
        "status": "received",
        "type": "document_forgery",
        "reporter_reference": null,
        "created_at": "2026-09-26T10:16:41Z"
      }
    },
    {
      "reference": "case-2025-00167",
      "status": "failed",
      "error": {
        "code": "invalid_identifier",
        "message": "identifier.value is not a valid rdcpass_id."
      }
    }
  ],
  "next_cursor": "cur_b3f10a92"
}

Batches of 50 items or fewer can be sent without Prefer: respond-async; the call then returns 200 OK with every result. Larger synchronous batches are rejected with 413 batch_too_large.

Asynchronous single report

Reports with large evidence files are best created asynchronously. Add Prefer: respond-async; RDCPASS returns 202 Accepted with a job immediately.

curl https://api.rdcpass.cd/v1/fraud/reports \
  -X POST \
  -H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
  -H "X-RDCPASS-Timestamp: 1790418900" \
  -H "X-RDCPASS-Nonce: 3c7e1a9d-2b4f-4d6a-8e15-9f0b7c2d4a61" \
  -H "X-RDCPASS-IV: q2Vh8Zk1pX0rT7mB" \
  -H "X-RDCPASS-Signature: b61d4e...9a07" \
  -H "Idempotency-Key: 5f0c2a8e-7d41-4b39-a6e2-1c9d8b3f7a50" \
  -H "Prefer: respond-async" \
  -H "Content-Type: application/json" \
  -d @report.json
202 Accepted
{
  "id": "job_4b1d9e7a2c",
  "object": "job",
  "service": "fraud_reporting",
  "status": "pending",
  "created_at": "2026-09-26T10:15:00Z",
  "result_url": "/v1/jobs/job_4b1d9e7a2c"
}

When the job completes you receive job.completed with the fraud_report in data.result, followed by fraud_report.created. You can also poll GET /v1/jobs/{job_id}.

A money-laundering report does not replace your own legal reporting

Filing a money_laundering or terrorist_financing report with RDCPASS shares the case with the national identity network. It does not discharge any suspicious transaction reporting obligation your institution has towards CENAREF under the DRC’s AML/CTF framework — file that report through your usual channel as well, and never inform the subject that a report has been made. To screen customers before the fact, use AML & CTF Screening.

Report facts, not suspicions about a person’s character

A report names a real person and can restrict their access to services while it is reviewed. Every report is attributed to your application, audited, and reviewed as part of your production due diligence. Knowingly false or abusive reports are grounds for suspending production access.

Errors

Errors specific to this service, in the standard error format. See Errors for the full list.

HTTPcodeDescription
400invalid_identifiersubject.identifier.value is not valid for its type.
400unsupported_identifier_typesubject.identifier.type is not one of the supported identifier types.
403service_not_enabledFraud Reporting is not enabled on this application.
403production_access_requiredThe call used production keys before the application’s production access was approved.
404job_not_foundThe job id passed to GET /v1/jobs/{job_id} does not exist.
404batch_not_foundThe batch id does not exist or belongs to another application.
413batch_too_largeA synchronous batch contained more than 50 items. Resend it with Prefer: respond-async.
429rate_limitedToo many requests in a short window. Retry with exponential backoff.

Next steps

Questions about your integration? Contact developer support