# Futurepedia Scraper: export AI tool data (`lovely_sequoia/futurepedia-scraper`) Actor

Build an AI-tool comparison sheet from public Futurepedia listings. Export descriptions, observed pricing, categories and vendor links to JSON/CSV. Start with one tool; verify vendor claims yourself.

- **URL**: https://apify.com/lovely_sequoia/futurepedia-scraper.md
- **Developed by:** [Kris Jensen](https://apify.com/lovely_sequoia) (community)
- **Categories:** AI, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 57 total users, 2 monthly users, 94.3% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 ai tool 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?

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

## Futurepedia Scraper: AI Tool Data Export

Stop copying AI-tool listings into a spreadsheet by hand. Export names, descriptions, categories, observed pricing and links from public Futurepedia listings into an Apify dataset, then download JSON or CSV for research and comparison workflows.

Each record includes a source URL and retrieval timestamp. When available, the listing's update date and outbound-link provenance help you inspect freshness and trace the result. Missing fields stay missing rather than being invented. Sitemap, category and specific-URL inputs are supported; source availability and optional-field completeness can vary.

This is a structured export, not a unified historical database or automatic change-alert service. Directory-listed prices are not verified current vendor offers, and a successful run does not guarantee complete directory coverage.

> **Unofficial, independent tool:** This Actor is not affiliated with, endorsed by, or operated by Futurepedia. Users are responsible for reviewing and complying with Futurepedia's current terms, robots/access rules, intellectual-property rights, privacy requirements, and applicable laws before running or redistributing source data.

Try one record first, inspect the output and `RUN_SUMMARY`, then scale only if the fields fit your workflow. The saved input default remains five records; the explicit quick-start below uses one.

### Pick the workflow you need

| Your task | Input | Useful output |
|---|---|---|
| Compare AI tools already on your shortlist | Specific tool URLs | Descriptions, observed pricing, categories and vendor links |
| Research tools in a category | Category mode with a small record limit | A bounded dataset for your own comparison sheet |
| Refresh your research spreadsheet | Repeat a selected URL export | Stable `recordId`, source URL and retrieval time for joining snapshots |

The Actor supplies source records, not purchasing advice or automated change alerts. Verify vendor pricing and claims at the vendor before making decisions.

#### Reproduce the verified one-tool example

```json
{"mode":"urls","toolUrls":["https://www.futurepedia.io/tool/gencraft"],"maxTools":1,"delayMs":1500,"proxyConfig":{}}
```

Set memory to 1,024 MB, timeout to 60 seconds and maximum run charge to $0.01 in run options. At current pricing, one delivered record at this memory costs $0.00405: $0.004/result plus $0.00005/start, including platform usage. Start charges still apply to empty or failed runs; check the Pricing tab for current prices.

An owner test of published build 1.4.1 on October 2, 2026 delivered this tool with its external URL, categories, features and source-update date, zero degraded rows, and one matching result event. This is a reproducible starting input, not a guarantee of future source availability or customer revenue.

#### Discover one tool from the sitemap

For the smallest first export, use:

```json
{
  "mode": "sitemap",
  "maxTools": 1,
  "delayMs": 1500,
  "proxyConfig": {}
}
```

Before starting, check the current Store pricing. For this small test, set a maximum run charge of $0.10, memory to 1,024 MB and timeout to 90 seconds in run options. These are test settings, not the Actor's global defaults; no account upgrade is required by these instructions.

When the run finishes, open its dataset to review the records and export JSON or CSV. Check `RUN_SUMMARY` for delivered rows, degraded records, coverage limits and billing reconciliation before increasing the limit. JSON preserves nested arrays; CSV may need normalization for your spreadsheet. Optional fields may be missing; a successful run does not guarantee complete directory coverage or current vendor pricing.

#### Real Output Snapshot

This abbreviated record comes from our one-record verification on September 18, 2026, using build 1.3.1. It is an owner test, not customer output or a claim of current vendor pricing. The first sitemap result may change; the quick-start does not guarantee this particular tool. The test delivered one record with one matching billed result event, not proof of every mode or full-directory performance.

```json
{
  "recordId": "futurepedia:gencraft",
  "name": "Gencraft",
  "slug": "gencraft",
  "url": "https://www.futurepedia.io/tool/gencraft",
  "externalUrl": "https://gencraft.com/",
  "externalUrlStatus": "direct",
  "externalUrlSource": "listing_cta",
  "canonicalDomain": "gencraft.com",
  "descriptionStatus": "detailed",
  "pricingModel": "Freemium",
  "sourceUpdatedRaw": "09/16/2026",
  "sourceUpdatedAt": "2026-09-16T00:00:00.000Z",
  "categories": ["image generators", "design generators", "image editing"],
  "scrapedAt": "2026-09-18T17:25:39.047Z"
}
```

Use `recordId` for source-scoped joins, `url` to trace the listing, and `scrapedAt` to distinguish retrieval time from the source's update date. Missing or unresolved external links remain explicit rather than being guessed.

#### Sitemap

Use `mode: "sitemap"` to discover public tool pages from Futurepedia's tool sitemap. `maxTools: 0` removes the user row limit, but the Actor still enforces a 500-detail-request safety ceiling, bounded sitemap processing, and any Apify maximum run charge.

#### Category

Use `mode: "category"` with slugs such as `marketing` or `seo`; values are normalized to lowercase. Category discovery deduplicates overlapping categories and stops at the effective row limit or a finite request, page, item, error, repeated-content, or no-progress ceiling.

#### Specific tools

Use `mode: "urls"` with slugs such as `chatgpt` or canonical URLs such as `https://www.futurepedia.io/tool/chatgpt`. Inputs are normalized, query strings and fragments are removed, duplicates are collapsed, and non-Futurepedia hosts are rejected before crawling.

```json
{
  "mode": "urls",
  "toolUrls": ["chatgpt", "https://www.futurepedia.io/tool/namelix"],
  "maxTools": 2
}
```

### Output Contract

Each successful row includes stable identifiers, listing data, and selection provenance. This abbreviated, fictional example illustrates the shape; it is not a live scrape or a promise of field availability.

```json
{
  "recordId": "futurepedia:example-tool",
  "name": "Example Tool",
  "slug": "example-tool",
  "url": "https://www.futurepedia.io/tool/example-tool",
  "externalUrl": "https://example.com/",
  "externalUrlStatus": "direct",
  "externalUrlSource": "listing_cta",
  "externalUrlSourceUrl": "https://example.com/?utm_source=futurepedia",
  "canonicalDomain": "example.com",
  "description": "Detailed listing description...",
  "descriptionStatus": "detailed",
  "sourceUpdatedRaw": "08/02/2026",
  "sourceUpdatedAt": "2026-08-02T00:00:00.000Z",
  "rating": 4.3,
  "reviewCount": 9,
  "features": ["A complete feature description is retained even when it is long."],
  "socialLinks": { "x": "https://x.com/example" },
  "badges": ["Verified"],
  "verified": true,
  "discoveredVia": "urls",
  "matchedInputs": ["https://www.futurepedia.io/tool/example-tool"],
  "sourceIndex": 0,
  "scrapedAt": "2026-08-02T12:00:00.000Z"
}
```

Important field semantics:

| Field | Meaning |
|---|---|
| `recordId` | Stable source-scoped ID: `futurepedia:<normalized-slug>` |
| `externalUrl` | Valid direct destination from the structurally scoped exact-name listing CTA; affiliate CTA values remain `null` |
| `externalUrlStatus` | `direct`, `unresolved_affiliate`, `missing`, or `invalid` |
| `externalUrlSourceUrl` | Original CTA href retained as evidence, including unresolved affiliate links |
| `canonicalDomain` | Normalized hostname for usable `externalUrl` values |
| `rating` | Listing aggregate rating, or `null` when absent; absence is never converted to zero |
| `reviewCount` | Listing review count, with `0` used only when the listing explicitly reports zero |
| `sourceUpdatedRaw` | Source date as displayed by Futurepedia |
| `sourceUpdatedAt` | ISO-normalized source date when parsing is valid |
| `socialLinks.x` | Both `twitter.com` and `x.com` listing links normalize to the `x` key |
| `sourceIndex` | Deterministic zero-based discovery order used for dataset output |

`lastUpdated` remains as a compatibility alias for `sourceUpdatedRaw`. `ratingDistribution` is intentionally not emitted because the previous implementation did not have reliable listing-scoped evidence for that field.

#### Missing Fields and Freshness

A delivered row needs an extracted name and a usable description, not every field. Summary-only descriptions and missing or unresolved outbound links can still produce successful rows. For example, this fictional abbreviated row is usable but degraded:

```json
{
  "recordId": "futurepedia:sparse",
  "descriptionStatus": "summary",
  "externalUrl": null,
  "externalUrlStatus": "missing",
  "pricingModel": null,
  "pricingTiers": [],
  "rating": null,
  "reviewCount": null,
  "sourceUpdatedRaw": null,
  "sourceUpdatedAt": null,
  "lastUpdated": null,
  "scrapedAt": "2026-09-17T12:00:00.000Z"
}
```

`null`, empty arrays, and empty objects mean no corresponding evidence was extracted, not that a product has no price, features, or social accounts. `verified: false` means no recognized Verified badge was extracted, not an independent trust assessment. Pricing is listing text, not a verified current vendor quote or normalized price comparison.

`scrapedAt` is the run-start timestamp passed to every parsed row, not the exact time each page was fetched or the vendor last changed its product. `sourceUpdatedAt` is a parsed Futurepedia listing date, not an independent freshness check; it stays `null` when absent or unparseable. A new scrape timestamp does not make an old listing current.

Join snapshots on `recordId`, not `sourceIndex` (which can change with input/discovery order). IDs are slug-based: a source slug rename changes the ID, and no rename resolution is provided. Compare fields downstream while retaining their status and source dates; absence from a bounded export is not evidence that a tool was deleted.

### URL Evidence

The Actor only considers a `tool-listing` CTA whose `data-tool-name` exactly matches the current listing name and whose structure is bound to the selected listing root. It does not fall back to the first CTA or accept same-name footer, promotion, duplicate-card, legal, or unrelated links. Sponsorship is read only from that same scoped CTA. Pricing, categories, features, dates, and subratings require explicit scoped tool-content evidence; page-wide navigation, footer, and promotion text are excluded.

Direct CTA URLs are cleaned of common tracking parameters. Known affiliate/tracker CTA values are classified immediately as `unresolved_affiliate`; neither the tracker nor any destination is contacted. `externalUrl` and `canonicalDomain` remain `null`, while the original CTA stays in `externalUrlSourceUrl` as listing metadata.

### Run Summary

After input validation, each run attempts to write `RUN_SUMMARY` to the default key-value store, outside the charged dataset. It includes actor/release/build/run/dataset identifiers where available, requested and discovered counts, detail-page `attempted`, delivered `succeeded`, and remaining `failed` counts, parsed/usable and degraded rows, discovery requests/pages/items/errors, repeated-content and no-progress counts, discovery/detail completeness and stop reasons, user/budget/safety skips, effective limits, `defaultDatasetRows`, its count source (`dataset_info` or push acknowledgements), charged-event reconciliation where PPE applies, runtime, and bounded failure details.

`attempted` counts detail requests actually started after known user, PPE, and safety caps. Selected candidates left unrequested by a detail request/error ceiling are counted in `detailSkipped`. `succeeded` equals rows confirmed written to the default dataset. `failed` is always `attempted - succeeded`, so `succeeded + failed = attempted`, including parse failures and rows not delivered after a partial dataset-write failure. Discovery failures are reported separately in `discoveryFailed`.

For sitemap/category modes, `requested` is the configured `maxTools` value (`0` means no user row limit, not unbounded work). For URL mode, it is the number of supplied URL/slug entries before deduplication. `budgetSkipped`, `userLimitSkipped`, `safetyLimitSkipped`, and `detailSkipped` count only known candidates; source items or pages not fetched after a bounded stop are not guessed. `discoveryComplete: false` and the matching `discoveryStopReason` disclose partial source coverage.

Do not treat `status: "succeeded"` or top-level `stopReason: "completed"` as full-directory coverage. For example, a category run capped at one delivered row can report this abbreviated summary:

```json
{
  "status": "succeeded",
  "stopReason": "completed",
  "attempted": 1,
  "succeeded": 1,
  "failed": 0,
  "discoveryComplete": false,
  "discoveryStopReason": "result_limit",
  "detailComplete": true,
  "userLimitSkipped": 0
}
```

Here the selected detail work finished, but discovery stopped early; zero known skips does not mean no unseen tools remain. Inspect both completeness flags, their stop reasons, failures, and row counts. `degradedRows` counts parsed usable rows with a non-detailed description or non-direct external URL, not all missing fields, and may include rows not delivered after a write failure. Failed detail pages do not become diagnostic dataset rows. Neither complete discovery nor a successful run guarantees every field is present or the directory itself is exhaustive.

### Charging Safety

The Actor makes one awaited `Actor.pushData(row)` call for each successful default-dataset row, in `sourceIndex` order. It does not make a second explicit result-event charge. Under Apify PPE, the configured synthetic `apify-default-dataset-item` event is associated with each pushed default-dataset row. The Actor records the charged-event delta where PPE exposes it and marks row/event reconciliation as matched or mismatched. A partial write preserves the exact count already delivered before the failure. The Actor calculates remaining event capacity before discovery, applies user/PPE/safety limits before detail requests, and applies the same effective cap again before output.

Check the current Actor Store pricing and your maximum run charge in Apify before starting. Preserved 2026-07-20 calibration runs measured platform usage of `$0.002304` for 5 returned rows, `$0.011842` for 50, and `$0.102764` for 495 of 500 requested rows. Those historical platform-usage measurements are not buyer-price or future-cost guarantees.

### Scheduling and Exports

Apify can run this Actor on a schedule and export each run's dataset as JSON, CSV, XML, or Excel. Each run has its own default dataset; scheduled runs do not automatically create a single accumulated history or calculate changes between snapshots.

First-party sitemap, category, and detail requests use fixed timeouts, streaming response-byte ceilings, zero automatic redirects, and zero retries. Detail work is sequential and capped at 500 requests and 50 errors; category discovery is separately capped at 100 requests, 100 total pages, 25 pages per input, 2,000 examined items, 20 errors, two no-progress pages, and one repeated-content page. Successful rows are still exported when other bounded requests fail, and the exact stop reason is available in `RUN_SUMMARY`.

The local parser acceptance corpus contains 20 separate, structurally varied HTML fixtures derived from retained sample values. Every fixture is labeled non-current; passing them is regression evidence, not proof of current Futurepedia markup, source permission, deployment approval, or future reliability.

### Support

Use the Issues tab on this Actor page for reproducible problems. Include the Apify run ID, a redacted input, the expected result, the observed result, and the `RUN_SUMMARY` record when available. Never post API tokens, credentials, private data, or customer data. Source blocking, changed markup, and bounded partial coverage should be reported as source-health evidence rather than described as successful complete output.

# Actor input Schema

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

Choose how to find tools. <b>All tools</b> discovers public tool pages via sitemap. <b>By category</b> targets specific category slugs. <b>Specific URLs</b> accepts Futurepedia tool slugs or canonical HTTPS tool URLs.

## `categories` (type: `array`):

Category slugs to scrape in category mode. Example inputs include <code>marketing</code> and <code>seo</code>; values are normalized to lowercase and current source availability can change.

## `toolUrls` (type: `array`):

Direct URLs to specific tool pages (only for "Specific URLs" mode). Example: https://www.futurepedia.io/tool/chatgpt

## `maxTools` (type: `integer`):

Limit how many tools to scrape. Category discovery stops at the effective row/charge limit. A value of 0 removes the user row limit but still enforces the Actor safety ceiling of 500 detail requests plus bounded discovery work.

## `delayMs` (type: `integer`):

Milliseconds the Actor waits between sequential detail-page requests. Recommended: 1000-2000.

## `proxyConfig` (type: `object`):

Proxy settings. The Actor uses Apify's auto-proxy by default — you don't need to change this unless you have specific needs.

## Actor input object example

```json
{
  "mode": "sitemap",
  "categories": [
    "marketing"
  ],
  "toolUrls": [
    "https://www.futurepedia.io/tool/chatgpt",
    "https://www.futurepedia.io/tool/shopify"
  ],
  "maxTools": 5,
  "delayMs": 1500,
  "proxyConfig": {}
}
```

# Actor output Schema

## `aiToolsOverview` (type: `string`):

Browse the deterministic overview with URL status, ratings, provenance, and source dates.

## `fullDataset` (type: `string`):

Download all successfully pushed tool records.

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

Uncharged operations record with actor/build/run IDs, attempted/succeeded/failed semantics, parsed and delivered rows, PPE reconciliation, runtime, stop reason, and bounded failures.

# 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 = {
    "mode": "sitemap",
    "categories": [
        "marketing"
    ],
    "toolUrls": [
        "https://www.futurepedia.io/tool/chatgpt",
        "https://www.futurepedia.io/tool/shopify"
    ],
    "maxTools": 5,
    "delayMs": 1500
};

// Run the Actor and wait for it to finish
const run = await client.actor("lovely_sequoia/futurepedia-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 = {
    "mode": "sitemap",
    "categories": ["marketing"],
    "toolUrls": [
        "https://www.futurepedia.io/tool/chatgpt",
        "https://www.futurepedia.io/tool/shopify",
    ],
    "maxTools": 5,
    "delayMs": 1500,
}

# Run the Actor and wait for it to finish
run = client.actor("lovely_sequoia/futurepedia-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 '{
  "mode": "sitemap",
  "categories": [
    "marketing"
  ],
  "toolUrls": [
    "https://www.futurepedia.io/tool/chatgpt",
    "https://www.futurepedia.io/tool/shopify"
  ],
  "maxTools": 5,
  "delayMs": 1500
}' |
apify call lovely_sequoia/futurepedia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lovely_sequoia/futurepedia-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/ARDgkbGRStNJLQ53d/builds/6rvVms8clROiJvjFO/openapi.json
