# Kalshi Profile Scraper (`maximedupre/kalshi-profile`) Actor

Get public Kalshi profile data for one or more handles. Choose profile details, open or closed positions, trades, category performance, posts, comments, or likes and receive structured rows without account authentication.

- **URL**: https://apify.com/maximedupre/kalshi-profile.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Social media, Developer tools
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 profiles

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?

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

### 🎯 See a Kalshi profile in one run

Kalshi traders, researchers, and developers can enter public profile handles and choose one data type for a run. The Actor returns structured rows for profile details, positions, trades, category performance, posts, comments, or likes. This makes public account and activity data easier to review in an Apify dataset without account authentication.

- Use **[Kalshi Likes Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-likes-scraper)** to collect public likes for a profile.
- Use **[Kalshi Comments Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-comments-scraper)** to collect a profile's public comments.
- Use **[Kalshi Posts Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-posts-scraper)** to collect a profile's public posts.
- Use **[Kalshi Category Performance Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-category-performance-scraper)** to review a profile's category measures.
- Use **[Kalshi Trades Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-trades-scraper)** to collect a profile's public trades.
- Use **[Kalshi Closed Positions Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-closed-positions-scraper)** to collect historical closed positions.
- Use **[Kalshi Open Positions Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-open-positions-scraper)** to collect current open positions.
- Use **[Kalshi Profile Scraper](https://apify.com/maximedupre/kalshi-profile/examples/kalshi-profile-scraper)** to collect profile details and metrics.

#### 📊 Kalshi profile rows you can use

Each saved row has a `recordType` that shows the selected public data type. Profile rows can include public identity, status, dates, social counts, financial metrics, categories, and performance badges. Other rows describe positions, trades, category measures, posts, comments, or likes.

#### ▶️ Run one Kalshi profile data type

1. Open the Actor in Apify Console.
2. Choose one value in **Data to return**.
3. Add one or more public Kalshi profile handles.
4. Start the run and open the default dataset.

One run uses one selected data type for every submitted handle. Start another run when you need a different data type. The Actor reads public Kalshi data and does not need account authentication.

#### ⚙️ Input

**Input fields**

Both fields are required.

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Chooses the one public Kalshi data type to return. The choice applies to every handle in the run. |
| `profileHandles` | array of strings | Lists one or more public Kalshi profile handles to check. Add one handle per item. |

**Example input**

This is the smallest successful common input from a current beta run.

```json
{
  "target": "profile",
  "profileHandles": [
    "DegenJohnny"
  ]
}
```

#### 🧾 Output

The default dataset can contain eight row shapes. Optional fields can be absent when public Kalshi does not provide them.

**Profile rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies this as a `profile` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `profileUrl` | string (URL) | A link to the public Kalshi profile. |
| `displayName` | string | The public name shown on the profile. |
| `status` | string | The public profile status. |
| `accountCreatedAt` | string (date-time) | The public account creation time. |
| `followersCount` | integer | The number of public followers. |
| `followingCount` | integer | The number of profiles followed. |
| `postCount` | integer | The number of public posts. |
| `profileImageUrl` | string (URL) | A link to the public profile image. |
| `openInterest` | number | The public open interest value for the profile. |
| `tradingVolume` | number | The public trading volume for the profile. |
| `profitLoss` | number | The public profit or loss value for the profile. |
| `tradedMarketsCount` | integer | The number of markets traded by the profile. |
| `topCategories` | array of strings | The profile's top category affiliations. |
| `performanceBadges` | array of objects | Public performance and ranking badges for the profile. |
| `performanceBadges[].name` | string | The badge name. |
| `performanceBadges[].category` | string | The category linked to the badge. |
| `performanceBadges[].rank` | integer | The ranking number shown for the badge. |
| `performanceBadges[].rankingContext` | string | The public context that explains the ranking. |

**Example profile row**

```json
{
  "recordType": "profile",
  "profileHandle": "DegenJohnny",
  "profileUrl": "https://kalshi.com/ideas/profiles/DegenJohnny",
  "displayName": "DegenJohnny",
  "status": "active",
  "accountCreatedAt": "2026-05-25T00:00:00.000Z",
  "followersCount": 7,
  "followingCount": 12,
  "postCount": 22,
  "profileImageUrl": "https://kalshi-social-public.s3.amazonaws.com/profile-pictures/sound.octopus5269-2026-07-03%2003%3A42%3A20.webp",
  "tradingVolume": 38677,
  "profitLoss": -9707324,
  "tradedMarketsCount": 132,
  "topCategories": [
    "Sports",
    "Crypto"
  ],
  "performanceBadges": []
}
```

**Open and closed position rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies an `openPosition` or `closedPosition` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `market` | object | The market linked to the position. |
| `market.marketId` | string | The public market identifier. |
| `market.ticker` | string | The public market ticker. |
| `market.title` | string | The public market title. |
| `market.url` | string (URL) | A link to the public market. |
| `contractCount` | integer | The number of contracts in the position. |
| `profitLoss` | number | The profit or loss for the position. |

**Trade rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies this as a `trade` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `tradeId` | string | The public trade identifier. |
| `market` | object | The market linked to the trade. |
| `market.marketId` | string | The public market identifier. |
| `market.ticker` | string | The public market ticker. |
| `market.title` | string | The public market title. |
| `market.url` | string (URL) | A link to the public market. |
| `price` | number | The price reported for the trade. |
| `quantity` | integer | The number of contracts traded. |
| `side` | string | The trade side or action reported by Kalshi. |
| `participants` | array of objects | The public participants reported for the trade. |
| `participants[].handle` | string | The public handle of a participant. |
| `participants[].role` | string | The role reported for a participant. |
| `executedAt` | string (date-time) | The time when the trade was executed. |

**Example trade row**

```json
{
  "recordType": "trade",
  "profileHandle": "weatherman.allday",
  "tradeId": "d69df33a-f24b-9f39-2a0f-a1edb4af37cb",
  "market": {
    "marketId": "4bce0537-f23b-45c0-97b9-2c062fad2265",
    "ticker": "KXUSLTOTAL-26AUG22CHAMIA-1",
    "title": "Will over 0.5 goals be scored?"
  },
  "price": 0.99,
  "quantity": 25,
  "side": "buy",
  "participants": [
    {
      "handle": "weatherman.allday",
      "role": "maker"
    }
  ],
  "executedAt": "2026-08-24T23:26:11.151Z"
}
```

**Category performance rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies this as a `categoryPerformance` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `category` | string | The category measured by the row. |
| `metric` | string | The name of the performance metric. |
| `value` | number | The numeric value of the performance metric. |
| `label` | string | The public label for the performance value. |

**Example category performance row**

```json
{
  "recordType": "categoryPerformance",
  "profileHandle": "DegenJohnny",
  "category": "Crypto",
  "metric": "projected_pnl",
  "value": -342.0078,
  "label": "Crypto"
}
```

**Post rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies this as a `post` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `postId` | string | The public post identifier. |
| `postUrl` | string (URL) | A link to the public post. |
| `content` | string | The public text of the post. |
| `market` | object | The market linked to the post, when provided. |
| `market.marketId` | string | The public market identifier. |
| `market.ticker` | string | The public market ticker. |
| `market.title` | string | The public market title. |
| `market.url` | string (URL) | A link to the public market. |
| `likeCount` | integer | The number of public likes on the post. |
| `commentCount` | integer | The number of public comments on the post. |
| `createdAt` | string (date-time) | The time when the post was created. |
| `mediaUrls` | array of strings | Links to media attached to the post, when provided. |

**Example post row**

```json
{
  "recordType": "post",
  "profileHandle": "DegenJohnny",
  "postId": "326b349a-94dd-4ea7-8bad-a5f0f2218e01",
  "postUrl": "https://kalshi.com/ideas/posts/326b349a-94dd-4ea7-8bad-a5f0f2218e01",
  "content": "cool",
  "market": {
    "marketId": "fe0fe3c0-7af5-43fb-9446-9e39db73876d",
    "ticker": "KXITFWMATCH-26JUL03SIEZAA-SIE",
    "title": "Will Madison Sieg win the Sieg vs Zaar: W35 Aix-les-Bains Quarterfinal match?",
    "url": "https://kalshi.com/markets/kxitfwmatch/kxitfwmatch-26jul03siezaa?marketTicker=KXITFWMATCH-26JUL03SIEZAA-SIE"
  },
  "likeCount": 0,
  "commentCount": 0,
  "createdAt": "2026-07-03T17:51:14.147Z"
}
```

**Comment rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies this as a `comment` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `commentId` | string | The public comment identifier. |
| `content` | string | The public text of the comment. |
| `post` | object | The public post linked to the comment. |
| `post.postId` | string | The public post identifier. |
| `post.url` | string (URL) | A link to the public post. |
| `post.content` | string | The public text of the linked post. |
| `post.market` | object | The market linked to the post, when provided. |
| `post.market.marketId` | string | The public market identifier. |
| `post.market.ticker` | string | The public market ticker. |
| `post.market.title` | string | The public market title. |
| `post.market.url` | string (URL) | A link to the public market. |
| `likeCount` | integer | The number of public likes on the comment. |
| `createdAt` | string (date-time) | The time when the comment was created. |

**Example comment row**

```json
{
  "recordType": "comment",
  "profileHandle": "DegenJohnny",
  "commentId": "80410825-9529-49fe-8e3a-2fcf95fc4ff2",
  "content": "nice dude",
  "post": {
    "postId": "4fb8fe84-da40-4283-94f2-01c117f69389",
    "url": "https://kalshi.com/ideas/posts/4fb8fe84-da40-4283-94f2-01c117f69389",
    "content": "",
    "market": {
      "marketId": "f26202b4-85e0-474c-9c01-fa76f18e12ad",
      "ticker": "KXMVESPORTSMULTIGAMEEXTENDED-S2026C6D3ED84071-624BCFEB874",
      "title": "yes Chicago C,yes Los Angeles D,yes Over 6.5 runs scored,yes Morocco advances",
      "url": "https://kalshi.com/markets/kxmvesportsmultigameextended/kxmvesportsmultigameextended-s2026c6d3ed84071?marketTicker=KXMVESPORTSMULTIGAMEEXTENDED-S2026C6D3ED84071-624BCFEB874"
    }
  },
  "likeCount": 1,
  "createdAt": "2026-06-30T04:02:01.604Z"
}
```

**Like rows**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Identifies this as a `like` row. |
| `profileHandle` | string | The public Kalshi handle that produced the row. |
| `likedItem` | object | The public market or content item that was liked. |
| `likedItem.type` | string | The kind of item that was liked: `market`, `post`, or `comment`. |
| `likedItem.id` | string | The public identifier of the liked item. |
| `likedItem.title` | string | The public title of the liked item. |
| `likedItem.url` | string (URL) | A link to the liked item. |
| `likedItem.content` | string | The public text of the liked item. |
| `likedItem.market` | object | The market linked to the liked item, when provided. |
| `likedItem.market.marketId` | string | The public market identifier. |
| `likedItem.market.ticker` | string | The public market ticker. |
| `likedItem.market.title` | string | The public market title. |
| `likedItem.market.url` | string (URL) | A link to the public market. |
| `likeCount` | integer | The number of public likes reported for the item. |
| `likedAt` | string (date-time) | The time when the profile liked the item. |
| `mediaUrls` | array of strings | Links to media attached to the liked content, when provided. |

**Example like row**

```json
{
  "recordType": "like",
  "profileHandle": "DegenJohnny",
  "likedItem": {
    "type": "post",
    "id": "7403e9fb-390d-4409-84c8-b5a0c31ca260",
    "title": "Anna Snigireva",
    "url": "https://kalshi.com/ideas/posts/7403e9fb-390d-4409-84c8-b5a0c31ca260",
    "content": "",
    "market": {
      "marketId": "1af3951c-12d7-45c8-99da-4183a1ac02d9",
      "ticker": "KXITFWMATCH-26JUL02SNIZHU-SNI",
      "title": "Will Anna Snigireva win the Snigireva vs Zhu: W15 Maanshan Quarterfinal match?",
      "url": "https://kalshi.com/markets/kxitfwmatch/kxitfwmatch-26jul02snizhu?marketTicker=KXITFWMATCH-26JUL02SNIZHU-SNI"
    }
  },
  "likeCount": 2,
  "likedAt": "2026-07-03T04:25:26.886Z",
  "mediaUrls": [
    "https://media.giphy.com/media/Tx5A9j5sMu9VDzdlKS/200h.webp"
  ]
}
```

#### 💳 Pricing

Pricing uses pay per event. A saved row is matched to one event: Profile, Open position, Closed position, Trade, Category performance, Profile post, Profile comment, or Profile like. The pricing panel shows the current tier price for each event. Platform usage charges may also apply under your Apify plan.

#### 🔌 Integrations

Use the Apify API or a dataset export to read saved rows after a run. The Actor reads public Kalshi data and does not place trades, change accounts, or provide investment advice.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can one run return more than one data type?

No. Choose one value in **Data to return**. That choice applies to every submitted handle. Start another run for another data type.

##### Can I submit more than one profile handle?

Yes. Add one or more public Kalshi handles to `profileHandles`. The Actor uses the same selected data type for all of them.

##### Does this need a Kalshi account or API key?

No. The Actor reads public Kalshi profile data without account authentication.

##### What if a profile is private or unavailable?

Private, deleted, or unavailable source records are not guaranteed. Only public data that Kalshi exposes can be returned.

##### Can it scrape all Kalshi markets?

No. This Actor works from submitted public profile handles. Market-wide discovery and odds scraping are outside its scope.

##### Does it give trading advice?

No. It returns public profile, position, trade, category, post, comment, and like data. It does not make predictions, give investment advice, or place trades.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~kalshi-profile/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Polymarket + Kalshi Arbitrage Finder](https://apify.com/maximedupre/prediction-market-arbitrage-finder): compare public prediction markets for adjacent price research.
- [Stocktwits Scraper](https://apify.com/maximedupre/stocktwits-scraper): collect public ticker messages and user posts for market discussion context.
- [Twitter (X) Scraper](https://apify.com/maximedupre/twitter-scraper): collect public X posts and profile matches for wider social context.
- [Kalshi Historical Trades Scraper](https://apify.com/automation-lab/kalshi-historical-trades-scraper): collect public Kalshi trade executions for source-level trade analysis.
- [Polymarket Market Monitor + Whale & Arbitrage Signals](https://apify.com/memo23/polymarket-market-monitor): review Polymarket price changes, holders, and cross-market signals.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose the public Kalshi data type to return. This choice applies to every profile handle in this run.

## `profileHandles` (type: `array`):

Enter one or more public Kalshi profile handles. Add one handle per item.

## Actor input object example

```json
{
  "target": "profile",
  "profileHandles": [
    "DegenJohnny"
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

Rows from the public Kalshi data type you chose.

# 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 = {
    "target": "profile",
    "profileHandles": [
        "DegenJohnny"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/kalshi-profile").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 = {
    "target": "profile",
    "profileHandles": ["DegenJohnny"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/kalshi-profile").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 '{
  "target": "profile",
  "profileHandles": [
    "DegenJohnny"
  ]
}' |
apify call maximedupre/kalshi-profile --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/kalshi-profile"
        }
    }
}

```

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/rGrlTlt38I7P1GbNd/builds/5dSEZozolWh9GByqq/openapi.json
