# WIE — Web Design Opportunity Finder (`overbifrost/wie-web-design-opportunity-finder`) Actor

Find local businesses with evidence-backed website opportunities. WIE discovers businesses or analyzes your list with bounded deterministic checks. WIE bills only conclusive evaluations; inconclusive results are not billed

- **URL**: https://apify.com/overbifrost/wie-web-design-opportunity-finder.md
- **Developed by:** [Lasse](https://apify.com/overbifrost) (community)
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 business evaluateds

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

## WIE — Web Design Opportunity Finder

**Find local businesses with evidence-backed website opportunities.**

WIE can discover businesses itself from Google Maps using the reusable WIE Maps engine, then check each business website with bounded deterministic probes. Or you can supply your own prospect list.

Each result states what WIE observed, what deterministic rule matched, what evidence supports it, what scope was checked and what remains unknown.

### Quick start

#### Find businesses automatically

1. Enter a **Business type** such as `plumber`, `dentist` or a local-language equivalent.
2. Enter a **Location**.
3. Choose the maximum number of businesses.
4. Run.

Discovery happens inside this Actor through WIE's own Maps capability. WDOF does not start a separate Compass or Maps Actor.

#### Analyze my own list

Choose **Analyze my own list** and either:

- add website rows in the form; or
- select an Apify Dataset whose rows contain `website`.

Selected Dataset access is READ-only.

### Opportunity statuses

| Status | Meaning |
| --- | --- |
| `CONFIRMED_OPPORTUNITY` | At least one qualifying deterministic finding was confirmed with evidence. |
| `NO_CONFIRMED_OPPORTUNITY_IN_CHECKED_SCOPE` | Required checks completed over their bounded scope and no qualifying finding was confirmed. |
| `SOURCE_ONLY_OPPORTUNITY` | The checked Maps source record supplied no website link. This is not proof that the business has no website elsewhere. |
| `INCONCLUSIVE` | Required coverage was insufficient because of blocking, network failure, unsupported content or another explicit limitation. |

WIE does not promise that an opportunity converts into a customer.

### What WIE checks

For a business website WIE uses bounded HTTP checks for:

- homepage retrieval, redirects and status;
- HTTPS/TLS acquisition and safe HTTP -> HTTPS behavior where testable;
- missing/empty title;
- viewport meta;
- mixed-content references in served HTML;
- up to two contact-page candidates;
- a deterministic sample of up to ten same-site internal links;
- selected repeat confirmation before high-value failure findings.

A CAPTCHA/interstitial page is not treated as the intended page.

#### Not included

- visual design grading;
- browser rendering of the business website;
- screenshots;
- Lighthouse/Core Web Vitals;
- complete SEO/accessibility audit;
- form submission;
- "outdated website" or "bad design" guesses;
- contact enrichment/outreach/CRM;
- AI pitches.

### Discovery behavior

WIE Maps returns explicit source states such as COMPLETE, ZERO\_RESULTS, PARTIAL, BLOCKED and FAILED.

Partial discovery may still contain valid businesses; limitations remain visible. A block or failure is never silently converted to zero results.

If the checked Maps source record has no `website`, WIE may return a source-only opportunity but does not search the wider web for a replacement domain.

Advanced discovery options include language/locale and proxy strategy. Residential proxy routing is an explicit choice; AUTO never silently selects it.

### Billing

WDOF uses one pay-per-event unit: `business-evaluated`.

A persisted conclusive result may be charged for:

- `CONFIRMED_OPPORTUNITY`;
- `NO_CONFIRMED_OPPORTUNITY_IN_CHECKED_SCOPE`;
- `SOURCE_ONLY_OPPORTUNITY`.

`INCONCLUSIVE` is not charged.

First-party discovery is part of this Actor run; there is no separate child-Actor discovery charge and WDOF does not emit the standalone Maps Actor's `business-scraped` event.

The Store page shows the live event price when pricing is activated. This release candidate does not encode or activate a final price in source.

### Output

Default Dataset: one row per normalized business with:

- business/source context;
- qualification;
- chargeability;
- coverage;
- findings/advisories;
- diagnostics;
- limitations;
- bounded inline evidence and provenance.

KVS includes:

- `RUN_SUMMARY`;
- `EVIDENCE_MANIFEST`;
- `CHARGE_JOURNAL`.

Evidence is bounded inline rather than arbitrary full-site snapshots.

### API fields

| Field | Mode | Notes |
| --- | --- | --- |
| `mode` | both | `discover` or `direct` |
| `searchTerm` | discover | one business type, 2–100 chars |
| `location` | discover | one location, 2–200 chars |
| `maxPlaces` | discover | 1–200, runtime default 50 |
| `discoveryLanguage` | discover | locale such as `en`, `nb-NO`, `de-DE` |
| `discoveryProxyStrategy` | discover | AUTO, NONE, datacenter or explicit residential |
| `targets` | direct | up to 500 `{website, businessName?, externalId?}` rows |
| `sourceDatasetId` | direct | READ-only selected Dataset |
| `maxConcurrentlyAnalyzedBusinesses` | both | 1–20 website analyses in parallel |

# Actor input Schema

## `mode` (type: `string`):

Choose whether WIE should discover local businesses automatically or analyze businesses you provide.

## `searchTerm` (type: `string`):

Business type or search term, for example plumber, dentist, electrician, or accountant.

## `location` (type: `string`):

City, region, or area to search.

## `maxPlaces` (type: `integer`):

Maximum number of businesses to discover and evaluate (1-200). Runtime default: 50.

## `targets` (type: `array`):

Add one row per business. Only Website is required. Maximum 500 entries.

## `sourceDatasetId` (type: `string`):

Select a dataset whose rows contain 'website'; optional 'businessName' and 'externalId' are carried through.

## `maxConcurrentlyAnalyzedBusinesses` (type: `integer`):

Maximum number of business websites checked in parallel (1-20).

## `discoveryLanguage` (type: `string`):

Optional Maps locale such as en, en-GB, nb-NO, de-DE, or fr-FR. Runtime default: en.

## `discoveryProxyStrategy` (type: `string`):

AUTO uses the normal configured Apify proxy route and never silently selects residential traffic. Residential is explicit.

## Actor input object example

```json
{
  "mode": "discover",
  "searchTerm": "dentist",
  "location": "London, UK",
  "maxPlaces": 25
}
```

# Actor output Schema

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

No description

## `runSummary` (type: `string`):

No description

## `evidenceManifest` (type: `string`):

No description

## `chargeJournal` (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 = {
    "searchTerm": "dentist",
    "location": "London, UK",
    "maxPlaces": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("overbifrost/wie-web-design-opportunity-finder").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 = {
    "searchTerm": "dentist",
    "location": "London, UK",
    "maxPlaces": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("overbifrost/wie-web-design-opportunity-finder").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 '{
  "searchTerm": "dentist",
  "location": "London, UK",
  "maxPlaces": 25
}' |
apify call overbifrost/wie-web-design-opportunity-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,overbifrost/wie-web-design-opportunity-finder"
        }
    }
}
```

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/Atvr00LOlFsCg99Vb/builds/sODgDgr0qYVBGaTvg/openapi.json
