# GoFundMe Scraper (`muhammadafzal/gofundme-scraper`) Actor

Scrape public GoFundMe campaigns by URL or keyword, including stories, organizers, funding goals, donation counts, locations, and recent donations.

- **URL**: https://apify.com/muhammadafzal/gofundme-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 campaign records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## GoFundMe Scraper

Extract structured public GoFundMe campaign data from campaign URLs or keyword searches. The Actor returns one clean dataset item per fundraiser for fundraising research, nonprofit intelligence, campaign monitoring, journalism, market analysis, and AI workflows.

### What it extracts

- Campaign ID, title, canonical URL, slug, image, status, and timestamps
- Story text, organizer, disclosed beneficiary, charity, and campaign type
- Amount raised, goal, currency, percent funded, and donation count
- City, region, postal code, and country when publicly displayed
- Update, heart, and social-share counts when available
- Recent donations already published on the campaign page, including anonymous status

The Actor reads public GoFundMe pages and GoFundMe's page-owned public search service. It does not sign in, donate, modify campaigns, bypass access controls, or retrieve private donor details.

### Input

Run by keyword:

```json
{
  "searchQueries": ["wildfire relief", "animal rescue"],
  "maxResults": 50,
  "includeStory": true,
  "includeRecentDonations": true
}
```

Run with direct campaign URLs:

```json
{
  "searchQueries": [],
  "startUrls": [
    { "url": "https://www.gofundme.com/f/example-campaign" }
  ],
  "maxResults": 10
}
```

You can combine both modes. Duplicate campaigns are returned once. `maxResults` applies across the entire run and is capped at 500.

### Output example

```json
{
  "campaignId": "50513568",
  "title": "Example fundraiser",
  "url": "https://www.gofundme.com/f/example-fundraiser",
  "slug": "example-fundraiser",
  "story": "Public campaign story...",
  "imageUrl": "https://images.gofundme.com/example.jpg",
  "organizerName": "Example Organizer",
  "beneficiaryName": null,
  "charityName": null,
  "categoryId": "11",
  "projectType": "PERSONAL",
  "city": "Austin",
  "region": "TX",
  "postalCode": "",
  "countryCode": "US",
  "amountRaised": 3621,
  "goalAmount": 500000,
  "currency": "USD",
  "percentFunded": 0.72,
  "donationCount": 65,
  "recentDonations": [],
  "updateCount": 0,
  "heartCount": 39,
  "socialShareCount": 17,
  "status": "ACTIVE",
  "donationsEnabled": false,
  "isCharity": false,
  "isTeamFundraiser": false,
  "createdAt": "2020-08-18T00:09:17.000-05:00",
  "publishedAt": "2020-08-27T23:51:19.000-05:00",
  "scrapedAt": "2026-09-04T00:00:00.000Z",
  "sourceUrl": "https://www.gofundme.com/f/example-fundraiser"
}
```

Results are written to the default dataset. `OUTPUT` in the default key-value store records the run outcome (`DATA`, `EMPTY`, or `BLOCKED`), counts, warnings, and terminal message.

### Pricing

This Actor uses pay per event:

- **Actor start:** $0.00005 once per run
- **Campaign record:** $0.002 for each unique, validated campaign written to the default dataset

No campaign-record event is charged for invalid URLs, failed requests, blocked pages, duplicates, or zero-result searches. Set an Apify maximum charge per run to enforce a hard budget.

### Reliability and limits

GoFundMe can change its public page structure or apply traffic controls. The Actor uses bounded retries, session consistency, and direct HTTP extraction. Direct access is the economical default. If GoFundMe blocks a cloud geography or larger run, enable an Apify residential proxy with US targeting.

Keyword ranking reflects GoFundMe's current public search results and can change over time. Recent donations are limited to entries embedded in the campaign page; the Actor does not claim complete donation history. Some fields are `null` when GoFundMe does not publish them.

### Responsible use

Use public campaign data lawfully and in line with GoFundMe's terms, applicable privacy rules, and your legitimate purpose. Do not use the output for harassment, discrimination, unsolicited targeting of vulnerable people, identity inference, or attempts to contact anonymous donors. You are responsible for retention, redistribution, and downstream processing.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords used to discover public campaigns, one per line. Examples: medical bills, wildfire relief, animal rescue.

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

Optional public GoFundMe campaign URLs such as https://www.gofundme.com/f/example-campaign.

## `maxResults` (type: `integer`):

Maximum number of unique campaign records returned across all inputs.

## `includeStory` (type: `boolean`):

Include the public fundraiser story as clean text.

## `includeRecentDonations` (type: `boolean`):

Include the recent public donation entries embedded in each campaign page. Anonymous donations remain anonymous.

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

Optional Apify Proxy settings. Direct access is used by default; use a US residential proxy if GoFundMe blocks your run.

## Actor input object example

```json
{
  "searchQueries": [
    "medical bills"
  ],
  "startUrls": [],
  "maxResults": 3,
  "includeStory": true,
  "includeRecentDonations": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Structured public GoFundMe campaign records.

## `summary` (type: `string`):

Outcome, record counts, and request diagnostics.

# 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 = {
    "searchQueries": [
        "medical bills"
    ],
    "maxResults": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/gofundme-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 = {
    "searchQueries": ["medical bills"],
    "maxResults": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/gofundme-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 '{
  "searchQueries": [
    "medical bills"
  ],
  "maxResults": 3
}' |
apify call muhammadafzal/gofundme-scraper --silent --output-dataset

```

## MCP server setup

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