# Milkshake (msha.ke) Profile Scraper — JSON Data Output (`ahmed_jasarevic/milkshake-scraper`) Actor

Extract structured Milkshake (msha.ke) profile data from any link-in-bio page. Get profile name, bio, avatar, social links, card links, external links, and storefront URLs as clean JSON — no browser needed.

- **URL**: https://apify.com/ahmed\_jasarevic/milkshake-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Milkshake Profile Scraper

Extract structured data from any Milkshake (msha.ke) link-in-bio profile. Get profile name, bio, avatar, social links, card links, external links, and storefront URLs as clean JSON.

### Main Use Cases

- **Creator research**: pull profile name, bio, and avatar image from any Milkshake link-in-bio page.
- **Influencer & affiliate outreach**: collect `socialLinks` and `externalLinks` for contact and partner lists.
- **Storefront discovery**: detect shop and storefront URLs linked from a creator's Milkshake page.
- **Link-in-bio auditing**: snapshot `cardLinks` for content reviews, collections, or affiliate tracking.
- **Lead list building**: scrape many public profiles and export normalized rows for CRM enrichment.
- **AI & data pipelines**: feed structured creator data into RAG, agents, dashboards, or spreadsheets.

### How It Works

Milkshake (msha.ke) is a link-in-bio / mobile website builder creators use to present links, socials, and storefronts. The **Milkshake Profile Scraper** fetches a Milkshake profile URL, parses the public page server-side, and extracts structured profile data **without a browser**. Provide `startUrls` (one or many `{"url":"..."}` objects) and receive a normalized JSON row per profile. No login, no session, no official API required.

### Input

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `startUrls` | array | Yes | — | Milkshake profile URLs to scrape. Each item must be an object: `{"url":"..."}`. Example: `https://msha.ke/go.milkshake` |
| `maxRequestsPerCrawl` | integer | No | — | Maximum number of profile pages processed per run; helps bound cost and runtime. |
| `proxyConfiguration` | object | No | — | Proxy settings, e.g. `{"useApifyProxy": true}` to route requests through Apify proxy infrastructure. |

### Output

Each scraped profile produces one dataset item (view: `overview`) with these fields:

- **`username`** — the profile username as shown on Milkshake.
- **`profileName`** — the display name of the profile.
- **`bio`** — the short bio/caption text from the profile.
- **`avatar`** — URL of the profile's avatar image.
- **`url`** — the canonical URL of the scraped Milkshake profile.
- **`socialLinks`** — array of social media links (Instagram, TikTok, YouTube, X, etc.).
- **`cardLinks`** — array of links attached to the profile's content cards.
- **`externalLinks`** — additional external URLs referenced on the page.
- **`storefrontUrls`** — URLs pointing to shops or storefronts on the profile.
- **`scrapedAt`** — ISO timestamp of when the profile was scraped.

### Example Input

```json
{
  "startUrls": [
    { "url": "https://msha.ke/go.milkshake" }
  ],
  "maxRequestsPerCrawl": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### Example Output

```json
{
  "username": "go.milkshake",
  "profileName": "Milkshake",
  "bio": "Build a beautiful link-in-bio. Free.",
  "avatar": "https://image.msha.ke/…/avatar.png",
  "url": "https://msha.ke/go.milkshake",
  "socialLinks": [
    "https://www.instagram.com/milkshake"
  ],
  "cardLinks": [
    "https://msha.ke/go.milkshake/shop"
  ],
  "externalLinks": [],
  "storefrontUrls": [],
  "scrapedAt": "2026-08-29T12:00:00.000Z"
}
```

> Note: empty arrays (`[]`) appear when a profile exposes no links of that type (e.g. `externalLinks`, `storefrontUrls`).

### Scheduling, Monitoring & Automation

Run the actor on a recurring schedule (daily or weekly) to monitor profiles for changes: new bios, new social links, or new storefronts. Combine it with:

- **Apify scheduled runs** — re-run with the same `startUrls` on a cron-like interval.
- **Actor tasks** — save a reusable configuration as a named task and publish it as a public use-case.
- **Webhooks / integrators** — push dataset items to your own API, CRM, or spreadsheet the moment a run finishes.
- **maxRequestsPerCrawl** — cap each run to keep monitoring costs predictable.

### Related Actors

This actor is part of the **link-in-bio scraping cluster** on Apify. Explore the neighboring tools:

- **Linkpop Scraper** — extract profile, bio, and links from Shopify's Linkpop link-in-bio pages.
- **Komi Scraper** — scrape Komi (komi.io) link-in-bio profiles for bio, socials, and media links.
- **ContactInBio Scraper** — collect ContactInBio link-in-bio data including donation and contact links.
- **Generic Web Scraper / Website Content Crawler** — for any link-in-bio platform not covered by a dedicated actor.

All four authors work the same way: give a profile URL, get structured JSON — ideal for building a cross-platform creator dataset.

### FAQ

**Why use this actor instead of an official Milkshake API?**
There is no official public Milkshake API. The actor parses the public msha.ke page directly and returns normalized JSON, which is the practical route for structured Milkshake profile data.

**Does it need a browser?**
No. Profile HTML is fetched and parsed server-side, which keeps runs fast, cheap, and reliable.

**Which profiles can I scrape?**
Any publicly accessible Milkshake profile. Provide its URL in `startUrls`, e.g. `https://msha.ke/go.milkshake`.

**Can I scrape multiple profiles in one run?**
Yes. `startUrls` accepts many `{"url":"..."}` objects; use `maxRequestsPerCrawl` to cap the total.

**What fields does it return?**
`username`, `profileName`, `bio`, `avatar`, `url`, `socialLinks`, `cardLinks`, `externalLinks`, `storefrontUrls`, and `scrapedAt`.

**What are good alternatives if I also want Linkpop/Komi data?**
Use the Linkpop Scraper, Komi Scraper, or ContactInBio Scraper actors and merge the datasets — see Related Actors.

### For AI Agents & LLM Apps

The purpose of this actor is to turn Milkshake's HTML into structured, model-ready JSON that an LLM or agent can consume directly. Minimal input:

```json
{
  "startUrls": [{ "url": "https://msha.ke/go.milkshake" }]
}
```

Output fields an AI app can rely on: `username`, `profileName`, `bio`, `avatar`, `url`, `socialLinks`, `cardLinks`, `externalLinks`, `storefrontUrls`, `scrapedAt`. Use the `bio` and link arrays for RAG context, profile summaries, outreach drafts, or storefront discovery.

Non-obvious behaviors to handle in code:

- `startUrls` items **must** be `{"url":"..."}` objects — bare strings are invalid input.
- Link fields are arrays; they may be **empty** (`[]`) when a profile exposes no such links — don't assume present.
- One dataset row per profile; keep the `username` as your deduplication key.
- `scrapedAt` is the extraction timestamp that allows you to diff profiles over time.

Billing: pricing is usage-based on the Apify platform (memory, compute, and data transfer per run); there is no fixed rate. Bound spend per run with `maxRequestsPerCrawl` and a schedule that fits your workload.

### Legal & Compliance Disclaimer

This actor is **independent** and is **not affiliated with, endorsed by, or connected to Milkshake** (msha.ke). It operates on publicly accessible pages only. Before use, review Milkshake's Terms of Service and applicable laws, and make sure your use case complies with them (including GDPR and other privacy regulations). Scrape only data you are authorized to collect and process, and never use extracted personal data in ways that violate any individual's rights.

### SEO Keywords

milkshake scraper, msha.ke scraper, milkshake profile scraper, msha.ke profile data, milkshake link in bio scraper, link in bio scraper, scrape milkshake profiles, milkshake data extraction, msha.ke links, milkshake bio, milkshake storefront links, milkshake social links, milkshake card links, influencer data extraction, creator link in bio data, apify milkshake actor, milkshake web scraping, scrape creator storefronts, milkshake profile export, msha.ke json data

# Actor input Schema

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

Milkshake profile URLs (msha.ke/username). You can paste full URLs or just usernames.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of profiles to scrape.

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

Proxy settings for anti-bot protection.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://msha.ke/go.milkshake"
    },
    {
      "url": "https://msha.ke/eexample"
    }
  ],
  "maxRequestsPerCrawl": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://msha.ke/go.milkshake"
        },
        {
            "url": "https://msha.ke/eexample"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/milkshake-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 = { "startUrls": [
        { "url": "https://msha.ke/go.milkshake" },
        { "url": "https://msha.ke/eexample" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/milkshake-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 '{
  "startUrls": [
    {
      "url": "https://msha.ke/go.milkshake"
    },
    {
      "url": "https://msha.ke/eexample"
    }
  ]
}' |
apify call ahmed_jasarevic/milkshake-scraper --silent --output-dataset

```

## MCP server setup

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