# Digital Product Sales Page Offer Extractor (`chiaosone/digital-product-offer-extractor`) Actor

Extract buyer-visible product names, promises, deliverables, prices, purchase actions, delivery details, refund terms, and support paths from one public digital-product sales page or pasted copy. Every value includes exact evidence, while unstated facts remain empty and appear in missingFields.

- **URL**: https://apify.com/chiaosone/digital-product-offer-extractor.md
- **Developed by:** [Chiao One](https://apify.com/chiaosone) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 offer extracteds

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.

- **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

## Digital Product Sales Page Offer Extractor

Turn one public product page or pasted sales copy into structured offer JSON with exact source evidence. Use it to audit Gumroad, Payhip, Lemon Squeezy, course, template, starter-kit, prompt-pack, and boilerplate offers without inventing unstated claims.

### What does this digital product offer extractor do?

The Actor reads the buyer-visible text from one public HTTP/HTTPS page or from pasted copy. It extracts the product name, target buyer, promise, deliverables, visible prices, purchase actions, delivery details, requirements, refund terms, and support paths.

Every extracted value includes confidence and exact supporting evidence. When the page does not state a fact, the value stays empty and the field appears in `missingFields`. This makes the output useful for quality assurance, structured catalogs, comparison workflows, and agent tools that must distinguish source facts from assumptions.

### Why use it?

- **Audit before launch:** find missing buyer-facing facts before sending traffic to a sales page.
- **Normalize product catalogs:** convert inconsistent creator listings into a stable JSON shape.
- **Ground an AI workflow:** give an API, webhook, or MCP client evidence-backed offer facts instead of generated summaries.
- **Review client pages:** let an agency compare what a seller intended to communicate with what the page actually states.
- **Monitor offer changes:** schedule repeated runs and compare structured outputs in your own workflow.

This is not a generic retail scraper and it does not rewrite the page. It focuses on the offer a buyer can verify.

### Input

Provide either:

1. one public HTTP/HTTPS product-page URL; or
2. up to 200,000 characters of buyer-visible pasted text.

Pasted text takes precedence when both are supplied. The included Store example uses pasted first-party sample copy, so a first run does not depend on a third-party website.

```json
{
  "text": "Creator Workflow Kit for solo consultants. Includes 12 checklists and three client handoff templates. Launch price: $19. Download immediately after purchase. Email support is included."
}
```

### Output

One successful run returns one dataset record containing:

- product name and target buyer;
- promise and deliverables;
- visible prices and purchase actions;
- delivery details and requirements;
- refund terms and support paths;
- confidence and exact evidence for each extracted value;
- a `missingFields` list for facts the page does not state.

Example shape:

```json
{
  "productName": {
    "value": "Creator Workflow Kit",
    "evidence": "Creator Workflow Kit for solo consultants."
  },
  "prices": [
    {
      "value": "$19",
      "evidence": "Launch price: $19."
    }
  ],
  "missingFields": ["refundTerms"]
}
```

Missing values remain empty. The Actor does not invent sales claims or treat a generic navigation label as a purchase action.

### Run it as an API or automation

Use the Apify Console, API, scheduled Tasks, webhooks, Google Sheets integrations, Make, n8n, or an Apify MCP connection. The input and dataset schemas keep the same top-level contract for URL and pasted-text modes.

A successful dataset delivery emits one pay-per-event `offer-extracted` event. Failed, rejected, or empty extractions deliver no paid result. Review current pricing on the Actor's Pricing tab before running it.

### Common workflows

#### Audit a Gumroad or Payhip page

Submit the public listing URL. Review `missingFields` first, then inspect the exact evidence for prices, deliverables, purchase actions, delivery, refunds, and support.

#### Check a draft before publishing

Paste the draft sales copy. This avoids exposing a private preview URL and shows which buyer-facing facts are still absent.

#### Feed a catalog or agent

Send the dataset record to your database, webhook, spreadsheet, or MCP workflow. Use the evidence fields to preserve traceability.

### Limits and safety

- One public page or pasted text per run
- No login, CAPTCHA, paywall, or access-control bypass
- No private, local, or credential-bearing URLs
- No proxy rotation
- No legal, compliance, or claim-verification advice
- Not affiliated with the page, seller, marketplace, or platform being analyzed

If a public page blocks automated access, use pasted buyer-visible copy that you are authorized to process.

### Troubleshooting

**The result is empty:** confirm the page contains buyer-visible offer text, or use pasted text.

**A field is missing:** the page may not state it. Check `missingFields` and the evidence entries before assuming an extraction error.

**The URL is rejected:** only public HTTP/HTTPS pages are accepted. Local, private-network, credential-bearing, and non-HTML targets are rejected by design.

**The website changes:** rerun the Actor and compare the new dataset record in your own storage or monitoring workflow.

# Actor input Schema

## `url` (type: `string`):

One public HTTP or HTTPS product page. Private networks, credentials, paywalls, and login-only pages are blocked.

## `pageText` (type: `string`):

Buyer-visible copy. When supplied, this text takes priority over the URL.

## `pageTitle` (type: `string`):

Optional title for pasted text.

## `productCategory` (type: `string`):

Optional context such as template, course, software, printable, or toolkit.

## Actor input object example

```json
{
  "pageText": "Built for local business owners who want more customer reviews without designing signs from scratch. Includes 12 printable QR signs, editable SVG files, a review request checklist, and three completed examples. Instant ZIP download after checkout. Requires a PDF reader. USD 9.99. No refunds on digital downloads. Email support is included. Buy now.",
  "pageTitle": "Local Review Growth Kit"
}
```

# Actor output Schema

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

No description

## `files` (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 = {
    "pageText": "Built for local business owners who want more customer reviews without designing signs from scratch. Includes 12 printable QR signs, editable SVG files, a review request checklist, and three completed examples. Instant ZIP download after checkout. Requires a PDF reader. USD 9.99. No refunds on digital downloads. Email support is included. Buy now.",
    "pageTitle": "Local Review Growth Kit"
};

// Run the Actor and wait for it to finish
const run = await client.actor("chiaosone/digital-product-offer-extractor").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 = {
    "pageText": "Built for local business owners who want more customer reviews without designing signs from scratch. Includes 12 printable QR signs, editable SVG files, a review request checklist, and three completed examples. Instant ZIP download after checkout. Requires a PDF reader. USD 9.99. No refunds on digital downloads. Email support is included. Buy now.",
    "pageTitle": "Local Review Growth Kit",
}

# Run the Actor and wait for it to finish
run = client.actor("chiaosone/digital-product-offer-extractor").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 '{
  "pageText": "Built for local business owners who want more customer reviews without designing signs from scratch. Includes 12 printable QR signs, editable SVG files, a review request checklist, and three completed examples. Instant ZIP download after checkout. Requires a PDF reader. USD 9.99. No refunds on digital downloads. Email support is included. Buy now.",
  "pageTitle": "Local Review Growth Kit"
}' |
apify call chiaosone/digital-product-offer-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/0K28GuJm6tEe1RDXh/builds/LJgBRPnSAfUvxKARe/openapi.json
