Scam Search
/v1/scam-searchSearch Malaysian scam databases for phone numbers, bank accounts, and company names. Results are aggregated from three sources: PDRM (Semakmule), ScamCheck.my, and the Securities Commission Malaysia Investor Alert List.
Plan requirement: Scam search requires a Pro plan or higher.
Request
Send as application/json.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Search type: phone, bank_account, or company |
query | string | Yes | The value to search for (e.g. phone number, bank account number, or company name) |
Search types
| Type | Sources | Description |
|---|---|---|
phone | PDRM, ScamCheck.my | Malaysian phone number (with or without country code) |
bank_account | PDRM | Bank account number |
company | PDRM, SC Malaysia | Company or entity name |
Data sources
PDRM Semakmule
Royal Malaysia Police commercial crime database. Supports phone, bank account, and company queries.
ScamCheck.my
Community-sourced caller ID and scam phone number database. Phone queries only.
Securities Commission Malaysia
SC Investor Alert List for unauthorized schemes and entities. Company queries only.
Examples
curl -X POST https://api.dokai.dev/v1/scam-search \
-H "Authorization: Bearer dk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{"type": "phone", "query": "0123456789"}'Response
Returns 200 OK with an array of results from each data source. Sources are queried in parallel with results cached for 6-12 hours.
{
"scam_check": [
{
"source": "pdrm",
"queried_at": "2026-03-10T12:00:00Z",
"cached": false,
"reports": [
{
"query_type": "phone",
"query": "0123456789",
"flagged": true,
"risk_level": "high",
"report_count": 5,
"lookups": 120,
"records": []
}
]
},
{
"source": "scamcheck_my",
"queried_at": "2026-03-10T12:00:00Z",
"cached": false,
"reports": [
{
"query_type": "phone",
"query": "0123456789",
"flagged": true,
"risk_level": "high",
"report_count": 0,
"lookups": 0,
"records": [
{
"identifier": "+60 12-345 6789",
"remarks": "Scam Caller"
}
]
}
]
}
]
}Company search example
{
"scam_check": [
{
"source": "pdrm",
"queried_at": "2026-03-10T12:00:00Z",
"cached": false,
"reports": [
{
"query_type": "company",
"query": "ACME SDN BHD",
"flagged": false,
"risk_level": "none",
"report_count": 0,
"lookups": 0,
"records": []
}
]
},
{
"source": "security_commission_malaysia",
"queried_at": "2026-03-10T12:00:00Z",
"cached": false,
"reports": [
{
"query_type": "company",
"query": "ACME SDN BHD",
"flagged": true,
"risk_level": "high",
"report_count": 1,
"lookups": 0,
"records": [
{
"identifier": "ACME SDN BHD",
"company_name": "ACME SDN BHD",
"report_date": "15/01/2026",
"website": "https://acme-invest.com",
"remarks": "Unauthorised investment scheme"
}
]
}
]
}
]
}Response fields
Source object
| Field | Type | Description |
|---|---|---|
source | string | pdrm, scamcheck_my, or security_commission_malaysia |
queried_at | string | ISO 8601 timestamp of when the source was queried |
cached | boolean | Whether the result was served from cache |
reports | array | Array of report objects for each matched query |
Report object
| Field | Type | Description |
|---|---|---|
query_type | string | The type of query (phone, bank_account, company) |
query | string | The search value |
flagged | boolean | Whether the query was flagged as potentially fraudulent |
risk_level | string | none, low, medium, high, or unknown |
report_count | integer | Number of scam reports filed (source-dependent) |
lookups | integer | Number of times this query has been looked up (source-dependent) |
records | array | Detailed records from the source (if available) |
Record object
| Field | Type | Description |
|---|---|---|
identifier | string | null | Matched identifier (phone number, company name, etc.) |
company_name | string | null | Company or entity name (for company queries) |
report_date | string | null | Date the record was reported |
report_count | integer | null | Number of reports for this specific record |
website | string | null | Associated website (e.g. fraudulent investment sites from SC Malaysia) |
remarks | string | null | Additional notes or description |
Risk levels
| Level | Meaning |
|---|---|
none | Not found in scam databases |
low | Few reports or unverified entries |
medium | Multiple reports filed |
high | Confirmed scam or on official alert list |
unknown | Source unavailable or returned an error |
Automatic scam check on parse
When parsing documents with POST /v1/parse, the API automatically extracts phone numbers and company names from the parsed data and runs scam checks against all sources. Results are included in the scam_check field of the parse response.
Caching: Results are cached in Redis for 6 hours (phone/bank account) and 12 hours (company). Subsequent requests for the same query will return cached results instantly.