Kickstarter Scraper avatar

Kickstarter Scraper

Pricing

from $0.84 / 1,000 results

Go to Apify Store
Kickstarter Scraper

Kickstarter Scraper

Kickstarter projects from its own discovery API: funding, goal, % funded, backers, category, location, creator, dates -- plus reward tiers, followers and live counters. Clean one-row-per-project output; summaries, errors and cost in a separate run report.

Pricing

from $0.84 / 1,000 results

Rating

0.0

(0)

Developer

Fetch Foundry

Fetch Foundry

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Categories

Security

Limited permissions

Share

Kickstarter Scraper — Projects, Funding, Backers, Rewards

Kickstarter projects straight from Kickstarter's own discovery API — goal, pledged, % funded, backers, category, location, creator and dates — plus optional reward tiers, followers and live counters.

One clean row per project. Summaries, errors, completeness and cost are kept out of your data, in a separate run report — so the dataset is ready to use, and you never have to guess whether it is complete.

v0.2 (October 2026). Clean output, a run report with resume support, duplicate removal across queries and runs, ~50x less proxy traffic for details, and a more reliable Cloudflare strategy. See the changelog. Inputs from v0.1 keep working unchanged.


Quick start

{
"queries": [
{"state": "live", "categoryId": 16, "sort": "most_backed"},
{"term": "board game", "state": "successful", "sort": "most_funded"}
],
"maxProjectsPerQuery": 200,
"includeProjectDetails": true,
"includeLiveStats": true
}

You get one row per project in the dataset (example below), and a RUN_REPORT record in the run's key-value store telling you, per query, how many projects Kickstarter has, how many you got, whether the query is complete, and the exact input to continue it.

Inspect real output before you run anything (public, no login):


What you get

1. The dataset: clean project rows

Real row from the sample run above (reward tiers shortened):

{
"projectId": 1471279538,
"name": "VIOLOOP - PLUG-IN AI FOR YOUR COMPUTER",
"state": "live",
"projectUrl": "https://www.kickstarter.com/projects/bvio/violoop-plug-in-ai-for-your-computer",
"categoryName": "Hardware",
"parentCategoryName": "Technology",
"goal": 78424,
"pledged": 17409753,
"currency": "HKD",
"usdPledged": 2219802.17836761,
"percentFunded": 22199.521830052025,
"backersCount": 4191,
"deadline": "2026-10-30T16:00:23+00:00",
"launchedAt": "2026-09-15T16:00:23+00:00",
"creatorName": "Bvio Tech",
"countryName": "Hong Kong",
"locationName": "Hong Kong, Hong Kong",
"blurb": "Turn every PC agent-ready with plug-in AI that reads your screen, prepares tasks, and waits for your approval.",
"_input": "query:state=live category=16 sort=most_backed",
"_source": "kickstarter-discover-json",
"_scrapedAt": "2026-10-10T09:39:37.230494+00:00",
"recordType": "PROJECT",
"slug": "violoop-plug-in-ai-for-your-computer",
"rewardsUrl": "https://www.kickstarter.com/projects/bvio/violoop-plug-in-ai-for-your-computer/rewards",
"convertedPledgedAmount": 2218226,
"currencySymbol": "$",
"currentCurrency": "USD",
"fxRate": 0.12741288,
"staticUsdRate": 0.12750337,
"percentFundedFromUpstream": true,
"country": "HK",
"locationId": 2165352,
"locationState": "Hong Kong Island",
"locationCountry": "HK",
"categoryId": 52,
"parentCategoryId": 16,
"categorySlug": "technology/hardware",
"categoryMatchesRequested": true,
"locationMatchesRequested": null,
"creatorId": 2131188616,
"creatorSlug": "bvio",
"staffPick": true,
"spotlight": false,
"isLaunched": true,
"prelaunchActivated": true,
"disableCommunication": false,
"createdAt": "2026-06-08T14:42:21+00:00",
"stateChangedAt": "2026-09-15T16:00:27+00:00",
"resultPage": 1,
"resultRank": 1,
"detailFetched": true,
"statsFetched": true,
"liveBackersCount": 4191,
"livePledged": 17409753,
"liveCommentsCount": 603,
"liveState": "live",
"livePercentFunded": 22199,
"watchesCount": 8659,
"rewardTierCount": 3,
"addOnCount": 4,
"updatesCount": 4,
"updatesCountExact": true,
"commentsCount": 603,
"topLevelCommentsCount": 330,
"faqsCount": 50,
"projectWeLove": true,
"creatorBackingsCount": 0,
"creatorLaunchedProjects": 1,
"detailSource": "graphql",
"rewardTiersScope": "public",
"dataComplete": true,
"photoUrl": "https://i.kickstarter.com/assets/055/177/242/...jpg",
"rewards": [
{
"rewardId": 11254735,
"title": "Super Early Bird - Violoop",
"minimum": 3128,
"currency": "HKD",
"convertedMinimum": 399,
"convertedCurrency": "USD",
"description": "Violoop is the first plug-in AI operator for any computer. It sees your screen, understands your workflow, and gets tasks done across apps—powered by on-device AI, local memory, and a physical confirmation key that keeps you in control.\n\n🚚 Shipping & Taxes Included\n🛡️ Guaranteed Delivery by Violoop\n🌍 Shipping to Most Countries & Regions",
"backersCount": 3683,
"available": true,
"limit": null,
"remaining": null,
"limitPerBacker": 1,
"estimatedDeliveryOn": "2026-11-01",
"shippingPreference": "unrestricted",
"shippingSummary": "Anywhere in the world",
"rewardType": "base"
},
"... 2 more tiers"
]
}

The Console's Output tab has two tables:

  • Overview (25 key columns) — funding, backers, category, dates, creator, location.
  • All fields — every column (Apify's standard view).

Every row has the same columns whichever options you choose (options only fill more of them).

2. The run report: everything that is not a project

Stored as RUN_REPORT in the run's default key-value store (Console: run → Storage → Key-value store; API: the runReport link in the run's output). Excerpt from the sample run:

{
"version": "0.2",
"isComplete": false,
"summary": {
"projectsInDataset": 36,
"queries": 3,
"queriesFailed": 0,
"queriesIncomplete": 3,
"duplicatesRemovedAcrossQueries": 0,
"excludedByHistoryOrList": 0
},
"queries": [
{
"label": "query:state=live category=16 sort=most_backed",
"status": "ok",
"totalHits": 373,
"estimatedReachable": 373,
"estimatedUnreachable": 0,
"projectsFound": 12,
"projectsPushed": 12,
"pagesFetched": 1,
"stoppedBecause": "max_projects_reached",
"complete": false,
"resumeFrom": {
"term": null,
"state": "live",
"categoryId": 16,
"woeId": null,
"sort": "most_backed",
"staffPicks": false,
"raised": null,
"goal": null,
"startPage": 2
},
"categoryFilterHonoured": true,
"categoryMatchRate": 1.0
},
"... one entry per query"
],
"errors": [],
"resumeInput": {
"queries": [
"... the resumeFrom of every query that did not finish"
]
},
"cost": {
"requests": {
"discover": 3,
"graph": 6,
"page": 0,
"stats": 0,
"warmup": 1
},
"bytesTransferred": {
"discover": 57823,
"graph": 48340,
"page": 0,
"stats": 0,
"warmup": 175959
},
"approxProxyGigabytes": 0.00028,
"retries": 0,
"cloudflareChallenges": 0,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"tlsProfiles": {
"safari17_0": {
"passed": 10,
"challenged": 0
}
}
},
"statusMessage": "36 project(s) from 3 query(ies). 3 query(ies) stopped at your maxProjectsPerQuery -- RUN_REPORT.resumeInput continues them without duplicates"
}
  • isComplete — true only if every query was walked to its real end with no failure. A query that stopped at your maxProjectsPerQuery, at Kickstarter's 2,400-row ceiling or on an error makes it false.
  • queries[] — one entry per query: Kickstarter's own totalHits, how much of it is reachable, what was returned, why it stopped, whether category / location filters were really applied, and resumeFrom.
  • errors[] — failed queries with a reason. A failed query adds nothing to your dataset; it appears here (and in the run's status message) instead.
  • resumeInput — paste it as the next run's input to continue every unfinished query exactly where this run stopped.
  • cost — requests by kind, bytes transferred, retries, Cloudflare challenges and which TLS profiles worked.

The run list in the Console stays tidy: every run shows the platform's usual "Actor succeeded with 360 results in the dataset" (or "Actor finished with … -- 1 query(ies) failed, see RUN_REPORT"). The full sentence, e.g. "360 project(s) from 3 query(ies). 3 query(ies) stopped at your maxProjectsPerQuery -- RUN_REPORT.resumeInput continues them without duplicates", is RUN_REPORT.statusMessage.

Prefer everything in one table, as in v0.1? Set includeDiagnosticsInDataset: true and the per-query SEARCH_SUMMARY and ERROR rows are appended to the dataset (filter on recordType).


Field reference

Project

FieldMeaning
projectIdKickstarter's numeric project id (stable; use it to deduplicate).
name, blurb, slugTitle, short description, URL slug.
projectUrl, rewardsUrlProject page and its rewards page.
statelive, successful, failed, canceled, upcoming (and the occasional other upstream state).
goalFunding goal, in the project's own currency.
pledgedAmount pledged, in the project's own currency.
currency, currencySymbolISO currency of goal/pledged, and its symbol.
usdPledgedpledged converted to USD with Kickstarter's static rate at the time.
convertedPledgedAmount, currentCurrency, fxRate, staticUsdRateKickstarter's own conversion to the viewer currency and the rates used.
percentFundedpledged / goal × 100. Taken from Kickstarter when present, otherwise computed.
percentFundedFromUpstreamtrue if percentFunded came from Kickstarter, false if computed.
backersCountNumber of backers.
staffPick, spotlightKickstarter "Projects We Love" flag (listing version) and spotlight page flag.
isLaunched, prelaunchActivatedLaunched yet; pre-launch page was enabled.
disableCommunicationCreator has turned off messages.
createdAt, launchedAt, deadline, stateChangedAtISO 8601 UTC timestamps.
photoUrlMain project image.

Category, location, creator

FieldMeaning
categoryId, categoryName, categorySlugThe project's (sub)category.
parentCategoryId, parentCategoryNameIts parent category (e.g. Technology).
categoryMatchesRequestedWhen you filtered by category: did this row really match it? (null if no category filter.) See Query limits.
country, countryNameProject country (ISO code and name).
locationId, locationName, locationState, locationCountryKickstarter location ("WOE id"), display name, region, country.
locationMatchesRequestedWhen you filtered by woeId: did this row match it?
creatorId, creatorName, creatorSlugProject creator.

Live counters (includeLiveStats or includeProjectDetails)

Listing values can lag; these are read live and kept next to the listing values.

FieldMeaning
liveBackersCount, livePledged, livePercentFunded, liveStateCurrent backers, pledged (project currency), % funded, state.
liveCommentsCountCurrent comment count including replies.
watchesCountPeople following ("remind me") the project.
statsFetchedtrue when the live counters were read.

Details (includeProjectDetails)

FieldMeaning
rewardsReward tiers (see below).
rewardTierCountNumber of tiers in rewards (public tiers, or all tiers with rewardTiers: all).
publicRewardTierCountWith rewardTiers: all: how many of them are public.
rewardTiersScopepublic or all — which tiers the row contains.
addOnCountNumber of add-ons.
updatesCountCreator updates, including backer-only ones. updatesCountExact is false only for projects with 50+ timeline events (then it is computed from the total).
commentsCountComments including replies. topLevelCommentsCount: without replies.
faqsCountNumber of FAQ entries.
projectWeLoveKickstarter "Projects We Love" badge (live value).
creatorBackingsCount, creatorLaunchedProjectsHow many projects the creator has backed / launched.
detailFetched, detailSourceDetails read (graphql, or project_page as fallback).
detailError, statsErrorWhy details / live counters are missing on this row (null when fine).

Each reward tier: rewardId, title, minimum (minimum pledge, project currency), convertedMinimum + convertedCurrency (USD), description, backersCount, available, limit, remaining, limitPerBacker, estimatedDeliveryOn (date), shippingPreference, shippingSummary, rewardType; with rewardTiers: all also isPublic.

Bookkeeping (same on every row)

FieldMeaning
dataCompletetrue unless an enrichment you asked for is missing on this row (failed, or beyond maxDetailsPerQuery).
_inputThe query that found this project (readable label).
resultPage, resultRankPage and position in that query's results.
_source, _scrapedAt, recordTypeData source, scrape time (UTC), always PROJECT in the dataset.
_error, _errorDetailOnly on ERROR rows (includeDiagnosticsInDataset, or invalid input): error code and message.

Input

Give one query with the flat fields (term, state, categoryId, woeId, sort, staffPicks, raised, goal) or several in queries — each object takes the same keys plus startPage.

FieldNotes
termFree text. A term with no matches honestly returns 0.
statelive, successful, failed, canceled, upcoming.
categoryIdParent ids: 1 Art, 3 Comics, 6 Dance, 7 Design, 9 Fashion, 10 Food, 11 Film & Video, 12 Games, 13 Journalism, 14 Music, 15 Photography, 16 Technology, 17 Theater, 18 Publishing, 26 Crafts — or any subcategory id.
woeIdKickstarter location id (e.g. 2459115 = New York).
sortmagic (default), popularity, newest, end_date, most_funded, most_backed.
raised0 = under 75 % funded, 1 = 75–100 %, 2 = over 100 %.
goalGoal band 0 (< $1,000) … 6 (> $100,000).
maxProjectsPerQueryDefault 60; 0 = up to Kickstarter's ceiling.
includeProjectDetails, rewardTiers, includeLiveStats, maxDetailsPerQueryEnrichment (see fields and Cost).
dedupeAcrossQueries, onlyNewProjects, historyStoreName, excludeProjectIdsDuplicate control (see below).
includeDiagnosticsInDatasetPut summary/error rows in the dataset too (v0.1 style).
proxyConfigurationResidential by default — keep it (see Reliability).
maxConcurrency, minRequestIntervalDefault 2 in flight, 1 s pacing. Kickstarter drops connections under load.
selfTestIgnore the queries and run the built-in health check instead.

Query limits — what Kickstarter does not tell you

  1. 12 projects per page, at most 200 pages: 2,400 projects per query. Page 201 is a real 404, however many hits Kickstarter reports (a "successful" query reports ~299,000). The report shows totalHits, estimatedReachable and estimatedUnreachable per query. To get more, split the query: by categoryId (one query per subcategory), by state, by goal band, by raised band or by woeId, keeping each slice under 2,400 — and leave dedupeAcrossQueries on so overlapping slices never duplicate.
  2. A wrong categoryId or woeId is not an error upstream — it returns every project. The actor detects this from the rows (categoryFilterHonoured / locationFilterHonoured in the report, and categoryMatchesRequested / locationMatchesRequested on rows).
  3. A subcategory is a loose filter, a parent category is strict. Measured on 2026-10-10 over the first 48 projects of five subcategories: 62–90 % on-category (Video Games: 89.2 % over 120 projects in the accuracy test) — the first page is often 100 %, later pages are not. Every row tells you (categoryMatchesRequested), and the report gives categoryMatchRate over all fetched rows. Filter on the flag for a strict set.
  4. state=suspended and unknown sort values are refused. Kickstarter would silently answer them with all projects / the default order.

Continue without duplicates

  • Resume a query. When a query stops at your maxProjectsPerQuery (or a run is cut short), RUN_REPORT.resumeInput holds the same query with startPage set to the next page. Run it as the next input: you get the following pages and none of the projects you already have. Verified in the test suite: page 1–2, then a resume from page 3, 0 overlapping projects.
  • Several queries in one run never return the same project twice (dedupeAcrossQueries, default on; the report counts the removed ones).
  • Across runs turn on onlyNewProjects: every delivered project id is remembered in a key-value store on your account (historyStoreName) and skipped next time — good for daily monitoring of new launches. Or pass ids you already have in excludeProjectIds.

Cost — measured, all-in

This actor charges per project row plus a $0.005 start fee, and you also pay platform usage (compute + Residential proxy). Measured on Apify on 2026-10-10, default settings, at list prices:

1,000 projectsplatform usagetotal on FREE ($0.002/row)total on GOLD+ ($0.001/row)
Discovery only$0.017$2.02$1.02
+ details & live counters (public tiers)$0.063$2.07$1.07
+ details, rewardTiers: all$1.761$3.77$2.77
v0.1 with details, for comparison$1.623$3.64$2.64
  • Summary and error rows are not charged — only projects (v0.1 charged its summary rows too).
  • Retries are included in the figures above. A 1,000-project run with details takes about 9 minutes.
  • Details went from ~0.18 GB to ~0.004 GB of Residential traffic per 1,000 projects by switching from project pages to Kickstarter's GraphQL API (8 projects per request). Secret/VIP tiers still need the page, so rewardTiers: all is opt-in.

Accuracy — tested

Same three queries run on 2026-10-10 on this actor's v0.1 and v0.2 and on the most-used competing Kickstarter scraper in the Store, 120 projects each, then checked against Kickstarter's own live stats.json:

v0.1v0.2competitor
Same project ids (per query)120/120120/120120/120
State correct100 %100 %100 %
Parent category correct (Technology)100 %100 %100 %
Subcategory correct (Video Games)89.2 %89.2 %89.2 %
…and flagged per rowyesyesno
Backers / pledged identical across actors100 %100 %100 %
Backers & pledged vs live stats.json (45 random)100 %100 %100 %
Summaries / errors mixed into the datasetyesnono
Tells you what is missing (report, resume)partlyyesno

The listing data is the same everywhere because it is Kickstarter's own; the difference is what you are told about it. Details were checked separately: reward minimums and per-tier backers identical to the project page on 178/178 public tiers, update counts 24/24, comment counts 23/24 (one comment posted in between). Full method and per-query numbers ship with the actor's source (tests/accuracy).

Reliability and how it is tested

  • Daily self-test on the live actor: fixed queries, invariant checks (state, category, live counters) and a comparison with Kickstarter's own stats.json on a random sample. Results are appended to a public health log.
  • A 27-case regression suite runs before every release (filters dropped by Kickstarter, ceilings, resume, duplicates, failure handling, cost accounting).
  • Kickstarter's Cloudflare decides which browser fingerprints pass, and that changes from day to day. The actor starts with the profiles that currently pass on Residential IPs and keeps score during the run, so a newly blocked profile stops being used after one refusal.
  • Use the Residential proxy (default). Datacenter IPs are refused by Kickstarter on every fingerprint as of 2026-10-10.

Changelog

0.2 — 2026-10-10

  • Dataset holds only clean project rows; summaries, errors, completeness and cost moved to the RUN_REPORT record (the Console run list keeps the short "Actor succeeded with N results" line) (includeDiagnosticsInDataset restores the v0.1 layout). Summary rows are no longer charged.
  • RUN_REPORT.resumeInput and per-query startPage to continue without duplicates; dedupeAcrossQueries (default on), onlyNewProjects, excludeProjectIds.
  • Details and live counters through Kickstarter's GraphQL API, 8 projects per request: ~50x less Residential traffic, details for every project by default (maxDetailsPerQuery 0 = all). New fields: watchesCount, faqsCount, topLevelCommentsCount, projectWeLove, creatorBackingsCount, creatorLaunchedProjects, livePercentFunded, dataComplete.
  • rewardTierCount now counts real tiers only (v0.1 also counted the "pledge without a reward" option). New rewardTiers: all adds secret / VIP / late-pledge tiers.
  • Fixed: queries could fail with "still challenged after 5 attempts" — the TLS rotation started with profiles Kickstarter now blocks on Residential IPs. Safari-first order plus in-run profile scoring.
  • categoryMatchRate over all fetched rows (the first-page rate understated how loose subcategories are).
  • Daily self-test with a public health log.

0.1 — 2026-08-27

  • First release: discovery API, filter-honesty checks, 2,400-row ceiling reporting, optional project-page details and stats.json live counters.