# Facebook Page Post Intelligence | Public Pages & Posts Scraper (`taroyamada/facebook-page-post-intelligence`) Actor

Scrape public Facebook page metadata and posts without API keys. Get page followers, post text, reactions, shares, comments, and engagement signals for analytics and research.

- **URL**: https://apify.com/taroyamada/facebook-page-post-intelligence.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** Social media, Automation, Marketing
- **Stats:** 3 total users, 2 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## Facebook Page Post Intelligence

**Public Facebook page metadata and post scraper — no API keys, no login required.**

Collect page-level intelligence (followers, likes, description, category, website) and recent public post signals (text, timestamps, reactions, comments, shares) from public Facebook Pages.

---

### Status

**Live V1** — Public page metadata extraction and recent post parsing with honest degraded/partial/blocked status reporting.

> ⚠️ **Important**: Facebook aggressively guards content behind login walls. This actor targets the subset of data that Facebook serves to logged-out visitors. Success rates vary by page, region, and Facebook's current challenge policy.

---

### What this actor does

| Feature | V1 Status |
|---------|-----------|
| Page name, category, description | ✅ When publicly served |
| Follower count, like count | ✅ When visible in HTML |
| Profile image URL | ✅ Via og:image |
| Website, contact info | ✅ When exposed |
| Verified badge | ✅ When embedded in page JSON |
| Recent post text | ✅ When served to logged-out visitors |
| Post timestamps | ✅ Parsed from embedded JSON |
| Post reactions/comments/shares | ✅ When exposed (often null) |
| Post media URLs | ✅ When public |
| Hashtag and mention extraction | ✅ Client-side regex from post text |

#### Explicitly out of scope (V1)

- Private profiles or personal timelines
- Facebook Groups or Events
- Stories, Reels, Live videos
- Full comment thread contents
- Ads (use [Meta Ad Library Intelligence](https://apify.com/store) instead)
- Pagination beyond what is initially visible
- Any data requiring Facebook login

---

### Input

```json
{
  "pageUrls": ["https://www.facebook.com/NASA"],
  "maxPostsPerPage": 10,
  "includePosts": true,
  "includePageSummary": true,
  "timeoutMs": 20000,
  "delivery": "dataset",
  "dryRun": false
}
````

#### Input fields

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `pageUrls` | string\[] | `[]` | Public Facebook Page URLs or bare handles (e.g. `https://www.facebook.com/NASA`, `NASA`, `@NASA`) |
| `maxPostsPerPage` | integer | `10` | Max recent posts to extract per page (1–50) |
| `includePosts` | boolean | `true` | Whether to extract recent posts |
| `includePageSummary` | boolean | `true` | Whether to extract page metadata |
| `timeoutMs` | integer | `20000` | HTTP timeout per request in ms (5000–60000) |
| `delivery` | string | `"dataset"` | `"dataset"` or `"webhook"` |
| `webhookUrl` | string | — | Webhook endpoint when `delivery="webhook"` |
| `dryRun` | boolean | `false` | Parse and validate but do not push to dataset |

#### Accepted URL formats

- `https://www.facebook.com/NASA`
- `https://fb.com/NASA`
- `facebook.com/NASA`
- `NASA` (bare handle)
- `@NASA` (with @ prefix)

***

### Output

Results are written to `output/result.json` and pushed to the Apify dataset (one item per post, or per page if no posts are found).

#### Top-level structure

```json
{
  "meta": { ... },
  "pages": [ { ...page summary... } ],
  "posts": [ { ...post... } ]
}
```

#### `meta` object

| Field | Type | Description |
|-------|------|-------------|
| `generatedAt` | string | ISO 8601 run timestamp |
| `implementationStatus` | string | `"live"` |
| `dataStrategy` | string | `"public_html"` |
| `totalPages` | integer | Pages queued |
| `succeeded` | integer | Pages with at least partial data |
| `failed` | integer | Pages that errored |
| `postsCollected` | integer | Total posts extracted |
| `v1Scope` | string | Scope statement |
| `warnings` | string\[] | Run-level warnings |
| `notes` | string\[] | Methodological notes |

#### `pages[]` fields

| Field | Type | Notes |
|-------|------|-------|
| `pageUrl` | string | Canonical page URL |
| `pageHandle` | string|null | URL slug / handle |
| `pageId` | string|null | Facebook numeric page ID |
| `name` | string|null | Page display name |
| `category` | string|null | Page category |
| `description` | string|null | About / description text |
| `followerCount` | integer|null | Follower count |
| `likeCount` | integer|null | Like count |
| `websiteUrl` | string|null | External website |
| `phone` | string|null | Phone number (when public) |
| `email` | string|null | Email address (when public) |
| `address` | string|null | Physical address (when public) |
| `profileImageUrl` | string|null | Profile image URL |
| `coverImageUrl` | string|null | Cover image URL |
| `verifiedBadge` | boolean|null | Page verification status |
| `createdDate` | string|null | Page creation date |
| `extractedAt` | string | Extraction timestamp |
| `status` | string | `ok` / `partial` / `degraded` / `error` |
| `warnings` | string\[] | Page-specific warnings |
| `error` | string|null | Error message if failed |

#### `posts[]` fields

| Field | Type | Notes |
|-------|------|-------|
| `postUrl` | string|null | Canonical post URL |
| `postId` | string|null | Facebook post/story ID |
| `pageHandle` | string|null | Source page handle |
| `pageId` | string|null | Source page ID |
| `text` | string|null | Post body text |
| `publishedAt` | string|null | ISO 8601 publish time |
| `mediaType` | string|null | `text`, `image`, `video`, `carousel`, `link` |
| `imageUrls` | string\[] | Image URLs |
| `videoUrl` | string|null | Video URL |
| `linkUrl` | string|null | Shared link URL |
| `linkTitle` | string|null | Shared link title |
| `reactionCount` | integer|null | Total reactions |
| `commentCount` | integer|null | Comment count |
| `shareCount` | integer|null | Share count |
| `viewCount` | integer|null | View count (video/reel) |
| `isSponsored` | boolean|null | Whether marked as sponsored |
| `isPinned` | boolean|null | Whether post is pinned |
| `hashtags` | string\[] | Hashtags found in text |
| `mentionedHandles` | string\[] | @mentions found in text |
| `extractedAt` | string | Extraction timestamp |

***

### Status values

| Status | Meaning |
|--------|---------|
| `ok` | Full or near-full data extracted |
| `partial` | Some fields extracted; others not publicly available |
| `degraded` | JS challenge or login wall detected; extraction may be incomplete |
| `not_found` | HTTP 404 — page does not exist |
| `blocked` | HTTP 429 rate limit |
| `error` | Network failure or unexpected error |

***

### Warnings glossary

| Warning prefix | Trigger |
|----------------|---------|
| `challenge-required` | Facebook JS challenge or login wall detected |
| `pagination-not-supported` | Additional posts exist beyond visible page |
| `field-not-public` | Expected fields not available to logged-out visitors |
| `page-structure-changed` | No extraction pattern matched — possible Facebook HTML change |

***

### Pricing

This actor uses **PAY\_PER\_EVENT** pricing:

| Event | Price |
|---|---|
| Actor start (per GB memory, min 1) | $0.001 |
| Per result (Facebook page) | $0.005 |

A typical run collecting posts from 10 Facebook pages costs approximately **$0.05–$0.06** (10 × $0.005 + start fee).

***

### FAQ

**Can this actor access private Facebook profiles or personal timelines?**
No. V1 is scoped exclusively to public Facebook Pages. Personal profiles are protected by Facebook's login wall.

**Why are reaction/comment/share counts often null?**
Facebook hides engagement metrics from logged-out visitors on most pages. The actor extracts them when available but cannot guarantee their presence.

**Can I scrape a Business Page, Celebrity Page, or Brand Page?**
Yes — these are public Facebook Pages and are in scope, subject to Facebook's access controls.

**Does this use the Facebook Graph API?**
No. This actor uses public HTML only. No Facebook API credentials are required or used.

**What happens if Facebook updates its page structure?**
The actor uses tiered parsing (embedded JSON → meta tags → inline patterns) to be resilient to minor changes. If all tiers fail, a `page-structure-changed` warning is emitted. See the RUNBOOK for maintenance steps.

**Can I run this at scale?**
Yes, on Apify. Start with a small batch (5–10 pages) to verify extraction quality for your target pages before scaling. Use `maxPostsPerPage` to control output volume.

***

### Support & limitations

- **Public pages only** — no private profiles, groups, or events
- **V1 does not paginate** — only posts visible in the initial page load are extracted
- **Engagement metrics** are often null for logged-out visitors
- **Rate limiting** — the actor politely spaces requests (2.5 s between pages) to reduce ban risk
- For issues, open a GitHub issue or contact the actor maintainer via Apify console

***

### Related actors

- [Meta Ad Library Intelligence](https://apify.com/store) — Facebook Ads (no login)
- [Instagram Profile Intelligence](https://apify.com/store) — Public Instagram profiles
- [Threads Profile Post Scraper](https://apify.com/store) — Public Threads profiles and posts

# Actor input Schema

## `pageUrls` (type: `array`):

Public Facebook Page URLs or bare page handles/usernames to scrape (e.g. https://www.facebook.com/NASA or 'NASA').

## `maxPostsPerPage` (type: `integer`):

Maximum number of recent posts to extract per page. Higher values increase run time.

## `includePosts` (type: `boolean`):

Whether to extract recent posts in addition to page metadata.

## `includePageSummary` (type: `boolean`):

Whether to extract page-level metadata (followers, likes, description, category, etc.).

## `timeoutMs` (type: `integer`):

HTTP timeout per page request in milliseconds.

## `delivery` (type: `string`):

Where to send results: dataset or webhook.

## `webhookUrl` (type: `string`):

Webhook URL to POST results to when delivery=webhook.

## `dryRun` (type: `boolean`):

Run without saving results to the dataset. Useful for testing.

## Actor input object example

```json
{
  "pageUrls": [
    "https://www.facebook.com/NASA"
  ],
  "maxPostsPerPage": 10,
  "includePosts": true,
  "includePageSummary": true,
  "timeoutMs": 20000,
  "delivery": "dataset",
  "dryRun": false
}
```

# 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 = {
    "pageUrls": [
        "https://www.facebook.com/NASA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/facebook-page-post-intelligence").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 = { "pageUrls": ["https://www.facebook.com/NASA"] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/facebook-page-post-intelligence").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 '{
  "pageUrls": [
    "https://www.facebook.com/NASA"
  ]
}' |
apify call taroyamada/facebook-page-post-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=taroyamada/facebook-page-post-intelligence",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Facebook Page Post Intelligence | Public Pages & Posts Scraper",
        "description": "Scrape public Facebook page metadata and posts without API keys. Get page followers, post text, reactions, shares, comments, and engagement signals for analytics and research.",
        "version": "0.1",
        "x-build-id": "k7E8gXndGtKoDFDFC"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~facebook-page-post-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-facebook-page-post-intelligence",
                "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/taroyamada~facebook-page-post-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-facebook-page-post-intelligence",
                "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/taroyamada~facebook-page-post-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-facebook-page-post-intelligence",
                "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": {
                    "pageUrls": {
                        "title": "Facebook Page URLs",
                        "type": "array",
                        "description": "Public Facebook Page URLs or bare page handles/usernames to scrape (e.g. https://www.facebook.com/NASA or 'NASA').",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPostsPerPage": {
                        "title": "Max Posts Per Page",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of recent posts to extract per page. Higher values increase run time.",
                        "default": 10
                    },
                    "includePosts": {
                        "title": "Include Posts",
                        "type": "boolean",
                        "description": "Whether to extract recent posts in addition to page metadata.",
                        "default": true
                    },
                    "includePageSummary": {
                        "title": "Include Page Summary",
                        "type": "boolean",
                        "description": "Whether to extract page-level metadata (followers, likes, description, category, etc.).",
                        "default": true
                    },
                    "timeoutMs": {
                        "title": "Timeout (ms)",
                        "minimum": 5000,
                        "maximum": 60000,
                        "type": "integer",
                        "description": "HTTP timeout per page request in milliseconds.",
                        "default": 20000
                    },
                    "delivery": {
                        "title": "Delivery",
                        "enum": [
                            "dataset",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "Where to send results: dataset or webhook.",
                        "default": "dataset"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Webhook URL to POST results to when delivery=webhook."
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Run without saving results to the dataset. Useful for testing.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
