# Faceted Navigation Auditor (`junipr/faceted-navigation-auditor`) Actor

Identify faceted navigation crawl traps, parameter bloat, indexability risks, and filter-path issues.

- **URL**: https://apify.com/junipr/faceted-navigation-auditor.md
- **Developed by:** [junipr](https://apify.com/junipr) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.90 / 1,000 page auditeds

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/platform/actors/running/actors-in-store#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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Faceted Navigation Auditor

<!-- FIXED_INCLUSIVE_PPE_20260707_START -->
### Store Positioning

**Store title:** Faceted Navigation Auditor

**Short description:** Identify faceted navigation crawl traps, parameter bloat, indexability risks, and filter-path issues.

**SEO title:** Faceted Navigation Auditor — technical SEO, web, and domain audit

**SEO description:** Identify faceted navigation crawl traps, parameter bloat, indexability risks, and filter-path issues. Use it to find crawlability, indexability, security, metadata, and page-quality issues with evidence-backed rows and audit reports.

**Categories:** SEO_TOOLS

**Keywords:** faceted, navigation, auditor, web/domain audit

### Fixed-Inclusive PPE Pricing

This actor uses pay-per-event pricing. Event prices include Apify platform usage; users are not expected to pay a separate platform-usage pass-through charge for the configured pricing model.

- Tier: W1 — Web/domain audit
- Primary event: `page-audited` at $0.00490 base
- Default max charge: $10.00
- Store discounts: FREE/BRONZE base, SILVER discounted, GOLD deepest approved discount

Event set:

- `actor-start`: base $0.00500, GOLD $0.00400. Faceted Navigation Auditor: charged when actor start is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `page-audited`: base $0.00490, GOLD $0.00392. Faceted Navigation Auditor: charged when page audited is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `record-extracted`: base $0.00372, GOLD $0.00298. Faceted Navigation Auditor: charged when record extracted is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `finding-emitted`: base $0.00372, GOLD $0.00298. Faceted Navigation Auditor: charged when finding emitted is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `audit-report-generated`: base $0.05000, GOLD $0.04000. Faceted Navigation Auditor: charged when audit report generated is completed. The price includes Apify platform usage; no separate usage pass-through is intended.

### Public Task Concepts

- Audit Faceted Navigation controls on a capped public sample
- Find high-priority Faceted Navigation issues before release
- Validate Faceted Navigation evidence from supplied pages
- Prioritize Faceted Navigation fixes with severity and proof
- Export Faceted Navigation QA rows for client review
<!-- FIXED_INCLUSIVE_PPE_20260707_END -->
Audit parameterized navigation URLs for crawl traps and indexation risk.

### What This Actor Does

Faceted Navigation Auditor parses each supplied URL and classifies facet, control, tracking, and session parameters. It detects duplicate keys, reads canonical and robots evidence from metadata or HTML, evaluates whether a faceted URL is indexable, and estimates combination growth from supplied facet option counts.

Each dataset row includes a `facetedRows` evidence object with parameter classifications, canonical policy, noindex state, unapproved indexable parameters, and bounded combination potential.

### What This Actor Does Not Do

- It does not crawl every filter combination or modify robots, canonical, or application routing rules.
- It does not decide which filtered landing pages have search demand.
- It does not render JavaScript; provide captured HTML when canonical or robots tags are client-rendered.
- Combination estimates depend on the supplied `optionCounts` values.

### Best Use Cases

- ecommerce and marketplace filter QA
- migration checks for canonical and noindex policy
- session, tracking, and duplicate-parameter detection
- crawl-budget triage before launch
- evidence exports for SEO and engineering teams

### Input Fields

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `records` | array | two built-in records | Parameterized URLs plus policy metadata or HTML. |
| `urls` | array | `[]` | Explicit URLs; these override schema-populated defaults. |
| `fetchUrls` | boolean | `false` | Fetch HTML for canonical and robots evidence. |
| `fetchTimeoutMs` | integer | `12000` | Per-request timeout, capped at 30 seconds. |
| `includeReport` | boolean | `true` | Writes JSON and Markdown report artifacts. |
| `maxItems` | integer | `2` | Result cap; maximum 50. |
| `maxTextBytes` | integer | `500000` | HTML/text cap per record. |

Policy metadata fields include `canonical`, `robots`, `noindex`, `indexable`, `allowedIndexableParameters`, `optionCounts`, and optional `html`.

### Example Input

```json
{
  "records": [
    {
      "sourceId": "shoe-facets",
      "sourceUrl": "https://shop.example.com/shoes?color=black&size=10&brand=acme&sort=price&utm_source=email",
      "metadata": {
        "canonical": "https://shop.example.com/shoes",
        "robots": "noindex,follow",
        "optionCounts": {"color": 12, "size": 18, "brand": 40}
      }
    }
  ],
  "maxItems": 1,
  "includeReport": true
}
````

### Output Evidence

The result reports normalized URL evidence and findings such as `facet-parameter-bloat`, `indexable-combination`, `canonical-missing`, `canonical-target-risk`, `indexable-pagination`, `duplicate-parameters`, `tracking-parameters`, `session-parameter`, and `combination-explosion`.

### Cost Control

- Start with representative high-value category URLs.
- Supply canonical and robots metadata directly when already collected.
- Keep option counts bounded to the facets under review.
- Disable report artifacts when only dataset rows are needed.

### Public Task Examples

- inspect one category's canonical and indexation policy
- classify facet, control, tracking, and session keys
- estimate filter-combination growth from option counts
- prioritize crawl-trap findings before release
- export normalized faceted URL evidence

### Limitations

This actor performs record-level URL and supplied-HTML analysis. Sitewide crawl discovery, rendered DOM inspection, log-file crawl frequency, search demand, and index coverage require separate data sources.

### Source And Safety Notes

Use public or permissioned URLs. Do not include authenticated session URLs, credentials, or private customer identifiers. Session parameters are flagged for removal from crawlable links.

### Changelog

- 2026-07-10: Added parameter classification, canonical/noindex policy, duplicate-key, session-key, and combination-growth evidence with expanded regression coverage.

# Actor input Schema

## `records` (type: `array`):

Records, snapshots, or source observations to process. Defaults to a tiny deterministic fixture.

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

Optional URLs reserved for live fetching when Fetch URLs is true.

## `fetchUrls` (type: `boolean`):

Fetch sourceUrl text over HTTP. Default is false for deterministic local runs.

## `fetchTimeoutMs` (type: `integer`):

Timeout for each bounded HTTP request.

## `watchTerms` (type: `array`):

Keywords or topics used to flag relevant records.

## `includeReport` (type: `boolean`):

Write JSON and Markdown report artifacts to the key-value store.

## `maxItems` (type: `integer`):

Maximum records to process in one run.

## `maxTextBytes` (type: `integer`):

Maximum searchable text bytes per record.

## `dryRun` (type: `boolean`):

Validate input and write a dry-run summary without PPE charges or dataset output.

## `debug` (type: `boolean`):

Enable debug logging.

## Actor input object example

```json
{
  "records": [
    {
      "sourceId": "facet-safe",
      "sourceUrl": "https://example.com/shoes?color=blue",
      "title": "Simple color facet canonicalized",
      "description": "Facet has one parameter and canonical metadata.",
      "category": "facets",
      "keywords": [
        "facet"
      ],
      "metadata": {
        "url": "https://example.com/shoes?color=blue",
        "parameterCount": 1,
        "indexable": false,
        "canonical": "https://example.com/shoes"
      }
    },
    {
      "sourceId": "facet-risk",
      "sourceUrl": "https://example.com/shoes?color=blue&size=9&brand=x&sort=price&page=8",
      "title": "Faceted URL crawl trap",
      "description": "parameter bloat crawl trap with indexable true marker.",
      "category": "facets",
      "keywords": [
        "parameter",
        "crawl trap"
      ],
      "metadata": {
        "url": "https://example.com/shoes?color=blue&size=9&brand=x&sort=price&page=8",
        "parameterCount": 5,
        "indexable": true
      }
    }
  ],
  "urls": [],
  "fetchUrls": false,
  "fetchTimeoutMs": 12000,
  "watchTerms": [
    "facet",
    "parameter",
    "crawl trap"
  ],
  "includeReport": true,
  "maxItems": 2,
  "maxTextBytes": 500000,
  "dryRun": false,
  "debug": false
}
```

# Actor output Schema

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

Structured result rows in the default dataset.

## `summary` (type: `string`):

Summary JSON in the key-value store when includeReport is enabled.

## `markdownReport` (type: `string`):

Markdown report in the key-value store when includeReport is enabled.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/faceted-navigation-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("junipr/faceted-navigation-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call junipr/faceted-navigation-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=junipr/faceted-navigation-auditor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Faceted Navigation Auditor",
        "description": "Identify faceted navigation crawl traps, parameter bloat, indexability risks, and filter-path issues.",
        "version": "1.0",
        "x-build-id": "9ZgbOie23b1NBkfKv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~faceted-navigation-auditor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-faceted-navigation-auditor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/junipr~faceted-navigation-auditor/runs": {
            "post": {
                "operationId": "runs-sync-junipr-faceted-navigation-auditor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/junipr~faceted-navigation-auditor/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-faceted-navigation-auditor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "records": {
                        "title": "Records To Check",
                        "type": "array",
                        "description": "Records, snapshots, or source observations to process. Defaults to a tiny deterministic fixture.",
                        "items": {
                            "type": "object"
                        },
                        "default": [
                            {
                                "sourceId": "facet-safe",
                                "sourceUrl": "https://example.com/shoes?color=blue",
                                "title": "Simple color facet canonicalized",
                                "description": "Facet has one parameter and canonical metadata.",
                                "category": "facets",
                                "keywords": [
                                    "facet"
                                ],
                                "metadata": {
                                    "url": "https://example.com/shoes?color=blue",
                                    "parameterCount": 1,
                                    "indexable": false,
                                    "canonical": "https://example.com/shoes"
                                }
                            },
                            {
                                "sourceId": "facet-risk",
                                "sourceUrl": "https://example.com/shoes?color=blue&size=9&brand=x&sort=price&page=8",
                                "title": "Faceted URL crawl trap",
                                "description": "parameter bloat crawl trap with indexable true marker.",
                                "category": "facets",
                                "keywords": [
                                    "parameter",
                                    "crawl trap"
                                ],
                                "metadata": {
                                    "url": "https://example.com/shoes?color=blue&size=9&brand=x&sort=price&page=8",
                                    "parameterCount": 5,
                                    "indexable": true
                                }
                            }
                        ]
                    },
                    "urls": {
                        "title": "URLs To Fetch",
                        "type": "array",
                        "description": "Optional URLs reserved for live fetching when Fetch URLs is true.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "fetchUrls": {
                        "title": "Fetch URLs",
                        "type": "boolean",
                        "description": "Fetch sourceUrl text over HTTP. Default is false for deterministic local runs.",
                        "default": false
                    },
                    "fetchTimeoutMs": {
                        "title": "Fetch Timeout (ms)",
                        "minimum": 1000,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Timeout for each bounded HTTP request.",
                        "default": 12000
                    },
                    "watchTerms": {
                        "title": "Watch Terms",
                        "type": "array",
                        "description": "Keywords or topics used to flag relevant records.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "facet",
                            "parameter",
                            "crawl trap"
                        ]
                    },
                    "includeReport": {
                        "title": "Include Report Artifacts",
                        "type": "boolean",
                        "description": "Write JSON and Markdown report artifacts to the key-value store.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum records to process in one run.",
                        "default": 2
                    },
                    "maxTextBytes": {
                        "title": "Max Text Bytes",
                        "minimum": 100,
                        "maximum": 2000000,
                        "type": "integer",
                        "description": "Maximum searchable text bytes per record.",
                        "default": 500000
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Validate input and write a dry-run summary without PPE charges or dataset output.",
                        "default": false
                    },
                    "debug": {
                        "title": "Debug Logs",
                        "type": "boolean",
                        "description": "Enable debug logging.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
