{
  "openapi": "3.0.1",
  "info": {
    "title": "Kickstarter Scraper",
    "description": "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.",
    "version": "0.2",
    "x-build-id": "5JpCFeo6vJXHPngKB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchfoundry-labs~kickstarter-scraper-cheapest/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchfoundry-labs-kickstarter-scraper-cheapest",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/fetchfoundry-labs~kickstarter-scraper-cheapest/runs": {
      "post": {
        "operationId": "runs-sync-fetchfoundry-labs-kickstarter-scraper-cheapest",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/fetchfoundry-labs~kickstarter-scraper-cheapest/run-sync": {
      "post": {
        "operationId": "run-sync-fetchfoundry-labs-kickstarter-scraper-cheapest",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "queries": {
            "title": "Queries",
            "type": "array",
            "description": "One or more discovery queries. Each object accepts term, state, categoryId, woeId, sort, staffPicks, raised and goal. Use several queries to get past the 2,400-row-per-query ceiling -- split by category, state or location. Leave empty to use the flat fields below. Each object may also carry startPage (1-200) to continue a walk an earlier run stopped -- the run's RUN_REPORT.resumeInput gives you these objects ready to paste."
          },
          "term": {
            "title": "Search term",
            "type": "string",
            "description": "Free-text search, used when 'Queries' is empty. Verified honest: a term with no matches returns zero results, not the unfiltered baseline."
          },
          "state": {
            "title": "Project state",
            "enum": [
              "",
              "live",
              "successful",
              "failed",
              "canceled",
              "upcoming"
            ],
            "type": "string",
            "description": "Only these five are real filter values. 'suspended' looks like a sixth and is not one -- Kickstarter answers it with every state at once, identically to a nonsense string, so this actor refuses it.",
            "default": ""
          },
          "categoryId": {
            "title": "Category id",
            "minimum": 1,
            "type": "integer",
            "description": "Kickstarter category id. Parent 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) filter strictly. A SUBcategory id is a relevance filter upstream and mixes in neighbouring categories -- rows carry categoryMatchesRequested so you can tell."
          },
          "woeId": {
            "title": "Location id (woe_id)",
            "minimum": 1,
            "type": "integer",
            "description": "Kickstarter location id, e.g. 2459115 for New York, NY. An unknown id is NOT an error upstream -- it silently returns every project. Rows carry locationMatchesRequested and the summary says whether the filter was honoured."
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "magic",
              "popularity",
              "newest",
              "end_date",
              "most_funded",
              "most_backed"
            ],
            "type": "string",
            "description": "An unrecognised sort is not an error upstream -- it silently becomes 'magic', so the run looks sorted and is not. Only these six are accepted here.",
            "default": "magic"
          },
          "staffPicks": {
            "title": "Staff picks only",
            "type": "boolean",
            "description": "Restrict to projects Kickstarter has featured.",
            "default": false
          },
          "raised": {
            "title": "Funding progress band",
            "minimum": 0,
            "maximum": 2,
            "type": "integer",
            "description": "Kickstarter's own band: 0 = under 75% funded, 1 = 75-100%, 2 = over 100%."
          },
          "goal": {
            "title": "Goal size band",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "Kickstarter's own goal band, 0 (under $1,000) through 6 (over $100,000)."
          },
          "maxProjectsPerQuery": {
            "title": "Max projects per query",
            "minimum": 0,
            "type": "integer",
            "description": "Set 0 to walk to the ceiling. That ceiling is 2,400 rows (page 200); page 201 is a genuine HTTP 404, so a broad query cannot be fully collected in one go however many hits it reports.",
            "default": 60
          },
          "includeProjectDetails": {
            "title": "Include reward tiers",
            "type": "boolean",
            "description": "Adds reward tiers (title, minimum pledge, backers per tier, limits, remaining, estimated delivery, shipping), add-on count, update count, comment count (incl. replies), FAQ count, followers (watchesCount), Projects We Love flag and creator history. v0.2 fetches this through Kickstarter's own GraphQL API, 8 projects per request (~4 KB per project instead of a ~600 KB project page), so it is cheap enough to leave on.",
            "default": false
          },
          "rewardTiers": {
            "title": "Reward tiers to include",
            "enum": [
              "public",
              "all"
            ],
            "type": "string",
            "description": "With details on: 'public' lists the tiers a visitor sees on the Rewards tab (via GraphQL). 'all' also reads the project page to add secret, VIP and late-pledge tiers -- in testing 79 of 257 tiers on 24 live tech projects were not public. Every row says which it contains (rewardTiersScope).",
            "default": "public"
          },
          "includeLiveStats": {
            "title": "Include live counters",
            "type": "boolean",
            "description": "Up-to-the-minute backers, pledged, comments, followers and state for each project (discovery results are cached and can lag). Fetched in the same GraphQL requests as the details, 24 projects per request when details are off. Kept side by side with the discovery values as live* fields.",
            "default": false
          },
          "maxDetailsPerQuery": {
            "title": "Max detail fetches per query",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on how many projects per query get details / live counters. 0 = all of them (default since v0.2, because enrichment is now ~4 KB per project). Rows beyond the cap carry dataComplete=false.",
            "default": 0
          },
          "dedupeAcrossQueries": {
            "title": "Remove duplicates across queries",
            "type": "boolean",
            "description": "A project matched by two queries in the same run appears once (under the first query that found it). The RUN_REPORT counts how many were removed.",
            "default": true
          },
          "onlyNewProjects": {
            "title": "Only projects not delivered by earlier runs",
            "type": "boolean",
            "description": "Remember every project id this actor delivered (in a named key-value store on your account) and skip them in later runs -- for scheduled monitoring without duplicates.",
            "default": false
          },
          "historyStoreName": {
            "title": "History store name",
            "type": "string",
            "description": "Key-value store used by 'Only projects not delivered by earlier runs'. Use a different name per project/campaign to keep histories apart.",
            "default": "kickstarter-seen-projects"
          },
          "excludeProjectIds": {
            "title": "Exclude project ids",
            "type": "array",
            "description": "Kickstarter project ids (the projectId column) to leave out, e.g. ones you already have.",
            "items": {
              "type": "string"
            }
          },
          "includeDiagnosticsInDataset": {
            "title": "Also put summaries and errors in the dataset",
            "type": "boolean",
            "description": "Off (default): the dataset holds only clean PROJECT rows; per-query summaries, errors, completeness and cost are in the run's RUN_REPORT key-value record. On: also append the v0.1-style SEARCH_SUMMARY and ERROR rows to the dataset (they carry recordType, so filter on recordType = PROJECT for the projects).",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Requests in flight at once across all queries. Kickstarter drops back-to-back connections under load, so this is deliberately low.",
            "default": 2
          },
          "minRequestInterval": {
            "title": "Min seconds between request starts",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Politeness pacing shared across all workers.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Residential proxy by default. Since early October 2026 Kickstarter's Cloudflare challenges every Apify datacenter IP and direct connection (verified on cloud runs: 0 rows without a proxy or with datacenter proxy, all rows with Residential). Only switch it off when running from a residential network yourself.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "selfTest": {
            "title": "Self-test (maintainers)",
            "type": "boolean",
            "description": "Ignore the queries above and run the actor's built-in health check: two fixed queries, invariant checks (state, category, live counters) and a comparison with Kickstarter's own stats.json for a random sample. The result is appended to a 'kickstarter-scraper-health' dataset. The maintainer runs this daily; its public log is linked in the README.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}