Kickstarter Projects Scraper
Scrape Kickstarter projects by category, state, location or keyword. Get goal, pledged, backers, deadline and creator as clean JSON or CSV. No account needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
state,category,searchTerms(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00092 per project = $0.92 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Project scraped | One Kickstarter project with its goal, pledged total and backer count. Refused filters stop the run and charge nothing. | $0.00092 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
state | Which projects to return. 'upcoming' means projects with a pre-launch page that have not started funding yet, so they have no goal, pledged total, backer count or deadline. Leave empty to search every state at once. | string |
category | A Kickstarter category. Use a section on its own ('games', 'technology', 'design') or a full path ('games/tabletop games', 'food/restaurants'). A category id also works. Anything that is not a real Kickstarter category is refused before the run spends anything - Kickstarter itself would silently ignore it and hand back every project instead. | string |
searchTerms | Words to search project pages for. Each term is searched in turn until the run reaches the row limit. Up to 20 per run. Leave empty to browse a category or state without a keyword. | array |
location | A place, written the way Kickstarter writes it: 'Berlin, Germany', 'London, UK', 'California', 'United Kingdom'. The name is looked up first, and every row is then checked to come from there. A bare woe_id number is also accepted, but rows cannot be checked against one. | string |
sortBy | How Kickstarter orders the results before paging. 'Magic' is its own default blend. Note that deep paging stops at 9,600 projects per search whichever order you pick, so the sort decides which 9,600 you get. | string |
fundingStatus | Filter by how far a project got towards its goal. | string |
goalRange | Filter by the funding goal, converted to US dollars. A project asking 100,000 JPY counts as about $626, not as $100,000. | string |
pledgedRange | Filter by how much a project has actually raised, converted to US dollars. | string |
staffPicksOnly | Return only projects Kickstarter's own team has picked out. | boolean |
searchUrls | Build the search you want on kickstarter.com/discover, then paste the address bar here. Every setting in the URL is checked against the same list the form uses, and anything Kickstarter would have silently dropped is reported back as a free note rather than sent. | array |
maxItems | Total projects to return across everything you asked for. The budget is shared evenly between your search terms and pasted URLs. Keep it low while you are testing - you pay per row. | integer |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
searchLabelnameblurbcreatorNamecategoryNamestategoalpledgedcurrencypledgedUsdpercentFundedbackersCountdeadlineprojectUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Kickstarter Projects Scraper
Search Kickstarter the way its own discover page does, and get a flat table back: what each project asked for, what it actually raised, how many people backed it, when it closes, who made it and where they are. No account, no cookies, no browser.
- Filter by state, category, location, search term, funding progress, goal size and amount raised.
- Money arrives twice: in the project's own currency and converted to US dollars, so an AUD campaign and a USD one sort against each other correctly.
- Paste a URL from kickstarter.com/discover and it runs that exact search.
- A setting Kickstarter would quietly ignore stops the run instead, so you never pay for the wrong projects.
- Runs with empty input return a labelled sample row, free, so you can see the shape first.
Price
$0.92 per 1,000 projects, plus a $0.0005 start fee per run.
This is a flat rate on every plan, free or paid. There are no volume tiers, no minimum spend, no subscription and no add-on fees. What you read here is what you pay on day one and on day four hundred.
| Projects | Total cost |
|---|---|
| 100 | $0.0925 |
| 1,000 | $0.9205 |
| 10,000 | $9.2005 |
| 100,000 | $92.0005 |
What is actually charged
- One
project-scrapedevent per project row written to the dataset. Nothing else is metered per row. - Free: the sample row an empty run returns, and every diagnostic row: a blocked target, a dead URL, a search that matched nothing. Those rows all carry
"charged": false. - Projects Kickstarter returns that do not actually match your filters are dropped before they are charged.
- Duplicates across your search terms are dropped before they are charged.
- A run stopped because a setting was not recognised charges nothing at all.
- A run that finds nothing costs the start fee and nothing more.
- Rows never leave the dataset without a charge, and are never charged without a row.
Input
{
"state": "live",
"category": "games/tabletop games",
"fundingStatus": "funded",
"sortBy": "most_backed",
"maxItems": 100
}
| Field | What it does |
|---|---|
state | live, successful, failed, canceled or upcoming. Leave it empty to search every state at once. British "cancelled" is understood and corrected. |
category | A section (games, technology, design) or a full path (games/tabletop games). A category id works too. There are 15 sections and 154 sub-categories. |
searchTerms | Words to look for. Up to 20 per run, searched in turn. Kickstarter searches the whole campaign page, not just the title. |
location | A place written the way Kickstarter writes it: Berlin, Germany, London, UK, California, United Kingdom. The name is looked up first and every row is checked against it. |
sortBy | magic, popularity, newest, end_date, most_funded or most_backed. Deep paging stops at 9,600 projects per search, so the sort decides which 9,600 you get. |
fundingStatus | under_75, 75_to_100 or funded. |
goalRange | under_1k, 1k_to_10k, 10k_to_100k, 100k_to_1m or over_1m, on the goal converted to US dollars. |
pledgedRange | The same five bands, applied to what the project actually raised. |
staffPicksOnly | Only projects Kickstarter's own team has picked out. |
searchUrls | Paste the address bar from a search on kickstarter.com/discover. Every setting in it is checked the same way a typed one is. |
maxItems | Total projects across everything you asked for, shared evenly between your terms and URLs. Default 100, hard ceiling 5,000. Keep it low while testing. You pay per row. |
proxyUrls | Leave empty. Fill it in only if you want the traffic to leave through proxy servers you already pay for, as http://user:pass@host:port. |
Run it with empty input and you get one clearly labelled sample row, free, so you can see the output shape before you spend anything.
Output
One row per project. A real row from a real run:
{
"ok": true,
"charged": true,
"recordType": "project",
"searchLabel": "live projects in games/tabletop games",
"projectId": "1129359461",
"name": "Good Society: A Jane Austen RPG – 2nd Edition",
"blurb": "Navigate the pitfalls of romance, reputation, manners, and marriage in the sumptuous new edition of this award-winning regency rpg.",
"creatorName": "Storybrewers Roleplaying",
"categoryName": "Tabletop Games",
"categorySlug": "games/tabletop games",
"categoryId": 34,
"state": "live",
"goal": 20000,
"pledged": 166508,
"currency": "AUD",
"goalUsd": 14430.58,
"pledgedUsd": 120140.32,
"percentFunded": 832.54,
"backersCount": 1023,
"deadline": "2026-10-09T03:00:00.000Z",
"launchedAt": "2026-09-09T20:00:01.000Z",
"createdAt": "2026-02-04T06:11:31.000Z",
"stateChangedAt": "2026-09-09T20:00:05.000Z",
"projectUrl": "https://www.kickstarter.com/projects/storybrewers/good-society-a-jane-austen-rpg-2nd-edition",
"country": "AU",
"locationName": "Sydney, AU",
"staffPick": true,
"isStaffSpotlight": false,
"hasVideo": true,
"imageUrl": "https://i.kickstarter.com/assets/054/517/465/bc8561a110c2f09da066c9d1f7762e6e_original.jpg",
"creatorUrl": "https://www.kickstarter.com/profile/storybrewers",
"resultPage": 1,
"totalMatches": 437,
"scrapedAt": "2026-09-20T09:52:43.077Z"
}
Field notes
goal / pledged: in the project's own currency, whatevercurrencysays. A campaign run in AUD reports AUD here.goalUsd / pledgedUsd: the same two figures converted to US dollars using the rate Kickstarter itself applies. Use these to compare projects across currencies. The filters work on these too, so a 100,000 JPY goal counts as about $626.percentFunded: pledged as a percentage of goal. It goes well past 100. The row above reads 832.54, and five-figure percentages exist.backersCount: people, not pledges, at the moment the row was read. It keeps moving on a live project.deadline: when funding closes, ISO 8601 in UTC. On a project that has already closed this is when it closed.state: live, successful, failed or canceled. An upcoming project readssubmittedorstartedinstead, because that is what Kickstarter calls it before launch.categorySlug: the full path, likegames/tabletop games. Split it on the slash to get the section.locationName: where the creator says they are, as Kickstarter displays it. It is not always the same ascountry, which is the project's registered country.projectId: Kickstarter's own id. Stable, and safe as a primary key when you re-run.
Every real row carries "charged": true. Sample rows carry "_sample": true and diagnostic rows carry "_diagnostic": true with an errorCode you can filter on, and neither is ever billed.
How it works
- It asks Kickstarter's own discovery search for JSON and reads the fields straight out of it. No page rendering, no headless browser, no login, no cookie.
- Every filter value is checked against a list read off Kickstarter itself before a request goes out. This matters more than it sounds: Kickstarter answers a setting it does not recognise by dropping it and returning everything, at a perfectly normal HTTP 200. A run that did that would hand you 680,000 unfiltered projects and bill you for them.
- Each page of results is then checked again on the way out. Kickstarter's sub-category ranking mixes in neighbouring and unrelated projects, measured at about one row in six, and those are dropped before anything is charged.
- Rate limits on the target are handled automatically.
- Results are paged 48 at a time and pushed as they arrive, so a big run never builds up in memory.
What people use it for
- Watching a category you sell into. Run
games/tabletop gamesdaily, diff onprojectId, and you have every new campaign the morning it launches. - Working out what a realistic goal looks like before launching your own: pull a few hundred funded projects in your category and look at the spread of
goalUsdagainstbackersCount. - Finding creators to approach, by location and category, with their project page and profile link already in the row.
- Post-mortems on what did not work:
state: failedwith a goal range tells you a lot more than the success stories do. - Tracking a whole category over months. The rows are flat and typed, so they load straight into a spreadsheet or a database without cleaning.
- Spotting projects about to close: sort by
end_date, filter on75_to_100, and you have every campaign in the last stretch of its funding.
Reading the output
Every run writes three kinds of row, and they are easy to tell apart:
- Real rows carry
"charged": trueand"recordType": "project". One billed event each. - The sample row carries
"_sample": trueand"charged": false. There is exactly one, it only appears when the input had nothing to search for, and it exists so you can look at the output shape before you spend anything. - Diagnostic rows carry
"_diagnostic": true,"charged": falseand anerrorCodeyou can switch on:BAD_INPUTwhen a setting was not recognised,NO_RESULTSwhen a search matched nothing or hit the paging wall,NETWORKwhen Kickstarter could not be reached,RATE_LIMITEDwhen it throttled the run,TIME_BUDGETwhen the run ran out of time before reaching a search.
If you only want the data, filter on charged == true. The count of those rows always equals the number of events you were billed for, so the dataset is its own invoice.
What happens when you get a setting wrong
Kickstarter does not reject a filter value it does not understand. It drops the filter and answers normally. Same HTTP 200, same JSON, just the whole catalogue instead of what you asked for. One letter is enough: cancelled returns every project in every state, while canceled returns the 67,000 that were actually cancelled.
So this Actor checks each value first and stops the run if one does not match, rather than running the wrong search and charging you for it. You get a free BAD_INPUT row naming the setting and what it accepts. The British spelling of "cancelled" is corrected rather than refused, because that one is unambiguous.
Limitations
- Kickstarter hands over at most 9,600 projects per search, whatever the match count says. That is 200 pages of 48. Past that you have to narrow the search with a category, a location or a funding range. When a run reaches that wall it says so in a free diagnostic row rather than quietly stopping.
- This returns the project listing, not the campaign page. There is no campaign body, no reward tiers, no updates, no comments and no backer list.
- Upcoming projects have no funding data at all: no goal, no pledged total, no backer count, no deadline. Those fields come back null rather than as zeroes that would read as real figures.
- Figures are a snapshot at read time. A live project's pledged total and backer count will have moved by the time you look.
- Filtering by a sub-category is approximate on Kickstarter's side . It mixes in neighbouring and unrelated projects at roughly one row in six. Those are dropped and not charged, so you get fewer rows rather than wrong ones, and a search for a thin sub-category can come back smaller than its match count suggests.
- Search terms are not re-checked against the rows, because Kickstarter searches the whole campaign page and the words may not appear in the name or the blurb. Every other filter is checked.
- A location typed loosely is matched to the nearest place Kickstarter knows, and you are told which one it used. A bare woe_id number is passed through as given and the rows cannot be checked against it.
- Creator details are limited to the public display name and profile link. No email, no phone, no address.
- The category list is read from Kickstarter and baked in. If Kickstarter adds a category, it will be refused here until this Actor is updated. That is the deliberate trade against silently returning everything.
- The hard ceiling is 5,000 rows per run and 20 search terms per run. For more, split the work across runs.
Questions
Can I get the campaign text, rewards or backer list?
No. This reads the project listing: the numbers, the dates, the category, the creator and the links. The campaign body, reward tiers, updates, comments and backers are not in it.
Why did I get fewer rows than the match count?
Two reasons, both deliberate. Kickstarter's sub-category ranking returns projects from neighbouring and unrelated categories, about one row in six, and those are dropped before they are charged. And any single search stops at 9,600 projects however many matches it reports. Both show up as free diagnostic rows so you can see which happened.
What happens if I mistype a category or a state?
The run stops before searching and writes a free row telling you what it accepts. It will not fall back to an unfiltered search, which is what Kickstarter itself would do and what would cost you money.
How do I compare projects in different currencies?
Use goalUsd and pledgedUsd. They are converted with the rate Kickstarter applies, and the goal and pledged filters work on those figures too, so the bands mean the same thing for every project.
Will the run fail if something goes wrong?
No. A blocked, empty or broken search produces an uncharged diagnostic row explaining what happened, and the run still finishes as succeeded. A failed run would still bill you the start fee, which would mean paying to be told something went wrong.
Can I run this on a schedule?
Yes. Nothing is held between runs, so the same input is safe to repeat. Diff on projectId to see only what is new since last time.
How do I get exactly the rows I paid for?
Filter the dataset on "charged": true. Sample and diagnostic rows are always false, and the number of charged rows always equals the number of billed events.