# MakerMap Scraper — Indie Makers, Founders & Products by City (`teodor_banea/makermap-scraper`) Actor

Export MakerMap's map of indie makers and startup founders who introduced themselves on X: handle, bio, city, country, sector, followers, intro post, products, socials, stated MRR. Filter by country, sector, tags. Also products and meetups. No login, no browser.

- **URL**: https://apify.com/teodor_banea/makermap-scraper.md
- **Developed by:** [Banea Teodor](https://apify.com/teodor_banea) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## MakerMap Scraper — Indie Makers, Founders & Products by City

### What does MakerMap Scraper do?

MakerMap Scraper exports [MakerMap](https://www.makermap.lol) — the world map of **indie makers and startup founders who introduced themselves on X** in the viral "I'm building … looking to connect" threads, plus everyone who joined the map since. One run gives you **every maker** (about 5,200 across 120+ countries) with handle, name, bio, city and country, sector, role, X followers, intro post, products, socials and stated MRR — or **every product** those makers build (about 3,500, with categories), or the **maker meetups** hosted on MakerMap. It reads the site's own public data files — no login, no browser, no proxy.

### Why use this Actor?

- **The whole map in seconds**: 3–4 file downloads, then filtering — a full export of 5,000+ makers takes under a minute.
- **More than the map shows at a glance**: the scraped intro-thread makers *and* the ~1,100 makers who signed up on MakerMap directly, joined into one row per person.
- **Lead-ready columns**: X handle and URL, MakerMap profile, city / country / coordinates (city-centroid precision), sector, role, work mode, stage, interests, skills, "open to" (hiring, raising, clients…), who they want to meet, companies, website, LinkedIn, GitHub and other socials, stated MRR as a number.
- **Filters that matter**: country, sector, product category, tags / interests / skills, minimum followers, claimed profiles only, makers with a product, free-text search.
- **Clean, typed rows**: every row has every column (null when unknown, never missing), ISO dates, numbers as numbers, decoded text, absolute URLs. No age column, and self-stated ages in intro posts ("I'm 29.") are redacted to "\[age]".

### How much does it cost?

You pay **per row** (one row = one maker, product or meetup) plus a tiny start fee. Platform compute is negligible: a full run finishes in seconds.

| Run | Rows |
|---|---|
| First run with the prefilled form (top 50 makers by followers) | 50 |
| All AI makers in Portugal and Spain | ~55 |
| All claimed makers (verified profiles) | ~900 |
| Every maker on the map | ~5,200 |
| Every product | ~3,500 |
| Meetups | a handful |

Use **Maximum results** and the filters to pay only for what you need.

### Input

| Field | Description | Example |
|---|---|---|
| `mode` | `makers` (default), `products` or `meetups` — one data set per run | `makers` |
| `countries` | ISO-2 country codes | `["PT", "ES"]` |
| `sectors` | ai, saas, devtools, consumer, fintech, health, crypto, games, ecommerce, media, services | `["ai"]` |
| `productCategories` | dev, productivity, marketing, ai, design, creators, finance, health, education, games, shopping, social, life, services, other | `["dev"]` |
| `tags` | Tags, interests or skills (key or label, ANY matches) | `["growth", "backend"]` |
| `minFollowers` | Minimum X followers | `1000` |
| `hasProductsOnly` | Only makers with at least one product | `true` |
| `claimedOnly` | Only claimed ("verified maker") profiles / claimed products | `true` |
| `searchText` | Every word must appear (name, bios, intro, posts, products) | `agents` |
| `includeIntroPost` | Intro post text, link, date and engagement (default on) | `true` |
| `includeRecentPosts` | Up to 10 collected posts per maker (default off) | `false` |
| `sortBy` | `followers` (default), `points` or `newest` | `points` |
| `maxResults` | Stop after this many rows; 0 = everything. The form prefills 50 | `50` |

```json
{
    "mode": "makers",
    "countries": ["PT", "ES"],
    "sectors": ["ai"],
    "sortBy": "followers",
    "maxResults": 100
}
```

### Output

#### Maker row (makers mode)

```json
{
    "handle": "example_maker",
    "xUrl": "https://x.com/example_maker",
    "profileUrl": "https://www.makermap.lol/example_maker",
    "name": "Alex Example",
    "avatarUrl": "https://pbs.twimg.com/profile_images/1000000000000000000/abcdEFGH_400x400.jpg",
    "xUserId": "1000000000000000001",
    "bio": "Solo founder building tools for indie hackers.",
    "xBio": "Solo founder building tools for indie hackers.\nPreviously engineering lead at a fintech.",
    "introText": "Solo founder from Lisbon, building a habit tracker.\nLooking to connect with more founders & designers!",
    "introUrl": "https://x.com/example_maker/status/2099832331842285666",
    "introPostedAt": "2026-09-15T12:06:55.000Z",
    "introLikes": 30, "introReplies": 31, "introReposts": 1, "introViews": 2140,
    "city": "Lisbon", "region": null, "country": "PT", "countryName": "Portugal",
    "locationText": "Lisbon, Portugal", "latitude": 38.7167, "longitude": -9.1333,
    "locationPrecision": "city", "locationSource": "introPost", "xLocation": "Lisbon 🇵🇹",
    "originCountry": "BR", "originCountryName": "Brazil",
    "cityPageUrl": "https://www.makermap.lol/city/lisbon",
    "countryPageUrl": "https://www.makermap.lol/country/portugal",
    "sector": "saas", "role": "founder", "workMode": "solo", "stage": "Launched",
    "teamSize": null, "seniority": "Mid career", "yearsBuilding": "3–10 years",
    "tags": ["saas", "apps"], "interests": ["productivity", "indie"], "skills": ["frontend", "product"],
    "openTo": ["collab", "beta"], "wantsToMeet": ["founders", "designers"],
    "companies": [{ "handle": "examplehq", "relation": "founded", "xUrl": "https://x.com/examplehq" }],
    "isSoloInOwnWords": true, "isDigitalNomad": false, "isLookingForCofounder": false,
    "hasBuiltBefore": true, "hasExited": false, "postLanguage": null,
    "followers": 4645, "isXVerified": true,
    "isClaimed": true, "claimStatus": "claimed", "claimedAt": "2026-10-04T20:49:05.076Z",
    "points": 416, "pointsToday": 0, "rank": 167, "introRank": 374,
    "pointsBreakdown": { "verified": 250, "intro": 128, "posts": 18, "bio": 0, "badges": 0, "referrals": 0, "bonus": 0, "email": 0, "bot": 0, "reviews": 20, "answers": 0 },
    "totalLikes": 30, "totalReposts": 2, "totalViews": 2280,
    "makersTalkedWith": 28, "countriesTalkedWith": 14,
    "statedMrr": 2400, "statedMrrText": "$2.4k MRR", "statedMrrCurrency": "USD", "statedRevenueText": "$2.4k MRR",
    "statedRevenuePeriod": "monthly", "statedRevenueSource": "bio",
    "productCount": 1,
    "products": [{
        "name": "Habitly", "url": "https://habitly.example/", "host": "habitly.example",
        "description": "A calm habit tracker for busy builders.", "category": "productivity",
        "source": "claimed", "statedMrr": null, "statedMrrText": null, "statedMrrCurrency": null,
        "productPageUrl": "https://www.makermap.lol/p/habitly.example"
    }],
    "websiteUrl": "https://example.com/", "linkedinUrl": "https://www.linkedin.com/in/example",
    "githubUrl": "https://github.com/example", "youtubeUrl": null, "instagramUrl": null,
    "tiktokUrl": null, "threadsUrl": null, "blueskyUrl": null, "newsletterUrl": null,
    "calendarUrl": null, "linkInBioUrl": null,
    "threadRole": "both", "addedVia": "introThread",
    "recentPosts": null,
    "datasetBuiltAt": "2026-10-19T04:09:25.508Z",
    "scrapedAt": "2026-10-19T15:00:00.000Z"
}
```

- `claimStatus`: **claimed** (logged in with X, MakerMap's "verified maker" badge — points, rank, products and socials they entered), **pending** (logged in, intro not verified yet), **unclaimed** (found in an intro thread).
- `points`: claimed makers' MakerMap points; for unclaimed makers, the points waiting for them to claim.
- `products[].source`: `claimed`, `pendingClaim` or `foundOnXProfile` (a site MakerMap found on an unclaimed maker's X profile — not confirmed by the maker).
- `latitude` / `longitude` are MakerMap's pin: a city, region or country centroid, never an address.
- `addedVia`: `introThread`, `scrape` (a later automatic pass — no engagement counts, so intro likes/views are null) or `signup`.

#### Product row (products mode)

`productKey`, `productName`, `pageTitle`, `url`, `host`, `description`, `category`, `categoryLabel`, `isClaimed`, `source`, `points`, `rating`, `ratingCount`, `statedMrr`, `statedMrrText`, `statedMrrCurrency`, `iconUrl`, `imageUrl`, `addedAt`, `makerHandle`, `makerName`, `makerProfileUrl`, `makerXUrl`, `makerFollowers`, `coMakerHandles`, `city`, `country`, `countryName`, `productPageUrl`, `datasetBuiltAt`, `scrapedAt`. Each product appears once; a product several claimed makers list goes to the one with most points, the others are in `coMakerHandles`.

#### Meetup row (meetups mode)

`meetupId`, `title`, `hasCustomTitle`, `status` (open = picking a time, locked = date set), `isOnline`, `onlinePlatform`, `city`, `country`, `countryName`, `latitude`, `longitude`, `startsAt`, `firstProposedAt`, `proposedTimeCount`, `timezone`, `hostHandle`, `hostName`, `hostProfileUrl`, `hostXUrl`, `hostAvatarUrl`, `going`, `maybe`, `capacity`, `spotsLeft`, `note`, `createdAt`, `url`, `datasetBuiltAt`, `scrapedAt`.

### Tips and tricks

- **Freshness**: MakerMap rebuilds its maker files about once a day (`datasetBuiltAt`); claims, points, followers of claimed makers and meetups are read live.
- **Leads in one city**: set `countries` and use `searchText` with the city name, or filter the `city` column after export.
- **Bigger first page**: `sortBy: points` puts the most active claimed makers first; `followers` the largest audiences.
- **Problems** (a file that could not be read) are listed under the `ERRORS` key of the run's key-value store and in the status message.

### Scheduling

MakerMap has no date filter, so each scheduled run returns the current listing for your filters (sort `newest` puts the latest makers first; pair it with `maxResults` sized to your schedule interval). Rows are unique within a run; drop repeats from earlier runs downstream by the id field — `handle` for makers, `productKey` for products, `meetupId` for meetups. The actor leaves no storage in your account beyond each run's own dataset and key-value store.

### Integrations

Export as JSON, CSV or Excel from the dataset, or connect the Actor to Google Sheets, Zapier, Make, Slack or a webhook in the Apify Console. Through the [Apify API](https://docs.apify.com/api/v2) you can start runs and read `https://api.apify.com/v2/datasets/{datasetId}/items?format=csv` from any pipeline.

### Data and privacy

MakerMap lists people who posted public introductions on X. This Actor exports only public professional information (handle, name, bio, location at city level, sector, followers, products, public links) and **never exports self-stated ages**: there is no age column, and ages written in intro posts and recent posts ("I'm 29.", "29 years old", "aged 29") are replaced by "\[age]" (best effort — free text can phrase it in ways the filter misses). Use the data in line with GDPR and the platform's terms — for example, do not use it for unsolicited bulk marketing.

# Changelog

This Actor's version history is a separate document: https://apify.com/teodor_banea/makermap-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Choose the data set. Makers: one row per indie maker / founder on the map. Products: one row per product those makers build. Meetups: upcoming maker meetups hosted on MakerMap.

## `countries` (type: `array`):

Keep only makers (or products / meetups) located in these countries. Leave empty for the whole world.

## `sectors` (type: `array`):

Keep only makers in these sectors (MakerMap's reading of what they build; about two thirds of makers have one). Products and meetups: the maker's sector.

## `productCategories` (type: `array`):

Keep only products in these categories (products mode), or makers with at least one product in them (makers mode).

## `tags` (type: `array`):

Keep makers with ANY of these tags, interests or skills — key or label, case-insensitive. Map tags: ai, saas, apps, dev, design, growth, crypto, nocode, games, health, fintech, hardware. Interests include agents, opensource, mobile, marketing, seo, content, ecommerce, productivity, education. Skills include frontend, backend, mobiledev, mleng, uiux, fundraising.

## `minFollowers` (type: `integer`):

Keep only makers (products: their makers) with at least this many X followers. 0 = no minimum.

## `hasProductsOnly` (type: `boolean`):

Keep only makers who list at least one product (claimed on MakerMap or found on their X profile). Makers mode only.

## `claimedOnly` (type: `boolean`):

Keep only makers who logged in with X and claimed their MakerMap profile (the "verified maker" badge) — they carry points, rank, products and socials they entered themselves. Products mode: only claimed products.

## `searchText` (type: `string`):

Keep only rows containing every word you enter (case-insensitive). Makers: name, handle, bios, location, companies, intro post, posts and products. Products: name, description, site and maker. Meetups: title, city, host.

## `includeIntroPost` (type: `boolean`):

Add the maker's intro post on X (text, link, date, likes, replies, reposts, views). Turn off for slimmer rows.

## `includeRecentPosts` (type: `boolean`):

Add up to 10 of the maker's posts that MakerMap collected (intro, product and claim posts, replies in the intro threads) with text, link, date and engagement, as the recentPosts list.

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

Order of the rows (and which ones you get when Maximum results cuts the list). Followers: most-followed first. Points: MakerMap points (claimed products first in products mode). Newest: latest intro post or claim first. Meetups are always soonest first.

## `maxResults` (type: `integer`):

Stop after this many rows. 0 = everything matching (about 5,200 makers or 3,600 products on the whole map).

## Actor input object example

```json
{
  "mode": "makers",
  "countries": [
    "PT",
    "ES"
  ],
  "sectors": [
    "ai",
    "saas"
  ],
  "productCategories": [
    "dev",
    "ai"
  ],
  "tags": [
    "ai",
    "growth"
  ],
  "minFollowers": 1000,
  "hasProductsOnly": false,
  "claimedOnly": false,
  "searchText": "agents",
  "includeIntroPost": true,
  "includeRecentPosts": false,
  "sortBy": "followers",
  "maxResults": 50
}
```

# Actor output Schema

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

Every row of the run as JSON.

## `makers` (type: `string`):

Makers mode: handle, name, bio, city, country, sector, followers, claim, points, products, website.

## `products` (type: `string`):

Products mode: product, link, description, category, maker, location.

## `meetups` (type: `string`):

Meetups mode: title, status, start time, city, host, attendance.

## `resultsCsv` (type: `string`):

The same rows as a CSV download.

## `errors` (type: `string`):

Files that could not be read. Only present when something went wrong.

# 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 = {
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("teodor_banea/makermap-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 = { "maxResults": 50 }

# Run the Actor and wait for it to finish
run = client.actor("teodor_banea/makermap-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 '{
  "maxResults": 50
}' |
apify call teodor_banea/makermap-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,teodor_banea/makermap-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/gKoxyrT1ab5f2hndI/builds/xsB4muVmc98zVrhV2/openapi.json
