# Mobile Friendly Test — Responsive Check & Device Screenshots (`intelscrape/mobile-friendly-test`) Actor

Mobile Friendly Test: check any web page on a real mobile browser for viewport, horizontal scrolling, small text, small tap targets and load time, with a 0-100 score, mobile screenshot and tablet, Android and desktop screenshots. Bulk URLs. A free alternative to the retired Google test.

- **URL**: https://apify.com/intelscrape/mobile-friendly-test.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Mobile Friendly Test — Responsive Check & Device Screenshots

![Mobile Friendly Test — Responsive Check & Device Screenshots](https://api.apify.com/v2/key-value-stores/hRabN9WfDGrT4nSvV/records/mobile-friendly-test-banner.png)

🇨🇳 **移动端友好性测试**：在真实移动浏览器中检查任意网页的 viewport、横向滚动、文字过小、点击区域过小和加载时间，给出 0-100 分，并提供手机截图以及平板、安卓和桌面截图。支持批量网址，是已下线的 Google 移动端测试工具的免费替代。

🇸🇬 **Ujian Mesra Mudah Alih**: semak mana-mana halaman web pada pelayar mudah alih sebenar untuk viewport, tatal mendatar, teks kecil, sasaran ketik kecil dan masa muat, dengan skor 0-100 dan tangkapan skrin peranti. URL pukal.

#### 🤖 NEW: Connect This To Your AI!

Use this actor from Claude, ChatGPT, Cursor or any MCP client through the **[IntelScrape MCP Server](https://apify.com/intelscrape/skip--trace)**, or call it directly over the Apify API.

#### 🏆 Featured Bots by IntelScrape

- [Skip Trace Pro](https://apify.com/intelscrape/skip-trace-pro)
- [TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)
- [TikTok Email Scraper](https://apify.com/intelscrape/tiktok-scraper)
- [Amazon Product Reviews Scraper](https://apify.com/intelscrape/amazon-product-review-scraper)
- [Website Contact Scraper](https://apify.com/intelscrape/contact-info-scraper)
- [Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)

⚡ Works with n8n, Make, Zapier, Google Sheets and the Apify API.

![price](https://img.shields.io/badge/price-%248%20per%201K%20pages-blue) ![billing](https://img.shields.io/badge/billing-pay%20per%20page-green) ![browser](https://img.shields.io/badge/browser-real%20Chromium-brightgreen) ![API key](https://img.shields.io/badge/API%20key-not%20required-orange)

**Bulk mobile-friendliness checks on a real mobile browser with a score, issue list and phone, tablet and desktop screenshots.**

> **Honest coverage & billing:** Some sites block headless browsers; enable the proxy if pages fail. You pay only for results actually delivered, and a built-in cost guard stops the run at your max-charge limit.

🌍 Built for teams in the **US, China and Singapore**, and anyone who needs this data in a spreadsheet or pipeline.

⭐ Found it useful? Please leave a review; it helps others find it.

⚖️ **Lawful business use only.** Collect public data only, and comply with the source site's terms, copyright and data-protection laws (GDPR, CCPA, China PIPL, Singapore PDPA).

*Examples below are illustrative; names and values may be fictional or out of date.*

### What is Mobile Friendly Test?

Google retired its Mobile-Friendly Test tool, but mobile usability still decides rankings and conversions: most visits are on phones, and a page that scrolls sideways or has tiny buttons loses them. **Mobile Friendly Test** opens each page in a real headless mobile browser, measures the problems Google used to flag, scores the page and saves screenshots on phone, tablet and desktop, for one URL or thousands.

### What does it do?

- **Real mobile rendering** with iPhone, Pixel, iPad or desktop device profiles (viewport, pixel ratio, touch, user agent)
- **Viewport check**: missing viewport meta, not device-width, zoom disabled
- **Horizontal scrolling**: content wider than the screen, with the overflowing elements named
- **Small text**: share of text elements under 12px
- **Small tap targets**: links and buttons smaller than 24×24px
- **Timing**: TTFB, DOMContentLoaded and load time on the device
- **Score 0-100** and mobileFriendly true/false
- **Screenshots**: device screenshot, plus tablet, desktop and Android (on by default) stored as JPEG links

### Why choose us over cheaper scrapers?

- **Honest output**: limits are documented, missing data is labeled, never invented
- **Clean, consistent schema** ready for Excel, Sheets, BI tools or an LLM
- **No account risk**: no logins, no cookies, no API keys
- **Pay per result** with a built-in cost guard; no subscription, failed items are never charged
- **Fast and light**: no residential proxy, so runs finish in seconds and stay cheap
- **Maintained by IntelScrape** and fixed fast when the source changes

### Who is it for?

- **SEO audits**: find pages that fail mobile usability
- **Agencies**: before/after screenshots for client reports
- **QA**: catch responsive regressions after deployments
- **Prospecting**: show local businesses how their site looks on a phone
- **Design reviews**: compare breakpoints side by side
- **Monitoring**: schedule weekly checks of key landing pages

### How to use it

#### In Apify Console (no code)

1. Click **Try for free** / **Start**. The form is prefilled with a working example.
2. Change the inputs (see examples below).
3. Click **Start**, then export the results as **JSON, CSV, Excel, XML or HTML**, or open them in Google Sheets.
4. Optional: **Schedule** the actor to run hourly, daily or weekly.

#### Via API

```bash
curl -X POST "https://api.apify.com/v2/acts/intelscrape~mobile-friendly-test/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": [{"url": "https://apify.com"}, {"url": "https://news.ycombinator.com"}], "device": "iphone", "otherDeviceScreenshots": true}'
```

Or use the official [Apify JavaScript](https://docs.apify.com/api/client/js/) and [Python](https://docs.apify.com/api/client/python/) clients:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("intelscrape/mobile-friendly-test").call(run_input={"urls": [{"url": "https://apify.com"}, {"url": "https://news.ycombinator.com"}], "device": "iphone", "otherDeviceScreenshots": true})
for item in client.dataset(run["default_dataset_id"]).iterate_items():
    print(item)
```

#### With AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) or the [IntelScrape MCP Server](https://apify.com/intelscrape/skip--trace) to Claude Desktop, Cursor, ChatGPT or any MCP client, then ask in plain language, e.g. *"Run intelscrape/mobile-friendly-test with the default input and summarise the results."*

### Input examples

**Two pages on iPhone with device screenshots (default)**

```json
{
  "urls": [{ "url": "https://apify.com" }, { "url": "https://news.ycombinator.com" }],
  "device": "iphone",
  "otherDeviceScreenshots": true
}
```

**Android only, full-page**

```json
{
  "urls": [{ "url": "https://example.com" }],
  "device": "android",
  "fullPage": true,
  "otherDeviceScreenshots": false
}
```

### Output fields

| Field | Description |
|---|---|
| `url / finalUrl / httpStatus / title / device` | Page and device |
| `mobileFriendly / score / issues[]` | Verdict, score and issues (severity, code, message) |
| `viewportMeta / viewportWidth / contentWidth / overflowingElements` | Viewport and overflow |
| `smallTextShare` | % of text elements under 12px |
| `tapTargets / smallTapTargets` | Links and buttons, and how many are under 24×24px |
| `imagesWithoutDimensions` | Images without width/height (layout shift risk) |
| `timing` | ttfb, dcl, load (ms), bytes |
| `screenshotUrl / screenshots` | Main and other device screenshot links |

#### Sample output

```json
{
  "url": "https://news.ycombinator.com",
  "mobileFriendly": true,
  "score": 90,
  "issues": [
    { "severity": "warning", "code": "small-tap-targets", "message": "..." }
  ],
  "viewportMeta": "width=device-width, initial-scale=1.0",
  "contentWidth": 390,
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/0002-news.ycombinator.com-iphone.jpg"
}
```

### Pricing (pay per event)

| Event | When it is charged | Price |
|---|---|---|
| **Actor start** | once per run | $0.005 |
| **Mobile test** | per page tested with mobile screenshot | $0.008 |
| **Device screenshots** | per page with tablet, desktop and Android screenshots (on by default; turn off to skip) | $0.006 |

#### Cost examples

| Run | Cost |
|---|---|
| Default run: 2 pages with device screenshots | $0.033 |
| 500 landing pages, mobile only | $4.005 |
| Weekly 20 key pages with all screenshots | $0.285 |

Platform usage is included in these prices. Set **Max charge per run** in the run options to cap spend; the actor stops cleanly when the limit is reached and keeps everything collected so far.

### Tips for best results

- Turn off other device screenshots for the cheapest bulk check.
- Use fullPage for design reviews, the first screen for quick checks.
- Fix errors (viewport, horizontal scroll) first; warnings are polish.
- Pair with SEO Audit Tool for on-page checks.

### FAQ

#### Is this the same as Google's Mobile-Friendly Test?

Google retired that tool. This actor checks the same core signals (viewport, content width, text size, tap targets) on a real mobile browser.

#### Does it measure Core Web Vitals?

It reports load timings from the device run, not field Core Web Vitals.

#### Where are screenshots stored?

In the run's key-value store; each row links to its JPEG files.

#### Are failed pages charged?

No.

#### Can it log in?

No, public pages only.

#### Why does Hacker News get a tap-target warning?

Its text links are small and close together; on a phone many are under 24×24px, which is exactly what this check flags.

#### Which device should I choose?

iPhone is the default because it is the most common mobile viewport in many markets; use Android for 412px layouts and tablet or desktop to test larger breakpoints.

#### Do I need a key?

No.

### Honest limits

- Some sites block headless browsers; enable the proxy if pages fail.
- Cookie banners may appear on screenshots.
- Tap-target and small-text checks are heuristics.
- Each page takes several seconds because it is really rendered.

### Related IntelScrape bots

- [Website to PDF](https://apify.com/intelscrape/website-to-pdf): any URL to a print-ready PDF
- [Open Graph Scraper](https://apify.com/intelscrape/open-graph-scraper): link previews & meta tags
- [Tech Stack Detector](https://apify.com/intelscrape/tech-stack-detector): CMS, analytics & frameworks per domain
- [Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace): IntelScrape tools for AI agents

### Legal

This actor collects publicly available data only. You are responsible for using the results lawfully and in line with the source's terms and applicable privacy laws (GDPR, CCPA, PIPL, PDPA). Process personal data only with a legitimate purpose. IntelScrape is not affiliated with, endorsed by or sponsored by the data source; all trademarks belong to their owners.

# Actor input Schema

## `urls` (type: `array`):

Pages to test.

## `device` (type: `string`):

Device used for the checks and main screenshot.

## `otherDeviceScreenshots` (type: `boolean`):

Also capture tablet, desktop (and Android) screenshots for side-by-side review. Charged per page.

## `fullPage` (type: `boolean`):

Capture the whole scroll height instead of the first screen.

## `timeoutSecs` (type: `integer`):

Per page.

## `proxyConfiguration` (type: `object`):

Not needed normally. The actor switches to Apify Proxy automatically if the source starts rate-limiting.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://news.ycombinator.com"
    }
  ],
  "device": "iphone",
  "otherDeviceScreenshots": true,
  "fullPage": false,
  "timeoutSecs": 45,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "urls": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://news.ycombinator.com"
        }
    ],
    "otherDeviceScreenshots": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/mobile-friendly-test").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 = {
    "urls": [
        { "url": "https://apify.com" },
        { "url": "https://news.ycombinator.com" },
    ],
    "otherDeviceScreenshots": True,
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/mobile-friendly-test").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 '{
  "urls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://news.ycombinator.com"
    }
  ],
  "otherDeviceScreenshots": true
}' |
apify call intelscrape/mobile-friendly-test --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intelscrape/mobile-friendly-test"
        }
    }
}
```

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/BZrTctTgmZc7dyd4q/builds/RAaLxpu9d4REnqwaW/openapi.json
