Paginating GoFundMe Search Results Across 20 Countries
Tracking disaster response, emergency medical relief, or localized community fundraising at scale requires structured access to GoFundMe campaigns. Querying individual pages through a headless browser introduces unnecess
Tracking disaster response, emergency medical relief, or localized community fundraising at scale requires structured access to GoFundMe campaigns. Querying individual pages through a headless browser introduces unnecessary rendering overhead, high resource consumption, and slow execution times.
GoFundMe exposes its public campaign search index through direct HTTP endpointsβthe same index that powers browser search on gofundme.com/s. The GoFundMe Campaign Scraper targets this index directly without requiring authentication or proxies. Understanding how to use its filtering options and pricing parameters allows you to extract campaign data cleanly while controlling execution costs.
Filtering Campaigns at the Search Index Level
Extracting targeted campaign data without fetching thousands of irrelevant records relies on passing structured parameters directly to GoFundMeβs internal search queries. The Actor supports two primary operational modes via the mode parameter: search (keyword search across campaigns) and byUrls (direct lookup of specific campaign links, short URLs, or slugs).
When using mode: "search", passing generic search terms can return thousands of low-value, zero-donation records. To narrow the returned dataset, you can apply categorical, geographical, and temporal parameters simultaneously:
{
"mode": "search",
"searchQuery": "flood relief",
"categories": ["Accidents & Emergencies", "Non-Profits & Charities"],
"countries": ["US", "CA"],
"minCurrentAmount": 1000,
"hasDonationsOnly": true,
"sortBy": "mostFunded",
"maxItems": 100
}
Key Schema Parameters
-
categories: An array restricting results to predefined GoFundMe categories such as"Medical, Illness & Healing","Rent, Food & Monthly Bills", or"Environment". -
countries: An array of ISO 3166-1 alpha-2 country codes (supporting 20 countries, including"US","GB","DE","CA", and"AU"). -
minCurrentAmount/maxCurrentAmount: Integer bounds for the total funds raised so far in the campaign's local currency. -
createdAfter/createdBefore: Date filters (YYYY-MM-DD) that restrict results based on the campaign launch date. -
registeredCharityOnly: A boolean flag that filters out personal fundraisers, returning only campaigns tied to a verified registered charity.
By pre-filtering results using hasDonationsOnly: true or minDonationCount, you eliminate unverified or abandoned campaigns before they are emitted into your dataset.
Structure of the Extracted Payload
Every campaign returned by the scraper emits a standardized JSON object to the default dataset. Fields that contain no data for a given campaign are automatically omitted from the payload rather than returning null values.
{
"campaignId": 84930281,
"title": "Emergency Flood Relief for Local Families",
"description": "Providing immediate shelter and essentials...",
"organizerName": "Jane Doe",
"beneficiaryName": "Community Relief Fund",
"category": "Accidents & Emergencies",
"city": "Austin",
"state": "TX",
"country": "US",
"goalAmount": 50000,
"currentAmount": 34200,
"amountToGoal": 15800,
"goalProgressPercent": 68.4,
"currency": "USD",
"donationCount": 412,
"heartCount": 89,
"createdAt": "2024-02-10T14:32:00Z",
"hasDonations": true,
"isPopular": true,
"isRegisteredCharity": false,
"campaignUrl": "https://www.gofundme.com/f/emergency-flood-relief-for-local-families",
"recordType": "campaign",
"scrapedAt": "2024-03-01T10:00:00Z"
}
The payload includes spatial properties (latitude, longitude, zip), activity metrics (recentDonationCount, socialShareCount), and logical flags (isCrisisResponse, donationsClosed).
How to Execute a Search Run
Executing a targeted extraction run can be configured programmatically using the Apify Python client or REST API.
Step 1: Define the Input Payload
Create a JSON configuration establishing your search scope and volume limits. Set maxItems to hard-cap the number of emitted records.
input_data = {
"mode": "search",
"searchQuery": "wildfire",
"countries": ["US"],
"categories": ["Accidents & Emergencies"],
"createdAfter": "2024-01-01",
"sortBy": "newest",
"maxItems": 200
}
Step 2: Initialize and Run the Actor
Pass the input payload to the Actor endpoint.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("crawlerbros/gofundme-campaign-scraper").call(run_input=input_data)
Step 3: Fetch Dataset Items
Retrieve the results from the dataset allocated to the completed run.
dataset_items = client.dataset(run["defaultDatasetId"]).list_items().items
for campaign in dataset_items:
print(f"{campaign['title']} - Raised: {campaign['currentAmount']} {campaign['currency']}")
Calculating Pay-Per-Event Execution Costs
This Actor uses a PAY_PER_EVENT billing model. Users pay per specific event type plus standard platform usage.
The event costs for this Actor are structured as follows:
-
Actor Start (
apify-actor-start): $0.005 per GB of memory allocated to the run. Charged once when the Actor starts running. -
Result (
apify-default-dataset-item): Charged for every dataset item returned.
The base result price per dataset item across Apify discount tiers is:
- FREE: $0.005
- BRONZE: $0.00433
- SILVER: $0.00367
- GOLD: $0.003
- PLATINUM: $0.003
- DIAMOND: $0.003
For example, on the FREE tier, running a job with 1 GB of allocated memory that extracts 100 campaign records results in:
- Actor Start event: $0.005
- Result events: 100 Γ $0.005 = $0.500
- Total event charges: $0.505 (plus platform usage).
On the GOLD tier, the same 100-result extraction incurs:
- Actor Start event: $0.005
- Result events: 100 Γ $0.003 = $0.300
- Total event charges: $0.305 (plus platform usage).
Platform usage is billed separately at the rates defined by your Apify plan. Setting maxItems prevents unexpected charges by stopping execution once the target number of records is met.
Sorting Limitations on the Public Search Index
GoFundMeβs public search index does not expose a globally sorted multi-million campaign database for metrics like total funding or donation counts. When setting sortBy to options other than relevance (such as mostFunded, mostDonations, or highestGoal), GoFundMe reorders records within each fetched page of results rather than across all campaigns globally.
If your use case requires a strict, global "Top 100 Most Funded Campaigns" dataset, fetch a broader subset of records by setting maxItems higher (e.g., 500) and perform the global sort in python or SQL post-ingestion.
Additionally, this approach reads from the public search index and does not fetch individual donor names or granular transaction-level donation histories.
Runs in this article used GoFundMe Campaign Scraper. Its README is the reference for input fields and output structure; this post is only one path through them.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β full credit and traffic to the original publisher.