# MakerWorld Scraper — 3D Models, Print Profiles & Reviews (`unfenced-group/makerworld-scraper`) Actor

Scrape MakerWorld.com 3D models by keyword, category, feed, creator or URL. Get downloads, prints, likes, ratings, every print profile with printer, print time, weight, plates and filaments, creator stats, and optional ratings and comments. No login needed.

- **URL**: https://apify.com/unfenced-group/makerworld-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.46 / 1,000 models

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## MakerWorld Scraper

![MakerWorld Scraper](https://api.apify.com/v2/key-value-stores/v9e62ofnIWIdvO5y1/records/banner.png)

Extract 3D models from MakerWorld.com (Bambu Lab) by keyword, category, feed, creator or URL, with the richest field set available: downloads, prints, likes, ratings, every print profile with print time, weight, plates and filaments, and optional ratings and comments. No login or API key required.

***

### Why this scraper?

#### 🧩 Every way into MakerWorld

Search by keyword, browse any of 81 categories and subcategories, pull the Trending or MakerWorld Exclusive feeds, scrape a creator's full catalogue, or paste model, creator, category and search URLs.

#### 📊 Complete popularity data

Downloads, prints, likes, collection saves, comments, boosts, raw-file downloads, average rating and rating count for every model, plus MakerWorld's trending and quality scores on search rows.

#### 🖨️ Every print profile

Each model's print profiles with printer, compatible printers, nozzle, print time, filament weight, plate count, AMS requirement, layer height, walls, infill and the exact filament types, colours, grams and metres, down to each build plate.

#### ⭐ Ratings and comments

Optional review rows with star score, print success, reported issues, text, English translation and photos.

#### 👤 Creator profiles

Creator name, handle, level, verification, followers and lifetime downloads, likes and collections.

#### 🔁 New-upload monitoring

Sort by newest and turn on **Only models not seen before** to receive just the new uploads on every scheduled run. Models you already have are skipped and never billed.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | string | (empty) | Keyword(s) to search for, as in the site's search box. |
| `category` | string | `"all"` | Category or subcategory ID, e.g. `"800"` Toys & Games or `"401"` Household › Decor. |
| `sortBy` | string | `"relevance"` | `relevance`, `trending`, `newest`, `mostDownloaded`, `mostLiked` or `mostBoosted`. |
| `feed` | string | `"none"` | `trending` or `exclusive` to scrape a curated feed. |
| `creators` | array | `[]` | Creator handles (from `makerworld.com/en/@handle`) or numeric user IDs. |
| `startUrls` | array | `[]` | Model, creator, category or search URLs from makerworld.com. |
| `maxItems` | integer | `50` | Maximum models to save. `0` means unlimited. Reviews do not count. |
| `fetchDetails` | boolean | `true` | Full model record with all print profiles. Off returns search-card fields only, at the lower price. |
| `includeCreatorStats` | boolean | `true` | Add creator lifetime totals, bio and links to full rows. |
| `includeReviews` | boolean | `false` | Save ratings and comments as separate rows. |
| `maxReviewsPerModel` | integer | `20` | Maximum ratings and comments per model. |
| `extendBeyondSearchLimit` | boolean | `true` | Go past MakerWorld's ~485-result search limit by combining sort orders. |
| `onlyNewModels` | boolean | `false` | Skip models this actor already returned on your account. |
| `proxyConfiguration` | object | no proxy | Not needed. The actor switches to Apify Proxy by itself if access is refused. |

With no input at all, the actor returns the Trending feed.

***

### Output schema

Up to 111 fields per model. Fields MakerWorld does not publish for a model are returned as `null` or `[]` rather than omitted. Every row carries `rowType` (`model`, `rating` or `comment`) and `detailLevel` so mixed datasets are easy to split.

#### Always present on model rows

| Field | Type | Description |
|---|---|---|
| `rowType` | string | Always `model` for model rows. |
| `id` | integer | MakerWorld model ID. |
| `url` | string | Model page URL. |
| `title` | string | Model title. |
| `slug` | string | URL slug of the model. |
| `coverUrl` | string | Cover image URL. |
| `imageUrls` | array | Gallery image URLs. |
| `tags` | array | Tags set by the creator. |
| `license` | string | License, e.g. `BY-NC-SA` or `Standard Digital File License`. |
| `isOfficial` | boolean | Published by Bambu Lab. |
| `isPrintable` | boolean | Can be sent to a printer straight from MakerWorld. |
| `isExclusive` | boolean | MakerWorld Exclusive model. |
| `isStaffPicked` | boolean | Staff pick. |
| `isNsfw` | boolean | Marked not safe for work. |
| `isPointRedeemable` | boolean | Can be redeemed with MakerWorld points. |
| `isMakerLabCustomized` | boolean | Made or customisable with a MakerLab tool. |
| `likeCount` | integer | Number of likes. |
| `collectionCount` | integer | Number of times saved to collections. |
| `downloadCount` | integer | Number of downloads. |
| `printCount` | integer | Number of prints started from MakerWorld. |
| `commentCount` | integer | Number of comments. |
| `rawFileDownloadCount` | integer | Downloads of the raw model files (STL/STEP). |
| `contestRank` | integer | Contest rank (null if never entered). |
| `modelFiles` | array | Raw model files: `name`, `type`, `sizeBytes`, `updatedAt`. |
| `createdAt` | string | Upload date (ISO 8601). |
| `creatorId` | integer | Creator's user ID. |
| `creatorName` | string | Creator display name. |
| `creatorHandle` | string | Creator handle. |
| `creatorUrl` | string | Creator profile URL. |
| `creatorLevel` | integer | Creator level on MakerWorld (often null on search-card rows). |
| `creatorVerified` | boolean | Verified creator. |
| `creatorAcceptsMemberships` | boolean | Creator offers paid memberships (often null on search-card rows). |
| `detailLevel` | string | `card` (search data) or `full` (full model record). |
| `isNew` | boolean | True when this actor has not returned the model before on your account. |
| `firstSeenAt` | string | When this actor first returned the model. |
| `sourceMode` | string | Where the row came from: `search`, `category`, `feed:Trending`, `feed:Exclusive`, `creator` or `model`. |
| `searchQuery` | string | Search query or creator that produced the row (null otherwise). |
| `position` | integer | Position in the source listing. |
| `contentHash` | string | Stable hash of ID and title, for change tracking. |
| `source` | string | Always `makerworld.com`. |
| `scrapedAt` | string | Scrape time (ISO 8601). |

#### Only on search-card rows (`fetchDetails: false`)

| Field | Type | Description |
|---|---|---|
| `trendingScore` | number | MakerWorld's trending score (search, category and feed rows). |
| `qualityScore` | number | MakerWorld's design quality score (search, category and feed rows). |
| `isPaid` | boolean | Paid model (creator-catalogue rows). |
| `isAiGenerated` | boolean | AI-generated content (creator-catalogue rows). |
| `boostCount` | integer | Boosts received (creator-catalogue rows). |
| `profileCount` | integer | Number of print profiles (creator-catalogue rows). |
| `defaultProfileId` | integer | Default print profile ID (creator-catalogue rows). |
| `publishedAt` | string | Publication date (creator-catalogue rows). |

#### With `fetchDetails: true`

| Field | Type | Description |
|---|---|---|
| `modelKey` | string | MakerWorld's internal model key. |
| `descriptionHtml` | string | Full description as HTML. |
| `descriptionText` | string | Full description as plain text. |
| `descriptionMarkdown` | string | Full description as Markdown. |
| `videoUrls` | array | Video URLs from the gallery. |
| `categories` | array | All category names. |
| `category` | string | Top-level category. |
| `categoryId` | integer | Top-level category ID. |
| `subcategory` | string | Subcategory (null if none). |
| `subcategoryId` | integer | Subcategory ID (null if none). |
| `allowsRemix` | boolean | Creator allows remixes. |
| `isAiGenerated` | boolean | Marked as AI-generated content. |
| `isPaid` | boolean | Paid model. |
| `makerLabTool` | string | MakerLab tool used (null if none). |
| `customizeCount` | integer | Number of customisations made. |
| `boostCount` | integer | Number of boosts received. |
| `ratingAverage` | number | Average rating across all print profiles, 1–5 (null if unrated). |
| `ratingCount` | integer | Total ratings across all print profiles. |
| `profileCount` | integer | Number of print profiles. |
| `defaultProfileId` | integer | ID of the default print profile. |
| `compatiblePrinters` | array | All printers covered by any print profile. |
| `materialTypes` | array | All filament types used, e.g. `PLA`, `PETG`. |
| `mainProfilePrintTimeHours` | number | Print time of the main profile, in hours. |
| `mainProfileWeightGrams` | number | Filament weight of the main profile, in grams. |
| `mainProfilePlateCount` | integer | Plates in the main profile. |
| `mainProfileFilamentCount` | integer | Filaments in the main profile. |
| `mainProfileNeedsAms` | boolean | Main profile needs an AMS (multi-colour unit). |
| `mainProfilePrinter` | string | Printer the main profile was made for. |
| `printProfiles` | array | Every print profile — fields below. |
| `billOfMaterialsFiles` | array | Bill-of-materials files: `name`, `url`. |
| `assemblyGuideFiles` | array | Assembly guide files: `name`, `url`. |
| `otherFiles` | array | Other attached files: `name`, `url`. |
| `remixOf` | array | Original models this is a remix of: `title`, `url`, `author`, `designId`. |
| `publishedAt` | string | First publication date (ISO 8601). |
| `updatedAt` | string | Last update (ISO 8601). |
| `contestName` | string | Contest the model was entered in (null if none). |
| `creatorFollowers` | integer | Creator's follower count. |
| `creatorTotalLikes` | integer | Creator's lifetime likes (with includeCreatorStats). |
| `creatorTotalCollections` | integer | Creator's lifetime collection saves (with includeCreatorStats). |
| `creatorTotalDownloads` | integer | Creator's lifetime downloads (with includeCreatorStats). |
| `creatorBio` | string | Creator bio (with includeCreatorStats). |
| `creatorLinks` | array | Links on the creator profile (with includeCreatorStats). |

#### Print profile fields (`printProfiles[]`)

| Field | Type | Description |
|---|---|---|
| `printProfiles.profileId` | integer | Print profile ID. |
| `printProfiles.title` | string | Profile title. |
| `printProfiles.isDefault` | boolean | Default profile. |
| `printProfiles.printer` | string | Printer the profile was sliced for. |
| `printProfiles.nozzleDiameterMm` | number | Nozzle diameter in mm. |
| `printProfiles.compatiblePrinters` | array | Printers this profile works on. |
| `printProfiles.printTimeSeconds` | integer | Estimated print time in seconds. |
| `printProfiles.printTimeHours` | number | Estimated print time in hours. |
| `printProfiles.weightGrams` | number | Filament weight in grams. |
| `printProfiles.plateCount` | integer | Number of build plates. |
| `printProfiles.filamentCount` | integer | Number of filaments. |
| `printProfiles.colorCount` | integer | Number of colours. |
| `printProfiles.needsAms` | boolean | Needs an AMS. |
| `printProfiles.filaments` | array | `type`, `color` (hex), `grams`, `meters` per filament. |
| `printProfiles.layerHeightMm` | number | Layer height in mm. |
| `printProfiles.wallLoops` | integer | Wall loops. |
| `printProfiles.infillDensity` | string | Infill density, e.g. `15%`. |
| `printProfiles.downloadCount` | integer | Downloads of this profile. |
| `printProfiles.printCount` | integer | Prints of this profile. |
| `printProfiles.ratingAverage` | number | Average rating of this profile. |
| `printProfiles.ratingCount` | integer | Ratings of this profile. |
| `printProfiles.publishedAt` | string | Profile publication date. |
| `printProfiles.updatedAt` | string | Profile last update. |
| `printProfiles.authorName` | string | Profile author (can differ from the model creator). |
| `printProfiles.authorHandle` | string | Profile author handle. |
| `printProfiles.isOfficial` | boolean | Official Bambu Lab profile. |
| `printProfiles.coverUrl` | string | Profile cover image. |
| `printProfiles.plates` | array | Per plate: `index`, `name`, `printTimeSeconds`, `weightGrams`, `filaments`, `thumbnailUrl`. |
| `printProfiles.summary` | string | Profile notes as plain text (null if none). |

#### Rating and comment rows (`includeReviews: true`)

| Field | Type | Description |
|---|---|---|
| `rowType` | string | `rating` or `comment`. |
| `reviewId` | string | Unique ID (`r…` rating, `c…` comment). |
| `modelId` | integer | Model ID. |
| `modelTitle` | string | Model title. |
| `modelUrl` | string | Model URL. |
| `profileId` | integer | Print profile that was rated (null for comments). |
| `profileTitle` | string | Title of that profile (null for comments). |
| `score` | integer | Star score 1–5 (null for comments). |
| `text` | string | Review or comment text. |
| `textTranslated` | string | MakerWorld's English translation (null if none). |
| `printedSuccessfully` | boolean | Reviewer reports a successful print (null for comments). |
| `issues` | array | Reported problems on low scores. |
| `imageUrls` | array | Photos attached by the reviewer. |
| `likeCount` | integer | Likes on the review. |
| `replyCount` | integer | Replies to the review. |
| `isPinned` | boolean | Pinned by the creator. |
| `authorName` | string | Reviewer display name. |
| `authorHandle` | string | Reviewer handle. |
| `authorLevel` | integer | Reviewer level. |
| `createdAt` | string | Posted at (ISO 8601). |
| `editedAt` | string | Last edit (null if never edited). |
| `source` | string | Always `makerworld.com`. |
| `scrapedAt` | string | Scrape time. |

#### Example record

```json
{
  "rowType": "model",
  "id": 13849,
  "url": "https://makerworld.com/en/models/13849-portable-cable-organizer-winder",
  "title": "Portable Cable Organizer / Winder",
  "slug": "portable-cable-organizer-winder",
  "modelKey": "USb0aee2f62a8650",
  "descriptionHtml": "<p>A portable cable organizer which is setup as an <strong>easy print-in-place</strong> and includes a knob on the side for conveniently winding up the cable wh…",
  "descriptionText": "A portable cable organizer which is setup as an easy print-in-place and includes a knob on the side for conveniently winding up the cable wh…",
  "descriptionMarkdown": "A portable cable organizer which is setup as an **easy print-in-place** and includes a knob on the side for conveniently winding up the cabl…",
  "coverUrl": "https://makerworld.bblmw.com/makerworld/model/USb0aee2f62a8650/design/2023-08-29_2heg6p3b9yry.jpg",
  "imageUrls": [
    "https://makerworld.bblmw.com/makerworld/model/USb0aee2f62a8650/design/2023-08-29_2heg6p3b9yry.jpg",
    "https://makerworld.bblmw.com/makerworld/model/USb0aee2f62a8650/design/2023-08-29_qba9kp7yyk1t.jpg"
  ],
  "videoUrls": [],
  "tags": [
    "organizer",
    "printinplace",
    "cord",
    "usb",
    "cordmanagement",
    "cablemanagement"
  ],
  "categories": [
    "Gadgets",
    "Tools"
  ],
  "category": "Tools",
  "categoryId": 700,
  "subcategory": "Gadgets",
  "subcategoryId": 705,
  "license": "BY",
  "allowsRemix": true,
  "isOfficial": false,
  "isPrintable": true,
  "isExclusive": false,
  "isStaffPicked": true,
  "isNsfw": false,
  "isAiGenerated": false,
  "isPaid": false,
  "isPointRedeemable": false,
  "isMakerLabCustomized": false,
  "makerLabTool": null,
  "customizeCount": 0,
  "likeCount": 24306,
  "collectionCount": 71973,
  "downloadCount": 108493,
  "printCount": 92010,
  "commentCount": 11068,
  "rawFileDownloadCount": 14400,
  "boostCount": 5972,
  "ratingAverage": 4.86,
  "ratingCount": 9770,
  "contestName": null,
  "contestRank": null,
  "profileCount": 30,
  "defaultProfileId": 14065,
  "compatiblePrinters": [
    "A1 mini",
    "P1S",
    "P1P",
    "X1",
    "X1 Carbon",
    "X1E"
  ],
  "materialTypes": [
    "PLA",
    "PETG"
  ],
  "mainProfilePrintTimeHours": 1.71,
  "mainProfileWeightGrams": 43,
  "mainProfilePlateCount": 1,
  "mainProfileFilamentCount": 1,
  "mainProfileNeedsAms": false,
  "mainProfilePrinter": "P1S",
  "printProfiles": [
    {
      "profileId": 23520,
      "title": "A1 Mini, All Knurled Sizes, 0.2mm layer, 3 walls, 15% infill",
      "isDefault": false,
      "printer": "A1 mini",
      "nozzleDiameterMm": 0.4,
      "compatiblePrinters": [
        "A1 mini",
        "P1S",
        "P1P",
        "X1"
      ],
      "printTimeSeconds": 20457,
      "printTimeHours": 5.68,
      "weightGrams": 129,
      "plateCount": 3,
      "filamentCount": 1,
      "colorCount": 1,
      "needsAms": false,
      "filaments": [
        {
          "type": "PLA",
          "color": "#368CF9",
          "grams": 129,
          "meters": 42.85
        }
      ],
      "layerHeightMm": 0.2,
      "wallLoops": 3,
      "infillDensity": "15%",
      "downloadCount": 28142,
      "printCount": 19345,
      "ratingAverage": 4.87,
      "ratingCount": 1917,
      "publishedAt": "2023-11-08T15:05:57Z",
      "updatedAt": "2026-09-20T03:28:22Z",
      "authorName": "squinn",
      "authorHandle": "squinn",
      "isOfficial": false,
      "coverUrl": "https://makerworld.bblmw.com/makerworld/model/USb0aee2f62a8650/design/2023-09-28_9c70edff1dfff8.jpg",
      "plates": [
        {
          "index": 1,
          "name": "Small Knurled Sides",
          "printTimeSeconds": 5910,
          "weightGrams": 38,
          "filaments": [
            {
              "type": "PLA",
              "color": "#368CF9",
              "grams": 38,
              "meters": 12.57
            }
          ],
          "thumbnailUrl": "https://makerworld.bblmw.com/makerworld/model/USb0aee2f62a8650/25978202/instance/plate_1.png"
        }
      ],
      "summary": "All three sizes of the portable cable winder on separate print plates, setup for"
    }
  ],
  "billOfMaterialsFiles": [],
  "assemblyGuideFiles": [],
  "otherFiles": [],
  "modelFiles": [
    {
      "name": "Portable Cable Winder - Small.stl",
      "type": "stl",
      "sizeBytes": 1462584,
      "updatedAt": "2023-09-13T13:04:40Z"
    }
  ],
  "remixOf": [],
  "createdAt": "2023-08-28T16:53:45Z",
  "publishedAt": "2023-10-08T20:08:20Z",
  "updatedAt": "2026-09-20T04:40:25Z",
  "creatorId": 3485677045,
  "creatorName": "squinn",
  "creatorHandle": "squinn",
  "creatorUrl": "https://makerworld.com/en/@squinn",
  "creatorFollowers": 15807,
  "creatorLevel": 30,
  "creatorVerified": true,
  "creatorAcceptsMemberships": true,
  "creatorTotalLikes": 140902,
  "creatorTotalCollections": 385922,
  "creatorTotalDownloads": 1151506,
  "creatorBio": "By day, a software engineer. By night, a hobbyist and wanna-be inventor. All the time, a dad of two crazy kids and husband of one amazing gal.\n\nInterested in commercial use?  Either join here or my club on Printables (www.printables.com/@squinn)",
  "creatorLinks": [],
  "detailLevel": "full",
  "isNew": true,
  "firstSeenAt": "2026-09-20T05:22:40.698Z",
  "sourceMode": "model",
  "searchQuery": null,
  "position": 1,
  "contentHash": "a5b7cbcf2e128a09",
  "source": "makerworld.com",
  "scrapedAt": "2026-09-20T05:22:40.698Z"
}
```

#### Example rating row

```json
{
  "rowType": "rating",
  "reviewId": "r16772",
  "modelId": 13849,
  "modelTitle": "Portable Cable Organizer / Winder",
  "modelUrl": "https://makerworld.com/en/models/13849-portable-cable-organizer-winder",
  "profileId": 14426,
  "profileTitle": "Smooth-Sided Small, 0.2mm layer, 3 walls, 15% infill",
  "score": 3,
  "text": "unfortunately the smooth sided small hinge was fused together I shall try a different one and update my review accordingly \nThe spinning bit in the middle worked great though",
  "textTranslated": null,
  "printedSuccessfully": true,
  "issues": [],
  "imageUrls": [
    "https://makerworld.bblmw.com/makerworld/model/13849/14426/ratings/94f455f0-595f-11ee-bb4e-1bf86e426750.jpg",
    "https://makerworld.bblmw.com/makerworld/model/13849/14426/ratings/94f7b150-595f-11ee-bb4e-1bf86e426750.jpg"
  ],
  "likeCount": 49,
  "replyCount": 39,
  "isPinned": false,
  "authorName": "PrinttX Old Account",
  "authorHandle": "PrinttXOldAccou",
  "authorLevel": 19,
  "createdAt": "2023-09-22T15:49:30Z",
  "editedAt": "2023-09-22T15:49:57Z",
  "source": "makerworld.com",
  "scrapedAt": "2026-09-20T05:22:41.024Z"
}
```

***

### Examples

**Most downloaded organizers, full detail:**

```json
{
  "searchQuery": "organizer",
  "sortBy": "mostDownloaded",
  "maxItems": 200,
  "fetchDetails": true
}
```

**Toys & Games category, newest uploads, search-card data only:**

```json
{
  "category": "800",
  "sortBy": "newest",
  "maxItems": 500,
  "fetchDetails": false
}
```

**Specific models, a creator and a category URL, with ratings:**

```json
{
  "startUrls": [
    { "url": "https://makerworld.com/en/models/12682-bambu-christmas-cabin" },
    { "url": "https://makerworld.com/en/@BambuLab" },
    { "url": "https://makerworld.com/en/3d-models/901-3d-printer-accessories" }
  ],
  "includeReviews": true,
  "maxReviewsPerModel": 50,
  "maxItems": 100
}
```

**Daily feed of new uploads (schedule this):**

```json
{
  "sortBy": "newest",
  "maxItems": 1000,
  "onlyNewModels": true,
  "fetchDetails": true
}
```

***

### 💰 Pricing

**From $0.49 per 1,000 results.** You only pay for rows that are saved. Failed retries and skipped models are never charged.

| Row type | Per 1,000 |
|---|---|
| Model, search-card data (`fetchDetails: false`) | $0.49 |
| Model, full record with print profiles (`fetchDetails: true`) | $1.49 |
| Rating or comment (`includeReviews: true`) | $0.49 |

| Results | Cards | Full records |
|---|---|---|
| 100 | ~$0.05 | ~$0.15 |
| 1,000 | ~$0.49 | ~$1.49 |
| 10,000 | ~$4.90 | ~$14.90 |
| 100,000 | ~$49.00 | ~$149.00 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, down to $0.46 (cards and reviews) and $1.46 (full records) per 1,000 at the highest tier. Use **Max models** in the input to control your spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 full records | under 1 minute |
| 1,000 full records | 4–6 minutes |
| 1,000 search cards | under 1 minute |
| 10,000 search cards | 5–8 minutes |

***

### Known limitations

- MakerWorld returns at most about 485 results per search and sort order. With **Go beyond the search limit** on, the actor combines all six sort orders, which reached about 1,300 unique models for a single query in testing. For larger pulls, split by category or subcategory.
- Creator handles are resolved through search. If a handle cannot be found, use the numeric user ID from the creator's profile.
- Keyword search is fuzzy on MakerWorld's side, so an unusual query can still return loosely related models.
- Creator avatars and reviewer photos of people are not collected. Review photos of prints are.

***

### Technical details

- **Source:** makerworld.com — Bambu Lab's 3D model platform, worldwide
- **Coverage:** all public models, 81 categories and subcategories, Trending and Exclusive feeds, creator catalogues
- **New-model memory:** KeyValueStore `makerworld-scraper-history`, 365-day retention
- **Retry:** automatic retry on network errors with exponential backoff

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword(s) to search MakerWorld models for, exactly as in the site's search box. Example: "vase", "benchy", "gridfinity". Leave empty to browse a category or feed instead.

## `category` (type: `string`):

Limit the search to one MakerWorld category or subcategory. Works with or without a search query. Example: "800" (Toys & Games) or "401" (Household › Decor).

## `sortBy` (type: `string`):

Result order for search and category browsing, the same options as the site. Example: "newest" to monitor new uploads.

## `feed` (type: `string`):

Also scrape one of MakerWorld's curated feeds: the Trending list or MakerWorld Exclusive models. Example: "exclusive".

## `creators` (type: `array`):

Scrape every published model of these creators. Give the handle from the profile URL (makerworld.com/en/@handle) or the numeric user ID. Example: \["BambuLab"].

## `startUrls` (type: `array`):

MakerWorld URLs to scrape: model pages (/models/12682-…), creator profiles (/@handle), category pages (/3d-models/901-…) or search pages (/search/models?keyword=…). Example: https://makerworld.com/en/models/12682-bambu-christmas-cabin

## `maxItems` (type: `integer`):

Maximum number of models to save across all sources. Reviews do not count toward this limit. 0 means no limit. Example: 200.

## `fetchDetails` (type: `boolean`):

Fetch each model's full record: description, all images, categories, license, rating, every print profile (printer, print time, weight, plates, filaments and colours), bill of materials and remix sources. Off returns the search-card fields only and is billed at the lower card price. Example: true.

## `includeCreatorStats` (type: `boolean`):

Add the creator's lifetime downloads, likes, collections, bio and links to full-detail rows (one cached request per creator, no extra charge). Example: true.

## `includeReviews` (type: `boolean`):

Save each model's ratings (score, print success, text, photos) and comments as separate rows with rowType "rating" or "comment". Billed per review row. Example: false.

## `maxReviewsPerModel` (type: `integer`):

Maximum ratings and comments saved per model when Include ratings and comments is on. Newest first. Example: 20.

## `extendBeyondSearchLimit` (type: `boolean`):

MakerWorld returns at most about 485 results per search. When on and you ask for more, the actor re-runs the search in the other sort orders to reach further models, with duplicates removed. Example: true.

## `onlyNewModels` (type: `boolean`):

Skip models this actor already returned in earlier runs on your account, so scheduled runs deliver new uploads only. Skipped models are not billed. Example: false.

## `proxyConfiguration` (type: `object`):

Not needed: the actor reads MakerWorld's public API directly and switches to Apify Proxy by itself if access is ever refused. Set a proxy only if you have a specific reason. Example: {"useApifyProxy": false}.

## Actor input object example

```json
{
  "searchQuery": "vase",
  "category": "all",
  "sortBy": "relevance",
  "feed": "none",
  "creators": [],
  "startUrls": [],
  "maxItems": 20,
  "fetchDetails": true,
  "includeCreatorStats": true,
  "includeReviews": false,
  "maxReviewsPerModel": 20,
  "extendBeyondSearchLimit": true,
  "onlyNewModels": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "vase",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/makerworld-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "vase",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/makerworld-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "vase",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call unfenced-group/makerworld-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/makerworld-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mDJG6ml1cYUpaIb44/builds/wLbfCXBxOfuZQVntY/openapi.json
