# CryptoPanic Public News Feed Scraper (`automation-lab/cryptopanic-crypto-news-sentiment`) Actor

Export public CryptoPanic news headlines, publisher links, timestamps, visible summaries and raw currency labels from the latest feed or supplied news URLs.

- **URL**: https://apify.com/automation-lab/cryptopanic-crypto-news-sentiment.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** News, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.43 / 1,000 item processeds

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

## CryptoPanic Public News Feed Scraper

Export **cryptopanic news** as structured public news snapshots for recurring market research and article triage. Collect the anonymous latest feed or supply public CryptoPanic article URLs. Each record contains a headline, news ID, publisher label and link, publication timestamp, visible summary, raw currency labels and CryptoPanic URL.

This Actor is a public headline exporter, **not a sentiment scoring service**. Its anonymous SSR route does not expose community vote totals. Vote fields are null and `sentimentAvailable` is false. No premium PanicScore, private API token, account login or historical completeness is included.

### Who is it for?

- Analysts maintaining a source-attributed crypto news reading queue.
- Researchers comparing recurring headline snapshots with separate market-price datasets.
- Editorial teams reviewing linked publisher stories before publication.
- Data engineers loading small news snapshots into a spreadsheet or warehouse.

Results reflect what CryptoPanic displays, including social posts and occasional non-crypto business headlines. They are not financial advice or verified factual reporting.

### Why use this Actor?

The product keeps source evidence rather than inventing a sentiment label. Stable news IDs make external deduplication straightforward. Raw currency labels preserve ambiguous names such as `Talus (US)` instead of assuming `US` means US stocks. Publisher links lead to the original source; summaries contain only the text shown by CryptoPanic.

The route uses lightweight anonymous HTML requests through Apify datacenter proxy with a reusable run session. Proxy usage is paid by the operator and included in Actor pricing; you do not supply a separate key. It does not download publisher article bodies, images, videos or browser assets. Two inputs provide a small, predictable contract without unsupported coin filters or historical search claims.

### Getting started

1. Open the Actor and keep the default input for a latest-feed snapshot.
2. Set `maxItems` between 1 and 50. Start with 10.
3. Run the Actor and open its default dataset.
4. Export JSON, CSV or Excel using Apify dataset export.
5. For repeat use, schedule runs in Apify and deduplicate by `newsId` downstream.

Example latest-feed input:

```json
{ "maxItems": 10 }
```

Example supplied-page input:

```json
{
  "startUrls": [
    { "url": "https://cryptopanic.com/news/33472499/Robinhood-pushes-US-stocks-toward-cryptos-247-model-with-weekend-trading" }
  ],
  "maxItems": 1
}
```

### Input parameters

| Parameter | Default | Behavior |
| --- | --- | --- |
| `startUrls` | `[]` | Up to 50 public news article URLs. Empty means latest feed; nonempty replaces discovery. |
| `maxItems` | `10` | Global unique-record cap after news-ID deduplication; integer 1–50. |

Supplied URLs must use `https://cryptopanic.com/news/<numeric-id>/<headline>`. Query strings, fragments, credentials, other hosts, currency pages and category URLs are rejected. Unknown input fields are rejected rather than silently ignored. URL sources support GET only; custom methods, payloads, headers and userData are rejected.

Input order is preserved. Duplicate news IDs are fetched once even if their headline slugs differ. The limit is global, not per URL. Zero and unlimited are not supported. A user-configured billing limit can stop output earlier.

### What data is extracted?

| Field | Meaning |
| --- | --- |
| `newsId` | Numeric news ID represented as a string. |
| `headline` | Public headline with normalized whitespace. |
| `canonicalUrl` | Public CryptoPanic article URL. |
| `publisher` | Displayed source label, including any Feed or X prefix; nullable. |
| `publisherUrl` | Original link from “Read full story”; nullable. |
| `publishedAt` | Publication time in UTC ISO 8601; nullable. |
| `summary` | Visible CryptoPanic summary; nullable and often truncated. |
| `currencyLabels` | Array of raw displayed labels and public currency-page URLs. |
| `sentimentAvailable` | Always false for the supported SSR route. |
| `bullishVotes`, `bearishVotes` | Null: unavailable, not zero. |
| `observedAt` | UTC snapshot observation time. |

Currency labels are source associations, not verified ticker mappings. An empty array means the article page displayed none. Missing publisher links or summaries remain null; they are not replaced with guessed values.

### Example output

A supplied-page run returned this source record (summary shortened here for readability):

```json
{
  "newsId": "33472499",
  "headline": "Robinhood pushes US stocks toward crypto’s 24/7 model with weekend trading",
  "canonicalUrl": "https://cryptopanic.com/news/33472499/Robinhood-pushes-US-stocks-toward-cryptos-247-model-with-weekend-trading",
  "publisher": "Feed - Cryptopolitan.Com",
  "publisherUrl": "https://www.cryptopolitan.com/robinhood-pushes-us-stocks-toward-cryptos-24-7-model-with-weekend-trading/",
  "publishedAt": "2026-09-30T04:06:01.000Z",
  "summary": "On September 29, Robinhood announced that it intends to allow clients to participate in trading in a selection of US stocks and ETFs around the clock during weekends...",
  "currencyLabels": [
    { "label": "Talus (US)", "url": "https://cryptopanic.com/news/talus/" }
  ],
  "sentimentAvailable": false,
  "bullishVotes": null,
  "bearishVotes": null,
  "observedAt": "2026-10-02T06:11:09.558Z"
}
```

### Coverage and limitations

The latest mode exports the finite anonymous feed currently served by CryptoPanic; it does not paginate historical archives. A 50-record cap does not imply the source has 50 current records. Publication order and coverage come from the source, not a comprehensive market-news index.

Supplied pages allow revisiting known public stories, not discovering all past stories. Deleted, inaccessible or changed pages can fail. The Actor does not fetch full publisher content or bypass publisher paywalls.

No keyword, coin, category, language, date-range or sentiment filters are implemented. Apply downstream filters yourself without treating raw currency labels as normalized asset IDs. No alerts, trading decisions or derived sentiment are generated.

### How much does it cost to export CryptoPanic news?

Pay-per-event pricing charges a **$0.0005 start fee per run** plus one `item` event per successfully accepted news record. Publisher links, summaries and currency labels are included in that record; there are no separate enrichment charges.

| Plan tier | Price per news record |
| --- | --- |
| FREE | $0.000828 |
| BRONZE | $0.00072 |
| SILVER | $0.0005616 |
| GOLD | $0.000432 |
| PLATINUM | $0.000432 |
| DIAMOND | $0.000432 |

Spend tiers follow your qualifying aggregate monthly Apify Store spend, not volume on this Actor. These are estimated Actor charges, not payout guarantees.

Estimated BRONZE example totals, including the start fee:

| Unique records per execution | Number of executions | Estimated aggregate total |
| --- | --- | --- |
| 1 | 1 | $0.00122 |
| 10 | 1 | $0.0077 |
| 20 | 1 | $0.0149 |
| 10 | 2 | $0.0154 |

Each run has its own start fee. Charges apply to records accepted during the run; duplicate input IDs and failed pages do not produce item charges.

Apify's displayed live pricing is authoritative. Set a maximum total charge appropriate to your intended record count. A failed run can retain already-produced records and their charges.

### Reliability and failure behavior

Requests have a 20-second timeout and at most three attempts for transient transport failures, rate limits, server errors or empty responses. A blocked or transiently failed session is retired before retrying with a fresh datacenter identity. Healthy sessions are reused. There is no residential or browser fallback. Deterministic HTTP errors and unexpected HTML structures fail rather than masquerading as successful empty datasets.

Article fetches are sequential. If a later page fails, earlier accepted rows can remain in the dataset; inspect the run status before treating the snapshot as complete. A changed anonymous feed structure is an upstream compatibility failure, not proof there was no news.

### Integrations

Use Apify schedules for recurring snapshots. Store `newsId`, `publishedAt` and `observedAt` in a warehouse so ingestion time stays separate from publication time. Compare IDs between runs to identify new headlines.

Send results through Make, Zapier or an Apify webhook to a spreadsheet or article-review queue. Use `publisherUrl` for human source checking. Downstream NLP can analyze the visible headline and summary, but its labels are your analysis—not CryptoPanic community sentiment.

Join news snapshots to separate market datasets only with independently verified asset mapping. Preserve the original currency labels so ambiguous associations can be reviewed.

### API usage

Keep your Apify token in an environment variable. Do not place it in shared datasets or source files.

#### cURL

```bash
curl -X POST \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"maxItems":10}' \
  'https://api.apify.com/v2/acts/automation-lab~cryptopanic-crypto-news-sentiment/run-sync-get-dataset-items'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/cryptopanic-crypto-news-sentiment')
  .call({ maxItems: 10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/cryptopanic-crypto-news-sentiment').call(
    run_input={'maxItems': 10})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### MCP use

Connect a compatible MCP client with authorized Apify access:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/cryptopanic-crypto-news-sentiment"
```

Equivalent HTTP client configuration for Claude Desktop, Cursor and VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/cryptopanic-crypto-news-sentiment"
    }
  }
}
```

Example prompt: “Export up to ten current CryptoPanic public news records and show their publisher links. Do not interpret unavailable vote fields as neutral sentiment.” Tool availability depends on the hosted service and your access permissions.

### Legality and responsible use

Use only public pages you are authorized to access. Review CryptoPanic's terms and applicable law, and respect reasonable request volumes. Publisher content and headlines may carry copyright; public availability does not grant redistribution rights. This Actor is independent and not endorsed by CryptoPanic.

The runtime uses no AI provider. Apify stores datasets and logs under your account's retention settings; delete runs and their storage in Console when no longer needed. No cross-run caches or cookies are retained. Apify datacenter proxy receives the public target URL and response traffic; no private source account or credentials are used. Report reproducible problems through the Actor's Apify issue interface.

Failed operations send sanitized diagnostic input, exceptions and actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed and reports are retained for 30 days.

### FAQ and troubleshooting

**Why are vote fields null?** The anonymous SSR pages do not expose them. Null means unavailable, not zero or neutral. Premium scores and derived sentiment are outside the contract.

**Why did I receive fewer records than maxItems?** The current feed is finite, supplied IDs are deduplicated, or your billing limit stopped further records. Check logs and status for upstream failures.

**Why is US associated with Talus?** That is the source's raw displayed currency label. The Actor deliberately does not reinterpret it as geography or a stock ticker.

**Can I export all historical news?** No. You can revisit supplied public article URLs, but the Actor does not discover or promise complete archives.

**Why did a URL fail validation?** Use a public numeric-ID article URL on cryptopanic.com without query parameters or fragments. Currency and filter URLs are not supported.

**What if the run fails after producing rows?** Treat it as an incomplete snapshot. Keep its existing rows if useful and inspect the error before scheduling another run.

### Related Actors

- [CoinGecko Crypto Market Data](https://apify.com/automation-lab/coingecko-crypto-market-data) provides separate market-price context, not news.
- [CoinPaprika Crypto Market Data Exporter](https://apify.com/automation-lab/coinpaprika-crypto-market-data) provides separate asset and market records.

Use these as complementary sources; this Actor does not perform an automatic cross-source join.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/cryptopanic-crypto-news-sentiment/changelog.md

# Actor input Schema

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

Optional public https://cryptopanic.com/news/<id>/<headline> article URLs, at most 50. Omit or leave empty to export the current anonymous latest feed. Supplied URLs replace feed discovery. Duplicate news IDs are removed; query strings, fragments, other hosts and currency/category URLs are rejected. GET only; custom methods, payload, headers and userData are unsupported and rejected. No historical search or pagination.

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

Global maximum unique news records per run, after news-ID deduplication, in source order. Default 10; range 1–50. Zero and unlimited are not supported. The finite anonymous latest feed may contain fewer records; this cap does not fetch historical pages. A billing limit may stop output earlier.

## Actor input object example

```json
{
  "startUrls": [],
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Headlines, publisher links, timestamps, summaries and raw currency labels.

# 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": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/cryptopanic-crypto-news-sentiment").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": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/cryptopanic-crypto-news-sentiment").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": [],
  "maxItems": 10
}' |
apify call automation-lab/cryptopanic-crypto-news-sentiment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/cryptopanic-crypto-news-sentiment"
        }
    }
}
```

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/Hbv10zNWYvHluEknk/builds/6FVLbX2ec6vla2hdQ/openapi.json
