# Reddit Post Details Scraper — Full Record by URL or id (`foxlabs/reddit-post-details-scraper`) Actor

Records of Reddit posts from their addresses, ids or t3\_ names: title, text, link, kind, score, upvote ratio, comment count, exact time, flair, image, gallery and video, score and comments per hour, the subreddit's size; author karma on request. Up to 10,000 links a run. No login.

- **URL**: https://apify.com/foxlabs/reddit-post-details-scraper.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 71.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 post details

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

## Reddit Post Details Scraper — Full Record by URL or id 🚀

**foXLabs Reddit series:** [Search](https://apify.com/foxlabs/reddit-search-scraper) · [Subreddit Posts](https://apify.com/foxlabs/reddit-subreddit-posts-scraper) · [Post Comments](https://apify.com/foxlabs/reddit-post-comments-scraper) · [User](https://apify.com/foxlabs/reddit-user-scraper)

🎉 The records of Reddit posts you already have the addresses or ids of, as Reddit shows them to a signed-out visitor: title, text, link, kind, **score, upvote ratio, comment count, exact time**, flair, media, **score and comments per hour**, the subreddit's size — and **the author's karma and account age** when you ask for it. Refresh the numbers of posts you found earlier, check which still exist, and get the full record of a list of links. No login, no cookies of yours, no CAPTCHA solving.

**Always `null` since 16 October 2026** — Reddit closed the JSON API this Actor used to read as a signed-out
visitor, and the pages it renders instead do not carry these: `editedAt`, `spoiler`, `locked`, `archived`,
`originalContent`, `removedBy`, `distinguished`, `crosspostOf`, `crosspostCount`, `poll` (a poll's kind is still
`poll`, its votes are not shown), `thumbnailUrl`, `authorPremium`. `nsfw` and `stickied` arrive on media posts
only. Everything else above is measured filled — see the Changelog.

### 🔍 What is the Reddit Post Details Scraper — and when should you use it?

Give this Actor a list of Reddit post URLs, `t3_` names or ids and it returns their records, enriched with velocity and the subreddit's size (and the author's karma when `includeAuthorInfo` is on). Each post is read from its own page, a few at a time.

**Use it when you need:** to refresh the score/comments of posts you collected earlier; to check which posts still exist; or to hydrate a list of post links into full rows.

**Use something else when:** you're discovering posts by keyword → [Search](https://apify.com/foxlabs/reddit-search-scraper); by subreddit → [Subreddit Posts](https://apify.com/foxlabs/reddit-subreddit-posts-scraper); you want a post's comments → [Post Comments](https://apify.com/foxlabs/reddit-post-comments-scraper).

### 🤖 Use with AI agents

**Already on the Apify MCP server?** Ask for this Actor by name: `foxlabs/reddit-post-details-scraper`. An agent can discover it, run it and read the dataset over MCP.

**Real-time Standby API.** The same code answers HTTP requests on demand — `GET /posts?ids=t3_1x2jj5d,1x2j7z3` or `GET /posts?url=https://www.reddit.com/r/Python/comments/1x2j7z3/`. Parameters: `ids` (up to 100), `url`, `authors` (0/1), `subreddits` (0/1); billed with the same `post-details` event.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```
I want Reddit post records by URL using the Apify Actor
`foxlabs/reddit-post-details-scraper`.

Input: `postUrls` is a list of post URLs, t3_ names or ids (up to 10,000), 100 fetched per request.
Each row has title, text, score, upvoteRatio, commentCount, createdAt, scorePerHour and authorInfo.

Start with:
{ "postUrls": ["https://www.reddit.com/r/Python/comments/1x2j7z3/"] }

Ask me for the posts to hydrate, run the Actor, then summarise them as a table.
```

The machine-readable API, MCP config and OpenAPI definition live at `apify.com/foxlabs/reddit-post-details-scraper.md`.

### 📋 Overview

Everything you need to turn a list of Reddit post links into clean, structured data — records with velocity, the subreddit's size and, on request, the author's karma — in one Actor, with no login, cookies or CAPTCHA solving.

**Why teams pick this Actor:**

- ✅ **Any number of links** — up to 10,000 lines a run; each post is read from its own page (six at a time), so a long list takes longer than it did on Reddit's old API.
- 🔄 **Refresh & existence check** — re-pull scores/comments, and see which posts were removed or deleted.
- ⚡ **Velocity, the subreddit's size, karma on request** — score/comments per hour on every row, the subscriber count from the post's own page, the author's karma with `includeAuthorInfo`.
- 🎯 **Honest state** — a removed post keeps its record with `removedBy`; a deleted one is a free status row.
- 💰 **Pay only for results** — one `post-details` event per row; status rows free.
- 🤖 **Agent-ready** — MCP + a real-time Standby API.

### ✨ Features

- 🔍 **Any post address** — URL, `t3_` name or id; `old.reddit.com`, `redd.it`, profile posts accepted.
- 📄 **Full record** — the same rich fields as the Subreddit Posts Scraper (title, text, media, flags, crosspost origin…).
- 👤 **Author karma + subreddit record** — `includeAuthorInfo` (one profile-page read per author, off unless asked) / `includeSubredditInfo` (free: it rides on the post's own page).
- 🧾 **What Reddit no longer shows a signed-out visitor** — the edit time, the spoiler/locked/archived flags, the removal reason, a poll's votes and a crosspost's origin are `null`; see *Fields*.
- 📦 **Clean export** — deduplicated camelCase rows, ready for CSV/Excel/JSON.

### 🎬 Quick Start

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~reddit-post-details-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"postUrls": ["https://www.reddit.com/r/Python/comments/1x2j7z3/", "t3_1x2jj5d"]}'
```

### 🚀 Getting Started (3 steps)

1. **Paste your posts** — one per line: URL, `t3_` name or id (up to 10,000).
2. **Pick enrichment** — keep `includeAuthorInfo` on; add `includeSubredditInfo` if you want.
3. **Run and export** — get a clean dataset as JSON, CSV or Excel.

### 📥 Input

| Field | Meaning |
|---|---|
| `postUrls` | one per line: a post URL, `t3_` name or id (up to 10,000). Share links (`…/s/…`) are not accepted. |
| `maxPosts` | rows in the whole run (default 100,000). |
| `includeAuthorInfo` | the author's karma and cake day — one profile-page read per author, so the run takes longer (default off). |
| `includeSubredditInfo` | each distinct subreddit's record (default off). |
| `proxyConfiguration` | nothing to change for normal use. |

```json
{ "postUrls": ["https://www.reddit.com/r/Python/comments/1x2j7z3/", "t3_1x2jj5d", "1x27tvo"] }
```

### 📤 Output

One row per post, with the [Subreddit Posts Scraper](https://apify.com/foxlabs/reddit-subreddit-posts-scraper) fields: ids and address, `title`, `text`, `link`, `domain`, `kind`, `author` and flair, `score`, `upvoteRatio`, `commentCount`, `awardCount`, `crosspostCount`, `createdAt`, `editedAt`, `hoursSincePost`, `scorePerHour`, `commentsPerHour`, flags, media, `subredditSubscribers` — plus `authorInfo`, `subredditInfo`, `input` (the line the row answers) and `position`.

A line Reddit has no post for — deleted or never existed — gets a **free status row**; so does a line that is not a post or repeats one. A run never ends empty without a word.

### 💼 Use cases

**1. Refresh a saved list** — re-pull the current score/comments of posts you collected before.
*Input:* your post URLs. *Output:* fresh records. *Use:* keep a dashboard up to date.

**2. Existence / removal audit** — see which posts still exist and which were removed.
*Input:* the links. *Output:* records + `removedBy`, or status rows for deleted. *Use:* clean a dataset.

**3. Hydrate links from anywhere** — turn a column of Reddit URLs into full rows.
*Input:* the URLs. *Output:* full post records. *Use:* enrich a spreadsheet or CRM.

### 🔗 Integration

**JavaScript / Node.js**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/reddit-post-details-scraper').call({
  postUrls: ['https://www.reddit.com/r/Python/comments/1x2j7z3/'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/reddit-post-details-scraper').call(
    run_input={'postUrls': ['https://www.reddit.com/r/Python/comments/1x2j7z3/']}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

Written for `apify-client` 3 for Python, where `call()` returns a run object; with version 1 or 2 it returns a dict — write `run['defaultDatasetId']` there.

**Automation (n8n / Zapier / Make):** schedule → HTTP request to the Actor API with your `postUrls` → handle the JSON dataset → push to a sheet, CRM or dashboard.

### 📊 Pricing

Pay per event, one event per delivered row: **`post-details`** — whatever it carries (the author's and subreddit's records ride along free). Status rows are free; a run Reddit doesn't answer ends FAILED and charges nothing; no start fee. [View current pricing.](https://apify.com/foxlabs/reddit-post-details-scraper)

### ❓ FAQ

**Do I need a Reddit account, login or API key?** No. It reads Reddit as a signed-out visitor via a guest token — no account, no cookies, no CAPTCHA solving.

**How many posts per request?** 100. A list of 10,000 is about 100 requests.

**What happens to a removed or deleted post?** A removed post keeps its record with `removedBy` set; a deleted one (or a nonexistent id) gets a free status row.

**Are share links accepted?** No (`…/s/…`). Use the full post URL, `t3_` name or id.

**Can I export to CSV / Excel / JSON?** Yes — directly from the Apify dataset.

### 🐛 Troubleshooting

- **A line returns a status row** — the post was deleted/never existed, isn't a post, or repeats another line (free).
- **Empty text on a post** — it was removed by a moderator (`removedBy` is set); the rest of the record is still there.
- **`subredditInfo.activeUsers` null** — Reddit doesn't give that to a signed-out visitor.
- **Scores look slightly off** — Reddit fuzzes scores by design.

**How it reads Reddit:** opens a listing as a signed-out visitor, takes the guest token, and calls Reddit's JSON API for posts by id, 100 at a time. Residential-only token (measured 7/7 residential, 0/8 datacenter) → Apify Proxy residential by default; four addresses rotate.

### ⚠️ Trademark

Independent, third-party tool. Reddit is a trademark of Reddit, Inc.; this Actor is not affiliated with, endorsed by or connected to Reddit. The mark is used here for identification only.

### ⚖️ Is it legal to scrape this data?

It reads only what Reddit shows anyone who is not signed in. Rows carry user names (public pseudonyms) and publicly posted text; you are responsible for using them lawfully (GDPR, CCPA, Reddit's User Agreement). Nothing is stored outside your own Apify datasets. See Apify's blog post on the legality of web scraping.

### 🤝 Support & contact

- 🌐 **Website:** [data.foxlabs.com.tr](https://data.foxlabs.com.tr)
- 📧 **Email:** info@foxlabs.com.tr
- 🐛 **Issues:** open a ticket in the Actor's **Issues** tab — the run's `SOURCE_REPORT` record holds what was read, delivered and why the run stopped.
- 🧰 **More clean data actors:** [Fox Labs on Apify](https://apify.com/foxlabs)

### Changelog

#### 0.2.0 — 2026-10-17

Reddit closed its JSON API to signed-out visitors on 16 October 2026 (HTTP 403 for a guest token, from any
address), so this Actor now reads each post from the page Reddit's own web client renders. Field names, the dataset
shape, the `post-details` event and its price are unchanged. What changed: a post is one page read instead of a
hundred posts a request, so a long list takes longer; `editedAt`, `spoiler`, `locked`, `archived`,
`originalContent`, `removedBy`, `distinguished`, `crosspostOf`, `crosspostCount`, `thumbnailUrl`, `authorPremium`
and a poll's votes are `null`, and `nsfw`/`stickied` arrive on media posts only; `includeAuthorInfo` is off by
default because the karma is now one profile-page read per author; `includeSubredditInfo` costs nothing — the
subscriber count comes off the post's own page. A page that comes back without the post on it is reported as "not
shown to this run", is retryable and charges nothing — it is never reported as a deleted post.

#### 0.1.0 — 2026-10-10

- First release: post records by address, name or id, 100 a request, with the family's full fields, velocity, author karma and optional subreddit records; free status rows for lines with no post; Standby API prepared.

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/reddit-post-details-scraper/changelog.md

# Actor input Schema

## `postUrls` (type: `array`):

One post per line: its address (https://www.reddit.com/r/python/comments/1x2jj5d/…, old.reddit.com or redd.it/1x2jj5d), its full name (t3_1x2jj5d) or its id (1x2jj5d). Share links (…/s/…) are not accepted. Up to 10,000 lines; 100 posts are read per request. A post written twice is delivered once.

## `maxPosts` (type: `integer`):

The run stops when this many rows have been delivered. You are charged only for delivered rows.

## `includeAuthorInfo` (type: `boolean`):

One profile-page read per author adds each post's author record (link and comment karma, account creation date, avatar) as authorInfo. A deleted author gets null.

## `includeSubredditInfo` (type: `boolean`):

One request per distinct subreddit among the posts adds its subscribers, active users, creation date, type and description to the rows of it (subredditInfo). Off by default: every row already carries the subscriber count.

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

Nothing to change for normal use: the Actor reads Reddit through Apify Proxy residential addresses, the only kind Reddit hands its guest token to (measured: residential 7 of 7 sessions, datacenter 0 of 8). Set a proxy here to send every request through it instead; a setting the platform refuses ends the run before anything is read.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.reddit.com/r/Python/comments/1x2j7z3/",
    "t3_1x2jj5d"
  ],
  "maxPosts": 100000,
  "includeAuthorInfo": false,
  "includeSubredditInfo": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "postUrls": [
        "https://www.reddit.com/r/Python/comments/1x2j7z3/",
        "t3_1x2jj5d"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/reddit-post-details-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 = {
    "postUrls": [
        "https://www.reddit.com/r/Python/comments/1x2j7z3/",
        "t3_1x2jj5d",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/reddit-post-details-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 '{
  "postUrls": [
    "https://www.reddit.com/r/Python/comments/1x2j7z3/",
    "t3_1x2jj5d"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call foxlabs/reddit-post-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,foxlabs/reddit-post-details-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/gyCamPwNy7MRs6GDr/builds/EERl5INnqO1YiuREy/openapi.json
