# Japan Vendor Risk & Adverse Action Monitor (`japan_signal_lab/japan-vendor-risk-adverse-action-monitor`) Actor

Exact corporate-number monitoring for official Japan vendor adverse-action publications.

- **URL**: https://apify.com/japan\_signal\_lab/japan-vendor-risk-adverse-action-monitor.md
- **Developed by:** [Japan Signal Lab](https://apify.com/japan_signal_lab) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 monitored companies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Japan Vendor Risk & Adverse Action Monitor

Monitor a known Japanese supplier, vendor, counterparty, or customer list for **newly published official adverse-action events**. Give this Actor the same 13-digit corporate-number watchlist used by a registry-change monitor. It returns only exact corporate-number matches—never a fuzzy name hit.

**For:** supplier risk, procurement, KYB/compliance, vendor master/CRM, and supply-chain risk teams managing Japanese counterparties.

### Why this is a separate monitor

`Japan Supplier & KYB Change Monitor` answers: *did the company record change?*
This Actor answers: *did an in-scope regulator publish an adverse action for one of my known companies?*

Use a 30-day initial audit, then schedule a 1-day run. A 7- or 30-day audit can repeat a historical match on later runs because this Actor deliberately does not retain a customer's watchlist or private alert state.

### What it covers today

This is a narrow, source-backed MVP. It is **not** a complete Japan adverse-action, sanctions, legal, credit, insolvency, or adverse-media database. The public JFTC index rejected automated requests in this validation environment, so it is deliberately excluded rather than represented as coverage we cannot verify end to end.

| Source | Event scope | Corporate-number matching | Publication cadence |
| --- | --- | --- | --- |
| MLIT Negative Information Search | Construction/public-works procurement suspensions | Exact number displayed on the result and detail page | As actions are published; Actor checks daily |
| Financial Services Agency (FSA) | Financial-sector administrative actions | Exact number displayed in the published action page | As actions are published; Actor checks daily |

MVP coverage is national within these authorities' published scopes, but it does not include every ministry, prefecture, municipality, license register, court, or private source. A source failure is recorded in `SUMMARY`; the Actor does not silently claim full coverage.

### Input

```json
{
  "companyNumbers": ["7110001019278", "4120001077369", "3010001008699"],
  "lookbackDays": 30
}
```

- `companyNumbers`: 1–10,000 known Japanese 13-digit corporate numbers. Spaces and hyphens are normalized. Company names, aliases, and addresses are not matched.
- `lookbackDays`: `1`, `7`, or `30`. Use `1` for a daily schedule after a first audit.
- `sources`: optional list of `mlit_procurement` and `fsa_financial`.

### Output

```json
{
  "corporateNumber": "7110001019278",
  "companyName": "中田建設株式会社",
  "eventType": "procurement_suspension",
  "authority": "北陸地方整備局",
  "actionTitle": "指名停止",
  "officialActionText": "工事請負契約に係る指名停止等の措置要領別表第2第15号に該当",
  "actionDate": "2026-06-26",
  "effectivePeriod": "令和8年6月26日～令和8年9月25日",
  "sector": "Japan public-works procurement",
  "severity": "medium",
  "source": {
    "sourceUrl": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi?jigyoubunya=shimeiteishi&EID=search&no=172",
    "license": "PDL1.0"
  },
  "englishSummary": "Official MLIT procurement suspension. Review the linked Japanese source for the published grounds and period.",
  "confidence": "official_exact_corporate_number"
}
```

#### Output storage

The named output **Matched adverse-action events** points to the
`adverse_actions` Dataset and contains only exact matched events. The default Dataset
contains one `run_summary` record per successful run (watchlist size, lookback, retrieval
time, and match count). This lets scheduled health checks distinguish a successful
zero-event sweep from a failed run without adding non-event records to the customer-facing
event output.

`severity` is intentionally mechanical, not an AI judgment:

- `high`: the official action title includes cancellation, revocation, abolition, or business suspension.
- `medium`: the official action title includes a surcharge, procurement suspension, exclusion order, business-improvement order, or order.
- `not_assessed`: no published action label maps to either rule.

Always review the official Japanese page. The Actor does not assert guilt, legal status beyond the publication, materiality to a relationship, or a compliance disposition.

### Attribution and permitted use

Every output retains the official source URL, publication date, retrieval timestamp, authority, and an attribution string. The current authorities' site rules state that their content is usable under the Public Data License 1.0 (PDL1.0) unless otherwise marked, with source attribution and a clear indication that Japan Signal Lab processed it:

- [MLIT link, copyright and disclaimer](https://www.mlit.go.jp/link.html)
- [FSA website rules](https://www.fsa.go.jp/rules/index.html)

The Actor does not use gBizINFO REST API or data-download endpoints because those currently require an application and API token. It uses only the listed public official pages and checks sources sequentially with retry/backoff and response-size caps.

### Pricing design (configure only after Cloud measurement)

PPE event names are fixed in code and must match the Apify Console exactly:

- `monitoring-run` is charged once after input validation and before source processing.
- `monitored-corporate-number` is charged before source processing.
- `adverse-action-event` is charged immediately before each output row.
- Do **not** configure `apify-default-dataset-item`; that would double-charge outputs.

Recommended pricing should be selected only after a successful Cloud Build and measured 1/100/1,000/10,000-company runs. The repository intentionally contains no live price or payment configuration.

### Development

```bash
npm install
npm test
npm run build
```

For an audited live check, record the date, sources, lookback, exact test watchlist, source statuses, output count, and timing. Tests cover number normalization/deduplication plus MLIT and FSA parser fixtures.

# Actor input Schema

## `companyNumbers` (type: `array`):

One known 13-digit Japanese corporate number per item. Spaces and hyphens are accepted, then removed. Maximum 10,000 unique companies; names are never fuzzy-matched.

## `lookbackDays` (type: `integer`):

Use 1 day for recurring monitoring. Use 7 or 30 days for a first audit; those audit runs can repeat historical matches because this Actor does not retain your watchlist or alert state.

## `sources` (type: `array`):

All sources are selected by default. MVP coverage is deliberately narrow and does not represent every Japanese authority or adverse-action category.

## Actor input object example

```json
{
  "companyNumbers": [
    "7110001019278",
    "4120001077369",
    "3010001008699"
  ],
  "lookbackDays": 30,
  "sources": [
    "mlit_procurement",
    "fsa_financial"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

New official events matched to the supplied Japanese corporate-number watchlist.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companyNumbers": [
        "7110001019278",
        "4120001077369",
        "3010001008699"
    ],
    "lookbackDays": 30,
    "sources": [
        "mlit_procurement",
        "fsa_financial"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("japan_signal_lab/japan-vendor-risk-adverse-action-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companyNumbers": [
        "7110001019278",
        "4120001077369",
        "3010001008699",
    ],
    "lookbackDays": 30,
    "sources": [
        "mlit_procurement",
        "fsa_financial",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("japan_signal_lab/japan-vendor-risk-adverse-action-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyNumbers": [
    "7110001019278",
    "4120001077369",
    "3010001008699"
  ],
  "lookbackDays": 30,
  "sources": [
    "mlit_procurement",
    "fsa_financial"
  ]
}' |
apify call japan_signal_lab/japan-vendor-risk-adverse-action-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,japan_signal_lab/japan-vendor-risk-adverse-action-monitor"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5CT57DuD5VboHBfh1/builds/m4rkNn3L0f1WdgFPj/openapi.json
