# Bluesky Scraper - Posts, Profiles, Followers (`webdata_labs/bluesky-data-api`) Actor

Scrape and export Bluesky/AT Protocol posts, profiles, followers, follows, and actor search results to clean CSV/JSON datasets. Built for social listening, research, lead lists, analytics, and automation. Uses public endpoints; post search supports app-password auth.

- **URL**: https://apify.com/webdata\_labs/bluesky-data-api.md
- **Developed by:** [Open Web Team](https://apify.com/webdata_labs) (community)
- **Categories:** Social media, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Bluesky Scraper API - Posts, Profiles, Followers

Export public Bluesky and AT Protocol data to clean Apify datasets for social listening, research, lead discovery, dashboards, and automation.

This Actor collects Bluesky profiles, author feeds, followers, follows, actor search results, and authenticated post-search results. It is built for users who want structured CSV/JSON output they can plug into spreadsheets, BI tools, APIs, and workflows.

### Quick Preview

| Input | Output |
|---|---|
| Bluesky handle, DID, keyword, or account list | Clean Apify dataset rows |
| Mode: `profiles`, `authorFeed`, `followers`, `follows`, `actorSearch`, `searchPosts` | CSV/JSON exports with typed fields |
| Optional app password for post search | Dataset views for posts, profiles, and relationships |

### Why Use This Actor

- Clean dataset rows instead of deeply nested raw AT Protocol objects.
- Separate Apify dataset views for `Overview`, `Posts`, `Profiles`, and `Relationships`.
- Public-data modes work without a Bluesky login.
- Post search supports Bluesky app-password auth when the search endpoint requires it.
- Output is designed for CSV/JSON export, dashboards, scheduled runs, and downstream APIs.
- Transparent limits and auth behavior, with no browser, cookies, or proxy setup required.

### What You Can Extract

| Mode | What it returns | Authentication |
|---|---|---|
| `actorSearch` | Bluesky profiles matching a keyword | Not required |
| `profiles` | Profile details for one or more handles/DIDs | Not required |
| `authorFeed` | Recent posts from one or more public accounts | Not required |
| `followers` | Followers of one or more public accounts | Not required |
| `follows` | Accounts followed by one or more public accounts | Not required |
| `searchPosts` | Public posts matching a keyword or phrase | Bluesky app password required |

Post search currently requires a Bluesky app password because Bluesky's post-search endpoint can require authentication. Use a Bluesky **app password**, not your main account password.

### Common Use Cases

- Monitor Bluesky posts mentioning a brand, product, topic, or hashtag.
- Export public Bluesky profiles for research or lead discovery.
- Build follower/following lists around customers, competitors, creators, or communities.
- Collect recent posts from a list of public accounts.
- Feed Bluesky data into Google Sheets, Airtable, Make, Zapier, Slack, BI tools, or your own database.
- Build research datasets from public AT Protocol data.

### Output Preview

Rows are pushed to the default Apify dataset as structured JSON records. You can export the same data as CSV, JSON, Excel, XML, RSS, or HTML from Apify.

Example dataset table:

| Type | Handle / Author | Text or Description | URL | Engagement |
|---|---|---|---|---|
| `post` | `example.bsky.social` | `We are testing a new data workflow...` | Post URL | 250 likes, 34 reposts |
| `profile` | `bsky.app` | `Official Bluesky account` | Profile data | follower/follow/post counts |
| `follower` | `example.bsky.social` | `Follower of bsky.app` | Relationship row | profile metrics |

#### Dataset Views

| View | Best for |
|---|---|
| `Overview` | Quick scan across all row types |
| `Posts` | Post text, author, URL, timestamps, and engagement counts |
| `Profiles` | Handles, display names, bios, avatars, and profile metrics |
| `Relationships` | Followers/follows rows with source and target accounts |

### Input Examples

#### Search Profiles

```json
{
  "mode": "actorSearch",
  "query": "data science",
  "maxResults": 100
}
````

#### Get Profiles

```json
{
  "mode": "profiles",
  "actors": ["bsky.app", "jay.bsky.team"]
}
```

#### Get Recent Posts From An Account

```json
{
  "mode": "authorFeed",
  "actors": ["bsky.app"],
  "maxResults": 100
}
```

#### Get Followers

```json
{
  "mode": "followers",
  "actors": ["bsky.app"],
  "maxResults": 500
}
```

#### Get Accounts A User Follows

```json
{
  "mode": "follows",
  "actors": ["bsky.app"],
  "maxResults": 500
}
```

#### Search Posts

```json
{
  "mode": "searchPosts",
  "query": "AI agents",
  "maxResults": 100,
  "sort": "latest",
  "identifier": "your-handle.bsky.social",
  "appPassword": "your-app-password"
}
```

### Sample Output

#### Post Row

```json
{
  "recordType": "post",
  "uri": "at://did:plc:example/app.bsky.feed.post/3abc123",
  "url": "https://bsky.app/profile/did:plc:example/post/3abc123",
  "authorDid": "did:plc:example",
  "authorHandle": "example.bsky.social",
  "authorDisplayName": "Example Account",
  "text": "We are testing a new data workflow with Bluesky public posts.",
  "langs": ["en"],
  "createdAt": "2026-06-20T12:00:00.000Z",
  "indexedAt": "2026-06-20T12:01:00.000Z",
  "replyCount": 12,
  "repostCount": 34,
  "likeCount": 250,
  "quoteCount": 4,
  "searchQuery": "AI agents",
  "labels": []
}
```

#### Profile Row

```json
{
  "recordType": "profile",
  "did": "did:plc:example",
  "handle": "example.bsky.social",
  "displayName": "Example Account",
  "description": "Public profile bio text.",
  "avatar": "https://cdn.bsky.app/img/avatar/...",
  "banner": "https://cdn.bsky.app/img/banner/...",
  "followersCount": 12000,
  "followsCount": 320,
  "postsCount": 1800,
  "indexedAt": "2026-06-20T12:01:00.000Z",
  "labels": []
}
```

#### Follower / Follow Row

```json
{
  "recordType": "follower",
  "sourceActor": "bsky.app",
  "targetDid": "did:plc:example",
  "targetHandle": "example.bsky.social",
  "handle": "example.bsky.social",
  "displayName": "Example Account",
  "description": "Public profile bio text.",
  "followersCount": 12000,
  "followsCount": 320,
  "postsCount": 1800
}
```

For debugging or advanced use, enable `includeRaw` to include the original Bluesky API object in each row.

### Authentication Notes

Most modes use public Bluesky AppView endpoints and do not need credentials.

`searchPosts` requires:

- `identifier`: your Bluesky handle or email
- `appPassword`: a Bluesky app password

Create an app password in Bluesky under:

`Settings -> Privacy and security -> App passwords`

You can revoke app passwords at any time from Bluesky settings.

### Limits and Caveats

- This Actor only returns public Bluesky data.
- It does not access private, deleted, or login-only user content.
- Result availability depends on Bluesky/AT Protocol public API behavior.
- `maxResults` is capped to keep runs predictable.
- Keep result limits modest while validating large exports.
- Respect Bluesky terms, user privacy, and downstream data rules.

### Pricing

This Actor is priced per exported dataset row. You pay only for results plus Apify platform usage.

### Support

If a run fails or a field is missing, open an Actor issue with:

1. the run URL,
2. the input you used,
3. the field or behavior you expected.

# Actor input Schema

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

What public Bluesky data to export.

## `query` (type: `string`):

Search query for post search or actor search. Required for searchPosts and actorSearch.

## `actors` (type: `array`):

Bluesky handles or DIDs. Required for profiles, authorFeed, followers, and follows.

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

Maximum dataset rows to push. For multiple actors this is the total cap across all actors.

## `since` (type: `string`):

Optional lower bound for post search, for example 2026-06-01T00:00:00Z.

## `until` (type: `string`):

Optional upper bound for post search, for example 2026-06-20T23:59:59Z.

## `sort` (type: `string`):

Sort order for post search where supported by the Bluesky AppView.

## `includeRaw` (type: `boolean`):

Include raw Bluesky objects in dataset rows. Useful for debugging, but increases dataset size.

## `identifier` (type: `string`):

Optional Bluesky handle/email for authenticated endpoints. Currently required for searchPosts because Bluesky post search requires auth.

## `appPassword` (type: `string`):

Optional Bluesky app password. Use an app password, not your main account password.

## `serviceUrl` (type: `string`):

Bluesky AppView service URL. The public AppView works for public data and does not require login.

## `authServiceUrl` (type: `string`):

Bluesky service URL used for login-only endpoints.

## `delayMs` (type: `integer`):

Polite delay between paginated API requests.

## Actor input object example

```json
{
  "mode": "searchPosts",
  "query": "AI agents",
  "actors": [
    "bsky.app"
  ],
  "maxResults": 100,
  "sort": "latest",
  "includeRaw": false,
  "serviceUrl": "https://public.api.bsky.app",
  "authServiceUrl": "https://bsky.social",
  "delayMs": 250
}
```

# Actor output Schema

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

All exported Bluesky rows from the default dataset.

## `overview` (type: `string`):

Default dataset view with the most useful fields for quick inspection.

# 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 = {
    "query": "AI agents",
    "actors": [
        "bsky.app"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/bluesky-data-api").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 = {
    "query": "AI agents",
    "actors": ["bsky.app"],
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/bluesky-data-api").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 '{
  "query": "AI agents",
  "actors": [
    "bsky.app"
  ]
}' |
apify call webdata_labs/bluesky-data-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bluesky Scraper - Posts, Profiles, Followers",
        "description": "Scrape and export Bluesky/AT Protocol posts, profiles, followers, follows, and actor search results to clean CSV/JSON datasets. Built for social listening, research, lead lists, analytics, and automation. Uses public endpoints; post search supports app-password auth.",
        "version": "0.1",
        "x-build-id": "vuh8c0vmMGDQGFwz8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/webdata_labs~bluesky-data-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-webdata_labs-bluesky-data-api",
                "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/webdata_labs~bluesky-data-api/runs": {
            "post": {
                "operationId": "runs-sync-webdata_labs-bluesky-data-api",
                "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/webdata_labs~bluesky-data-api/run-sync": {
            "post": {
                "operationId": "run-sync-webdata_labs-bluesky-data-api",
                "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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "searchPosts",
                            "authorFeed",
                            "profiles",
                            "followers",
                            "follows",
                            "actorSearch"
                        ],
                        "type": "string",
                        "description": "What public Bluesky data to export.",
                        "default": "searchPosts"
                    },
                    "query": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Search query for post search or actor search. Required for searchPosts and actorSearch."
                    },
                    "actors": {
                        "title": "Actors",
                        "type": "array",
                        "description": "Bluesky handles or DIDs. Required for profiles, authorFeed, followers, and follows.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum dataset rows to push. For multiple actors this is the total cap across all actors.",
                        "default": 100
                    },
                    "since": {
                        "title": "Since",
                        "type": "string",
                        "description": "Optional lower bound for post search, for example 2026-06-01T00:00:00Z."
                    },
                    "until": {
                        "title": "Until",
                        "type": "string",
                        "description": "Optional upper bound for post search, for example 2026-06-20T23:59:59Z."
                    },
                    "sort": {
                        "title": "Search sort",
                        "enum": [
                            "latest",
                            "top"
                        ],
                        "type": "string",
                        "description": "Sort order for post search where supported by the Bluesky AppView.",
                        "default": "latest"
                    },
                    "includeRaw": {
                        "title": "Include raw response objects",
                        "type": "boolean",
                        "description": "Include raw Bluesky objects in dataset rows. Useful for debugging, but increases dataset size.",
                        "default": false
                    },
                    "identifier": {
                        "title": "Bluesky identifier",
                        "type": "string",
                        "description": "Optional Bluesky handle/email for authenticated endpoints. Currently required for searchPosts because Bluesky post search requires auth."
                    },
                    "appPassword": {
                        "title": "Bluesky app password",
                        "type": "string",
                        "description": "Optional Bluesky app password. Use an app password, not your main account password."
                    },
                    "serviceUrl": {
                        "title": "Service URL",
                        "type": "string",
                        "description": "Bluesky AppView service URL. The public AppView works for public data and does not require login.",
                        "default": "https://public.api.bsky.app"
                    },
                    "authServiceUrl": {
                        "title": "Auth service URL",
                        "type": "string",
                        "description": "Bluesky service URL used for login-only endpoints.",
                        "default": "https://bsky.social"
                    },
                    "delayMs": {
                        "title": "Delay between requests (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Polite delay between paginated API requests.",
                        "default": 250
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
