# LoomIQ Product Price Sheet (`merciful_goldenlarch/product-offer-evidence`) Actor

Turn permitted product links into a spreadsheet of declared prices and stock, with source links and warnings for missing or ambiguous data. Static Product JSON-LD; no browser rendering.

- **URL**: https://apify.com/merciful_goldenlarch/product-offer-evidence.md
- **Developed by:** [LoomIQ](https://apify.com/merciful_goldenlarch) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product observations

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## LoomIQ Product Price Sheet 🦉

Turn permitted product links into a price spreadsheet, with warnings for missing or ambiguous data.

Download declared prices, currencies, stock information and product identifiers, with source links, capture times and review flags. The quality report identifies failed URLs and unsupported data.

### Start in three steps

1. **Add your product links.** Use up to 20 public HTTPS URLs and put each exact hostname in `allowedHosts`. Include subdomains separately; `shop.example.com` and `example.com` are different hosts.
2. **Confirm your permission and costs.** Check `permissionConfirmed` only for pages you are authorized to retrieve; robots rules alone do not establish permission. Review pricing and set a run-cost limit.
3. **Run, review, download.** Open the run's **Output** table and use **Export** for a spreadsheet, or open **Storage → Key-value store** for `RESULTS.csv`, `OUTPUT` (JSON) and `REPORT.html`. Check the warnings before using a price.

You can start with this Books to Scrape demo, which explicitly permits scraping. Its prices are randomly assigned demonstration values.

```json
{
  "urls": [
    "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
    "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"
  ],
  "allowedHosts": ["books.toscrape.com"],
  "permissionConfirmed": true
}
```

Recorded demo output from October 17, 2026:

| Product | Price | Currency | Stock declared by demo |
| --- | --- | --- | --- |
| A Light in the Attic | 51.77 | GBP | In stock (22 available) |
| Tipping the Velvet | 53.74 | GBP | In stock (20 available) |

These two demo pages have been tested in the cloud. They demonstrate the workflow, while compatibility with commercial shops remains unverified; the demo values are not commercial price evidence.

### What the price means

For supported shops, LoomIQ reads the machine-readable product data embedded in the returned page HTML, called Product JSON-LD. That declaration can differ from the price visible after a browser renders the page, the selected variant, or the current checkout total. Shipping, tax, discounts and product equivalence are not calculated or independently verified.

Output preserves declared product/offer IDs, color, size, seller and GTIN fields where supported. Same-page offer references, simple exact price specifications and exact offers inside aggregate offers are supported. Missing values stay missing; ranges, conflicts, conditional prices and past validity dates receive flags. Group-level brand information is not inherited into variant rows.

Each result includes its source URL, capture time and source hash, with the declared price field identified for JSON-LD offers. Multiple offers or variants can produce several rows. SKUs, GTINs and other identifiers remain unverified source declarations.

### Before you run your own links

Pages need supported Product JSON-LD in their returned HTML. Generic product HTML is unsupported, apart from the specific Books to Scrape demo adapter. LoomIQ does not execute JavaScript, use login cookies, follow cross-host redirects, bypass robots or access controls, or fetch linked JSON-LD references from other pages. URLs containing credentials, query strings or fragments, and private destinations, are refused. Some shops and query-selected variants will therefore be unsupported.

If results are empty or incomplete, open `REPORT.html` for the affected URLs and error reasons, then use `SUMMARY` and `ACTIONS.jsonl` in the same Key-value store for run details. Report reproducible problems through the Actor's **Issues** tab with the run ID, keeping credentials and private customer data out of the report.

### Pricing

**$1 per 1,000 product observations**, plus **$0.00005 per start** and separate Apify platform usage. An observation is a result row written to the run's default Dataset, so a URL with multiple offers can produce multiple charged rows. A start can incur its start charge even when extraction is refused or unsupported.

CSV, JSON, the HTML report and URL diagnostics are not separate charged product observations. Check the current **Pricing** tab and your run-cost limit before starting; there is no subscription or external model service required by the scraper.

# Actor input Schema

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

One to20 permitted public HTTPS product pages containing Product JSON-LD. No credentials, query strings or fragments.

## `allowedHosts` (type: `array`):

Exact website hosts you authorize, for example shop.example.com. List subdomains separately; only these hosts can be fetched.

## `permissionConfirmed` (type: `boolean`):

Prefilled as checked for the public Books to Scrape demonstration. If you change URLs, confirm your authorization before starting; robots rules alone do not establish permission.

## Actor input object example

```json
{
  "urls": [
    "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
    "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"
  ],
  "allowedHosts": [
    "books.toscrape.com"
  ],
  "permissionConfirmed": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `json` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (type: `string`):

No description

## `summary` (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 = {
    "urls": [
        "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
        "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"
    ],
    "allowedHosts": [
        "books.toscrape.com"
    ],
    "permissionConfirmed": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("merciful_goldenlarch/product-offer-evidence").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://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
        "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html",
    ],
    "allowedHosts": ["books.toscrape.com"],
    "permissionConfirmed": True,
}

# Run the Actor and wait for it to finish
run = client.actor("merciful_goldenlarch/product-offer-evidence").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://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
    "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"
  ],
  "allowedHosts": [
    "books.toscrape.com"
  ],
  "permissionConfirmed": true
}' |
apify call merciful_goldenlarch/product-offer-evidence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,merciful_goldenlarch/product-offer-evidence"
        }
    }
}
```

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/8s8N0OhoMjw6dB4J6/builds/r1ivn772D7r5dB9DU/openapi.json
