# Website Contact & Social Discovery Crawler (`competent_clarinet/website-contacts-scraper`) Actor

High-throughput crawler that extracts emails, phone numbers, and social media profiles from websites using HTTP-first Crawlee crawling with Selectolax parsing and Playwright SPA fallback.

- **URL**: https://apify.com/competent\_clarinet/website-contacts-scraper.md
- **Developed by:** [Man Mohit verma](https://apify.com/competent_clarinet) (community)
- **Categories:** Lead generation, Developer tools, Social media
- **Stats:** 2 total users, 0 monthly users, 70.6% runs succeeded, 0 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

### What does Website Contact & Social Discovery Crawler do?

This Actor crawls websites and discovers **contact details** and **social media profiles**. For each seed URL you provide, it searches high-value pages (contact, about, team, support, and pages found in sitemaps), extracts emails, phone numbers, and social links, and writes every finding as a separate dataset record.

Use it for lead generation, company research, enrichment pipelines, or building contact databases from public web pages.

### Features

- Discover **emails**, **phone numbers**, and **social profiles** (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, Threads, GitHub, and more)
- Crawl **multiple websites** in one run
- **Sitemap discovery** — finds contact-related pages faster via `robots.txt` and `sitemap.xml`
- **Multi-site friendly** — balances load across domains with round-robin scheduling and per-host rate limits
- **Direct-first proxy** — direct requests first; proxy after HTTP 403/429 when configured, otherwise the site is skipped
- **Event-based output** — one row per discovered email, phone, or social URL

### Input

Configure the Actor in the **Input** tab. Main fields:

| Field | Description |
|-------|-------------|
| `websites` | **Required.** One or more website URLs to crawl. Each entry may be a URL string or `{ "url": "…", "countryCode": "IN" }` for phone parsing. |
| `defaultCountryCode` | Default ISO country code for phone parsing when a website entry omits `countryCode` (default: `US`). |
| `maxPagesPerSite` | Maximum pages to crawl per website (default: `25`). |
| `maxDepthPerSite` | Maximum link hops from the seed URL (default: `10`; `0` = seed pages only). |
| `terminationStrategy` | `early` stops when email, phone, and social are found; `lazy` crawls until page/depth limits (default: `early`). |
| `maxConcurrency` | Max parallel requests across all sites (default: `10`). |
| `maxConcurrencyPerDomain` | Max in-flight requests per host (default: `2`). |
| `maxRequestsPerDomainPerSecond` | Per-domain request rate limit (default: `2`). Lower if you see HTTP 429 errors. |
| `minEnqueueScore` | How selective the crawler is when following links (default: `0.333`, raw ≥ 50 on the /160 scale when semantic scoring is active, /120 otherwise). Higher = fewer, more contact-focused pages. |
| `useSemanticScoring` | Improves link selection on sites with generic URLs and descriptive link text (default: `false`). |
| `useSitemapDiscovery` | Resolve redirects and import URLs from `robots.txt` / `sitemap.xml` before crawling (default: `true`). |
| `maxSitemapUrls` | Cap on sitemap URLs imported per site (default: `50`). |
| `treatSubdomainsAsSameSite` | Follow links on subdomains of the same brand domain (default: `false`). |
| `additionalPaths` | Extra path suffixes probed per site (e.g. contact and policy pages). |
| `proxyConfiguration` | Optional. Direct first; proxy after HTTP 403/429 when set. Sites without proxy are skipped on 403/429. Sessions rotate on 403/429. |
| `maxProxySessions` | Max active proxy sessions at once (default: `10`). Domains share sessions; rotation moves every domain on that session together. |

#### Website examples

```json
[
  "https://www.apify.com",
  "https://example.com"
]
````

With per-site phone region (recommended for non-US sites):

```json
[
  { "url": "https://www.kalyansilks.com/", "countryCode": "IN" },
  { "url": "https://example.co.uk/", "countryCode": "GB" }
]
```

URLs with optional object form (uses `defaultCountryCode` when `countryCode` is omitted):

```json
[
  { "url": "https://www.apify.com" }
]
```

### Output

Each discovered entity is saved as one dataset record. Download results as **JSON, CSV, Excel, HTML, XML, or RSS** from the run's **Storage** tab.

#### Output fields

| Field | Description |
|-------|-------------|
| `startingUrl` | The seed URL you provided for this website |
| `currentPage` | The page where the entity was found |
| `pageFetched` | The actual URL that was fetched (may differ after redirects) |
| `type` | Entity type: `email`, `phone`, `twitter`, `linkedin`, `facebook`, `instagram`, `youtube`, `tiktok`, `threads`, `github`, `whatsapp`, `telegram`, `discord`, or `contact_form` |
| `value` | The extracted email, phone number, social profile URL, or contact page URL |

#### Output example

```json
{
  "startingUrl": "https://www.example.com/",
  "currentPage": "https://www.example.com/contact-us",
  "pageFetched": "https://www.example.com/contact-us",
  "type": "email",
  "value": "hello@example.com"
}
```

```json
{
  "startingUrl": "https://www.example.com/",
  "currentPage": "https://www.example.com/about",
  "pageFetched": "https://www.example.com/about",
  "type": "linkedin",
  "value": "https://www.linkedin.com/company/example"
}
```

### Tips

- Start with a low `maxPagesPerSite` when testing new domains.
- Set **`countryCode`** (or `defaultCountryCode`) to match each site's market so local phone numbers parse correctly.
- Use `terminationStrategy: "lazy"` to collect more contacts within your page and depth limits.
- Use `terminationStrategy: "early"` (default) for faster runs when one email, phone, and social per site is enough.
- Set `proxyConfiguration` if sites return HTTP 403 or 429 without proxy.
- Lower `maxRequestsPerDomainPerSecond` or `maxConcurrencyPerDomain` if you encounter rate limiting (HTTP 429).
- Set `useSitemapDiscovery` to `false` if you only want to crawl pages discovered via links from the homepage.

### Limitations

- Extracts only **publicly visible** contact information on crawled pages.
- Phone numbers without a country code need the correct `countryCode` or `defaultCountryCode` for your target market.
- Some sites block automated access; proxy may be required.
- Respects `maxPagesPerSite`, `maxDepthPerSite`, and termination strategy; lazy mode still does not guarantee every contact on large sites.

# Actor input Schema

## `websites` (type: `array`):

Seed URLs to crawl. Each entry may be a URL string or an object with url and optional countryCode (ISO 3166-1 alpha-2, e.g. US, IN, GB). When countryCode is omitted on an entry, defaultCountryCode is used.

## `defaultCountryCode` (type: `string`):

Default ISO 3166-1 alpha-2 country code for parsing phone numbers without an explicit country prefix. Used for website entries that do not specify countryCode.

## `maxPagesPerSite` (type: `integer`):

Maximum number of pages to crawl per website before stopping.

## `maxDepthPerSite` (type: `integer`):

Maximum link hops from the seed URL (0 = seed pages only). Applies to both termination strategies.

## `terminationStrategy` (type: `string`):

Early stops each site once an email, phone, and social profile are found. Lazy crawls until max pages and max depth limits are reached to collect as many contacts as possible.

## `maxConcurrency` (type: `integer`):

Maximum number of concurrent httpx workers across all websites.

## `maxConcurrencyPerDomain` (type: `integer`):

Maximum in-flight HTTP requests per website host. Combined with round-robin scheduling to avoid hammering one domain.

## `maxRequestsPerDomainPerSecond` (type: `number`):

Per-domain request rate limit enforced by httpx-limiter.

## `requestTimeoutSecs` (type: `integer`):

HTTP request timeout.

## `maxRequestRetries` (type: `integer`):

Retries for failed page requests.

## `bufferFlushSize` (type: `integer`):

Number of events to buffer before pushing to the dataset.

## `useSitemapDiscovery` (type: `boolean`):

Resolve redirects, read robots.txt, and seed the crawl queue from sitemap.xml URLs before link discovery.

## `maxSitemapUrls` (type: `integer`):

Maximum number of same-site page URLs to seed from sitemaps after score-based ranking. Capped by maxPagesPerSite minus one (canonical URL slot).

## `minEnqueueScore` (type: `number`):

Only queue URLs whose normalized contact-path score (0.0–1.0) meets this threshold. Homepage is always queued. Lower values discover more pages; higher values focus on contact/about/support paths. Legacy integer inputs from 0–100 are accepted and converted automatically.

## `useSemanticScoring` (type: `boolean`):

When enabled, score each discovered link by semantic similarity between contact-intent phrases and a combined profile of the raw URL (path, query params) plus anchor and surrounding text.

## `treatSubdomainsAsSameSite` (type: `boolean`):

When enabled, follow links on subdomains of the same registrable domain (e.g. stores.example.com while crawling www.example.com). Disabled by default; unrelated domains and other tenants on shared platforms (e.g. different \*.myshopify.com shops) are never combined.

## `additionalPaths` (type: `array`):

Path suffixes queued as seeds for every site (after the canonical landing URL). Useful for Shopify contact/policy pages that may not appear in navigation or sitemaps. Resolved against each site's post-redirect origin; duplicates are removed per domain.

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

Optional proxies. Requests go direct first; after HTTP 403/429 a site uses proxy when configured, otherwise it is skipped. Proxy sessions rotate on 403/429.

## `maxProxySessions` (type: `integer`):

Maximum number of active proxy sessions kept at once. Domains are assigned to a session and stay on it until rotation. If multiple domains share a session and one rotates, all domains on that session move together.

## Actor input object example

```json
{
  "websites": [
    "https://www.apify.com"
  ],
  "defaultCountryCode": "US",
  "maxPagesPerSite": 25,
  "maxDepthPerSite": 3,
  "terminationStrategy": "early",
  "maxConcurrency": 10,
  "maxConcurrencyPerDomain": 2,
  "maxRequestsPerDomainPerSecond": 2,
  "requestTimeoutSecs": 30,
  "maxRequestRetries": 3,
  "bufferFlushSize": 200,
  "useSitemapDiscovery": true,
  "maxSitemapUrls": 50,
  "minEnqueueScore": 0.333,
  "useSemanticScoring": true,
  "treatSubdomainsAsSameSite": false,
  "additionalPaths": [
    "/pages/contact",
    "/policies/contact-information",
    "/pages/privacy-policy",
    "/privacy-policy",
    "/pages/terms-and-conditions",
    "/terms-and-conditions"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxProxySessions": 10
}
```

# Actor output Schema

## `events` (type: `string`):

Dataset items with type, value, startingUrl, currentPage, and pageFetched.

# 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 = {
    "websites": [
        "https://www.apify.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("competent_clarinet/website-contacts-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 = {
    "websites": ["https://www.apify.com"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("competent_clarinet/website-contacts-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 '{
  "websites": [
    "https://www.apify.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call competent_clarinet/website-contacts-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Contact & Social Discovery Crawler",
        "description": "High-throughput crawler that extracts emails, phone numbers, and social media profiles from websites using HTTP-first Crawlee crawling with Selectolax parsing and Playwright SPA fallback.",
        "version": "0.1",
        "x-build-id": "w0xaQa7eFE9euekhi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/competent_clarinet~website-contacts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-competent_clarinet-website-contacts-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/competent_clarinet~website-contacts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-competent_clarinet-website-contacts-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/competent_clarinet~website-contacts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-competent_clarinet-website-contacts-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",
                "required": [
                    "websites"
                ],
                "properties": {
                    "websites": {
                        "title": "Websites",
                        "type": "array",
                        "description": "Seed URLs to crawl. Each entry may be a URL string or an object with url and optional countryCode (ISO 3166-1 alpha-2, e.g. US, IN, GB). When countryCode is omitted on an entry, defaultCountryCode is used."
                    },
                    "defaultCountryCode": {
                        "title": "Default country code",
                        "type": "string",
                        "description": "Default ISO 3166-1 alpha-2 country code for parsing phone numbers without an explicit country prefix. Used for website entries that do not specify countryCode.",
                        "default": "US"
                    },
                    "maxPagesPerSite": {
                        "title": "Max pages per site",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of pages to crawl per website before stopping.",
                        "default": 25
                    },
                    "maxDepthPerSite": {
                        "title": "Max crawl depth per site",
                        "minimum": 0,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum link hops from the seed URL (0 = seed pages only). Applies to both termination strategies.",
                        "default": 3
                    },
                    "terminationStrategy": {
                        "title": "Termination strategy",
                        "enum": [
                            "early",
                            "lazy"
                        ],
                        "type": "string",
                        "description": "Early stops each site once an email, phone, and social profile are found. Lazy crawls until max pages and max depth limits are reached to collect as many contacts as possible.",
                        "default": "early"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of concurrent httpx workers across all websites.",
                        "default": 10
                    },
                    "maxConcurrencyPerDomain": {
                        "title": "Max concurrency per domain",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum in-flight HTTP requests per website host. Combined with round-robin scheduling to avoid hammering one domain.",
                        "default": 2
                    },
                    "maxRequestsPerDomainPerSecond": {
                        "title": "Max requests per domain per second",
                        "minimum": 0.1,
                        "maximum": 50,
                        "type": "number",
                        "description": "Per-domain request rate limit enforced by httpx-limiter.",
                        "default": 2
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 300,
                        "type": "integer",
                        "description": "HTTP request timeout.",
                        "default": 30
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries for failed page requests.",
                        "default": 3
                    },
                    "bufferFlushSize": {
                        "title": "Buffer flush size",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Number of events to buffer before pushing to the dataset.",
                        "default": 200
                    },
                    "useSitemapDiscovery": {
                        "title": "Use sitemap discovery",
                        "type": "boolean",
                        "description": "Resolve redirects, read robots.txt, and seed the crawl queue from sitemap.xml URLs before link discovery.",
                        "default": true
                    },
                    "maxSitemapUrls": {
                        "title": "Max sitemap URLs per site",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of same-site page URLs to seed from sitemaps after score-based ranking. Capped by maxPagesPerSite minus one (canonical URL slot).",
                        "default": 50
                    },
                    "minEnqueueScore": {
                        "title": "Min enqueue score",
                        "minimum": 0,
                        "maximum": 1,
                        "type": "number",
                        "description": "Only queue URLs whose normalized contact-path score (0.0–1.0) meets this threshold. Homepage is always queued. Lower values discover more pages; higher values focus on contact/about/support paths. Legacy integer inputs from 0–100 are accepted and converted automatically.",
                        "default": 0.333
                    },
                    "useSemanticScoring": {
                        "title": "Use semantic link scoring (spaCy)",
                        "type": "boolean",
                        "description": "When enabled, score each discovered link by semantic similarity between contact-intent phrases and a combined profile of the raw URL (path, query params) plus anchor and surrounding text.",
                        "default": true
                    },
                    "treatSubdomainsAsSameSite": {
                        "title": "Treat subdomains as same site",
                        "type": "boolean",
                        "description": "When enabled, follow links on subdomains of the same registrable domain (e.g. stores.example.com while crawling www.example.com). Disabled by default; unrelated domains and other tenants on shared platforms (e.g. different *.myshopify.com shops) are never combined.",
                        "default": false
                    },
                    "additionalPaths": {
                        "title": "Additional seed paths",
                        "type": "array",
                        "description": "Path suffixes queued as seeds for every site (after the canonical landing URL). Useful for Shopify contact/policy pages that may not appear in navigation or sitemaps. Resolved against each site's post-redirect origin; duplicates are removed per domain.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "/pages/contact",
                            "/policies/contact-information",
                            "/pages/privacy-policy",
                            "/privacy-policy",
                            "/pages/terms-and-conditions",
                            "/terms-and-conditions"
                        ]
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxies. Requests go direct first; after HTTP 403/429 a site uses proxy when configured, otherwise it is skipped. Proxy sessions rotate on 403/429."
                    },
                    "maxProxySessions": {
                        "title": "Max proxy sessions",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of active proxy sessions kept at once. Domains are assigned to a session and stay on it until rotation. If multiple domains share a session and one rotates, all domains on that session move together.",
                        "default": 10
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
