# Gab Scraper: Profiles, Posts & Replies from Gab.com (`memo23/gab-scraper`) Actor

Gab.com scraper with no login: account profiles (followers, posts, verified, Pro, join date), each account's latest posts, single posts by link and up to 40 replies a post, with likes, reposts, media and links. $1.50 per 1,000 posts and replies, $8 per 1,000 profiles.

- **URL**: https://apify.com/memo23/gab-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 post or replies

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

## Gab Scraper: Profiles, Posts & Replies from Gab.com

Scrape **Gab.com** without a login: account **profiles** (followers, following, post count, verified and Pro flags, join date), each account's **latest posts**, any **post by its link**, and the **replies** under it. Every post comes with text, likes, reposts, reply count, media links, and the links, mentions and hashtags found in the text. **$1.50 per 1,000 posts and replies.**

![How the Gab Scraper works](https://api.apify.com/v2/key-value-stores/s7AzwFyXjfKClRxYQ/records/how-it-works-gab.png)

```json
{
  "usernames": ["a", "https://gab.com/Scarecrow23"],
  "postUrls": ["https://gab.com/a/posts/117479942126216153"]
}
```

| Input | Rows |
|---|---|
| Username or profile link | One `profile` row, plus the account's latest posts (up to 8) as `post` rows |
| Post link | One `post` row for the post itself, plus up to 40 `reply` rows |

### Why Use This Scraper?

- **Profiles, feeds and threads in one actor.** Put accounts and post links in the same run; each row says what it is in `type`.
- **Links put back together.** Gab cuts long links into pieces when it shows them; this actor joins them again and lists them in `links`, with `mentions` and `hashtags` beside them.
- **Cheaper per post.** $0.0015 per post or reply, against $0.002 to $0.005 in other Gab actors.
- **You only pay for rows.** Accounts that do not exist and posts that are gone cost nothing beyond the run start.

### Use Cases

- **OSINT and research:** follow what known accounts post and who answers them.
- **Brand and narrative monitoring:** collect the replies under a post that is spreading.
- **Audience checks:** compare accounts by followers, post count and join date.
- **Archiving:** keep a dated copy of posts with their counts and media links.

### How It Works

1. Usernames and post links are read four at a time. Each lookup takes about 40 seconds.
2. For an account, the profile and the latest posts are fetched together.
3. For a post link, the post comes first. It shows how many replies there are; if there are 5 or more, the replies are fetched next.
4. Every row is charged as it is delivered, and the run stops cleanly at your spending limit or `maxItems`.

### Input Configuration

| Field | Type | Description |
|---|---|---|
| `usernames` | array | Account names (`a`, `@GabNews`) or profile links. Post links here are handled as post links. |
| `includeProfiles` | boolean | Profile row for each account. Default on. |
| `includePosts` | boolean | Latest posts of each account. Default on. |
| `maxPostsPerUser` | integer | 5 to 100, default 8. The data source returns up to 8 today. |
| `postUrls` | array | Links like `https://gab.com/a/posts/117479942126216153`. |
| `includePostDetails` | boolean | A row for the linked post itself. Default on. |
| `includeReplies` | boolean | Replies under the linked post. Default on. |
| `maxRepliesPerPost` | integer | 5 to 100, default 40. The data source returns up to 40 today. |
| `maxItems` | integer | Cap on all rows. Default 1,000; free-plan runs return up to 100. |

#### Example input

Profiles and latest posts of three accounts:

```json
{
  "usernames": ["a", "GabNews", "Scarecrow23"]
}
```

Replies only, for two posts:

```json
{
  "postUrls": [
    "https://gab.com/a/posts/117479942126216153",
    "https://gab.com/a/posts/117496951939627396"
  ],
  "includePostDetails": false
}
```

### Output Samples

A profile:

```json
{
  "type": "profile",
  "userId": "31",
  "username": "a",
  "displayName": "Andrew Torba ✝️",
  "bio": "Saved servant soldier of Jesus Christ. CEO of\n@gab\n.",
  "url": "https://gab.com/a",
  "followersCount": 4013850,
  "followingCount": 3110,
  "postsCount": 80584,
  "isVerified": true,
  "isPro": true,
  "avatarUrl": "https://m3.gab.com/accounts/avatars/000/000/031/original/8c87a72b55945b7d.png",
  "headerUrl": "https://m3.gab.com/accounts/headers/000/000/031/original/8ae356922cbeb9a6.jpeg",
  "createdAt": "2016-08-10T06:02:25.000Z",
  "input": "https://gab.com/a",
  "scrapedAt": "2026-10-26T14:40:36.478Z"
}
```

A post from an account's feed:

```json
{
  "type": "post",
  "id": "117497269073678500",
  "url": "https://gab.com/a/posts/117497269073678500",
  "text": "For those on Windows machines a big new update to the Gab AI Windows app just landed in the store:\nhttps://apps.microsoft.com/detail/9nbmwtz69fgk?hl=en-US&gl=US",
  "authorUsername": "a",
  "authorName": "Andrew Torba ✝️",
  "authorUrl": "https://gab.com/a",
  "likeCount": 49,
  "repostCount": 6,
  "replyCount": 3,
  "mediaUrls": [],
  "mediaCount": 0,
  "links": ["https://apps.microsoft.com/detail/9nbmwtz69fgk?hl=en-US&gl=US"],
  "mentions": [],
  "hashtags": [],
  "createdAt": "2026-10-24T18:20:44.219Z",
  "sourceType": "user-posts",
  "input": "https://gab.com/a"
}
```

A reply:

```json
{
  "type": "reply",
  "id": "117479971800576557",
  "url": "https://gab.com/Scarecrow23/posts/117479971800576557",
  "text": "@a\nExactly! as the saying goes \"Life is 10% what happens to you and 90% how you react to it\" so act accordingly",
  "authorUsername": "Scarecrow23",
  "authorName": "ScArecrow23 :merica: 💀 🎸",
  "likeCount": 5,
  "repostCount": 0,
  "replyCount": 0,
  "mentions": ["a"],
  "createdAt": "2026-10-21T17:01:48.795Z",
  "sourceType": "replies",
  "inReplyToUrl": "https://gab.com/a/posts/117479942126216153"
}
```

### Key Output Fields

| Field | Meaning |
|---|---|
| `type` | `profile`, `post` or `reply` |
| `sourceType` | Where a post came from: `user-posts` (an account's feed), `post-link` or `replies` |
| `likeCount`, `repostCount`, `replyCount` | Counts at the time of the run |
| `links`, `mentions`, `hashtags` | Found in the post text; links are rejoined |
| `mediaUrls` | Image and video links attached to the post |
| `inReplyToUrl` | For replies: the post link you gave |
| `createdAt` | When the post was made, or when the account joined (ISO 8601, UTC) |

### FAQ

**How many posts do I get per account?**
The latest 8. The data source returns no more than 8 an account and has no way to page further back, so older posts are not reachable through this actor. For older posts, put their links in `postUrls`.

**How many replies do I get per post?**
Up to 40, including replies to replies. A post with 53 replies returned 40 in our tests. Posts showing fewer than 5 replies are not looked up for replies, so you are not charged for a lookup that returns almost nothing; turn `includePostDetails` off if you want the replies of every post regardless.

**Why do some profiles have no follower or post counts?**
Some older accounts (for example `gab`, `GabNews`, `realdonaldtrump`) come back with name, bio and avatar only. Those rows are billed as a basic profile ($0.003), not at the full profile price.

**Can I search Gab by keyword or hashtag?**
No. This actor works from usernames and post links.

**Do I need a Gab account or cookies?**
No.

### Pricing

| Event | When | Price |
|---|---|---|
| Actor start | Once per run (per GB of memory, 256 MB default) | $0.005 |
| Post | Each post from an account's feed, and each reply | $0.0015 |
| Profile | Each account profile with counts | $0.008 |
| Basic profile | An older account the source returns with name, bio and avatar only, no counts | $0.003 |
| Post by link | Each post looked up by its own link | $0.008 |

Example: profiles and latest posts of 50 accounts cost 50 × $0.008 + 400 × $0.0015 + $0.005 = **$1.005**. The replies of 20 busy posts cost 20 × $0.008 + 800 × $0.0015 + $0.005 = **$1.365**.

### Support

Found a bug or need a field? Open an issue on the actor's Issues tab and include the run link.

### ⚠️ Disclaimer

This actor reads public Gab pages only. It is not affiliated with or endorsed by Gab AI Inc. You are responsible for using the data in line with Gab's terms and the laws that apply to you, including data protection rules for personal data. Post texts and media belong to their authors.

### SEO Keywords

Gab scraper, Gab.com scraper, Gab posts scraper, Gab profile scraper, Gab replies, Gab followers, Gab OSINT, Gab data export, alt-tech social media scraper, Gab API alternative, social media monitoring, Gab account posts

# Actor input Schema

## `usernames` (type: `array`):

Account names (a, @GabNews) or profile links (https://gab.com/a). Each account returns its profile and its latest posts. Post links put here are handled as post links.

## `includeProfiles` (type: `boolean`):

Followers, following, post count, bio, verified and Pro flags, avatar, join date.

## `includePosts` (type: `boolean`):

The account's latest posts with text, likes, reposts, replies, media and links. The data source gives the latest 8 posts of an account; older posts are not reachable.

## `maxPostsPerUser` (type: `integer`):

The data source returns up to 8 posts an account today; the setting is kept for when it returns more.

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

Links like https://gab.com/a/posts/117479942126216153. Each returns the post itself and its replies.

## `includePostDetails` (type: `boolean`):

Text, counts and media of the linked post. It also tells the actor how many replies there are, so a post with fewer than 5 replies is not looked up for replies.

## `includeReplies` (type: `boolean`):

Replies under the post, up to 40 a post (what the data source returns).

## `maxRepliesPerPost` (type: `integer`):

The data source returns up to 40 replies a post today.

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

Cap on all rows together. Free-plan runs return up to 100.

## Actor input object example

```json
{
  "usernames": [
    "a"
  ],
  "includeProfiles": true,
  "includePosts": true,
  "maxPostsPerUser": 8,
  "postUrls": [
    "https://gab.com/a/posts/117479942126216153"
  ],
  "includePostDetails": true,
  "includeReplies": true,
  "maxRepliesPerPost": 40,
  "maxItems": 1000
}
```

# Actor output Schema

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

Rows told apart by `type`: `profile`, `post` and `reply`.

# 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 = {
    "usernames": [
        "a"
    ],
    "postUrls": [
        "https://gab.com/a/posts/117479942126216153"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/gab-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 = {
    "usernames": ["a"],
    "postUrls": ["https://gab.com/a/posts/117479942126216153"],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/gab-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 '{
  "usernames": [
    "a"
  ],
  "postUrls": [
    "https://gab.com/a/posts/117479942126216153"
  ]
}' |
apify call memo23/gab-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/gab-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/kbTJhv0r1iclc2QQa/builds/qlSSgBsug2wgIG5yC/openapi.json
