# Japan IT Tender Signal — 官公需 IT入札・プロポーザル新着 (`handa-labs/japan-it-tender-signal`) Actor

New Japanese public-sector IT tenders (national ministries, agencies, prefectures, cities) from the official 官公需情報ポータル API. Built-in IT queries, deadline/budget extraction, proposals flag, only new since your last run. 日本語対応。

- **URL**: https://apify.com/handa-labs/japan-it-tender-signal.md
- **Developed by:** [tatsuya handa](https://apify.com/handa-labs) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 tender notices

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

### What is Japan IT Tender Signal for?

**Every weekday, Japanese ministries, agencies, prefectures and cities publish 200–300 procurement notices that mention "システム".** Most of them are buried in PDF announcements on thousands of separate websites. This Actor reads the **official 官公需情報ポータルサイト API** (the Small and Medium Enterprise Agency's nationwide portal that aggregates those announcements, national and local), applies a **built-in set of IT queries** (system development, cloud, software, network, servers, data platforms, AI/RPA, DX, websites, security, IT maintenance, GIS), drops building-equipment noise, **extracts deadline, opening date, budget ceiling and qualification grade** from the notice text, flags proposals (プロポーザル / 企画競争), and in *monitor* mode returns **only the notices it has not shown you before**.

Typical users:

- **IT vendors and SIers selling to the Japanese public sector** who want every new system, cloud or website tender the day it appears, with the deadline already parsed.
- **Bid-management and GovTech teams** feeding a CRM or Slack channel.
- **Analysts and journalists** tracking government cloud (ガバメントクラウド) migration, DX spending or AI adoption by municipality.
- **AI agents** that need a JSON feed of Japanese public IT opportunities without reading PDFs.

Data source: **官公需情報ポータルサイト (https://www.kkj.go.jp/) API**, an official service of the Small and Medium Enterprise Agency. Its terms require this credit and moderate access; the Actor paces its calls and includes the credit in every record.

### Sample output

A `notice` record:

```json
{
  "type": "notice",
  "change": "new",
  "key": "c2VhcmNoL3BfcG9ydGFsLzIwMjYvMDkvMjAyNjA5MDRfNzg1NzMK",
  "title": "ガバメントクラウド移行計画作成支援（食品安全総合情報システム）",
  "organization": "内閣府",
  "prefecture": "東京都",
  "prefectureCode": "13",
  "city": null,
  "issueDate": "2026-09-04",
  "collectedAt": "2026-09-04T19:37:43+09:00",
  "category": null,
  "procedureType": "一般競争入札",
  "certification": null,
  "location": null,
  "sourceUrl": "https://www.p-portal.go.jp/pps-web-biz/UAA01/OAA0101",
  "fileType": "html",
  "attachments": [],
  "matchedQueries": ["クラウド OR ガバメントクラウド OR SaaS", "システム AND (構築 OR 開発 OR 更改 OR 移行 OR 改修 OR 刷新 OR 導入)"],
  "deadline": "2026-09-25",
  "openingDate": "2026-09-26",
  "budgetJpy": null,
  "qualificationGrade": "A,B",
  "isProposal": false,
  "governmentLevel": "national",
  "descriptionExcerpt": "ガバメントクラウド移行計画作成支援（食品安全総合情報システム） 調達案件番号0000000000000620931 調達種別 一般競争入札の入札公告（WTO対象外）…",
  "checkedAt": "2026-09-05T04:30:11.000Z",
  "dataSource": "官公需情報ポータルサイト API (https://www.kkj.go.jp/)",
  "llmSummary": "内閣府 (東京都): 「ガバメントクラウド移行計画作成支援（食品安全総合情報システム）」 一般競争入札, 公告 2026-09-04, 締切 2026-09-25, 開札 2026-09-26, 等級 A,B. [national]"
}
```

The first record of every run is a `summary` with counts per prefecture and government level, top organisations, how many notices have a parsed deadline or budget, and per-query hit counts.

### What you get

| Field | Meaning |
| --- | --- |
| `key` | Portal's unique key, stable across runs |
| `title`, `organization`, `prefecture`, `city` | 件名・発注機関・都道府県・市区町村 as registered by the portal |
| `issueDate` | 公告日 (`YYYY-MM-DD`) |
| `category`, `procedureType`, `certification`, `location` | 物品/工事/役務, 入札方式, 入札資格, 履行場所 (sparsely filled by the portal) |
| `sourceUrl`, `fileType`, `attachments` | The announcement page or PDF and any attached 仕様書 / 要領 |
| `deadline`, `openingDate` | 提出期限 and 開札日 parsed from the text (令和 dates supported) |
| `budgetJpy` | 予定価格 / 上限額 parsed from the text, in yen |
| `qualificationGrade` | 等級 (A–D) when stated |
| `isProposal` | プロポーザル / 企画競争 / 公募型 |
| `governmentLevel` | `national`, `local` or `other` (rule-based from the organisation name) |
| `matchedQueries` | Which of your queries hit this notice |
| `descriptionExcerpt` / `fullText` | Notice text excerpt (default 1,200 chars) and optionally the full text |
| `change` | `new` (monitor mode), `baseline` or `snapshot` |
| `llmSummary` | One-line Japanese summary for LLM agents and alerts |

Parsed fields are best-effort: in tests about 75% of notices yield a deadline, 60% an opening date and under 10% a budget (most notices do not state one). Always confirm with the linked announcement.

### Settings

| Input | Default | Notes |
| --- | --- | --- |
| `useItPreset` | true | 12 built-in IT queries |
| `queries` | – | Your own full-text queries (AND / OR / ANDNOT, parentheses) |
| `prefectureCodes` | – | JIS X 0401 two-digit codes; empty = all Japan |
| `organizationName` | – | Partial match on 発注機関 |
| `category` | all | goods / works / services (only half of notices carry one) |
| `procedureType` | all | 一般競争入札 etc. |
| `excludeNoise` | true | Drops 空調・給排水・消防設備・照明・昇降機・橋梁… |
| `excludeWorks` | true | Drops 工事 (construction) notices |
| `itTitleFilter` | true with preset | Requires an IT term in the title (or opening lines) so that boilerplate mentions of 電子入札システム do not pull in unrelated goods |
| `excludeTerms` | – | Extra drop terms |
| `proposalOnly` | false | Keep only proposals / 企画競争 |
| `minBudgetJpy` | – | Minimum parsed budget |
| `daysBack` | 2 | Window on 公告日 (1–30). The portal registers notices about one day after publication |
| `descriptionChars` / `includeFullText` | 1200 / false | How much notice text to include |
| `mode`, `watchlistId`, `emitBaseline`, `maxNotices` | monitor / default / false / 2000 | See below |

#### Monitor mode, watchlists and the free first run

1. Choose a `watchlistId` (e.g. `tokyo-cloud`) and your filters. Run once. The **first run is a free baseline**: the Actor remembers the notices currently in the window and returns only a summary (no notice records are charged) unless `emitBaseline` is on.
2. Schedule the same input daily, ideally after 20:00 JST (the portal's collection batch runs around 19:00 JST). Each later run returns **only notices published since the last run** and charges only for those.
3. Different watchlists keep separate memories. Changing filters starts a new baseline for that watchlist.

Pricing: one `run-summary` event per non-baseline run, one `notice` event per notice record.

#### Example: cloud and system tenders in Tokyo and Kanagawa, proposals included

```json
{
  "useItPreset": false,
  "queries": ["クラウド OR ガバメントクラウド", "システム AND (構築 OR 更改 OR 移行)"],
  "prefectureCodes": ["13", "14"],
  "daysBack": 3,
  "mode": "monitor",
  "watchlistId": "tokyo-kanagawa-cloud"
}
```

### Notes and limits

- The API returns at most 1,000 notices per query and has no paging. When a query exceeds that, the Actor re-runs it per block of prefectures; very broad single words (e.g. just `システム`) can still be capped, so prefer AND expressions.
- The portal collects announcements one day after the issuing body publishes them; weekends have no new data.
- Some titles are PDF headings (e.g. a date) when the issuing body's page had no proper title; the excerpt and `sourceUrl` still identify the notice.
- Notices are official public records provided as-is. 本Actorは官公需情報ポータルサイトのAPIを用いています。

### 日本語

国・独立行政法人・都道府県・市区町村の**IT関連の入札公告・公募型プロポーザル**を、中小企業庁の公式「官公需情報ポータルサイト」APIから毎日取得します。システム構築・クラウド・ソフトウェア・ネットワーク・データ基盤・AI/RPA・DX・ホームページ・セキュリティ・保守運用・GISの12クエリを内蔵し、空調や給排水などの設備系ノイズを除外。公告本文から**提出期限・開札日・予定価格(上限額)・等級**を抽出し、プロポーザル/企画競争にフラグを付けます。`monitor` モードでは前回以降の新着だけを返し、初回はベースライン(無課金)です。本Actorは官公需情報ポータルサイトのAPIを用いています(https://www.kkj.go.jp/)。

# Actor input Schema

## `useItPreset` (type: `boolean`):

12 full-text queries covering system development, cloud, software, network, servers, data platforms, AI/RPA, DX, websites, security, IT maintenance and GIS. Turn off to use only your own queries.

## `queries` (type: `array`):

Each entry is one API query over the full notice text. Supports AND / OR / ANDNOT and parentheses, e.g. "電子カルテ OR 医療情報システム".

## `prefectureCodes` (type: `array`):

Two-digit codes, e.g. 13 = 東京都, 27 = 大阪府, 14 = 神奈川県. Empty = all of Japan.

## `organizationName` (type: `string`):

e.g. 東京都, 国土交通省, 大阪市. Partial match.

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

goods = 物品, works = 工事, services = 役務. About half of the notices carry no category, so 'all' is the safe default.

## `procedureType` (type: `string`):

Only about a third of notices carry a procedure type.

## `excludeNoise` (type: `boolean`):

Drops notices mentioning 空調, 給排水, 消防設備, 照明, 受変電, 昇降機 etc. (HVAC and other 'systems' that are not IT).

## `excludeWorks` (type: `boolean`):

Drops notices categorised 工事 or whose title contains 工事. IT notices are almost always 物品/役務.

## `itTitleFilter` (type: `boolean`):

Keeps only notices whose title (or opening lines when the title is a file name) contains an IT term such as システム, クラウド, ネットワーク, データ, DX, ホームページ, セキュリティ. Defaults to on when the IT preset is used; turn off for your own non-IT queries.

## `excludeTerms` (type: `array`):

Notices whose title or first 3000 characters contain any of these are dropped.

## `proposalOnly` (type: `boolean`):

Keep only プロポーザル, 企画競争, 企画提案, 公募型 notices.

## `minBudgetJpy` (type: `integer`):

Keep only notices whose text states a 予定価格 / 上限額 of at least this amount. Notices without a parsed budget are dropped when set.

## `daysBack` (type: `integer`):

Notices issued (公告日) within the last N days (1–30). The portal registers notices about one day after publication.

## `descriptionChars` (type: `integer`):

Characters of the notice text to include per record (0 = none).

## `includeFullText` (type: `boolean`):

Adds `fullText` (median ~5,000 characters, up to 200k). Off by default to keep datasets small.

## `mode` (type: `string`):

monitor = remember what was returned and only emit notices not seen before (first run is a free baseline). snapshot = return everything matching every time.

## `watchlistId` (type: `string`):

Name for this watch (e.g. "tokyo-cloud"). Separate IDs keep separate memories; the filters are part of the key too.

## `emitBaseline` (type: `boolean`):

On the very first run of a watchlist, also output the current notices (charged). Default: only a free summary.

## `maxNotices` (type: `integer`):

Cap on notices kept per run (newest first).

## Actor input object example

```json
{
  "useItPreset": true,
  "queries": [],
  "category": "all",
  "procedureType": "all",
  "excludeNoise": true,
  "excludeWorks": true,
  "itTitleFilter": true,
  "proposalOnly": false,
  "daysBack": 2,
  "descriptionChars": 1200,
  "includeFullText": false,
  "mode": "snapshot",
  "watchlistId": "default",
  "emitBaseline": false,
  "maxNotices": 200
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `consoleRun` (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 = {
    "queries": [],
    "mode": "snapshot",
    "maxNotices": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("handa-labs/japan-it-tender-signal").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 = {
    "queries": [],
    "mode": "snapshot",
    "maxNotices": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("handa-labs/japan-it-tender-signal").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 '{
  "queries": [],
  "mode": "snapshot",
  "maxNotices": 200
}' |
apify call handa-labs/japan-it-tender-signal --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,handa-labs/japan-it-tender-signal"
        }
    }
}
```

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/nx7hhtXrdEnjKWUOw/builds/EQAWf5nAt39FGkFQr/openapi.json
