# Arabic Multilingual Website Auditor (`muntasir2000/arabic-multilingual-website-auditor`) Actor

Audit Arabic and multilingual HTML pages for metadata, language, RTL direction, canonical and hreflang signals. Export actionable Arabic reports plus JSON and CSV. Respects robots.txt.

- **URL**: https://apify.com/muntasir2000/arabic-multilingual-website-auditor.md
- **Developed by:** [Muntasir Salim](https://apify.com/muntasir2000) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 audited html pages

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

## Arabic & Multilingual Website Auditor

Audit public HTML pages for Arabic language declarations, document direction, metadata, canonical and hreflang signals. Designed for agencies maintaining Arabic and translated websites, with Arabic explanations and machine-readable exports.

### What you receive

One dataset record for each attempted page: URL, HTTP status, title, description, language, direction, canonical, hreflang declarations, robots signals, H1 headings, image-alt counts and actionable findings. The key-value store contains `REPORT` (JSON), `REPORT-CSV` and `REPORT-HTML` (Arabic report).

Use the input form or pass:

```json
{"startUrls":[{"url":"https://example.com/"}],"maxPages":10,"crawl":true,"delayMs":500,"timeoutSeconds":15}
```

Maximum 20 starting URLs and 200 page attempts per run. Requests stay on each starting URL's origin. Use the final canonical origin as input, for example `https://www.example.com/` rather than an origin that redirects there. Discovered query-string URLs and common downloads are skipped. Submitted query-string URLs are supported.

### Checks

- HTTP errors and redirect chains.
- Missing or multiple titles, missing description, H1 structure review.
- Missing/invalid document language and predominantly Arabic content with a conflicting language declaration.
- Arabic document direction review (HTML `dir` only).
- Robots noindex signals (including Googlebot-specific declarations, exposed as signals to review).
- Canonical presence, validity and differences from the fetched URL.
- Hreflang syntax, absolute URLs, duplicate language conflicts and missing self-reference.
- Images missing the `alt` attribute; empty alt attributes are allowed for decoration.

### Limits and safe operation

This is an HTTP HTML audit, not a rendered-browser audit. Only UTF-8 HTML is supported. JavaScript content, CSS direction, hreflang reciprocity, alternate-target health, HTTP Link canonical and actual search-engine index status are not checked. No SEO ranking score is invented. An intentional noindex or alternate canonical is not automatically an error.

The crawler respects robots.txt. A robots outage or rate limit fails closed; 401/403 disallows crawling. Nonstandard ports, credentials in URLs and private/reserved network addresses are blocked. DNS answers are checked and the socket is pinned to a checked address. Each response has a size limit, a request timeout and a redirect limit. No login, proxy, CAPTCHA bypass or LLM API is used. Crawl delays over 10 seconds cause the origin to be skipped.

### Pricing

Use pay-per-event with one custom event `page-audited`, a charge for one successfully fetched HTML page (HTTP 2xx/3xx). Remove or zero the synthetic `apify-actor-start` and `apify-default-dataset-item` events. Failed requests, robots-blocked URLs and non-HTML responses are diagnostics without custom event charges. The runtime rejects conflicting event configuration and stops before a new page when the remaining event budget is insufficient.

**$0.01 per successfully audited HTML page ($10 per 1,000)**, including platform usage. HTTP errors, robots-blocked URLs, duplicate final URLs and non-HTML responses have no custom event charge. Set a maximum run budget to control spending; the minimum supported budget is $0.01. The Actor respects the remaining page-event budget before requesting another page.

Source: https://docs.apify.com/actors/publishing/monetize and https://docs.apify.com/sdk/js/docs/concepts/pay-per-event

### Local development

Requires Node.js 22+.

```text
npm ci
npm test
npm run audit -- example-input.json results
npm start
```

`audit` runs without an Apify account and writes local JSON, CSV and HTML. `start` uses the Apify SDK storage lifecycle; provide input through `storage/key_value_stores/default/INPUT.json` locally or the input form on Apify. Local tests do not charge a customer. Production event charging must be tested after the event is configured in Console; it is not activated by these files alone.

### Deployment

Deploy this folder as an Actor using the official Apify CLI or create an Actor with these source files in the Console. The Docker image builds with `npm ci --omit=dev`. Build and run privately, inspect the dataset and reports, then measure resource costs. Fill developer/payout requirements personally in Console. Publish only after a successful cloud run and an approved price. Routine maintenance includes dependency updates, checking failures and customer support.

# Actor input Schema

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

Up to 20 public HTTP(S) URLs. No credentials, localhost, private networks or nonstandard ports.

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

Includes blocked URLs and request failures; 1 to 200.

## `crawl` (type: `boolean`):

Discover same-origin HTML pages from links, excluding query-string links and common downloads.

## `delayMs` (type: `integer`):

Pause between page attempts; robots.txt crawl delays are also respected.

## `timeoutSeconds` (type: `integer`):

Timeout for each DNS lookup and HTTP request.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.com/"
    }
  ],
  "maxPages": 10,
  "crawl": true,
  "delayMs": 500,
  "timeoutSeconds": 15
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `htmlReport` (type: `string`):

No description

## `csvReport` (type: `string`):

No description

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://example.com/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muntasir2000/arabic-multilingual-website-auditor").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://example.com/" }] }

# Run the Actor and wait for it to finish
run = client.actor("muntasir2000/arabic-multilingual-website-auditor").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://example.com/"
    }
  ]
}' |
apify call muntasir2000/arabic-multilingual-website-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muntasir2000/arabic-multilingual-website-auditor"
        }
    }
}
```

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/KJkV6SpzOJcTgUagV/builds/v5OHgO75RX41FbZgd/openapi.json
