# ATS Jobs Scraper — Greenhouse, Lever & Ashby (`i-scraper/ats-jobs-scraper`) Actor

Scrape public job postings from company career pages on Greenhouse, Lever, and Ashby. Normalized output with seniority, remote-type, role and technology detection. Tracks new vs. recurring jobs.

- **URL**: https://apify.com/i-scraper/ats-jobs-scraper.md
- **Developed by:** [i-Scraper](https://apify.com/i-scraper) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Greenhouse, Lever & Ashby Job Scraper — ATS Career Page Data

Scrape job postings from any company career page hosted on **Greenhouse**, **Lever**, or **Ashby**. This ATS jobs scraper returns clean, normalized data for every opening: job titles, locations, departments, seniority levels, remote type, and detected tech stack. Detect new postings between runs so you always work with fresh hiring signals.

Built for recruiting research, sales prospecting, competitor hiring intelligence, talent market analysis, and tech jobs aggregation. No browser automation, no flaky DOM scraping: the actor reads public ATS endpoints directly, so output stays fast and stable.

---

### Use cases

- **Recruiters & sourcers** — monitor competitor hiring, find passive candidates by skill set, build pipelines from public openings.
- **Sales & RevOps teams** — detect buying signals (a company hiring a "Salesforce admin" hints at a Salesforce purchase).
- **Market researchers & analysts** — track hiring trends across industries, geographies, and seniority bands.
- **Founders & operators** — benchmark headcount growth, compensation bands, and tech-stack adoption against competitors.
- **Job board builders** — aggregate fresh tech jobs from hundreds of company career pages into a single feed.
- **Investors & VCs** — measure portfolio growth and hiring velocity with weekly snapshots.

---

### What you get

For every job posting, the scraper returns a structured record with:

- **Job basics**: title, company, location, department, employment type, source URL.
- **Detected attributes**: seniority (intern through executive), remote/hybrid/on-site, role category, technologies mentioned (Python, AWS, React, Kubernetes, …).
- **Tracking fields**: `firstSeen`, `lastSeen`, and `isNew` to spot fresh openings between scheduled runs.
- **Full descriptions** (text + HTML, optional) for deeper analysis or LLM enrichment.

---

### What this scraper does NOT do

The actor only extracts **publicly available** job postings. It does not:

- Scrape LinkedIn Jobs, Indeed, Glassdoor, or any other job aggregator.
- Access private ATS dashboards or recruiter views.
- Bypass logins, captchas, or anti-bot systems.
- Collect candidate data, applications, or private salary information.

This keeps the data legal, stable, and reliable across long-running schedules.

---

### Supported ATS platforms (MVP)

| ATS | Career page URL pattern | Example slug |
|---|---|---|
| Greenhouse | `https://boards.greenhouse.io/{slug}` | `stripe` |
| Lever | `https://jobs.lever.co/{slug}` | `netflix` |
| Ashby | `https://jobs.ashbyhq.com/{slug}` | `notion` |

Workable, Recruitee, Personio, and Workday adapters are on the roadmap.

---

### How to use the ATS jobs scraper

Two ways to pick the companies you want to scrape: an explicit list of targets, or curated preset lists.

#### 1. Explicit company targets

```json
{
  "targets": [
    { "ats": "greenhouse", "slug": "stripe" },
    { "ats": "lever", "slug": "netflix" },
    { "ats": "ashby", "slug": "notion" }
  ],
  "keywords": ["python", "backend"],
  "locations": ["remote", "europe"],
  "includeDescriptions": true
}
````

How to find a company's ATS slug:

1. Open the company's careers page.
2. Look at the URL of any job listing (or the iframe/embed).
3. The path after the ATS hostname is the slug:
   - `boards.greenhouse.io/stripe` → slug is `stripe`
   - `jobs.lever.co/netflix` → slug is `netflix`
   - `jobs.ashbyhq.com/notion` → slug is `notion`

#### 2. Preset company lists

Skip the manual research and run one or more curated, manually verified bundles of companies:

```json
{
  "presetLists": ["ai-ml", "fintech"],
  "keywords": ["engineer", "ml"],
  "locations": ["remote", "europe"]
}
```

Currently available:

| Preset | Companies | Examples |
|---|--:|---|
| `top-tech` | ~34 | Stripe, Anthropic, OpenAI, Notion, Vercel, Linear, Figma, Spotify, Netflix, Cloudflare, Datadog, GitLab |
| `ai-ml` | ~27 | Anthropic, OpenAI, Mistral, Cohere, Cursor, Perplexity, ElevenLabs, Modal, Pinecone, Scale AI, DeepL |
| `fintech` | ~23 | Stripe, Brex, Mercury, Ramp, Monzo, Robinhood, Affirm, Adyen, Carta, Lithic, Modern Treasury |
| `devtools` | ~29 | Vercel, GitLab, Supabase, PostHog, Linear, Cursor, Sentry, Render, Datadog, Cloudflare, Twilio, Mux |
| `eu-startups` | ~20 | Mistral, Monzo, ElevenLabs, Adyen, Spotify, Doctolib, HelloFresh, Celonis, BlaBlaCar, GetYourGuide |
| `yc-alumni` | ~26 | Stripe, Airbnb, Brex, Reddit, Notion, Gusto, Vanta, Webflow, Mercury, Replit, Algolia, Whatnot |
| `crypto-web3` | ~11 | Kraken, Alchemy, Ripple, Anchorage Digital, Mysten Labs, OpenSea, Phantom, Foundation, Gemini |
| `remote-first` | ~17 | GitLab, PostHog, Supabase, Linear, Vercel, Buffer, Zapier, Deel, Mattermost, Notion, Mercury |

You can combine multiple presets and `targets` in the same run. Duplicates are removed automatically. Slugs are re-verified periodically — if a company changes ATS provider, it shows up in `FAILED_TARGETS` as `not_found`.

***

### Filtering job postings

| Field | What it does |
|---|---|
| `keywords` | Keep only jobs whose title, department, location, or description contains at least one keyword (case-insensitive). |
| `excludeKeywords` | Drop any job matching any of these keywords (e.g. `intern`). |
| `locations` | Keep only jobs whose location contains one of these terms (e.g. `remote`, `europe`, `berlin`). |
| `maxJobsPerTarget` | Hard cap on jobs returned per company (default: 500). |
| `includeDescriptions` | Whether to include full descriptions in output (default: true). |

***

### Example output (Greenhouse job posting)

```json
{
  "jobId": "greenhouse:stripe:1234567",
  "source": "greenhouse",
  "sourceJobId": "1234567",
  "sourceUrl": "https://boards.greenhouse.io/stripe/jobs/1234567",
  "atsBoard": "stripe",
  "jobTitle": "Senior Python Engineer",
  "department": "Engineering",
  "locationText": "Remote, Europe",
  "locations": ["Remote", "Europe"],
  "remoteType": "remote",
  "employmentType": null,
  "seniority": "senior",
  "roleCategory": "engineering",
  "technologies": ["python", "django", "postgresql", "aws"],
  "descriptionText": "Build high-scale services at Stripe...",
  "descriptionHtml": "<p>Build high-scale services...</p>",
  "publishedAt": "2026-05-15T16:00:00Z",
  "scrapedAt": "2026-05-18T12:00:00Z",
  "firstSeen": "2026-05-01T08:00:00Z",
  "lastSeen": "2026-05-18T12:00:00Z",
  "isNew": false,
  "isMatchedByFilters": true,
  "matchedKeywords": ["python"],
  "dedupeKey": "greenhouse:stripe:1234567"
}
```

***

### Run summary

After each run, check the default **Key-Value Store**:

- `OUTPUT` — counts by source, started/finished timestamps, totals.
- `FAILED_TARGETS` — per-target errors (404 board not found, network, parse).
- `UNSUPPORTED_TARGETS` — preset names that were not found.

***

### Tracking new job postings

The actor keeps its own state in a named Key-Value Store (`JOB_STATE`). On every run:

- A job seen for the first time gets `isNew: true` and `firstSeen` = now.
- A job seen previously keeps its original `firstSeen` and updates `lastSeen`.

Run the actor on a schedule (every day, every hour, …) and filter the dataset by `isNew = true` to get a feed of fresh job postings only. Ideal for a daily "new tech jobs" alert, a Slack digest, or a webhook into your CRM.

***

### Troubleshooting

| Problem | Likely cause |
|---|---|
| `not_found` for a target | The slug does not exist on that ATS, or the company changed ATS provider. |
| No jobs returned | The company has no public openings, or your filters are too narrow. |
| `network_error` repeated | ATS endpoint is rate-limiting. Enable the Apify proxy or reduce concurrency. |
| Missing descriptions | Some ATS responses omit descriptions for some jobs (rare). Enable `includeDescriptions`. |
| Want LinkedIn jobs | Out of scope. Use a dedicated LinkedIn Jobs actor instead. |

***

### FAQ

**What is an ATS jobs scraper?**
An ATS (Applicant Tracking System) jobs scraper pulls job postings directly from the career pages a company hosts on platforms like Greenhouse, Lever, or Ashby. Because the data comes from each company's own public board, it is more accurate and timely than scraping an aggregator like LinkedIn or Indeed.

**Does this scraper work with LinkedIn Jobs or Indeed?**
No. The actor only supports public ATS platforms (Greenhouse, Lever, Ashby) and intentionally avoids aggregators like LinkedIn, Indeed, and Glassdoor for legal and stability reasons.

**Can I scrape job postings from any company?**
Only companies whose public career page is hosted on a supported ATS (Greenhouse, Lever, Ashby). Companies on Workday, SmartRecruiters, or fully custom platforms are on the roadmap.

**How often should I run the scraper?**
Daily is enough for most use cases. For time-sensitive hiring intelligence, hourly works too. Public ATS endpoints rarely rate-limit, but you can enable the Apify proxy if you hit issues. Use the `isNew` field to alert on fresh postings only.

**Does Apify proxy cost extra when scraping Greenhouse, Lever, or Ashby?**
The actor uses public, free ATS endpoints, so most runs do not need a proxy. Apify proxy is optional and only useful if a board starts rate-limiting your IP.

**How is this different from a generic web scraper?**
This actor reads structured ATS endpoints directly instead of parsing HTML, so output is stable, fast, and resilient to career-page redesigns. You also get post-processing out of the box: seniority detection, remote-type detection, role categorization, and a technology tagger.

***

### Roadmap

- **v1.1** — Workable, Recruitee, Personio adapters; CSV preset upload; more preset lists (YC batches, EU fintech, …).
- **v1.2** — Workday and SmartRecruiters adapters; hiring velocity metrics.
- **v2** — Slack / webhook alerts on new jobs; watchlists; scheduled run templates.

# Actor input Schema

## `targets` (type: `array`):

Companies to scrape. Each item is `{ats, slug}` — for example `{"ats": "greenhouse", "slug": "stripe"}` corresponds to https://boards.greenhouse.io/stripe.

## `presetLists` (type: `array`):

Curated, manually verified lists of companies bundled with the actor. Pick any combination — duplicates across presets are merged automatically.

## `keywords` (type: `array`):

Only return jobs whose title, department, location, or description contains at least one of these keywords. Leave empty to return all jobs.

## `excludeKeywords` (type: `array`):

Drop any job matching one of these keywords.

## `locations` (type: `array`):

Only return jobs whose location matches one of these (case-insensitive). Region keywords expand into their countries and cities: `europe` matches Dublin/London/Berlin/…, `americas` matches US cities/Canada/Mexico/…, `apac` matches Tokyo/Singapore/Sydney/Bengaluru/…, `emea` adds Middle East and Africa. Use plain terms like `remote`, `berlin`, or `united states` for literal matches.

## `maxJobsPerTarget` (type: `integer`):

Hard cap on jobs fetched per company. Lower values make runs faster and cheaper; raise it only if you expect a single company to publish more than ~200 matching roles.

## `includeDescriptions` (type: `boolean`):

Return the full job description (HTML and plain text). Disable for smaller, lighter outputs.

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

Optional Apify proxy. Public ATS endpoints usually work without proxy.

## Actor input object example

```json
{
  "targets": [
    {
      "ats": "greenhouse",
      "slug": "stripe"
    },
    {
      "ats": "lever",
      "slug": "mistral"
    },
    {
      "ats": "ashby",
      "slug": "notion"
    }
  ],
  "presetLists": [],
  "keywords": [
    "engineer"
  ],
  "excludeKeywords": [
    "intern"
  ],
  "locations": [
    "remote",
    "europe"
  ],
  "maxJobsPerTarget": 200,
  "includeDescriptions": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

All normalized job postings.

## `summary` (type: `string`):

Aggregate stats by ATS and target.

## `failedTargets` (type: `string`):

Per-target errors (404, network, parse).

# 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 = {
    "targets": [
        {
            "ats": "greenhouse",
            "slug": "stripe"
        },
        {
            "ats": "lever",
            "slug": "mistral"
        },
        {
            "ats": "ashby",
            "slug": "notion"
        }
    ],
    "keywords": [
        "engineer"
    ],
    "excludeKeywords": [
        "intern"
    ],
    "locations": [
        "remote",
        "europe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("i-scraper/ats-jobs-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 = {
    "targets": [
        {
            "ats": "greenhouse",
            "slug": "stripe",
        },
        {
            "ats": "lever",
            "slug": "mistral",
        },
        {
            "ats": "ashby",
            "slug": "notion",
        },
    ],
    "keywords": ["engineer"],
    "excludeKeywords": ["intern"],
    "locations": [
        "remote",
        "europe",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("i-scraper/ats-jobs-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 '{
  "targets": [
    {
      "ats": "greenhouse",
      "slug": "stripe"
    },
    {
      "ats": "lever",
      "slug": "mistral"
    },
    {
      "ats": "ashby",
      "slug": "notion"
    }
  ],
  "keywords": [
    "engineer"
  ],
  "excludeKeywords": [
    "intern"
  ],
  "locations": [
    "remote",
    "europe"
  ]
}' |
apify call i-scraper/ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ATS Jobs Scraper — Greenhouse, Lever & Ashby",
        "description": "Scrape public job postings from company career pages on Greenhouse, Lever, and Ashby. Normalized output with seniority, remote-type, role and technology detection. Tracks new vs. recurring jobs.",
        "version": "0.1",
        "x-build-id": "ikey14ee1hySqaFWx"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/i-scraper~ats-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-i-scraper-ats-jobs-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/i-scraper~ats-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-i-scraper-ats-jobs-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/i-scraper~ats-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-i-scraper-ats-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "targets": {
                        "title": "Targets",
                        "type": "array",
                        "description": "Companies to scrape. Each item is `{ats, slug}` — for example `{\"ats\": \"greenhouse\", \"slug\": \"stripe\"}` corresponds to https://boards.greenhouse.io/stripe."
                    },
                    "presetLists": {
                        "title": "Preset lists",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Curated, manually verified lists of companies bundled with the actor. Pick any combination — duplicates across presets are merged automatically.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "top-tech",
                                "ai-ml",
                                "fintech",
                                "devtools",
                                "eu-startups",
                                "yc-alumni",
                                "crypto-web3",
                                "remote-first"
                            ],
                            "enumTitles": [
                                "Top tech companies (~34)",
                                "AI / ML labs (~27)",
                                "Fintech (~23)",
                                "Developer tools (~29)",
                                "European startups (~20)",
                                "Y Combinator alumni (~26)",
                                "Crypto / Web3 (~11)",
                                "Remote-first companies (~17)"
                            ]
                        },
                        "default": []
                    },
                    "keywords": {
                        "title": "Include keywords",
                        "type": "array",
                        "description": "Only return jobs whose title, department, location, or description contains at least one of these keywords. Leave empty to return all jobs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeKeywords": {
                        "title": "Exclude keywords",
                        "type": "array",
                        "description": "Drop any job matching one of these keywords.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Only return jobs whose location matches one of these (case-insensitive). Region keywords expand into their countries and cities: `europe` matches Dublin/London/Berlin/…, `americas` matches US cities/Canada/Mexico/…, `apac` matches Tokyo/Singapore/Sydney/Bengaluru/…, `emea` adds Middle East and Africa. Use plain terms like `remote`, `berlin`, or `united states` for literal matches.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxJobsPerTarget": {
                        "title": "Max jobs per target",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on jobs fetched per company. Lower values make runs faster and cheaper; raise it only if you expect a single company to publish more than ~200 matching roles.",
                        "default": 200
                    },
                    "includeDescriptions": {
                        "title": "Include descriptions",
                        "type": "boolean",
                        "description": "Return the full job description (HTML and plain text). Disable for smaller, lighter outputs.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify proxy. Public ATS endpoints usually work without proxy.",
                        "default": {
                            "useApifyProxy": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
