# Japan SEO Localisation Checker (`ta2/japan-seo-localisation-checker`) Actor

Audit any URL for Japanese search readiness: html lang, Japanese title & meta description, hreflang (incl. the common "jp" mistake), canonical, Japanese text ratio, Chinese-vs-Japanese detection and mojibake. Returns a 0–100 Japan readiness score with fixes.

- **URL**: https://apify.com/ta2/japan-seo-localisation-checker.md
- **Developed by:** [Tatsuhiro Aoikawa](https://apify.com/ta2) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 SEO Localisation Checker 🇯🇵

Find out in seconds whether a web page is really ready for **Japanese search (Google Japan / Yahoo! JAPAN)**. Paste a URL and get a **0–100 Japan readiness score**, a grade, and a prioritised list of fixes in **English and Japanese**.

Built by a native Japanese speaker for teams launching products in Japan, localisation agencies, and SEO consultants who need to check Japanese pages they can't read.

### Why this exists

Translated sites often *look* fine but are broken for Japanese search in ways that are invisible to non-Japanese readers:

- `lang="en"` left on the Japanese page by a translation plugin
- `hreflang="jp"` — "jp" is a **country** code; Japanese is `ja`. Google silently ignores it
- The Japanese page's **canonical points to the English page**, so the Japanese page drops out of the index
- Title or meta description left in English
- The "Japanese" locale actually serves **Chinese** text (kanji without kana)
- Mojibake from Shift_JIS / UTF-8 mix-ups
- `og:locale="ja-JP"` instead of `ja_JP`

This Actor catches all of them.

### What it checks

| Category | Points | Checks |
|---|---|---|
| Language declaration | 15 | `<html lang>`, `jp` vs `ja`, underscore format, lang vs actual content mismatch |
| Title | 15 | Present, written in Japanese, length in full-width characters |
| Meta description | 15 | Present, written in Japanese, length in full-width characters |
| Content | 20 | Share of Japanese characters, Japanese-vs-Chinese detection, JS-only pages |
| hreflang | 15 | `ja` entry, invalid codes, self-reference, `x-default`, absolute URLs, conflicts |
| Canonical | 10 | Present, absolute, self-referencing, not pointing to another language |
| Technical | 10 | Charset (UTF-8 vs legacy), header/meta conflicts, viewport, `og:locale`, mojibake |

A `noindex` page is capped at 30 points.

**Tip:** enter your *English* URL. If it declares `hreflang="ja"`, the Japanese version is found and audited automatically.

### Input

```json
{
  "startUrls": [{ "url": "https://example.com/" }],
  "followHreflangJa": true,
  "maxPages": 100
}
```

### Output (one item per page)

```json
{
  "finalUrl": "https://example.com/ja/",
  "japanReadinessScore": 62,
  "grade": "C",
  "summary": "Japan readiness 62/100 (C). 1 critical, 3 warnings, 1 notes.",
  "categoryScores": { "language": "15/15", "title": "15/15", "metaDescription": "7/15", "content": "20/20", "hreflang": "3/15", "canonical": "2/10", "technical": "8/10" },
  "topFixes": ["Each language version should have a canonical pointing to itself.", "..."],
  "issues": [
    {
      "severity": "critical",
      "category": "canonical",
      "id": "canonical-to-other-language",
      "message": "This Japanese page's canonical points to the \"en\" version...",
      "messageJa": "日本語ページのcanonicalが「en」版を指しています...",
      "fix": "Each language version should have a canonical pointing to itself."
    }
  ],
  "details": { "htmlLang": "ja", "detectedContentLanguage": "ja", "hreflang": [], "bodyText": { "japaneseRatio": 0.91 } }
}
```

Every issue has a stable `id`, so you can filter or track issues across runs.

### Pricing

Pay per page audited. Failed fetches (timeouts, 404s, non-HTML) are **not charged**. Lightweight: no browser, no AI calls.

### Use with AI agents (MCP)

This Actor is available through the Apify MCP server, so Claude, Cursor and other MCP clients can call it directly, e.g. *"Check whether https://example.com/ja/ is ready for Japanese SEO."*

### Limitations

- Analyses the HTML returned by the server; content rendered only by JavaScript is not executed.
- Length guidelines (title ≈15–35, description ≈50–120 full-width characters) are common Japanese SEO practice, not official Google limits.
- hreflang reciprocity across pages is not yet verified (planned).

### 日本語での説明

URLを入力するだけで、そのページが日本の検索向けに正しくローカライズされているかを100点満点で採点します。lang属性、hreflang（「jp」誤記を含む）、canonical、日本語タイトル・説明文、日本語比率、中国語誤配信、文字化けなどをチェックし、修正方法を日英で出力します。

# Actor input Schema

## `startUrls` (type: `array`):

Pages to audit. You can enter your English page: if it links a Japanese version via hreflang, that page is audited too.

## `followHreflangJa` (type: `boolean`):

If a page declares hreflang="ja", audit that Japanese URL as well (counts as one more page).

## `maxPages` (type: `integer`):

Safety cap on the number of pages audited in one run.

## `maxConcurrency` (type: `integer`):

How many pages to fetch in parallel.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each page to respond before giving up.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.apple.com/jp/"
    }
  ],
  "followHreflangJa": true,
  "maxPages": 100,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

## `overview` (type: `string`):

Score, grade, summary and top fixes for each audited page.

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

Full audit results including every issue and detail.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.apple.com/jp/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ta2/japan-seo-localisation-checker").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 = { "startUrls": [{ "url": "https://www.apple.com/jp/" }] }

# Run the Actor and wait for it to finish
run = client.actor("ta2/japan-seo-localisation-checker").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 '{
  "startUrls": [
    {
      "url": "https://www.apple.com/jp/"
    }
  ]
}' |
apify call ta2/japan-seo-localisation-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ta2/japan-seo-localisation-checker"
        }
    }
}
```

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/4Pf7ziNlAd84NgIh6/builds/wOP34jYnfSvfQN1sb/openapi.json
