Patreon Scraper With Launch Date & Billing Setup
Pricing
from $5.99 / 1,000 results
Patreon Scraper With Launch Date & Billing Setup
Patreon Scraper — Scrape Patreon creator profiles, launch dates, billing setup, membership tiers, prices, benefits, and audience details. Extract structured data for creator research, competitive analysis, market research, and subscription insights.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
139
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Patreon Scraper — Campaign Launch Dates, Billing Setup and Free Trials
Patreon Scraper With Launch Date & Billing Setup profiles public Patreon campaigns from a URL, username or search keyword and returns structured JSON: the campaign's launch date, creation date and last public post, plus exactly how it charges — monthly or per release, in which currency, upfront or not, with or without a free trial. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. No Patreon account, login or API key is required — every field comes from what Patreon already serves to a logged-out visitor. Point it at a niche and get back campaign age, activity and monetization mechanics in one pass instead of guessing them from a patron count.
What is Patreon Scraper With Launch Date & Billing Setup?
It is a query-driven Patreon campaign scraper: give it a patreon.com/ URL to profile one campaign directly, or a bare username or free-text keyword to run Patreon's own creator search and profile every campaign it returns. Results come back as one flat JSON object per campaign, pushed to an Apify dataset. No Patreon account or login is needed — every request hits Patreon's public, logged-out about.json and /api/campaigns surfaces.
What sets this apart from a plain profile scrape is the launch and billing layer: launchedDate (when the page went live) sits next to createdDate (when the campaign object was first created, which is earlier), and both sit next to the actual billing mechanics — billingModel, isChargeUpfront, isChargedImmediately, hasFreeTrial, freeTrialDays. A launchedBetween window can filter the result set to campaigns that launched inside a date range, before you spend a row on it.
- Profile a specific campaign from its
patreon.com/URL, or search by keyword and cap the result atmaxDatacampaigns - Read launch date, creation date, posting frequency and the newest public post
- Read the full billing setup: model, currency, charge timing, free trial length and which tiers carry it
- Read publishing format (podcast, video, shows, collections, shop, per-release) mapped from the campaign's own published flags
- Filter or flag campaigns by a launch-date window with
launchedBetweenandonlyKeepMatchingCampaigns - Route traffic through Apify proxy groups or your own proxy URLs
What data can you get with Patreon Scraper With Launch Date & Billing Setup?
Each campaign row is a merge of five field groups: campaign identity, launch & activity, billing & free trial, publishing format, and social links.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Campaign identity | name, creator_name, username, url, campaign_id, about, patron_count, paid_members, total_posts, is_nsfw, tiers, earnings_per_month, earnings_hidden, earnings_currency | Build a base creator/campaign profile |
| Launch & activity | launchedDate, launchedAt, createdDate, createdAt, latestPostDate, latestPostTitle, latestPostUrl, postFrequencyPerMonth, publicPostsAvailable | Score campaign age and whether it's still active |
| Billing setup & free trial | billingModel, payPerName, billingCurrency, isChargeUpfront, isChargedImmediately, hasFreeTrial, freeTrialDays, freeTrialTierIds, showsEarnings, showsPatronCount, earningsVisibility, pledgeUrl | Compare monetization mechanics across a niche |
| Publishing format | contentFormats, oneLiner, mainVideoUrl, numShows, numCollections, hasVisibleShop, hasRss, hasPublicRss, hasSpotifyRss | Segment campaigns by what they publish |
| Social links | socials, instagram, twitter, youtube, facebook, twitch, tiktok | Find a campaign's owned channels off-platform |
Launch date, creation date and billing setup
This is the block a plain Patreon profile scrape does not carry. launchedDate is the day the campaign page went live (Patreon's published_at); createdDate is the earlier day the campaign object was made — the gap between the two is how long the creator built in private before launching. Alongside it, billingModel reports monthly or per_creation, isChargeUpfront and isChargedImmediately report the charge-timing switches, and hasFreeTrial / freeTrialDays report whether a trial exists and how long it runs. A field Patreon did not publish comes back None, never a guessed 0 or false:
{"launchedDate": "2021-09-19","createdDate": "2021-06-02","billingModel": "monthly","payPerName": "month","billingCurrency": "USD","isChargeUpfront": true,"isChargedImmediately": true,"hasFreeTrial": true,"freeTrialDays": 7,"freeTrialTierIds": ["9911002"]}
Publishing format and membership tiers
contentFormats is a mechanical tag list — podcast_rss, video, shows, collections, shop, per_release — each one mapped from a single published flag (has_rss, main_video_url, num_shows, and so on), so every tag traces to one payload key. tiers is the array of paid, titled membership tiers with name, price, description and discord_access, useful for benchmarking a niche's pricing ladder without opening every profile.
Why not build this yourself?
Patreon's own developer API is OAuth-scoped to campaigns the authenticated user owns or manages — it has no public endpoint for searching or listing campaigns you don't administer, so it cannot power a discovery workflow like "find every campaign matching a keyword." Building that yourself means reverse-engineering Patreon's logged-out about.json and JSON:API /api/campaigns routes, tracking Next.js buildId rotations across deploys, and handling Cloudflare, which fronts every request. This Actor already does that: it caches and refreshes the buildId per run, falls back to the campaigns API when the SSR route 404s or returns a redirect envelope, and escalates through unproxied → Apify datacenter → Apify residential proxy on a 403, 429 or 503.
How to scrape Patreon with Patreon Scraper With Launch Date & Billing Setup?
- Open the Actor's page on the Apify Store and click Run, or call it from the Apify API
- Enter one or more items in
startUrls— apatreon.com/profile URL to profile it directly, or a bare username / keyword to search - Set the toggles that decide which columns you pay to fetch:
includeLaunchDate,fetchLatestPostDate,includeBillingAndTrial,includeCreationType, and optionally alaunchedBetweendate window - Start the run
- Download the dataset as JSON, CSV, Excel, or stream it live via the Apify API
{"startUrls": ["python", "https://www.patreon.com/GreenRoomPythons"],"maxData": 25,"includeLaunchDate": true,"fetchLatestPostDate": true,"includeBillingAndTrial": true,"includeCreationType": true,"launchedBetween": "2020-01-01..2023-12-31","onlyKeepMatchingCampaigns": true}
How to run multiple queries in one job
startUrls accepts an array of items, and each one is resolved independently: a patreon.com/ URL is profiled directly and always in full, while anything else is run through Patreon's own creator search up to maxData results. Mix direct profiles and keywords freely in the same run — direct profiles ignore maxData entirely, so a run with three keywords and five direct URLs charges for 3 × maxData searched rows plus exactly 5 direct rows.
⬇️ Input
startUrls is the only required field. Everything else has a default and can be left as-is for a first run.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array (stringList) | A patreon.com/ item is profiled directly; anything else — including a bare username — runs through Patreon's own creator search as a keyword. | ["python", "https://www.patreon.com/GreenRoomPythons"] |
maxData | No | integer | How many campaigns to keep per search keyword. Default 10, minimum 1, maximum 500. Direct profile URLs always resolve in full and ignore this number. | 25 |
includeLaunchDate | No | boolean | Returns launchedAt, createdAt, postFrequencyPerMonth and publicPostsAvailable. Default true. Costs one extra request per campaign. | true |
fetchLatestPostDate | No | boolean | Adds latestPostDate, latestPostTitle and latestPostUrl by reading one row off the public post feed. Default true. Costs one more request per campaign. | true |
includeBillingAndTrial | No | boolean | Returns billingModel, payPerName, billingCurrency, isChargeUpfront, isChargedImmediately, hasFreeTrial, freeTrialDays plus showsEarnings / showsPatronCount / earningsVisibility. Default true. | true |
includeCreationType | No | boolean | Returns contentFormats plus the raw flags and oneLiner it is built from. Default true. | true |
launchedBetween | No | string | YYYY-MM-DD..YYYY-MM-DD. Either side may be empty for an open end. Empty (default "") keeps every campaign. | 2020-01-01..2023-12-31 |
onlyKeepMatchingCampaigns | No | boolean | ON (default true) drops campaigns outside the window and keeps paging to fill maxData. OFF returns every campaign flagged with passedLaunchDateFilter and filterReasons. Ignored when no window is set. | true |
proxyConfiguration | No | object (proxy) | Apify proxy groups, or your own proxy URLs when the section is expanded. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Common pitfall: launchedBetween is a single string with a literal .. separator (2020-01-01..2023-12-31), not two separate date fields — a typo that doesn't match YYYY-MM-DD..YYYY-MM-DD fails the run at start-up rather than silently filtering nothing. A campaign whose launch date Patreon never published fails the window too, and says so in filterReasons, rather than being quietly passed through.
⬆️ Output
Output is typed, normalized JSON with a stable schema across every row in a run — a switched-off toggle leaves its columns present as null (or [] for array columns) rather than removing the keys, so the dataset table keeps one shape start to finish. Download it as JSON, CSV, Excel/XLSX, or pull it live through the Apify API and Apify's dataset export formats.
The default dataset view surfaces 48 of the columns below for readability. The Actor's row-building code (data_extractor.py and launch_billing.py) writes more than that on every successful row — the full field reference is below the example.
Scraped campaign results
[{"url": "https://www.patreon.com/GreenRoomPythons","id": "campaign_7057610","campaign_id": 7057610,"avatar_photo_blurred_url": "https://c10.patreonusercontent.com/avatars/blurred.jpg","avatar_photo_url": "https://c10.patreonusercontent.com/avatars/full.jpg","creation_name": "podcast episodes","creator_name": "Green Room Pythons","is_nsfw": false,"name": "Green Room Pythons","patron_count": 412,"total_posts": 318,"primary_theme_color": 5802752,"thumb": "https://c10.patreonusercontent.com/avatars/thumb.jpg","tiers": [{"id": "9911001", "name": "Listener", "price": 3.0, "description": "Early access to every episode.", "discord_access": false},{"id": "9911002", "name": "Superfan", "price": 10.0, "description": "Early access plus the monthly Q&A.", "discord_access": true}],"about": "A weekly podcast about herpetoculture and ball python genetics.","total_members": 412,"paid_members": 287,"post_count": 318,"earnings_per_month": null,"earnings_hidden": true,"earnings_currency": "USD","socials": [{"platform": "instagram", "url": "https://instagram.com/greenroompythons", "display_name": "greenroompythons", "is_public": true},{"platform": "youtube", "url": "https://youtube.com/greenroompythons", "display_name": null, "is_public": true}],"data_source": "about_json","youtube": "https://youtube.com/greenroompythons","instagram": "https://instagram.com/greenroompythons","twitter": null,"facebook": null,"twitch": null,"tiktok": null,"launchedAt": "2021-09-19T20:36:54.000+00:00","launchedDate": "2021-09-19","createdAt": "2021-06-02T14:11:03.000+00:00","createdDate": "2021-06-02","latestPostDate": "2026-08-09T15:00:00.000+00:00","latestPostTitle": "Episode 214: Clutch season check-in","latestPostUrl": "https://www.patreon.com/posts/episode-214-99887766","postFrequencyPerMonth": 4,"publicPostsAvailable": 96,"billingModel": "monthly","payPerName": "month","billingCurrency": "USD","isChargeUpfront": true,"isChargedImmediately": true,"hasFreeTrial": true,"freeTrialDays": 7,"freeTrialTierIds": ["9911002"],"showsEarnings": false,"showsPatronCount": true,"memberCountPreference": "patron_count","earningsVisibility": "hidden","pledgeUrl": "https://www.patreon.com/checkout/GreenRoomPythons","contentFormats": ["podcast_rss", "shows"],"oneLiner": "A weekly deep-dive into ball python genetics and husbandry.","mainVideoUrl": null,"numShows": 2,"numCollections": 0,"hasRss": true,"hasPublicRss": false,"hasSpotifyRss": true,"hasVisibleShop": false,"isPlural": false,"passedLaunchDateFilter": true,"filterReasons": [],"query": "python","username": "GreenRoomPythons","success": true,"error": null},{"url": "https://www.patreon.com/PixelPagesComics","id": "campaign_5533210","campaign_id": 5533210,"avatar_photo_blurred_url": null,"avatar_photo_url": "https://c10.patreonusercontent.com/avatars/pixelpages.jpg","creation_name": "comic pages","creator_name": "Pixel Pages Comics","is_nsfw": false,"name": "Pixel Pages Comics","patron_count": 189,"total_posts": 640,"primary_theme_color": null,"thumb": "https://c10.patreonusercontent.com/avatars/pixelpages-thumb.jpg","tiers": [{"id": "7701", "name": "Reader", "price": 2.0, "description": "One new page every update.", "discord_access": false}],"about": "Independent webcomic updated twice weekly.","total_members": 189,"paid_members": 142,"post_count": 640,"earnings_per_month": null,"earnings_hidden": null,"earnings_currency": null,"socials": [{"platform": "twitter", "url": "https://twitter.com/pixelpagescomics", "display_name": null, "is_public": null}],"data_source": "campaign_api","youtube": null,"instagram": null,"twitter": "https://twitter.com/pixelpagescomics","facebook": null,"twitch": null,"tiktok": null,"launchedAt": "2019-03-11T09:00:00.000+00:00","launchedDate": "2019-03-11","createdAt": "2019-01-22T11:45:00.000+00:00","createdDate": "2019-01-22","latestPostDate": "2026-08-12T10:00:00.000+00:00","latestPostTitle": "Page 640","latestPostUrl": "https://www.patreon.com/posts/page-640-98877665","postFrequencyPerMonth": 8,"publicPostsAvailable": 210,"billingModel": "per_creation","payPerName": "Each Page","billingCurrency": "USD","isChargeUpfront": null,"isChargedImmediately": null,"hasFreeTrial": null,"freeTrialDays": null,"freeTrialTierIds": [],"showsEarnings": null,"showsPatronCount": null,"memberCountPreference": null,"earningsVisibility": "hidden","pledgeUrl": null,"contentFormats": ["per_release"],"oneLiner": null,"mainVideoUrl": null,"numShows": null,"numCollections": null,"hasRss": null,"hasPublicRss": null,"hasSpotifyRss": null,"hasVisibleShop": null,"isPlural": null,"passedLaunchDateFilter": true,"filterReasons": [],"query": "webcomic","username": "PixelPagesComics","success": true,"error": null},{"url": "https://www.patreon.com/InactiveVanity404","username": "InactiveVanity404","query": "python","success": false,"error": "about_json_http_404 | campaign_id_unresolved","passedLaunchDateFilter": null,"filterReasons": []}]
The second row shows a campaign recovered through the /api/campaigns/<id> fallback (data_source: "campaign_api") after its SSR route returned a redirect envelope. That surface does not carry pledge_sum, primary_theme_color, or the free-trial relationship on every reward object, so hasFreeTrial comes back null — unknown, not a guessed false — along with several format flags. The third row is an unresolved vanity: it never reached a campaign, so it carries only the failure shape (url, username, query, success, error, passedLaunchDateFilter, filterReasons) instead of the full column set.
Full output field reference
Every successful row carries all of the fields below, regardless of which toggles are on — a switched-off block just leaves its fields null or []. Fields marked "view" are in the default dataset view; the rest are pushed to every row but need a custom view or JSON/CSV export to see.
Campaign identity (from data_extractor.py)
| Field | Type | View | Description |
|---|---|---|---|
url | string | yes | Campaign's canonical Patreon URL |
id | string | no | campaign_<id>, Patreon's JSON:API resource id |
campaign_id | integer | yes | Numeric campaign id |
name | string | yes | Campaign display name |
creator_name | string | yes | Creator's full name |
creation_name | string | no | What the creator says they make (e.g. "podcast episodes") |
about | string | yes | Campaign summary, HTML stripped with paragraph breaks kept |
is_nsfw | boolean | yes | Patreon's own NSFW flag |
patron_count / total_members | integer | patron_count only | Total members (both keys hold the same number; kept for compatibility) |
paid_members | integer | yes | Paying member count |
total_posts / post_count | integer | total_posts only | Total posts published (both keys hold the same number) |
earnings_per_month | float | yes | Monthly earnings in earnings_currency; null unless the creator publishes it |
earnings_hidden | boolean | yes | Whether earnings are hidden from the public page |
earnings_currency | string | yes | Currency code for earnings_per_month |
tiers | array | yes | Paid, titled membership tiers: id, name, price, description, discord_access |
avatar_photo_url / avatar_photo_blurred_url / thumb | string | no | Avatar image URLs |
primary_theme_color | integer | no | Campaign's theme color as a decimal RGB int (hex converted) |
socials | array | yes | Every connected social platform: platform, url, display_name, is_public |
youtube, instagram, twitter, facebook, twitch, tiktok | string | yes | Flat convenience columns pulled out of socials |
data_source | string | yes | about_json or campaign_api, depending which surface resolved this row |
Launch & activity (from launch_billing.py, gated by includeLaunchDate)
| Field | Type | View | Description |
|---|---|---|---|
launchedAt / launchedDate | string | launchedDate only | Full timestamp / ISO date the campaign page went live |
createdAt / createdDate | string | createdDate only | Full timestamp / ISO date the campaign object was created (earlier than launch) |
postFrequencyPerMonth | integer | yes | Patreon's own posting-frequency estimate |
publicPostsAvailable | integer | yes | Size of the public post feed |
latestPostDate | string | yes | Publish timestamp of the newest public post (needs fetchLatestPostDate) |
latestPostTitle | string | no | Title of the newest public post |
latestPostUrl | string | no | URL of the newest public post |
Billing setup & free trial (gated by includeBillingAndTrial)
| Field | Type | View | Description |
|---|---|---|---|
billingModel | string | yes | monthly or per_creation |
payPerName | string | yes | What a charge is per, in the creator's own words (e.g. "month", "Each Page") |
billingCurrency | string | yes | Currency campaign members are billed in |
isChargeUpfront | boolean | yes | Whether the first charge happens immediately on pledge |
isChargedImmediately | boolean | yes | Whether ongoing charges are immediate rather than delayed |
hasFreeTrial | boolean | yes | Whether any tier runs a free trial; null when this surface can't see it |
freeTrialDays | integer | yes | Longest active trial length across tiers, in days |
freeTrialTierIds | array | no | Tier ids that carry an active free trial |
showsEarnings | boolean | yes | Whether the creator publishes monthly earnings |
showsPatronCount | boolean | yes | Whether the creator publishes the member count |
memberCountPreference | string | yes | Which member figure the creator prefers to display |
earningsVisibility | string | yes | Raw earnings-visibility setting from /api/campaigns |
pledgeUrl | string | yes | Direct join / checkout URL |
Publishing format (gated by includeCreationType)
| Field | Type | View | Description |
|---|---|---|---|
contentFormats | array | yes | Tags from podcast_rss, video, shows, collections, shop, per_release, one per published flag |
oneLiner | string | no | Campaign's one-line tagline |
mainVideoUrl | string | no | Profile's featured video, if any |
numShows | integer | yes | Number of Patreon Shows the campaign runs |
numCollections | integer | yes | Number of content collections |
hasVisibleShop | boolean | yes | Whether the campaign has a visible Patreon Shop |
hasRss, hasPublicRss, hasSpotifyRss | boolean | no | Podcast RSS feed switches |
isPlural | boolean | no | Whether the campaign is run by a group/team rather than one creator |
Run metadata (always present)
| Field | Type | View | Description |
|---|---|---|---|
passedLaunchDateFilter | boolean | yes | Whether the row matched launchedBetween; null on a failed row |
filterReasons | array | yes | Why a row failed the window, e.g. launch_date_not_published |
query | string | yes | The startUrls item this row came from ("direct" for a URL input) |
username | string | yes | Resolved Patreon username / vanity |
success | boolean | yes | false on an unresolved vanity — see the failure shape above |
error | string | yes | Failure reason, null on a successful row |
How can I use the data extracted with Patreon Scraper With Launch Date & Billing Setup?
- Creator-economy analysts and researchers: pull every campaign in a niche and compare
billingModel,hasFreeTrialandfreeTrialDaysside by side to benchmark how a category actually monetizes, instead of assuming it's all monthly billing. - AI engineers and LLM developers: an agent issues a keyword or URL, receives the structured campaign JSON back, and passes
about,contentFormatsandtiersstraight into the model as grounded context for a research or recommendation task. - Market researchers: run the same keyword set on a schedule and track how many campaigns in a niche pass
launchedBetween, giving a rolling read on category growth without re-deriving age from patron counts. - Creator-tooling product teams: use
tiers,billingModelandfreeTrialDaysacross a comparison set to show a prospective customer how their setup compares to campaigns like theirs.
How do you monitor Patreon billing setup and launch activity over time?
Billing setup is not fixed once a campaign launches — creators change billingModel, add or drop a free trial, or go quiet. Monitoring means running the same startUrls set on a schedule and diffing the fields that actually move: hasFreeTrial and freeTrialDays (a trial added or shortened), billingModel and payPerName (a switch from per-release to monthly or back), latestPostDate and postFrequencyPerMonth (posting has slowed or stopped), and patron_count / paid_members (growth or decline). launchedDate and createdDate are fixed once published and don't need re-checking.
A practical loop: keep a saved list of campaign URLs or a keyword set, run this Actor against it on a recurring Apify schedule, and diff each new dataset against the previous run on username. Alert when hasFreeTrial flips, when billingModel changes, or when latestPostDate hasn't advanced in longer than the campaign's own postFrequencyPerMonth would predict — that combination is a stronger "gone quiet" signal than patron count alone. Delivery is whatever the Apify schedule and dataset/webhook integrations you configure for the run support.
Integrate Patreon Scraper With Launch Date & Billing Setup and automate your workflow
Patreon Scraper With Launch Date & Billing Setup works with any language or tool that can send an HTTP request to the Apify API.
REST API with Python
import requestsTOKEN = "YOUR_APIFY_TOKEN"ACTOR = "scrapier/patreon-scraper-with-launch-date-and-billing-setup"run_input = {"startUrls": ["python"], "maxData": 20}resp = requests.post(f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",params={"token": TOKEN},json=run_input,)campaigns = resp.json()print(campaigns[0]["name"], campaigns[0]["billingModel"])
MCP for query-grounded AI agents
Any Apify Actor, including this one, can be exposed to an MCP-compatible client through Apify's Actors MCP Server:
APIFY_TOKEN=your_token npx -y @apify/actors-mcp-server --actors scrapier/patreon-scraper-with-launch-date-and-billing-setup
An agent in Claude Desktop, Claude Code, or another MCP client then calls the Actor as a tool: it sends a keyword or URL, gets back the campaign JSON, and grounds its answer in the real launch date and billing fields instead of guessing.
Scheduled monitoring and delivery
Apify Console's built-in Schedules run this Actor on a cron interval against the same startUrls, writing each run to a fresh dataset you can diff or pull through the API. There is no actor-specific webhook feature documented here beyond Apify's platform-level dataset and run webhooks.
Is it legal to scrape Patreon campaign data?
Yes — this Actor reads only public campaign pages that any visitor, logged out, can already see; it does not access private posts, patron-only content, or anything behind a paywall. The data here is business and product information — billing setup, launch dates, tier pricing — not personal data about private individuals, so it sits under Patreon's Terms of Service and database-rights considerations rather than GDPR/CCPA personal-data rules. Courts have distinguished scraping publicly accessible web data from unauthorized access to non-public systems (hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985, 9th Cir. 2019), though outcomes depend on jurisdiction and how the data is used. Scraping for a one-off research pass and scraping to train a model or build a competing product carry different risk profiles. Consult your legal team for commercial use cases involving bulk data storage.
Frequently asked questions
How many campaigns does this Actor return per keyword?
Up to maxData (default 10, maximum 500) per keyword, but Patreon's own search is usually the real ceiling — it reported between 44 and 174 hits for the keywords measured on 2026-08-10, and the run stops paging once Patreon's own meta.pages_total is exhausted rather than looping past the end of the result set. Direct patreon.com/ URLs always resolve in full and ignore maxData.
Does this Actor extract free trial data?
Yes — hasFreeTrial, freeTrialDays and freeTrialTierIds come from reward.relationships.free_trial_configuration inside the about.json payload. ⚠️ When a campaign is instead recovered through the /api/campaigns/<id> fallback (data_source: "campaign_api"), that surface's reward objects can carry an empty relationships block even on campaigns that really do run a trial — so hasFreeTrial comes back null there rather than a guessed false. Treat null as "not observable on this surface," not "no trial."
How does this Actor handle Patreon's anti-bot measures?
Every request goes out with a Chrome TLS/JA3 fingerprint (curl_cffi impersonating Chrome 131) matched to the User-Agent it sends, since Patreon fronts everything with Cloudflare. On an HTTP 403, 429 or 503 the run automatically escalates from unproxied to Apify's datacenter proxy and then to Apify's residential proxy, and retries each request up to 3 times before giving up on it.
Can I use this Actor without managing proxies or Patreon credentials?
Yes. No Patreon login, cookie or API key is ever used — every field is read from Patreon's logged-out pages. You can leave proxyConfiguration on its default (Apify RESIDENTIAL) and the Actor handles the datacenter/residential escalation itself; supplying your own proxy URLs is optional.
How do I search by keyword versus profiling one campaign directly?
Put a patreon.com/ URL in startUrls to profile that exact campaign, ignoring maxData. Put anything else — a bare username or a free-text phrase — and it runs through Patreon's own creator search as a keyword, returning up to maxData matching campaigns. Both forms can be mixed in the same startUrls array.
What does the launchedBetween date filter actually do?
Set it to YYYY-MM-DD..YYYY-MM-DD (either side can be left empty for an open end) to keep only campaigns whose launchedDate falls inside that window. With onlyKeepMatchingCampaigns on (the default), non-matching campaigns are dropped and not charged, and the search keeps paging to fill maxData with campaigns that do match. Turn it off to keep every campaign, flagged with passedLaunchDateFilter and filterReasons instead of dropped.
How do I monitor a campaign's billing setup over time?
Run the same startUrls on a recurring Apify schedule and diff each new dataset against the last one on username, watching hasFreeTrial, billingModel, freeTrialDays and latestPostDate for changes. See "How do you monitor Patreon billing setup and launch activity over time?" above for the full loop.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
Yes on both counts. It is reachable as an HTTP endpoint through the Apify API by any agent framework that can send a request, and it can also be registered as a tool for MCP-compatible clients through Apify's Actors MCP Server (npx -y @apify/actors-mcp-server --actors scrapier/patreon-scraper-with-launch-date-and-billing-setup), letting an agent retrieve live campaign data before answering.
Does this Actor return Patreon's content category?
No, and that's deliberate rather than an oversight. Patreon does not expose its own category taxonomy to logged-out requests — it was checked against both about.json and /api/campaigns/<id> on 2026-08-10 with zero occurrences. Rather than ship a guessed category column, this Actor returns contentFormats, where every tag maps to one real published flag.
Are failed or filtered rows charged?
No. Only successfully resolved campaigns are charged, under the row_result pay-per-event. A campaign the search couldn't resolve is still pushed to the dataset with success: false and a reason in error, but not charged; a campaign dropped by an active launchedBetween window (with onlyKeepMatchingCampaigns on) is never pushed at all. To pull only the charged rows from an exported dataset, filter on success == true.
Your feedback
Found a bug, or a Patreon field this Actor should be reading but isn't? Open an issue from this Actor's page in the Apify Store, or reach out through Scrapier's Apify profile — reports like that go straight into the next update.