# AppSumo Scraper (`datascrapers/appsumo-scraper`) Actor

Scrape AppSumo software deals from browse, categories, new arrivals, Radar, or product URLs. Optional listing details, founder socials, and paginated reviews with pay-per-event charging.

- **URL**: https://apify.com/datascrapers/appsumo-scraper.md
- **Developed by:** [Farhan Ali](https://apify.com/datascrapers) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

**AppSumo Scraper** creates a structured dataset of software deal records collected from appsumo.com. Each dataset item represents one product deal and can include the name, listing URL, price, original price, rating, review count, category, deal type, plan types, and company details, with optional listing details, founder profiles, and paginated reviews. Query the source using a catalog source, category, keyword search, or a direct AppSumo URL, control the result limit with `maxItems`, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, or XML.

### Dataset at a glance

| Property | Value |
|---|---|
| Source | appsumo.com |
| Record unit | One software deal (product) |
| Input methods | `sources`, `category`, `subcategory`, `keywords`, `startUrls` |
| Main identifiers | `id`, `slug`, `url` |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML |
| Update model | Fresh records per Actor run |
| Pricing | $1.50 per 1,000 products |

### Coverage and available records

The Actor returns AppSumo deals from the current catalog, new arrivals, Radar, categories, keyword searches, or direct URLs. Supported coverage includes:

- Catalog sources: `current` (active deals), `newArrivals` (New Arrivals collection), and `radar` (AppSumo Radar).
- Category groups (`marketing`, `operations`, `build-code`, `media-design`, `sales-leads`, `customer-engagement`) with optional subcategory slugs.
- Keyword search filtering.
- Direct product, category, new-arrivals, Radar, or browse URLs via `startUrls`.
- Optional listing details (plans, FAQs, company info, overview) when `scrapeListingDetails` is enabled.
- Optional founder profiles (LinkedIn, Twitter/X, bio, website) when `includeFounderDetails` is enabled.
- Optional paginated customer reviews when `scrapeReviews` is enabled, capped by `maxReviews`.

Plans, FAQs, company info, and the full overview appear only when `scrapeListingDetails` is enabled; founder profiles appear only when `includeFounderDetails` is enabled.

### Data dictionary

| Field | Type | Nullable | Description | Example |
|---|---:|---|---|---|
| `id` | integer | No | AppSumo product identifier | `257904` |
| `slug` | string | No | Product slug | `"robinreach"` |
| `name` | string | No | Product name | `"RobinReach"` |
| `url` | string | No | AppSumo listing URL | `"https://appsumo.com/products/robinreach/"` |
| `source` | string | Yes | Discovery source | `"url"` |
| `listingType` | string | Yes | Listing type | `"product"` |
| `imageUrl` | string | Yes | Main product image URL | `"https://appsumo2-cdn.appsumo.com/..."` |
| `logoUrl` | string | Yes | Product logo URL | `"https://appsumo2-cdn.appsumo.com/..."` |
| `featuredImageUrl` | string | Yes | Featured image URL | `"https://appsumo2-cdn.appsumo.com/..."` |
| `price` | number | Yes | Deal price (USD) | `69` |
| `originalPrice` | number | Yes | Original price (USD) | `99` |
| `averageRating` | number | Yes | Average customer rating | `4.7` |
| `reviewCount` | integer | Yes | Total review count | `86` |
| `group` | string | Yes | Category group slug | `"marketing"` |
| `groupName` | string | Yes | Category group name | `"Marketing"` |
| `category` | string | Yes | Category slug | `"social-media"` |
| `subcategory` | string | Yes | Subcategory slug | `"social-media-management"` |
| `bestFor` | array | Yes | Recommended audiences | `["Small businesses", "Social media managers"]` |
| `dealType` | string | Yes | Deal type | `"Software"` |
| `planTypes` | array | Yes | Plan types | `["Lifetime Deal"]` |
| `isLabs` | boolean | Yes | Whether the deal is a Labs listing | `false` |
| `isMarketplace` | boolean | Yes | Whether the deal is a Marketplace listing | `false` |
| `status` | string | Yes | Deal status | `"current"` |
| `startDate` | string | Yes | Deal start timestamp | `"2026-07-24T12:02:32-05:00"` |
| `endDate` | string | Yes | Deal end timestamp | `"2026-08-21T12:00:00-05:00"` |
| `codesRemaining` | integer | Yes | Remaining deal codes | `0` |
| `productUrl` | string | Yes | Official product website | `"https://robinreach.com"` |
| `availability` | string | Yes | Availability text | `"in stock"` |
| `refundableDays` | integer | Yes | Refund window in days | `60` |
| `isActive` | boolean | Yes | Whether the deal is active | `true` |
| `currentStage` | string | Yes | Current deal stage | `"general access"` |
| `companySize` | string | Yes | Company size | `"1-10"` |
| `headquarters` | string | Yes | Headquarters location | `"London, UK"` |
| `foundedAt` | string | Yes | Founding date | `"2023-11-17"` |
| `productStage` | string | Yes | Product stage | `"Startup"` |
| `financialStage` | string | Yes | Financial stage | `"Bootstrapped"` |
| `isVerifiedCompany` | boolean | Yes | Whether the company is verified | `true` |
| `overviewHtml` | string | Yes | Product overview HTML, when details are enabled | `"<p>...</p>"` |
| `plans` | array | Yes | Pricing tiers, when details are enabled | `[...]` |
| `faqs` | array | Yes | Product FAQs, when details are enabled | `[...]` |
| `founders` | array | Yes | Founder profiles, when enabled | `[{"name": "...", "linkedinUrl": "..."}]` |
| `reviews` | array | Yes | Customer reviews, when enabled | `[...]` |

The most stable field for deduplication is `id` (falling back to `url`).

### Example dataset record

```json
{
  "id": 257904,
  "slug": "robinreach",
  "name": "RobinReach",
  "url": "https://appsumo.com/products/robinreach/",
  "price": 69,
  "originalPrice": 99,
  "averageRating": 4.7,
  "reviewCount": 86,
  "group": "marketing",
  "groupName": "Marketing",
  "category": "social-media",
  "subcategory": "social-media-management",
  "bestFor": ["Small businesses", "Social media managers", "Solopreneurs"],
  "dealType": "Software",
  "planTypes": ["Lifetime Deal"],
  "isLabs": false,
  "isMarketplace": false,
  "status": "current",
  "startDate": "2026-07-24T12:02:32-05:00",
  "endDate": "2026-08-21T12:00:00-05:00",
  "productUrl": "https://robinreach.com",
  "availability": "in stock",
  "refundableDays": 60,
  "isActive": true,
  "companySize": "1-10",
  "headquarters": "London, UK",
  "foundedAt": "2023-11-17",
  "productStage": "Startup",
  "financialStage": "Bootstrapped",
  "isVerifiedCompany": true
}
```

This record was produced from a product URL without listing details or reviews enabled.

### Query and input reference

| Input | Type | Required | Default | Accepted values | Description |
|---|---:|---|---|---|---|
| `startUrls` | array | No | none | AppSumo product, category, new-arrivals, Radar, or browse URLs | Direct URLs; when set, they override `sources`, `category`, and `keywords`. |
| `sources` | array | No | `["current"]` | `current`, `newArrivals`, `radar` | Catalog sources to scrape. |
| `category` | string | No | none | `marketing`, `operations`, `build-code`, `media-design`, `sales-leads`, `customer-engagement` | Category group. |
| `subcategory` | string | No | `social-media` | Subcategory slug | Subcategory under the selected category. |
| `keywords` | array | No | none | Free-text terms | Search terms to filter deals. |
| `maxItems` | integer | No | 10 | `0` (unlimited) or a positive integer | Maximum products to scrape. |
| `scrapeListingDetails` | boolean | No | `false` | `true` / `false` | Fetch plans, FAQs, company info, and overview. |
| `scrapeReviews` | boolean | No | `false` | `true` / `false` | Fetch paginated reviews per product. |
| `includeFounderDetails` | boolean | No | `false` | `true` / `false` | Extract founder profiles. |
| `maxReviews` | integer | No | `0` (all) | `0` or a positive integer | Maximum reviews per product. |
| `detailConcurrency` | integer | No | 5 | 1–15 | Parallel product enrichments. |
| `proxyConfiguration` | object | No | Apify Residential | Apify proxy settings | Proxy configuration. |

Minimal request:

```json
{
  "category": "marketing",
  "subcategory": "social-media",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

Advanced request with enrichment:

```json
{
  "keywords": ["social media"],
  "category": "marketing",
  "maxItems": 3,
  "scrapeListingDetails": true,
  "scrapeReviews": true,
  "includeFounderDetails": true,
  "maxReviews": 8,
  "detailConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Retrieve the data through the API

1. Start the Actor with a JSON input containing sources, category, keywords, or start URLs.
2. Wait for the run to finish, or use the synchronous run endpoint.
3. Retrieve items from the run's default dataset via the Dataset API.
4. Paginate the dataset or export it in the required format.

The Apify Console generates ready-to-run code for Python, JavaScript, and other languages in the Actor's API tab; see that tab for the current endpoint and authentication details. Never place a real API token in a URL or example.

### Data quality and record handling

- `plans`, `faqs`, `companySize`, `headquarters`, `overviewHtml`, and `founders` are conditional on the enabled toggles and on what AppSumo publishes.
- `price` and `originalPrice` are numeric USD values; `averageRating` is on a 0–5 scale.
- Within a run, products are deduplicated by `id`. Across runs, key on `id`.
- A product that fails to fetch is still written with listing-level fields; the Actor fails soft so one blocked product does not stop the run.
- Enable Apify Residential proxies (the default) and keep `detailConcurrency` modest to reduce blocks.

### Export and pipeline examples

| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL/Supabase | Dataset API or webhook consumer | Store deal records keyed on `id` |
| Google Sheets | Apify integration | Shareable deal-tracking sheet |
| S3/cloud storage | Scheduled export or integration | Periodic deal archive |

### Pricing and cost examples

Billing is pay-per-event. Each product written to the dataset is one `dataset-item` charge ($1.50 per 1,000); enabling listing details adds a `listing-details` charge, and enabling reviews adds a `reviews` charge, each $1.00 per 1,000. `apify-actor-start` is a small one-time per-run charge.

| Records | Estimated base cost |
|---:|---:|
| 1,000 products | $1.50 |
| 10,000 products | $15.00 |

Estimates assume the published pay-per-event model and do not include Apify platform usage; Apify subscription plan discounts may reduce the per-event rate. Enabling listing details or reviews increases cost per product.

### Limitations and responsible data use

- Only publicly accessible AppSumo listings are returned; plans, FAQs, and founder data require the corresponding toggles.
- Deal availability, pricing, and ratings reflect AppSumo at run time and change over time.
- Extraction depends on AppSumo's current availability and site structure, which can change without notice.
- No historical snapshots are stored unless the user archives dataset exports.
- Users are responsible for compliance with applicable terms of service and privacy obligations.

### Dataset questions

#### What does one dataset item represent?

One dataset item is a single AppSumo software deal (product), identified by `id`.

#### Which field should I use as a unique identifier?

Use `id`; it is unique per product and stable across runs.

#### Are fields nullable or conditional?

Yes. `plans`, `faqs`, `overviewHtml`, `founders`, and `reviews` are conditional on the enabled toggles; `price` and `averageRating` may be absent where AppSumo does not publish them.

#### Can I retrieve the records as CSV or JSON?

Yes. The dataset can be exported as JSON, CSV, Excel, or XML from the Apify Console or Dataset API.

#### How do I paginate large datasets?

Raise `maxItems` (set `0` for unlimited) to collect more records in a single run, then paginate via the Dataset API.

#### What counts as a billable result?

Each product record written to the dataset is one `dataset-item` charge; enabling listing details or reviews adds one charge per enriched product at the corresponding rate.

### Related datasets from Data Scrapers

- [Zapier Apps Scraper](https://apify.com/datascrapers/zapier-apps-scraper) — SaaS app directory records for adjacent SaaS-market research.
- [Clutch.co Company Scraper](https://apify.com/datascrapers/clutch-scraper) — B2B company profiles for vendor and market analysis.
- [Trustpilot Scraper](https://apify.com/datascrapers/trustpilot-scraper) — customer review records for reputation analysis.
- [LinkedIn Company Scraper](https://apify.com/datascrapers/linkedin-company-scraper) — company records for founder and firm enrichment.

### Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.

# Actor input Schema

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

Product, category, new arrivals, Radar, or browse URLs copied from appsumo.com (e.g. https://appsumo.com/products/robinreach/, https://appsumo.com/marketing/social-media/, https://appsumo.com/collections/new/, https://appsumo.com/a/radar/). When provided, these URLs are used and Catalog sources / Category below are ignored.

## `sources` (type: `array`):

Which AppSumo catalogs to scrape when no start URLs are provided. Radar is AppSumo's early-stage / labs listing. Ignored when AppSumo URLs are provided.

## `category` (type: `string`):

AppSumo category group to scrape (Software marketplace groups). Combined with Subcategory when set. Ignored when AppSumo URLs are provided.

## `subcategory` (type: `string`):

Optional subcategory slug under the selected category (e.g. social-media, seo-analytics, paid-ads, content-marketing, developer-tools). Leave empty for the whole category. Ignored when AppSumo URLs are provided.

## `keywords` (type: `array`):

Search terms to filter AppSumo deals, e.g. "social media", "email marketing", "SEO". Combined with Category and Subcategory when those are set. Ignored when AppSumo URLs are provided.

## `maxItems` (type: `integer`):

Maximum number of products to scrape (0 = unlimited)

## `scrapeListingDetails` (type: `boolean`):

Visit each product page and extract plans, FAQs, company info, and overview. Charged as listing-details in addition to each dataset item.

## `scrapeReviews` (type: `boolean`):

Fetch paginated customer reviews for each product. Charged as reviews in addition to each dataset item.

## `includeFounderDetails` (type: `boolean`):

Extract founder profiles including LinkedIn, Twitter/X, bio, and website. Uses the product page (LinkedIn is always present there) and the public founder profile.

## `maxReviews` (type: `integer`):

Maximum reviews to collect per product when Scrape reviews is enabled (0 = all available reviews).

## `detailConcurrency` (type: `integer`):

How many products to enrich in parallel when listing details, reviews, or founders are enabled. Higher is faster; keep it modest to avoid blocks.

## `proxyConfiguration` (type: `object`):

Proxy settings. Apify Residential proxies are recommended for reliable AppSumo access.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://appsumo.com/marketing/social-media/"
    }
  ],
  "sources": [
    "current"
  ],
  "category": "",
  "subcategory": "social-media",
  "keywords": [
    "social media"
  ],
  "maxItems": 10,
  "scrapeListingDetails": false,
  "scrapeReviews": false,
  "includeFounderDetails": false,
  "maxReviews": 0,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset of scraped AppSumo products

## `runStats` (type: `string`):

Record counts and run timestamps

# 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 = {
    "startUrls": [
        {
            "url": "https://appsumo.com/marketing/social-media/"
        }
    ],
    "subcategory": "social-media",
    "keywords": [
        "social media"
    ],
    "maxItems": 10,
    "scrapeListingDetails": false,
    "scrapeReviews": false,
    "includeFounderDetails": false,
    "detailConcurrency": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascrapers/appsumo-scraper").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 = {
    "startUrls": [{ "url": "https://appsumo.com/marketing/social-media/" }],
    "subcategory": "social-media",
    "keywords": ["social media"],
    "maxItems": 10,
    "scrapeListingDetails": False,
    "scrapeReviews": False,
    "includeFounderDetails": False,
    "detailConcurrency": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("datascrapers/appsumo-scraper").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 '{
  "startUrls": [
    {
      "url": "https://appsumo.com/marketing/social-media/"
    }
  ],
  "subcategory": "social-media",
  "keywords": [
    "social media"
  ],
  "maxItems": 10,
  "scrapeListingDetails": false,
  "scrapeReviews": false,
  "includeFounderDetails": false,
  "detailConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call datascrapers/appsumo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascrapers/appsumo-scraper"
        }
    }
}
```

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/MARbFOoBabe2owF7V/builds/2RcrEy9M2MTE5k8Ua/openapi.json
