# Mastodon Scraper — Posts, Hashtags & Public Timeline (`logiover/mastodon-scraper`) Actor

Scrape Mastodon by hashtag, public timeline, or account. Extract posts, engagement stats, account info, media URLs, and tags. No API key, no login required. Works on any public Mastodon instance.

- **URL**: https://apify.com/logiover/mastodon-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Social media
- **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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Mastodon Scraper — Posts, Hashtags, Public Timeline & Account Data

Scrape any public Mastodon instance at scale: hashtag timelines, public feeds, and account statuses — fully keyless, no login, no API key required.

---

### What does Mastodon Scraper do?

Mastodon Scraper connects directly to the open Mastodon REST API (v1/v2) available on any public instance — `mastodon.social`, `fosstodon.org`, `infosec.exchange`, or any ActivityPub server running Mastodon-compatible software. It extracts posts (called "statuses") from three sources: hashtag timelines (`/api/v1/timelines/tag/{hashtag}`), the public federated timeline (`/api/v1/timelines/public`), and individual account statuses (`/api/v1/accounts/{id}/statuses`).

Pagination is handled automatically using the `max_id` cursor parameter, so a single run can pull hundreds or thousands of posts from deep in the timeline. Each post is cleaned (HTML stripped to plain text), enriched with account-level data (username, display name, follower count), and includes engagement metrics (favourites, reblogs, replies), attached media URLs, and all hashtags. The scraper works across any Mastodon-compatible instance — you simply set the `instance` field and it works.

---

### Who is it for?

- **Social media researchers** monitoring public discourse, trending topics, or community discussions on decentralized platforms.
- **Data journalists** tracking hashtag movements, political conversations, or technology trends across the Fediverse.
- **Brand and sentiment analysts** monitoring what communities say about products, projects, or public figures.
- **Developers and AI engineers** building datasets for training, fine-tuning, or embedding models on authentic social content.
- **Community managers** keeping an eye on mentions, hashtag adoption, and audience growth across federated instances.

---

### Use cases

- Track a technology or event hashtag (e.g. `#technology`, `#ai`, `#opendata`) to collect thousands of posts in minutes for trend analysis or LLM dataset building.
- Monitor the public timeline of a specific Mastodon instance to understand that community's interests, activity volume, and content mix.
- Pull all posts from a public account (journalist, researcher, developer) to analyze their posting patterns, reach, and engagement history.
- Export Mastodon content to Google Sheets or CSV for social listening reports without manual copy-paste.
- Build a federated news feed aggregator by scraping multiple hashtag timelines across different instances and merging the results.

---

### Why use Mastodon Scraper?

- **Completely keyless** — Mastodon's public API requires no authentication token, no account, no OAuth. Just set an instance URL and go.
- **15 output fields per post** — id, url, content (plain text), createdAt, language, favouritesCount, reblogsCount, repliesCount, username, displayName, followers, accountUrl, tags, mediaUrls, instance.
- **Bulk extraction** — paginate to thousands of posts per run using `max_id` cursor pagination; set `maxResults` up to 10,000.
- **Multi-instance support** — switch between any public Mastodon-compatible server: mastodon.social, fosstodon.org, infosec.exchange, hachyderm.io, and hundreds more.
- **Three modes** — hashtag timeline, public/federated timeline, or per-account statuses — one actor covers every public surface.
- **Export to CSV, JSON, or Excel** — all results land in Apify's dataset, instantly downloadable in any format or piped to Google Sheets, Zapier, or Make via webhook.

---

### What data can you extract?

Each scraped Mastodon post returns the following fields:

| Field | Type | Description |
|---|---|---|
| `id` | string | Unique post ID on the instance |
| `url` | string | Direct URL to the post |
| `content` | string | Post text (HTML stripped to plain text) |
| `createdAt` | string | ISO 8601 timestamp of when the post was published |
| `language` | string | Two-letter language code (e.g. `en`, `de`, `fr`) |
| `favouritesCount` | number | Number of times the post was favourited |
| `reblogsCount` | number | Number of reblogs (boosts) |
| `repliesCount` | number | Number of replies |
| `username` | string | Author's username (with instance domain if remote) |
| `displayName` | string | Author's human-readable display name |
| `followers` | number | Author's follower count on their home instance |
| `accountUrl` | string | Direct URL to the author's profile |
| `tags` | string | Comma-separated list of hashtags used in the post |
| `mediaUrls` | string | Comma-separated URLs of attached images/videos |
| `instance` | string | The Mastodon instance this post was scraped from |

**Example output:**

```json
{
  "id": "113820745678901234",
  "url": "https://mastodon.social/@user/113820745678901234",
  "content": "Just discovered an amazing open-source project for AI model fine-tuning. The community around #technology and #ai is growing fast on the Fediverse!",
  "createdAt": "2026-07-06T14:32:11.000Z",
  "language": "en",
  "favouritesCount": 47,
  "reblogsCount": 12,
  "repliesCount": 5,
  "username": "user@mastodon.social",
  "displayName": "Tech Enthusiast",
  "followers": 1342,
  "accountUrl": "https://mastodon.social/@user",
  "tags": "technology, ai",
  "mediaUrls": "https://media.mastodon.social/media_attachments/files/xxx/original/image.jpg",
  "instance": "mastodon.social"
}
````

***

### How to use

#### Option A: Scrape by Hashtag

The most common use case. Pull all recent posts tagged with a specific hashtag from any instance.

1. Set **Mode** to `hashtag`.
2. Set **Hashtag** to your keyword (without `#`), e.g. `technology`.
3. Optionally change **Instance** from `mastodon.social` to another server (e.g. `fosstodon.org` for FOSS topics).
4. Set **Max Results** (default: 200, max: 10,000).
5. Run the actor.

**Input JSON:**

```json
{
  "mode": "hashtag",
  "hashtag": "technology",
  "instance": "mastodon.social",
  "maxResults": 500
}
```

#### Option B: Scrape Public Timeline

Pull the live federated public timeline of an instance — great for community monitoring.

1. Set **Mode** to `publicTimeline`.
2. Set **Instance** to your target.
3. Set **Max Results**.

**Input JSON:**

```json
{
  "mode": "publicTimeline",
  "instance": "fosstodon.org",
  "maxResults": 300
}
```

#### Option C: Scrape Account Statuses

Pull all public posts from a specific account.

1. Set **Mode** to `accountStatuses`.
2. Set **Account** to the username (without `@` or instance suffix, e.g. `Gargron`).
3. Optionally set the **Instance** where that account lives.

**Input JSON:**

```json
{
  "mode": "accountStatuses",
  "account": "Gargron",
  "instance": "mastodon.social",
  "maxResults": 200
}
```

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `instance` | string | `mastodon.social` | Mastodon instance hostname (without https://) |
| `mode` | string | `hashtag` | Scraping mode: `hashtag`, `publicTimeline`, or `accountStatuses` |
| `hashtag` | string | — | Hashtag to scrape (no `#`). Required for hashtag mode. |
| `account` | string | — | Username to scrape. Required for accountStatuses mode. |
| `maxResults` | integer | `200` | Maximum posts to collect (1–10,000) |
| `proxyConfiguration` | object | disabled | Apify proxy settings (optional; most instances allow direct access) |

**Full input JSON:**

```json
{
  "instance": "mastodon.social",
  "mode": "hashtag",
  "hashtag": "technology",
  "account": "",
  "maxResults": 200,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

***

### Output example

```json
{
  "id": "113820745678901234",
  "url": "https://mastodon.social/@researcher/113820745678901234",
  "content": "New paper on federated social networks and decentralization patterns. The #technology landscape is shifting — thread below.",
  "createdAt": "2026-07-06T09:15:44.000Z",
  "language": "en",
  "favouritesCount": 82,
  "reblogsCount": 31,
  "repliesCount": 14,
  "username": "researcher@mastodon.social",
  "displayName": "Dr. Alex Research",
  "followers": 4210,
  "accountUrl": "https://mastodon.social/@researcher",
  "tags": "technology, research, fediverse",
  "mediaUrls": "",
  "instance": "mastodon.social"
}
```

***

### Tips for best results

- **Start with mastodon.social** — it has the highest post volume. Switch to niche instances (infosec.exchange, fosstodon.org) for topic-focused results.
- **Use specific hashtags** — broad tags like `tech` return fewer posts than `technology` on some instances. Test both.
- **Increase maxResults for deep dives** — the API paginates in batches of 40. Set maxResults to 1000+ for comprehensive archival.
- **Run on a schedule** — use Apify Schedules to collect new posts daily/hourly for trend tracking over time.
- **Cross-instance comparison** — run the same hashtag against multiple instances to compare community discussions. Use Apify's API to chain runs.
- **Filter by language in post-processing** — the `language` field lets you filter English-only or German-only posts downstream in Google Sheets.
- **Media content analysis** — use `mediaUrls` to download images/videos for visual content research.
- **Account deep-dives** — combine accountStatuses mode with multiple accounts to build influence maps for a topic.
- **Watch follower counts** — the `followers` field per post lets you rank posts by author influence without a separate lookup.
- **Proxy is rarely needed** — Mastodon instances are open APIs, but if you hit rate limits on large runs, enabling Apify proxy helps.

***

### Integrations

Mastodon Scraper stores all results in Apify's dataset, ready to connect anywhere:

- **Google Sheets** — use the Apify → Google Sheets integration in the Apify Console to push results automatically.
- **Slack** — set a webhook to send a message when the run completes with item count.
- **Zapier / Make** — trigger downstream workflows whenever new posts are collected.
- **Webhooks** — configure a `POST` webhook to your own server to receive dataset URLs on run completion.
- **Schedules** — automate recurring runs (hourly, daily, weekly) from the Apify Scheduler UI.
- **API** — query the dataset programmatically via `GET /v2/datasets/{datasetId}/items`.

***

### API usage

**cURL:**

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/logiover~mastodon-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"hashtag","hashtag":"technology","maxResults":200}'
```

**Node.js (Apify client):**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('logiover/mastodon-scraper').call({
  mode: 'hashtag',
  hashtag: 'technology',
  maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python:**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/mastodon-scraper").call(run_input={
    "mode": "hashtag",
    "hashtag": "technology",
    "maxResults": 200,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

***

### Use with AI agents (MCP)

Mastodon Scraper is available as an MCP tool via the Apify MCP server. Connect it to Claude, GPT-4, or any MCP-compatible agent to pull live Mastodon data on demand. Example prompt: *"Scrape the last 300 posts tagged #technology from mastodon.social and summarize the top trending subtopics."* The agent calls the actor, waits for results, and returns structured data — no manual API calls needed.

***

### FAQ

#### Does this require an API key or Mastodon account?

No. Mastodon's public timelines and hashtag endpoints are fully open and require no authentication. You do not need an account on any instance.

#### Which Mastodon instances does this work with?

Any instance running Mastodon v2.3+ or compatible software (Pleroma, Akkoma, Hometown) that exposes the standard REST API. Just change the `instance` field to the hostname.

#### How many posts can I collect per run?

Up to 10,000 per run using automatic `max_id` pagination. For very active hashtags, you can collect thousands of posts in minutes.

#### Why am I getting zero results?

Check that: (1) the hashtag exists and has recent posts on that instance, (2) the instance is public and accessible from the internet, (3) the instance name is correct (no `https://`). Try `mastodon.social` with hashtag `technology` as a sanity check.

#### Some fields are empty — is that normal?

Yes. `language` may be null if not detected. `mediaUrls` is empty for text-only posts. `tags` is empty if no hashtags were used. These are returned as empty strings, not errors.

#### Can I export to CSV or Excel?

Yes. From the Apify dataset view, click Export → CSV / Excel / JSON. Or use the API with `format=csv` query parameter.

#### How fast does it run?

A 200-post hashtag run typically completes in under 60 seconds. A 1,000-post run takes 2–4 minutes depending on instance speed.

#### Is scraping Mastodon legal?

Mastodon's public API is intentionally open — the developers designed it for open access without authentication. You are reading data that is publicly visible to any visitor. Always respect instance-specific terms of service and applicable privacy laws (GDPR in the EU).

#### Can I scrape private/followers-only posts?

No. This actor only accesses public endpoints. Posts marked as followers-only or direct messages are never returned.

#### Can I search across multiple hashtags at once?

Run the actor multiple times with different hashtag inputs, or use Apify's API to trigger parallel runs. Results from each run are in separate datasets.

#### How often is the data updated?

Mastodon posts are real-time. Each run fetches the most recent posts as of that moment. For continuous monitoring, schedule the actor to run hourly.

#### Does it handle media attachments?

Yes — image, video, and GIF URLs from `media_attachments` are collected into the `mediaUrls` field as a comma-separated list. Downloading the files themselves is outside scope but easily done with the URLs.

***

### Is it legal?

This actor accesses only public data via Mastodon's official REST API — the same data visible to any browser without login. No private messages, private accounts, or access-controlled content is ever retrieved. You remain responsible for complying with your jurisdiction's privacy laws (including GDPR, CCPA) and the terms of service of each Mastodon instance you target. Do not use this actor to build surveillance tools, dox individuals, or violate instance-specific community standards.

***

### Related scrapers

- **[Reddit Scraper](https://apify.com/logiover)** — Scrape Reddit posts, comments, and subreddits at scale.
- **[X/Twitter Scraper](https://apify.com/logiover)** — Extract tweets and profile data via guest token endpoints.
- **[TikTok Scraper](https://apify.com/logiover)** — Collect TikTok posts, hashtag feeds, and account videos.
- **[LinkedIn Scraper](https://apify.com/logiover)** — Company profiles and public posts without login.

# Actor input Schema

## `instance` (type: `string`):

The Mastodon instance to scrape (e.g. mastodon.social, fosstodon.org). Must be a public instance. You can enter any instance domain.

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

Choose what to scrape: hashtag timeline, public timeline (not all instances allow this without auth), or a specific account's statuses.

## `hashtag` (type: `string`):

Hashtag to scrape (without the # symbol). Used when mode is 'hashtag'.

## `account` (type: `string`):

Username (without @) to scrape statuses from. Used when mode is 'accountStatuses'.

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

Maximum number of posts to retrieve. Keep low for a fast preview; raise to pull more.

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

Proxy settings for requests. Mastodon public APIs typically don't require proxies, but Apify Proxy (automatic) is enabled by default for reliability if your target instance blocks datacenter IPs.

## Actor input object example

```json
{
  "instance": "mastodon.social",
  "mode": "hashtag",
  "hashtag": "technology",
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/mastodon-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 = { "proxyConfiguration": { "useApifyProxy": True } }

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

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

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

```

## CLI example

```bash
echo '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/mastodon-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/mastodon-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Mastodon Scraper — Posts, Hashtags & Public Timeline",
        "description": "Scrape Mastodon by hashtag, public timeline, or account. Extract posts, engagement stats, account info, media URLs, and tags. No API key, no login required. Works on any public Mastodon instance.",
        "version": "1.0",
        "x-build-id": "exPyUnb8MJexknZZj"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~mastodon-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-mastodon-scraper",
                "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/logiover~mastodon-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-mastodon-scraper",
                "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/logiover~mastodon-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-mastodon-scraper",
                "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": {
                    "instance": {
                        "title": "Mastodon Instance",
                        "type": "string",
                        "description": "The Mastodon instance to scrape (e.g. mastodon.social, fosstodon.org). Must be a public instance. You can enter any instance domain.",
                        "default": "mastodon.social"
                    },
                    "mode": {
                        "title": "Scraping Mode",
                        "enum": [
                            "hashtag",
                            "publicTimeline",
                            "accountStatuses"
                        ],
                        "type": "string",
                        "description": "Choose what to scrape: hashtag timeline, public timeline (not all instances allow this without auth), or a specific account's statuses.",
                        "default": "hashtag"
                    },
                    "hashtag": {
                        "title": "Hashtag",
                        "type": "string",
                        "description": "Hashtag to scrape (without the # symbol). Used when mode is 'hashtag'.",
                        "default": "technology"
                    },
                    "account": {
                        "title": "Account Username",
                        "type": "string",
                        "description": "Username (without @) to scrape statuses from. Used when mode is 'accountStatuses'."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of posts to retrieve. Keep low for a fast preview; raise to pull more.",
                        "default": 200
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings for requests. Mastodon public APIs typically don't require proxies, but Apify Proxy (automatic) is enabled by default for reliability if your target instance blocks datacenter IPs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
