# Pensight Creator Scraper – Digital Products & Coaching (`huykenny/pensight-creator-scraper`) Actor

Scrape public Pensight creator storefronts into clean JSON: digital products, coaching sessions with duration, courses, memberships, exact prices and currencies, social links and monetization methods. One request per profile, no browser, no proxy.

- **URL**: https://apify.com/huykenny/pensight-creator-scraper.md
- **Developed by:** [Kenny Ha](https://apify.com/huykenny) (community)
- **Categories:** E-commerce, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 creator results

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

## Pensight Creator Store Scraper – Digital Products, Coaching & Pricing

Extract public Pensight creator storefronts — digital products, coaching sessions, courses, memberships, exact prices and monetization methods — into clean structured JSON.

One HTTP request per profile. No browser. No proxy. No price guessing.

### What it does

Turns a Pensight profile URL into a structured record you can use directly, with no extra parsing:

```json
{
  "username": "thecareer_coach",
  "displayName": "The Career Coach",
  "profileUrl": "https://pensight.com/x/thecareer_coach",
  "bio": "Your Success starts here!",
  "offerCount": 10,
  "coachingOfferCount": 8,
  "minPrice": 5,
  "maxPrice": 2000,
  "currencies": ["EUR"],
  "monetizationMethods": ["COACHING", "DIGITAL_PRODUCTS", "PAID_QNA"],
  "offers": [
    {
      "offerId": "…",
      "type": "COACHING",
      "name": "1:1 career coach consultation",
      "price": { "model": "ONE_TIME", "amount": 150, "currency": "EUR", "isFree": false },
      "durationMinutes": 45,
      "url": "https://pensight.com/x/thecareer_coach/…",
      "priceShownOnProfile": true
    }
  ]
}
```

### Supported data

| | |
|---|---|
| **Creator** | handle, display name, bio, avatar, cover image, account type, custom domain, account age |
| **Social profiles** | platform, handle and URL — from Pensight's own typed field, so the platform is not guessed |
| **Other links** | own website, blog, review pages — kept separate from social platforms |
| **Digital products** | name, description, exact price, currency, delivery type ("E-Book", "PDF"), image, URL |
| **Coaching** | 1:1 sessions with **session duration**, bundles with **session count** and billing mode |
| **Courses** | name, description, price, currency, URL |
| **Memberships** | price, currency and **billing period** (monthly / yearly) |
| **Paid Q\&A** | Pensight's paid question format, with price |
| **Group sessions & programs** | capacity and dates where published |
| **Lead magnets** | free digital products (derived, and labelled as derived) |
| **Pricing** | one-time, subscription, instalments, pay-what-you-want, free, and sale prices with the original amount |
| **Monetization methods** | derived from the offer types actually found |

#### Prices are exact, not parsed

Pensight exposes prices as structured data, so this Actor never reads "$99" out of a page. Every amount comes with its currency, and subscriptions come with their billing period. Sale prices carry the original amount and the discount percentage.

**Currency is never guessed.** If Pensight does not state it, the field is `null`.

### Quick start

```json
{
  "profiles": ["https://pensight.com/x/thecareer_coach"]
}
```

Handles work too, in any shape you happen to copy: `thecareer_coach`, `@thecareer_coach`, `pensight.com/x/thecareer_coach`. A link to a single offer also works — the creator handle is taken from it.

### Batch scraping

```json
{
  "mode": "BATCH_PROFILES",
  "profiles": ["coachlenora", "logoslearnerlab", "clicknow", "amazon-unleashed"],
  "maxItems": 500
}
```

One failing profile never stops the run: it becomes an error row so you can see which handle failed and why, and it is **not charged**.

### Monitoring

```json
{
  "mode": "MONITOR",
  "profiles": ["coachlenora", "logoslearnerlab"],
  "onlyChanges": true
}
```

The first run stores a baseline. Later runs report:

`NEW_OFFER` · `OFFER_REMOVED` · `PRICE_CHANGED` · `SALE_STARTED` · `SALE_ENDED` · `BILLING_PERIOD_CHANGED` · `OFFER_RENAMED` · `DISPLAY_NAME_CHANGED` · `BIO_CHANGED` · `SOCIAL_PROFILE_ADDED` · `SOCIAL_PROFILE_REMOVED`

Offers are matched on Pensight's own stable offer id, so a discount is reported as a price change and never as a new offer. Prices are compared as numbers with their currency, so a formatting change is not a price change. Verified by running twice over unchanged profiles and getting zero events.

State lives in a **named** key-value store (`pensight-monitor-state` by default) so it survives between runs, and the key includes a hash of your monitoring settings so two different watch configurations never overwrite each other.

### Measured performance

From a live run over 22 real profiles:

| | |
|---|---|
| Success rate | **22/22 (100 %)** |
| HTTP requests | **1 per profile** |
| Data | **139 kB per profile** |
| Runtime | 0.66 s per profile at concurrency 4 · 0.34 s at concurrency 8 |
| HTTP 429 | **0** across 110+ requests |
| Proxy | not used |
| Browser | never launched |

### Field coverage

Real numbers from those 22 profiles, not marketing estimates:

| Field | Coverage |
|---|---|
| Display name, bio, avatar | **100 %** |
| Offers (≥ 1) | **91 %** |
| Currency, social profiles, pricing | **82 %** |
| Cover image | 77 % |
| Digital products | **77 %** |
| Coaching offers | **55 %** |
| Courses | 18 % |
| Memberships | 14 % |

Courses and memberships are fully supported and extracted — they are simply less common on Pensight than digital products and coaching. The Actor's name reflects the data rather than the feature list.

### Use cases

**Creator product database** — build a structured catalogue of what creators sell and at what price.

**Coaching marketplace / directory** — session durations, bundle sizes and per-session pricing, which no comparable Actor extracts.

**Competitor monitoring** — watch a list of creators and get an event the moment a price moves or an offer appears.

**Price intelligence** — compare offer pricing across creators, per currency.

**Creator economy research** — analyze how creators monetize: products vs. coaching vs. memberships.

**Agency CRM enrichment** — add public offer and social data to creator records.

### API usage

Replace `<TOKEN>` with your Apify API token.

**curl**

```bash
curl -X POST "https://api.apify.com/v2/acts/huykenny~pensight-creator-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H 'Content-Type: application/json' \
  -d '{"profiles":["https://pensight.com/x/thecareer_coach"]}'
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<TOKEN>' });
const run = await client.actor('huykenny/pensight-creator-scraper').call({
    mode: 'BATCH_PROFILES',
    profiles: ['coachlenora', 'logoslearnerlab'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<TOKEN>")
run = client.actor("huykenny/pensight-creator-scraper").call(run_input={
    "mode": "BATCH_PROFILES",
    "profiles": ["coachlenora", "logoslearnerlab"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["username"], item["offerCount"], item["minPrice"], item["currencies"])
```

Output is ready for Make, n8n, Zapier or an AI agent as-is.

### Limitations

- **No creator discovery.** Pensight publishes no public creator directory and its sitemap contains no profiles, so you supply the profile URLs or handles. This Actor does not fake discovery through a search engine.
- **Creators pick their own product type.** One real profile sells "Executive Coaching – 12 sessions" for €2 000 typed as a digital product. The Actor reports the platform's type faithfully and keeps the original in `rawType`; it does not re-type offers by guessing from the name.
- **Some prices are hidden on the profile card.** A creator can turn the price display off, leaving only a button. The price is still public — a buyer sees it at checkout — so it is returned with `priceShownOnProfile: false` so you can tell.
- **Non-public offers are excluded.** Unpublished, private and archived offers exist in the page data but are not returned, because a visitor does not see them.
- **No sales, revenue, member or student counts.** Pensight does not publish them, so this Actor does not estimate them.
- **Group programs are rare** — one in 143 offers observed.

### FAQ

**Do I need a proxy?** No. Pensight returned zero rate-limit responses across more than 110 direct requests. The proxy option exists if your own runs ever need it.

**How many requests per profile?** Exactly one.

**Can it find creators for me?** No — see Limitations. Supply handles or URLs.

**Does it get private or paid content?** No. Only what an anonymous visitor sees on the public profile. Nothing behind a login, no checkout, no purchases.

**Are prices accurate?** They come from Pensight's own structured price data with an explicit currency, not from text on the page. Amounts and session durations were manually verified against rendered pages.

**What happens to a profile that does not exist?** Pensight answers such handles with HTTP 200 and an empty payload, so the Actor detects it from the content and reports `PROFILE_NOT_FOUND`. You get an error row, and you are not charged for it.

### Not affiliated with Pensight

This Actor is not affiliated with or endorsed by Pensight. It extracts publicly accessible profile data and uses no official API, partnership or private access. Users are responsible for complying with applicable laws, privacy requirements and platform terms.

# Actor input Schema

## `profiles` (type: `array`):

Profile URLs or handles. All of these work: coachlenora, @coachlenora, pensight.com/x/coachlenora, https://pensight.com/x/coachlenora. A link to a single offer also works — the creator handle is taken from it. Pensight has no public creator directory, so profiles cannot be discovered automatically; this field is the input.

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

What the run does. Every mode uses one plain HTTP request per profile.

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

Hard cap on how many profiles one run processes.

## `includeOffers` (type: `boolean`):

Extract digital products, courses, memberships, coaching sessions and their prices. This is the main value of the Actor; turn it off only if you want profiles alone.

## `includeSocialLinks` (type: `boolean`):

Extract the creator's social profiles (platform, handle, URL) plus other links such as their own website or Trustpilot page.

## `onlyChanges` (type: `boolean`):

Monitor mode only. Writes one row per detected change instead of a full creator row — the cheap setup for a scheduled watcher. The first run has nothing to compare against, so it stores a baseline and reports no changes.

## `snapshotStoreName` (type: `string`):

Name of the named key-value store holding one snapshot per creator. It must be a named store: the default store is recreated for every run, so monitoring would never see the previous state. Use different names to keep separate watch sets apart.

## `maxConcurrency` (type: `integer`):

How many profiles to fetch at once. The default of 4 keeps the Actor a well-behaved visitor. Concurrency 8 produced no rate limiting on a 22-profile test, but that sample is small — raise it at your own pace.

## `useProxy` (type: `boolean`):

Off by default and normally unnecessary: pensight.com returned zero HTTP 429 across more than 110 direct requests. Turn it on only if your own runs start getting blocked.

## `proxyGroups` (type: `array`):

Apify Proxy groups, for example RESIDENTIAL. Ignored when the proxy is off.

## `proxyCountryCode` (type: `string`):

Two-letter country code for the proxy, for example US. Ignored when the proxy is off.

## `includeRawResponse` (type: `boolean`):

Attach the untouched public data exactly as Pensight's own page receives it. Useful when you want a field this Actor does not normalize yet; it makes rows several times larger.

## `debug` (type: `boolean`):

Verbose logs. Tokens, proxy passwords and credentials are never logged at any level.

## Actor input object example

```json
{
  "profiles": [
    "https://pensight.com/x/thecareer_coach"
  ],
  "mode": "PROFILE",
  "maxItems": 100,
  "includeOffers": true,
  "includeSocialLinks": true,
  "onlyChanges": false,
  "snapshotStoreName": "pensight-monitor-state",
  "maxConcurrency": 4,
  "useProxy": false,
  "includeRawResponse": false,
  "debug": false
}
```

# Actor output Schema

## `creators` (type: `string`):

One row per creator: profile, social links, every public offer with its exact price and currency, plus counts, price ranges and detected monetization methods.

## `offerChanges` (type: `string`):

Monitor mode: new and removed offers, price changes, sales starting and ending, billing period changes, renames, and profile or social link changes.

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

Success rate, requests and bytes per profile, rate-limit hits, error codes and what was charged. Written even when the run fails.

# 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 = {
    "profiles": [
        "https://pensight.com/x/thecareer_coach"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("huykenny/pensight-creator-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 = { "profiles": ["https://pensight.com/x/thecareer_coach"] }

# Run the Actor and wait for it to finish
run = client.actor("huykenny/pensight-creator-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 '{
  "profiles": [
    "https://pensight.com/x/thecareer_coach"
  ]
}' |
apify call huykenny/pensight-creator-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,huykenny/pensight-creator-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/h3yKe4KR1v4KnZDFX/builds/stdcvTbMCOuUo3o2U/openapi.json
