# Remote OK Scraper (`crawlerbros/remote-ok-scraper`) Actor

Scrape Remote OK, the leading remote job board. Search remote jobs by keyword, tag (python, design, marketing, ...), region, salary, or fetch by direct URL. Returns position, company, salary range, tags, location, apply URL, full description, and posting date.

- **URL**: https://apify.com/crawlerbros/remote-ok-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 7 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.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

## Remote OK Scraper

Scrape Remote OK — one of the largest remote job boards on the web. Pull live remote job listings filtered by keyword, tag, region, salary range, and recency. Returns clean structured data for every job: position, company, salary range, tags, location, posting date, full text description, and a direct apply URL. Powered by the public Remote OK JSON feed. No login, no proxy, no API key required.

### What this actor does

- **Five modes:**
  - `search` — free-text keyword filter over the latest feed (title, company, description, tags)
  - `byTag` — pull all jobs tagged with a single Remote OK tag (`python`, `design`, `marketing`, ...)
  - `byTags` — pull jobs across multiple tags and merge (jobs matching ANY of the tags)
  - `byUrls` — fetch jobs by direct Remote OK job page URLs
  - `latest` — full latest feed with no keyword/tag filter
- **Curated tag dropdown** — 100+ most popular Remote OK tags pre-populated in a select picker
- **Region filtering** — `worldwide` / `americas` / `europe` / `asia` / `africa` / `oceania` / `usOnly` heuristics from each job's location string + `digital nomad` tag
- **Salary filtering** — `minSalary`, `maxSalary`, and `salaryOnly` (drop jobs without a published range)
- **Recency filtering** — `postedSinceDays` for "last N days"
- **Keyword filter** — extra `containsKeyword` substring over title/company/description/tags
- **HTML descriptions cleaned** — entities decoded, tags stripped, whitespace collapsed
- **Empty fields are omitted** from every record

### Output per job

- `jobId` — Remote OK job ID (e.g. `1131632`)
- `slug` — Remote OK URL slug
- `position` — job title
- `company` — company / employer name
- `location` — raw location text from Remote OK (e.g. `Dallas, TX`, `Worldwide`, `Berlin`)
- `region` — derived region bucket (`worldwide` / `americas` / `europe` / `asia` / `africa` / `oceania`)
- `salaryMin`, `salaryMax`, `salaryCurrency` — published USD salary range (when available)
- `tags` — lowercased, deduplicated, sorted skill / category tags
- `description` — plaintext job description (HTML stripped, capped at 8000 chars)
- `url` — canonical Remote OK job page URL
- `applyUrl` — direct apply URL (when different from canonical URL)
- `companyLogo` — company logo URL (when published)
- `postedAt` — ISO-8601 UTC posting timestamp
- `verified` — `true` if Remote OK has marked the listing verified
- `recordType: "job"`, `scrapedAt` — added by the actor

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byTag` / `byTags` / `byUrls` / `latest` |
| `searchQuery` | string | `engineer` | Free-text query (mode=search) |
| `tag` | enum | `python` | Single Remote OK tag (mode=byTag) — pick from dropdown |
| `tags` | array | – | Multiple Remote OK tags (mode=byTags) — any-of |
| `startUrls` | array | – | Direct Remote OK job URLs (mode=byUrls) |
| `region` | enum | `any` | `any` / `worldwide` / `americas` / `europe` / `asia` / `africa` / `oceania` / `usOnly` |
| `minSalary` | int | – | Drop jobs whose max salary is below this value (USD) |
| `maxSalary` | int | – | Drop jobs whose min salary is above this value (USD) |
| `postedSinceDays` | int | – | Only emit jobs posted in the last N days |
| `salaryOnly` | bool | `false` | Drop jobs that do not publish a salary |
| `containsKeyword` | string | – | Additional substring filter |
| `maxItems` | int | `50` | Hard cap on emitted records (1–1000) |

#### Example: senior remote Python jobs worldwide

```json
{
  "mode": "byTag",
  "tag": "python",
  "region": "worldwide",
  "containsKeyword": "senior",
  "maxItems": 50
}
````

#### Example: latest design jobs over $100k

```json
{
  "mode": "byTag",
  "tag": "design",
  "minSalary": 100000,
  "salaryOnly": true,
  "maxItems": 30
}
```

#### Example: pull a specific job by URL

```json
{
  "mode": "byUrls",
  "startUrls": [
    "https://remoteok.com/remote-jobs/remote-senior-fraud-risk-analyst-braviant-holdings-1131632"
  ]
}
```

#### Example: any of multiple tags

```json
{
  "mode": "byTags",
  "tags": ["data-science", "machine-learning", "ai"],
  "postedSinceDays": 14,
  "maxItems": 100
}
```

### Use cases

- **Job aggregators** — bulk-ingest fresh remote jobs into your search / matching engine
- **Recruiter intelligence** — track who's hiring, in which tech stacks, with what salary ranges
- **Salary benchmarking** — measure compensation ranges for specific roles or stacks
- **Market research** — see which regions are publishing the most remote roles for your niche
- **Talent platforms** — power "trending remote roles" or "highest-paying remote tag" dashboards
- **Personal job hunt** — alert me when a Python role over $150k posts in Europe

### FAQ

**What's Remote OK?**  Remote OK is one of the largest remote job boards. It aggregates fully remote tech, design, marketing, and ops jobs from companies around the world. See [remoteok.com](https://remoteok.com).

**Do I need login or API key?**  No. Remote OK exposes a public JSON feed. The actor uses a polite User-Agent and is rate-limit friendly.

**How many jobs does the feed return?**  About 100 latest jobs at the global level, and varying counts per tag (typically 50–150 depending on the tag's popularity).

**What regions does region filtering support?**  `worldwide`, `americas`, `europe`, `asia`, `africa`, `oceania`, and `usOnly`. Remote OK encodes worldwide jobs via the `digital nomad` tag and the rest are inferred from each job's `location` string.

**Why is the salary range often missing?**  Most Remote OK postings don't publish salary. Roughly 10–15% include a range. Set `salaryOnly: true` if you only want priced postings.

**Can I get more than 100 jobs in a single run?**  Yes — combine `byTags` with multiple tags. The actor fetches each tag's feed and merges them, deduplicated by job ID. You can reach 500+ unique jobs across half a dozen tags.

**Are job descriptions formatted as HTML or plaintext?**  The actor strips HTML tags and decodes entities so the `description` field is clean plaintext. The original HTML is available on the job page if needed.

**What's the difference between `url` and `applyUrl`?**  `url` is the canonical Remote OK page; `applyUrl` is the company's direct apply link when distinct from the Remote OK page.

**How fresh is the data?**  Real-time — Remote OK's feed reflects new postings as they're approved. Set `postedSinceDays: 1` to capture only the most recent.

**Why does `byUrls` mode sometimes return fewer records than I passed in?**  Remote OK has no per-job JSON endpoint. The actor resolves URLs against the live feed; jobs that have aged off the feed (typically after 1–2 weeks) cannot be re-fetched.

### Data Source

This actor scrapes the public Remote OK JSON API (`https://remoteok.com/api`). The endpoint is documented for non-commercial use; please link back to Remote OK if you republish data scraped via this actor.

# Actor input Schema

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

What to fetch.

## `searchQuery` (type: `string`):

Free-text query matched against job title, company name, description, and tags (mode=search). Case-insensitive substring match.

## `tag` (type: `string`):

Single Remote OK tag. Use lowercase, hyphen-separated values (e.g. `python`, `rust`, `nextjs`, `typescript`, `vue3`, `gatsby`, `terraform`, `data-science`, `customer-support`). Any of the 240+ tags from https://remoteok.com/sitemap-tags-1.xml is accepted. Common examples: ai, amazon, android, angular, api, aws, backend, blockchain, ceo, cloud, css, customer-support, data-science, design, designer, developer, devops, django, docker, engineer, engineering, finance, fintech, frontend, full-stack, full-time, gatsby, golang, graphql, growth, html, infosec, ios, java, javascript, junior, kubernetes, laravel, linux, manager, marketing, mobile, mongodb, nextjs, node, nodejs, nosql, php, postgres, product, python, qa, rails, react, redis, ruby, rust, saas, sales, scala, security, senior, seo, serverless, shopify, software, support, swift, technical, terraform, typescript, ui, ux, vue, vue3, web, web3, wordpress.

## `tags` (type: `array`):

List of Remote OK tags. The actor fetches each tag separately and merges results (jobs matching ANY of the tags). Use lowercase, hyphen-separated values like `python`, `data-science`, `customer-support`.

## `startUrls` (type: `array`):

Direct Remote OK job URLs, e.g. `https://remoteok.com/remote-jobs/remote-senior-backend-engineer-acme-12345`.

## `region` (type: `string`):

Filter jobs by region. Remote OK encodes worldwide jobs with a `digital nomad` tag and otherwise hints region via the `location` field. `any` returns all jobs. Note: many Remote OK jobs have empty or US/India locations, so filtering by a specific region (e.g. `europe`) excludes jobs whose location text isn't recognized as that region — including many engineering roles with empty location text. For broader results, combine with `containsKeyword` or leave `region` empty.

## `minSalary` (type: `integer`):

Drop jobs whose published max salary is below this value. Jobs without a published salary are dropped only when this filter is set.

## `maxSalary` (type: `integer`):

Drop jobs whose published min salary is above this value.

## `postedSinceDays` (type: `integer`):

Only emit jobs posted within the last N days. Leave blank for no time filter.

## `salaryOnly` (type: `boolean`):

Drop jobs that do not publish a salary range.

## `containsKeyword` (type: `string`):

Extra substring filter applied to the job title, company name, and description (case-insensitive).

## `maxItems` (type: `integer`):

Hard cap on emitted records. Remote OK's feed returns ~100 latest jobs per tag; combining tags or no filter rarely exceeds 600.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "engineer",
  "tag": "python",
  "tags": [],
  "startUrls": [],
  "region": "any",
  "salaryOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

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

Dataset containing all scraped Remote OK jobs.

# 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 = {
    "mode": "search",
    "searchQuery": "engineer",
    "tag": "python",
    "tags": [],
    "startUrls": [],
    "region": "any",
    "salaryOnly": false,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/remote-ok-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 = {
    "mode": "search",
    "searchQuery": "engineer",
    "tag": "python",
    "tags": [],
    "startUrls": [],
    "region": "any",
    "salaryOnly": False,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/remote-ok-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 '{
  "mode": "search",
  "searchQuery": "engineer",
  "tag": "python",
  "tags": [],
  "startUrls": [],
  "region": "any",
  "salaryOnly": false,
  "maxItems": 50
}' |
apify call crawlerbros/remote-ok-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Remote OK Scraper",
        "description": "Scrape Remote OK, the leading remote job board. Search remote jobs by keyword, tag (python, design, marketing, ...), region, salary, or fetch by direct URL. Returns position, company, salary range, tags, location, apply URL, full description, and posting date.",
        "version": "1.0",
        "x-build-id": "WfP0ly7pVCM8kzRtR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~remote-ok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-remote-ok-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/crawlerbros~remote-ok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-remote-ok-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/crawlerbros~remote-ok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-remote-ok-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": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "byTag",
                            "byTags",
                            "byUrls",
                            "latest"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text query matched against job title, company name, description, and tags (mode=search). Case-insensitive substring match.",
                        "default": "engineer"
                    },
                    "tag": {
                        "title": "Tag (mode=byTag)",
                        "type": "string",
                        "description": "Single Remote OK tag. Use lowercase, hyphen-separated values (e.g. `python`, `rust`, `nextjs`, `typescript`, `vue3`, `gatsby`, `terraform`, `data-science`, `customer-support`). Any of the 240+ tags from https://remoteok.com/sitemap-tags-1.xml is accepted. Common examples: ai, amazon, android, angular, api, aws, backend, blockchain, ceo, cloud, css, customer-support, data-science, design, designer, developer, devops, django, docker, engineer, engineering, finance, fintech, frontend, full-stack, full-time, gatsby, golang, graphql, growth, html, infosec, ios, java, javascript, junior, kubernetes, laravel, linux, manager, marketing, mobile, mongodb, nextjs, node, nodejs, nosql, php, postgres, product, python, qa, rails, react, redis, ruby, rust, saas, sales, scala, security, senior, seo, serverless, shopify, software, support, swift, technical, terraform, typescript, ui, ux, vue, vue3, web, web3, wordpress.",
                        "default": "python"
                    },
                    "tags": {
                        "title": "Tags (mode=byTags)",
                        "type": "array",
                        "description": "List of Remote OK tags. The actor fetches each tag separately and merges results (jobs matching ANY of the tags). Use lowercase, hyphen-separated values like `python`, `data-science`, `customer-support`.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs (mode=byUrls)",
                        "type": "array",
                        "description": "Direct Remote OK job URLs, e.g. `https://remoteok.com/remote-jobs/remote-senior-backend-engineer-acme-12345`.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "region": {
                        "title": "Region",
                        "enum": [
                            "any",
                            "worldwide",
                            "americas",
                            "europe",
                            "asia",
                            "africa",
                            "oceania",
                            "usOnly"
                        ],
                        "type": "string",
                        "description": "Filter jobs by region. Remote OK encodes worldwide jobs with a `digital nomad` tag and otherwise hints region via the `location` field. `any` returns all jobs. Note: many Remote OK jobs have empty or US/India locations, so filtering by a specific region (e.g. `europe`) excludes jobs whose location text isn't recognized as that region — including many engineering roles with empty location text. For broader results, combine with `containsKeyword` or leave `region` empty.",
                        "default": "any"
                    },
                    "minSalary": {
                        "title": "Min salary (USD)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Drop jobs whose published max salary is below this value. Jobs without a published salary are dropped only when this filter is set."
                    },
                    "maxSalary": {
                        "title": "Max salary (USD)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Drop jobs whose published min salary is above this value."
                    },
                    "postedSinceDays": {
                        "title": "Posted within last N days",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Only emit jobs posted within the last N days. Leave blank for no time filter."
                    },
                    "salaryOnly": {
                        "title": "Only jobs with published salary",
                        "type": "boolean",
                        "description": "Drop jobs that do not publish a salary range.",
                        "default": false
                    },
                    "containsKeyword": {
                        "title": "Contains keyword",
                        "type": "string",
                        "description": "Extra substring filter applied to the job title, company name, and description (case-insensitive)."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records. Remote OK's feed returns ~100 latest jobs per tag; combining tags or no filter rarely exceeds 600.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
