# Website SEO Audit & Tech Stack Detector (`interconnected_seaport/website-seo-tech-audit`) Actor

Get a scored SEO audit and technology lookup for every URL first; then inspect title, meta tags, canonical, Open Graph, security headers, sitemap and 60+ technologies. Bulk results cost $0.01 per successful page.

- **URL**: https://apify.com/interconnected_seaport/website-seo-tech-audit.md
- **Developed by:** [Zenith Ops](https://apify.com/interconnected_seaport) (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

from $10.00 / 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/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

## Website SEO Audit & Tech Stack Detector

Get a scored, single-page SEO audit and a technology lookup for every URL. Results include meta tags, headings, canonical and Open Graph checks, security headers, robots/sitemap status, timing, issue codes, and 60+ detected technologies. This is an HTTP-only meta tag checker and technology lookup: no browser, crawling, link checking, or evasion.

### Use cases

- Agency bulk audits across client domains.
- Lead qualification by CMS, ecommerce, analytics, CDN, framework, and consent stack.
- A lightweight Wappalyzer or BuiltWith alternative with SEO findings and a score.

### Input

```json
{"urls":["https://www.scb.se","https://www.kth.se","https://www.nasa.gov"],"includeTechnologies":true}
```

`checkRobotsAndSitemap` and `respectRobotsTxt` default to true. Only the supplied pages are fetched. JavaScript is not executed; `likelyJsRendered` flags low-text HTML shells with multiple scripts.

### Output sample

```json
{"url":"https://example.com/","status":"ok","httpStatus":200,"score":76,"title":"Example Domain","metaDescription":null,"canonicalSelf":null,"likelyJsRendered":false,"wordCount":25,"technologies":[{"name":"Cloudflare","category":"CDN","evidence":"server: cloudflare"}],"issues":[{"severity":"warning","code":"missing_meta_description","message":"No meta description."}],"issueCounts":{"error":0,"warning":4,"info":7}}
```

### Score and issue codes

Scores start at 100. Errors subtract 15, warnings 6, and informational findings do not reduce the score. The complete issue-code set is: `not_https`, `noindex`, `missing_title`, `title_too_short`, `title_too_long`, `missing_meta_description`, `meta_description_short`, `meta_description_long`, `missing_h1`, `multiple_h1`, `missing_canonical`, `canonical_points_elsewhere`, `missing_viewport`, `missing_lang`, `incomplete_open_graph`, `images_missing_alt`, `thin_content`, `mixed_content`, `slow_response`, `large_html`, `no_compression`, `long_redirect_chain`, `no_structured_data`, `missing_hsts`, `missing_x_content_type_options`, `robots_txt_missing`, `sitemap_not_found`, and `no_favicon_link`.

### API

```js
const run = await fetch('https://api.apify.com/v2/acts/interconnected_seaport~website-seo-tech-audit/runs?token=YOUR_TOKEN', {method:'POST', headers:{'content-type':'application/json'}, body:JSON.stringify({urls:['https://www.scb.se'], includeTechnologies:true})});
console.log(await run.json());
```

Never commit API tokens; use an environment variable in real integrations.

### Cost

| Usage | Audit charges |
|---|---:|
| 100 successful pages | $1.00 |
| 1,000 successful pages | $10.00 |
| Actor start fee | Apify default (currently $0.00005) |

Only successful `ok` items emit the `url-audited` paid event. HTTP errors, blocks, invalid URLs, and non-HTML responses are not charged. Free-plan runs cap at 20 URLs.

### FAQ

**Does it render JavaScript?** No. It fetches static HTML. Use `likelyJsRendered` to identify pages where a browser audit may be useful.

**Why did I get `http_error`?** The origin returned a 4xx/5xx (429 and 403 commonly indicate a bot block). The actor reports the status and does not evade it.

**How is the score calculated?** Errors are -15, warnings -6, and info is -0 from a starting score of 100.

**Does it crawl?** No. It audits only the URLs supplied and makes only light robots/sitemap probes when enabled.

### Legal and responsible use

Respect each site's robots.txt and terms; `respectRobotsTxt` is enabled by default. The actor sends a transparent `WebsiteSeoAudit` user agent, does not bypass bot controls, and should be used only with permission. It collects public page metadata, not personal data; assess GDPR and other privacy obligations for your workflow.

# Actor input Schema

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

One per line, e.g. https://www.scb.se or example.se/produkter. Bare domains get https://. Only the given page is audited (no crawling). Local and private addresses are rejected.

## `checkRobotsAndSitemap` (type: `boolean`):

Report whether robots.txt exists and whether a sitemap is listed there or at /sitemap.xml (one or two extra light requests per site).

## `includeTechnologies` (type: `boolean`):

Detect CMS, frameworks, analytics, CDN, hosting, consent and payment tools from HTML, headers and cookies.

## `respectRobotsTxt` (type: `boolean`):

Skip pages that the site's robots.txt disallows for automated clients (reported as blocked_by_robots, not charged). Leave on unless you own the site.

## Actor input object example

```json
{
  "urls": [
    "https://www.scb.se",
    "https://www.kth.se",
    "https://www.nasa.gov"
  ],
  "checkRobotsAndSitemap": true,
  "includeTechnologies": true,
  "respectRobotsTxt": true
}
```

# Actor output Schema

## `audits` (type: `string`):

One item per URL: score, issues, on-page SEO fields, timing, security headers, robots/sitemap and detected technologies.

# 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": [
        "https://www.scb.se",
        "https://www.kth.se",
        "https://www.nasa.gov"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("interconnected_seaport/website-seo-tech-audit").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": [
        "https://www.scb.se",
        "https://www.kth.se",
        "https://www.nasa.gov",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("interconnected_seaport/website-seo-tech-audit").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": [
    "https://www.scb.se",
    "https://www.kth.se",
    "https://www.nasa.gov"
  ]
}' |
apify call interconnected_seaport/website-seo-tech-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,interconnected_seaport/website-seo-tech-audit"
        }
    }
}
```

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/HrgXhA5tG04GDuRR3/builds/h5aMlmt5SMGN9BXWk/openapi.json
