# Traffic Drop Checker: Google Update or Technical SEO Break? (`cygnix_labs/traffic-drop-emergency-check`) Actor

Why did Google traffic drop? Dates the drop from a Search Console export, matches it to Google's official core/spam update and incident feed, and checks the live site: robots.txt, noindex, canonicals, redirects, 5xx, sitemap, hacked spam, cloaking. One verdict + fixes. $0.03 per site.

- **URL**: https://apify.com/cygnix_labs/traffic-drop-emergency-check.md
- **Developed by:** [Umair Saleem Mohammad Saleem](https://apify.com/cygnix_labs) (community)
- **Categories:** SEO tools, AI, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 site checkeds

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

## Traffic Drop Checker: Google Update or Technical SEO Break?

**Your Google impressions fell off a cliff overnight. Was it the core/spam update, a broken site, or a hack?** This Actor answers in about a minute and gives you one verdict, the evidence, and the fixes in priority order.

It combines three things no single tool does together:

1. **Drop dating** from your Google Search Console "Dates" export: finds the break day and the shape (overnight cliff, step, slow slide, clicks-only CTR loss, or spike-then-normal).
2. **Official Google updates and incidents**: reads Google's own [Search Status Dashboard](https://status.search.google.com/) feed live and tells you if the drop falls inside a core update, spam update, or a crawling/indexing/serving incident.
3. **Live technical and security checks**: robots.txt errors and `Disallow: /`, noindex (meta and X-Robots-Tag), canonicals pointing to staging or another domain, off-site redirects, 4xx/5xx, DNS, sitemap health, spam URLs in the sitemap, Japanese keyword hack, hidden off-site links, and a **Googlebot user-agent comparison** that catches cloaking only Google sees.

### Verdicts

| Verdict | What it means |
|---|---|
| TECHNICAL_BREAK | The site blocks or fails Google right now. Fix first (exact fix included). |
| HACKED_OR_SPAM_INJECTION | Spam pages, injected links or Googlebot-only content. Clean the site. |
| GOOGLE_RANKING_UPDATE | Site is clean and the drop sits inside a confirmed core or spam update. |
| GOOGLE_SIDE_INCIDENT | Drop overlaps an official Google crawling/indexing/serving incident. |
| SERP_CTR_CHANGE | Impressions held, clicks fell: AI Overviews, SERP features, title rewrites. |
| SPIKE_NORMALIZED | "Drop" is traffic returning to normal after a short spike. |
| PAST_OUTAGE_OR_MANUAL_ACTION | Overnight cliff, no update, site clean today: check Crawl stats and Manual actions. |
| GRADUAL_DECAY / UNEXPLAINED_STEP | Not a break: content decay, competition, or your own site changes. |

### Input

- **Sites**: one or more sites you own or manage (agencies: paste all clients for a weekly sweep).
- **Search Console Dates export** (optional, recommended): Performance > 3-16 months > Export > open `Dates.csv` and paste its contents.
- **Key URLs** (optional): pages that lost the most.
- Sitemap sample size (default 10), Googlebot comparison on/off, delay.

### Output

- Dataset: one row per site with `verdict`, `confidence`, `summary`, `nextSteps`, `dropDate`, `dropPct`, `dropShape`, `matchedUpdates`, `criticalFindings`, `topFixes`, plus every finding and page checked.
- `REPORT` record in the key-value store: a client-ready Markdown report.

### Pricing

**$0.03 per site checked** (pay per event). Mistyped or unreachable sites and empty input are not charged. A typical check makes 10-15 polite requests.

### Polite and safe

Identifies itself as `CygnixTrafficDropCheck`, obeys robots.txt for its own crawling, waits between requests (default 1 s), samples at most 50 URLs. The Googlebot user-agent comparison is a single homepage request; turn it off for sites you do not manage. No logins, no paid APIs, no Google account access needed.

### FAQ

**Does it need access to my Search Console?** No. Paste the Dates export if you want the drop dated; without it the live checks still run.

**Was it the spam update? Should I disavow?** If the verdict is GOOGLE_RANKING_UPDATE for a spam update, the report explains that spam updates target practices on your own site (scaled content, link schemes, site reputation abuse), not spam links pointing at you.

**The site looks fine now but traffic died overnight.** You get PAST_OUTAGE_OR_MANUAL_ACTION with the exact Search Console screens to check (Crawl stats > Host status, Manual actions, Security issues). Live checks cannot see a problem that was fixed before the run.

**Why do Semrush/Ahrefs show a different drop?** They estimate traffic. Use Search Console numbers.

Also available as an AI agent skill on Agensi (Claude Code, Cursor, Codex). Questions or custom audits: info@cygnixlabs.com

### Changelog

- 0.1 (2026-10-30): first release.

# Actor input Schema

## `sites` (type: `array`):

Your site (or a client's, with permission), e.g. https://example.com. Add several for an agency sweep; each site is one charged check.

## `gscDatesCsv` (type: `string`):

Paste the contents of Dates.csv from Search Console > Performance > Export (columns Date, Clicks, Impressions, CTR, Position). Used to date the drop and match it to Google updates.

## `keyUrls` (type: `array`):

Checked in addition to the homepage and the sitemap sample.

## `sampleUrls` (type: `integer`):

How many URLs from the sitemap to check besides the homepage (spread across the sitemap). Max 50.

## `compareGooglebot` (type: `boolean`):

One extra homepage request with a Googlebot user-agent to catch hacked sites that show spam only to Google. Turn off for sites you do not manage.

## `delaySecs` (type: `number`):

Polite crawling; robots.txt is always respected.

## Actor input object example

```json
{
  "sites": [
    "https://cygnixlabs.com"
  ],
  "sampleUrls": 10,
  "compareGooglebot": true,
  "delaySecs": 1
}
```

# Actor output Schema

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

No description

## `report` (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 = {
    "sites": [
        "https://cygnixlabs.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cygnix_labs/traffic-drop-emergency-check").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 = { "sites": ["https://cygnixlabs.com"] }

# Run the Actor and wait for it to finish
run = client.actor("cygnix_labs/traffic-drop-emergency-check").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 '{
  "sites": [
    "https://cygnixlabs.com"
  ]
}' |
apify call cygnix_labs/traffic-drop-emergency-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cygnix_labs/traffic-drop-emergency-check"
        }
    }
}
```

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/nE7qrZrj9etfXSq6i/builds/6uf0mYpav6yusMgln/openapi.json
