# Japan Public Procurement Intelligence (`junya-lab/japan-public-procurement-intelligence`) Actor

Unofficial analytics for Japanese public procurement and government tender listings from the official Kankouju portal. Get agency, region, category, procedure, and monthly summaries with machine-readable coverage.

- **URL**: https://apify.com/junya-lab/japan-public-procurement-intelligence.md
- **Developed by:** [Junya Shimosaka](https://apify.com/junya-lab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 analysis outputs

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Japan Public Procurement Intelligence

This unofficial Actor searches the official Kankouju Information Portal API and turns Japanese public procurement and government tender listings into analysis-ready JSON. It returns agency, region, category, procedure, and monthly summaries with explicit coverage for AI agents, market research, and sales planning.

### What this Actor does

- Searches the official Kankouju Information Portal API using your keyword and optional filters.
- Normalizes returned procurement listings into the Default Dataset.
- Saves a summary as `OUTPUT` in the Default Key-value Store.
- Reports how much of the portal's search result was fetched, so partial results are not presented as a complete analysis.

### Quick start

```json
{
  "query": "情報システム",
  "maxItems": 10
}
```

| Input | Description |
| --- | --- |
| `query` | Required search keyword. |
| `maxItems` | Maximum records to fetch: 1–1,000; default 100. |
| `prefecture` | Two-digit JIS X0401 prefecture code, such as `13`. |
| `category` | `物品` (goods), `工事` (construction), or `役務` (services). |
| `organization` | Procuring organization name. |
| `fromDate`, `toDate` | Date filters in `YYYY-MM-DD` format. The API filters by announcement date or portal acquisition date. |
| `topN` | Number of organizations in the ranking: 1–100; default 10. |

### Output

The **Default Dataset** contains normalized procurement records. Unavailable fields are `null`.

The **`OUTPUT`** record contains `analysisStatus`, `coverageRatio`, `coveragePercent`, `analysisScope`, `meta`, `summary`, `topOrganizations`, `categoryBreakdown`, `procedureTypeBreakdown`, `prefectureBreakdown`, `monthlyTrend`, `recentOpportunities`, `warnings`, and `source`.

`analysisStatus` has three values:

- `no_results`: the portal search returned no hits and no records.
- `complete`: all results for this specific portal search were fetched at that time. This does **not** mean all public procurement in Japan was covered.
- `partial`: only some of the portal search hits were fetched. Rankings, distributions, and monthly counts describe the fetched records only and may not represent all search hits.

`coverageRatio` is `fetchedItems / SearchHits`: `null` for `no_results`, `1` for `complete`, and a value between 0 and 1 for `partial`. It is the unrounded coverage value; `coveragePercent` is a rounded display value. `analysisScope` records the portal search, filters, hit count, fetched count, and requested limit.

### Pricing

- Analysis output: **$0.10** per successful, non-empty analysis. The `analysis-output` event is charged once after the Dataset and `OUTPUT` are saved.
- Actor start: **$0.00005** per start. This is a platform-generated event and may still apply when there are no results or a run fails.
- Platform usage is included in the event prices; users do not pay it separately.

For `no_results`, `analysis-output` is not charged. Failed API, parsing, Dataset, or `OUTPUT` operations do not intentionally trigger that event. Event prices are configured in Apify Console.

### Coverage and limitations

- The official API returns at most **1,000 records per request**. `SearchHits` is the total number of portal search hits, which can exceed `fetchedItems`.
- When `analysisStatus` is `partial`, all summaries and rankings use only `fetchedItems`. Narrow the search with dates, prefecture, category, or other filters when `SearchHits > 1,000`. Increasing `maxItems` can improve coverage when it is below the available result count.
- `deadline` maps to `PeriodEndTime`, the **delivery deadline**, not the bid submission deadline.
- `CftIssueDate` may be the portal acquisition date when an announcement date is unavailable.
- Awardee, award amount, and award date are not provided because the official API does not expose them as structured fields.
- Announcement full text is not stored. The portal may not cover every public procurement opportunity in Japan.
- Verify current details and original procurement information with the procuring organization and the portal before acting on a listing.

### Data source

Official source: [Kankouju Information Portal](https://www.kkj.go.jp/s/). See its [API guide](https://www.kkj.go.jp/doc/ja/api_guide.pdf).

This is an **unofficial** Actor. It is not an official or endorsed product of the Japanese government, the SME Agency, the Kankouju Information Portal, or Apify.

### Example coverage

In one run with `query: "情報システム"` and `maxItems: 10`, the Actor fetched **10** records from **30,608** portal search hits. The output reported `analysisStatus: "partial"` and `coveragePercent: 0.0327%`.

This is only an example from one search run and is not representative of all procurement data.

### 日本語案内

このActorは、官公需情報ポータルサイト公式検索APIの返却結果を正規化・集計する非公式ツールです。取得範囲や原情報は、必ず発注機関および同ポータルで確認してください。

# Actor input Schema

## `query` (type: `string`):

公告文などを検索します。

## `maxItems` (type: `integer`):

1～1000件。

## `prefecture` (type: `string`):

JIS X0401の2桁コード（例: 13）。

## `category` (type: `string`):

公式APIのカテゴリー。

## `organization` (type: `string`):

機関名による絞り込み。

## `fromDate` (type: `string`):

公告日またはデータ取得日の開始日。YYYY-MM-DD。

## `toDate` (type: `string`):

公告日またはデータ取得日の終了日。YYYY-MM-DD。

## `topN` (type: `integer`):

発注機関ランキングの表示数。

## Actor input object example

```json
{
  "query": "情報システム",
  "maxItems": 100,
  "topN": 10
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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 = {
    "query": "情報システム"
};

// Run the Actor and wait for it to finish
const run = await client.actor("junya-lab/japan-public-procurement-intelligence").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 = { "query": "情報システム" }

# Run the Actor and wait for it to finish
run = client.actor("junya-lab/japan-public-procurement-intelligence").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 '{
  "query": "情報システム"
}' |
apify call junya-lab/japan-public-procurement-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,junya-lab/japan-public-procurement-intelligence"
        }
    }
}
```

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/zbt6y34dUuEZAsigW/builds/GKU1B9fCa6nwm4pyr/openapi.json
