# Branded Search Reputation Snapshot (`junipr/branded-search-reputation-snapshot`) Actor

Snapshot branded search results and classify visible reputation signals such as reviews, profiles, complaints, social results, news, competitor...

- **URL**: https://apify.com/junipr/branded-search-reputation-snapshot.md
- **Developed by:** [junipr](https://apify.com/junipr) (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 $11.50 / 1,000 branded query snapshot analyzeds

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?

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Branded Search Reputation Snapshot

Convert captured branded search results into a structured inventory of owned assets, known profiles, review pages, news, social properties, neutral results, and visible reputation-risk terms. Every classification retains the result URL and human-readable evidence that produced it.

### What you get

Each visible result becomes a dataset row with:

- brand query and result position;
- result URL and normalized domain;
- asset type: `owned`, `known_profile`, `review`, `news`, `social`, or `organic`;
- owned-asset flag;
- reputation signal classification;
- transparent positive, negative, mixed, or neutral keyword hint;
- visible-rating flag;
- reputation-risk flag and recommended action;
- source URL, issue code, evidence excerpt, scan time, and severity.

With `includeReport` enabled, the actor writes a Markdown summary, CSV export, issue JSON, evidence JSON, and run metadata to the default key-value store.

### Input choices

Use `serpHtmlInputs` or `htmlInputs` for captured branded-result HTML. Each object should include `query`, `sourceUrl`, and `html`. The parser recognizes explicitly marked result cards and extracts their linked title, snippet, domain, result type, position, and visible rating.

You can also provide explicit public `startUrls`. Requests are restricted to the URLs you submit and may be constrained with `allowedDomains`. The actor does not expand the run by following links found in result cards.

Classification controls:

- `brandQueries`: query context associated with supplied snapshots.
- `ownedDomains`: domains classified as controlled assets.
- `knownProfileDomains`: expected third-party profile hosts.
- `sentimentTerms.negative` and `.positive`: visible keyword lists used as transparent hints.
- `includeSerpFeatures`: include or exclude cards explicitly marked as non-organic features.
- `maxResultsPerQuery`, `maxBrands`, `maxQueries`, `maxSnapshots`: bound accepted evidence and output.
- `includeEvidence`: include or suppress excerpts.
- `includeRawSnapshots`: opt in to capped source HTML storage.
- `maxChargeUsd`: stop before a paid event would exceed your ceiling.

### Example input

```json
{
  "brandQueries": ["junipr"],
  "serpHtmlInputs": [
    {
      "query": "junipr",
      "sourceUrl": "https://example.com/serp/junipr",
      "html": "<article class=\"serp-result\" data-rank=\"1\"><a href=\"https://junipr.io/\">junipr official SEO tools</a><p>Official evidence-backed automation.</p></article><article class=\"serp-result\" data-rank=\"2\"><a href=\"https://ratings.example/junipr\">junipr reviews</a><p>Trusted customer reviews rating 4.7</p></article><article class=\"serp-result\" data-rank=\"3\"><a href=\"https://complaints.example/junipr\">junipr complaint report</a><p>Customer complaint discussion.</p></article>"
    }
  ],
  "ownedDomains": ["junipr.io"],
  "knownProfileDomains": ["linkedin.com", "crunchbase.com"],
  "sentimentTerms": {
    "negative": ["complaint", "fraud", "lawsuit"],
    "positive": ["official", "trusted", "award"]
  },
  "includeSerpFeatures": true,
  "maxResultsPerQuery": 10,
  "maxBrands": 1,
  "maxQueries": 5,
  "maxSnapshots": 5,
  "includeReport": true,
  "maxChargeUsd": 35
}
```

### Example output

```json
{
  "recordType": "branded_search_reputation_snapshot",
  "recordName": "junipr official SEO tools",
  "issueCode": "branded_search_reputation_snapshot_ok",
  "severity": "low",
  "brandQuery": "junipr",
  "resultPosition": 1,
  "resultUrl": "https://junipr.io/",
  "resultDomain": "junipr.io",
  "assetType": "owned",
  "ownedAsset": true,
  "reputationSignal": "owned_result",
  "sentimentHint": "positive_keyword_hint",
  "reviewRatingVisible": false,
  "riskFlag": false,
  "recommendedAction": "Maintain this owned asset and monitor its position.",
  "sourceUrl": "https://example.com/serp/junipr",
  "scannedAt": "2026-07-10T12:00:00.000Z"
}
```

### Classification semantics

Owned and known-profile classification is based on normalized hostnames you provide. Review classification uses visible review or rating language and common result patterns. News and social classification relies on visible text, explicit result type, or recognized social hosts. All remaining linked cards are retained as organic results.

Sentiment is intentionally described as a keyword hint. A negative-term match creates a risk flag because an analyst may need to inspect it, but the actor does not assert that the underlying claim is true. A positive-term match is likewise not an endorsement. Mixed positive and negative terms remain mixed. The result URL and excerpt are retained so decisions can be based on source evidence.

Empty HTML, unsupported layouts, and access-denied or challenge content produce diagnostics instead of reputation conclusions. Sponsored cards are excluded when they are explicitly marked in the supplied HTML.

### Pay-per-event pricing

Platform usage pass-through is off. The actor charges before writing associated paid output.

| Event | Price |
| --- | ---: |
| `actor-start` | $0.0350 |
| `branded-query-snapshot-analyzed` | $0.0115 |
| `reputation-signal-classified` | $0.0115 |
| `reputation-risk-emitted` | $0.0115 |
| `executive-report-generated` | $0.4000 |

The default maximum charge is $35. Setting the ceiling to zero prevents paid processing and output.

### Practical uses

- inventory owned assets visible for brand queries;
- track review, profile, news, and social-result coverage;
- flag result titles or snippets containing stated risk terms;
- compare branded-result composition across locations or dates;
- export a source-linked action list for reputation and communications teams.

### Limits

The actor analyzes provided observations; it does not validate third-party claims, calculate a general sentiment score, or infer the reputation of a person or business. HTML support depends on visible linked result cards. Use consistent query, locale, device, and collection method for comparisons over time.

# Actor input Schema

## `startUrls` (type: `array`):

Optional explicit public URLs; private and non-HTTP targets are rejected.

## `sitemapUrls` (type: `array`):

Optional permitted public sitemap URLs.

## `htmlInputs` (type: `array`):

Deterministic HTML objects with sourceId, sourceUrl, and query context.

## `allowedDomains` (type: `array`):

Optional hostname allowlist for network fetches.

## `maxPages` (type: `integer`):

Overall HTML target cap.

## `maxDepth` (type: `integer`):

Fixed at zero because discovered links are not crawled.

## `includeEvidence` (type: `boolean`):

Include source evidence excerpts in dataset rows.

## `includeRawSnapshots` (type: `boolean`):

Store capped raw HTML in key-value storage.

## `requestDelayMs` (type: `integer`):

Delay between permitted public fetches.

## `timeoutMs` (type: `integer`):

Per-request timeout in milliseconds.

## `userAgentMode` (type: `string`):

Standard or compatibility request header.

## `brandQueries` (type: `array`):

Brand queries associated with supplied snapshots.

## `serpHtmlInputs` (type: `array`):

Captured brand-query SERP HTML objects.

## `ownedDomains` (type: `array`):

Domains classified as owned assets.

## `knownProfileDomains` (type: `array`):

Expected third-party profile hosts.

## `sentimentTerms` (type: `object`):

Visible negative and positive keyword arrays used only as keyword hints.

## `includeSerpFeatures` (type: `boolean`):

Allow explicitly marked feature result cards.

## `maxResultsPerQuery` (type: `integer`):

Maximum visible result cards emitted per query.

## `maxBrands` (type: `integer`):

Maximum distinct brand groups processed.

## `maxQueries` (type: `integer`):

Maximum brand queries processed.

## `maxSnapshots` (type: `integer`):

Maximum supplied snapshots processed.

## `maxChargeUsd` (type: `number`):

Maximum accepted PPE spend before paid output stops.

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

Write Markdown, CSV, JSON evidence, and run metadata.

## Actor input object example

```json
{
  "startUrls": [],
  "sitemapUrls": [],
  "htmlInputs": [],
  "allowedDomains": [],
  "maxPages": 1,
  "maxDepth": 0,
  "includeEvidence": true,
  "includeRawSnapshots": false,
  "requestDelayMs": 250,
  "timeoutMs": 15000,
  "userAgentMode": "standard",
  "brandQueries": [
    "junipr"
  ],
  "serpHtmlInputs": [],
  "ownedDomains": [
    "junipr.io"
  ],
  "knownProfileDomains": [
    "linkedin.com",
    "crunchbase.com"
  ],
  "sentimentTerms": {
    "negative": [
      "complaint",
      "scam",
      "lawsuit"
    ],
    "positive": [
      "official",
      "trusted",
      "award"
    ]
  },
  "includeSerpFeatures": true,
  "maxResultsPerQuery": 10,
  "maxBrands": 1,
  "maxQueries": 1,
  "maxSnapshots": 1,
  "maxChargeUsd": 35,
  "includeReport": true
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/branded-search-reputation-snapshot").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/branded-search-reputation-snapshot").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 '{}' |
apify call junipr/branded-search-reputation-snapshot --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,junipr/branded-search-reputation-snapshot"
        }
    }
}
```

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/xx3c2AUOCmTWRo9tL/builds/3X7h6O7ud6bGyltsT/openapi.json
