# Pige Immobilière 🇫🇷 : SeLoger + PAP + Logic-Immo dédupliqués (`tagadanar/french-real-estate-pige`) Actor

Pige immobilière multi-sources en un seul run : SeLoger, PAP et Logic-Immo dédupliqués entre portails, avec filtre particulier, vrais numéros de téléphone, prix au m² et DPE. Le mode veille ne renvoie que les nouvelles annonces et alerte par Slack ou webhook.

- **URL**: https://apify.com/tagadanar/french-real-estate-pige.md
- **Developed by:** [tagada](https://apify.com/tagadanar) (community)
- **Categories:** Real estate, Lead generation, AI
- **Stats:** 2 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 listings

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Pige Immobilière 🇫🇷 : SeLoger + PAP + Logic-Immo dédupliqués

**Every French property listing that matters, from three portals, in one call: de-duplicated, filterable by owner-direct sellers, with phone numbers.** Paste your saved searches from **SeLoger, PAP and Logic-Immo** and this actor scrapes all of them, merges the same property when it's advertised on several sites into a single record, and hands you one clean feed you can drop straight into a CRM, a spreadsheet, or an AI agent.

Built for **pige immobilière (owner-direct prospecting), agency & investor sourcing, and AI agents** (REST API + MCP out of the box).

> **Why one bundle instead of three scrapers?** A property for sale by an owner is often posted on SeLoger *and* PAP *and* Logic-Immo at once. Run three separate scrapers and you get it three times, pay three times, and call the owner off stale duplicates. This actor **de-duplicates across portals** (you're charged **once per unique property**), keeps the **real phone number** whichever portal carried it, and tells you every site it appeared on.

### What you get

- ✅ **Three sources, one schema.** SeLoger, PAP and Logic-Immo listings all come back normalized to the same fields, so you just paste search URLs and the source is detected automatically.
- ✅ **Cross-portal de-duplication**: the same flat listed on several sites collapses into one record (`sources: ["SeLoger","PAP"]`), and you're charged once, not once per portal.
- ✅ **Owner-direct (particulier) filter.** Turn on `onlyPrivateSeller: true` and you keep only FSBO leads across every source; PAP is the pure owner-direct portal, while SeLoger carries both private and agency listings.
- ✅ **Real phone numbers.** SeLoger and Logic-Immo carry the advertiser's actual number right on the listing, and PAP numbers get recovered automatically from each ad's detail page. Whichever source had it, the merged record keeps the best number, normalized to E.164.
- ✅ **Monitor mode with Slack alerts.** The actor remembers what it already reported for each `monitorName`, so scheduled runs return and charge for new listings only, and can push a digest straight to Slack or any webhook.
- ✅ **Rich data**: price, €/m², surface, rooms, DPE energy class, GPS coordinates, photos, a private-vs-agency flag, and publication dates.

### The 5-minute pige radar

1. On each portal (seloger.com, pap.fr, logic-immo.com), build the same search (your city, buy or rent, your budget) and copy each result-page URL.
2. Paste them all into `searchUrls`.
3. Set `onlyPrivateSeller: true`, turn on **`monitorMode`**, paste a **Slack webhook** into `webhookUrl`.
4. Create an Apify **Schedule** (daily).

Every morning your Slack channel gets only the **new** owner-direct listings in your sector, de-duplicated across all four portals, with phone numbers.

### Use cases

- **Pige immobilière**: be first to call the owner on every new FSBO in your area, skip the duplicates and the agency noise.
- **Agency prospecting.** Pull agency listings with names and phone numbers across SeLoger and Logic-Immo.
- **Investor sourcing.** Filter on DPE rating (F or G) and €/m² across all portals, then benchmark against sold prices with our [DVF](https://apify.com/tagadanar/french-real-estate-dvf) and [Deal Score](https://apify.com/tagadanar/french-real-estate-deal-score) actors.
- **AI agents**: plug into Claude or Cursor via MCP with a prompt like *"new owner-direct apartments under €300k around Marseille, de-duplicated, with a phone."*

### Input

```json
{
    "searchUrls": [
        "https://www.pap.fr/annonce/vente-appartements-maisons-marseille-13e-13013-g43690",
        "https://www.seloger.com/list.htm?projects=2&types=1,2&places=[{\"inseeCodes\":[130013]}]",
        "https://www.logic-immo.com/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08FR4491"
    ],
    "onlyPrivateSeller": true,
    "minPrice": 150000,
    "maxPrice": 400000,
    "monitorMode": true,
    "monitorName": "marseille-particuliers",
    "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
````

You don't need all three, just pass whichever portals you use. Each URL is the normal result-page URL you get after running a search on that site.

### Output (one record per unique property)

```json
{
    "sources": ["SeLoger", "PAP"],
    "source": "PAP",
    "ids": { "SeLoger": "210000001", "PAP": "g43690-12345" },
    "urls": {
        "SeLoger": "https://www.seloger.com/annonces/…/210000001.htm",
        "PAP": "https://www.pap.fr/annonce/…"
    },
    "url": "https://www.pap.fr/annonce/…",
    "transactionType": "sale",
    "propertyType": "Maison",
    "title": "Maison 4 pièces 95 m²",
    "price": 305000,
    "currency": "EUR",
    "pricePerM2": 3210,
    "rooms": 4,
    "bedrooms": 3,
    "surface": 95,
    "city": "Marseille",
    "postalCode": "13013",
    "latitude": 43.36,
    "longitude": 5.42,
    "energyClass": "D",
    "gesClass": "D",
    "photos": ["https://…jpg"],
    "seller": "Particulier",
    "isPrivateSeller": true,
    "phone": "+33612345678",
    "phones": ["+33612345678"],
    "hasPhone": true,
    "publishedAt": "2026-06-30T08:12:00Z"
}
```

`sources` lists every portal the property was found on; `ids` and `urls` link back to each. The record keeps the real phone number from whichever source carried it.

### Companion actors

Single-source versions (if you only need one portal), plus the sold-price benchmarks this bundle pairs with:

- [**PAP**](https://apify.com/tagadanar/french-real-estate-pap) · [**SeLoger**](https://apify.com/tagadanar/french-real-estate-seloger) · [**Logic-Immo**](https://apify.com/tagadanar/french-real-estate-logicimmo)
- [**French Real Estate Sales (DVF)**](https://apify.com/tagadanar/french-real-estate-dvf): official **sold** prices.
- [**Real Estate Deal Score**](https://apify.com/tagadanar/french-real-estate-deal-score): asking price compared against DVF sold prices.

### Pricing

Pay per event, no subscription:

| Event | Price | When |
|---|---|---|
| Listing found | **$0.005** ($5 / 1,000) | Per **unique, de-duplicated** listing returned (in monitor mode: **new listings only**) |
| Actor start | $0.00001 (≈ zero) | Once per run |

Apify platform usage (compute + Residential proxy) is billed separately at platform rates. You control total spend with a per-run charge cap.

You're never charged twice for the same property, even when it's posted on several portals.

### FAQ

**How does de-duplication work?** Listings are matched on their physical facts (price, surface, rooms and location), not on the portal's id, so the same flat on SeLoger and PAP collapses into one record. Records with too little data to match safely are kept as-is; they're never wrongly merged.

**Which sources carry phone numbers?** All three of them: SeLoger, PAP and Logic-Immo expose the advertiser's actual number. SeLoger and Logic-Immo carry it on the listing card, while PAP keeps it on the ad's detail page, which the actor **fetches automatically** for every PAP listing still missing a phone (bounded per run; a listing whose detail page can't be read keeps `phone: null`). The merged record keeps the best available, and `hasPhone` is always set.

**How does monitor mode work?** The actor keeps a per-`monitorName` memory of every property it already returned. Scheduled runs output only what's new, so you're never charged twice for the same listing across runs.

**Do I have to use all four portals?** No, pass any subset you like. The actor detects each URL's source and scrapes only what you provide.

**Is it reliable?** SeLoger and Logic-Immo are read through a real browser (DataDome); PAP through residential proxies (Cloudflare). Blocked requests retry with a fresh session. Run on Apify with the **Residential** proxy (the default).

**Does it work with AI agents?** Yes, it's exposed via REST API and **MCP**, callable from Claude, Cursor and other agent tools.

***

*Keywords: pige immobilière, pige immo, PAP, seloger, logic-immo, annonces immobilières, particulier, owner-direct, FSBO France, real estate leads France, prix immobilier, €/m², DPE, lead generation immobilier, prospection, proptech, MCP.*

# Actor input Schema

## `searchUrls` (type: `array`):

Paste one or more search-result URLs from any of the three portals — <b>seloger.com</b>, <b>pap.fr</b>, <b>logic-immo.com</b>. Build the <i>same</i> search (city, buy/rent, budget) on each portal and paste them all: the actor scrapes every source and merges duplicates into one clean feed. The source is detected automatically from each URL.

## `onlyPrivateSeller` (type: `boolean`):

Keep only listings posted by private owners (particuliers) across every source — the core of a pige workflow. Drops agency/builder ads.

## `withPhoneOnly` (type: `boolean`):

Keep only listings that carry a phone signal. SeLoger, PAP and Logic-Immo all ship the actual number (PAP via an automatic detail-page fetch — see README).

## `minPrice` (type: `integer`):

Keep only listings at or above this price.

## `maxPrice` (type: `integer`):

Keep only listings at or below this price.

## `minSurface` (type: `integer`):

Keep only listings with at least this living surface.

## `minRooms` (type: `integer`):

Keep only listings with at least this many rooms (pièces).

## `propertyTypes` (type: `array`):

Keep only these property types. Empty = all types found.

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

Keep only listings whose title, description or city contain at least one of these words (e.g. <code>terrasse</code>, <code>jardin</code>, <code>viager</code>).

## `monitorMode` (type: `boolean`):

Remember what previous runs already reported (per <code>monitorName</code>) and return only <b>new</b> listings. Schedule this daily to get a live pige feed — you're charged for new listings only.

## `monitorName` (type: `string`):

Name for this watch's memory of already-seen listings. Use a distinct name per saved search (e.g. <code>marseille-particuliers</code>).

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

Optional. A Slack incoming-webhook URL (or any endpoint) that receives a digest of the listings found in this run — perfect with monitor mode + a daily schedule.

## `includeEnlargedResults` (type: `boolean`):

For Logic-Immo URLs, also include the broadened-area listings it appends when your zone has few ads.

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

Stop after this many de-duplicated listings across all sources.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.pap.fr/annonce/vente-appartements-maisons-marseille-13e-13013-g43690",
    "https://www.logic-immo.com/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08FR4491"
  ],
  "onlyPrivateSeller": false,
  "withPhoneOnly": false,
  "propertyTypes": [],
  "keywords": [],
  "monitorMode": false,
  "monitorName": "default",
  "includeEnlargedResults": false,
  "maxResults": 50
}
```

# Actor output Schema

## `listings` (type: `string`):

All de-duplicated listings across the four sources (one item per property) in the default dataset.

# 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 = {
    "searchUrls": [
        "https://www.pap.fr/annonce/vente-appartements-maisons-marseille-13e-13013-g43690",
        "https://www.logic-immo.com/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08FR4491"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/french-real-estate-pige").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 = {
    "searchUrls": [
        "https://www.pap.fr/annonce/vente-appartements-maisons-marseille-13e-13013-g43690",
        "https://www.logic-immo.com/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08FR4491",
    ],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/french-real-estate-pige").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 '{
  "searchUrls": [
    "https://www.pap.fr/annonce/vente-appartements-maisons-marseille-13e-13013-g43690",
    "https://www.logic-immo.com/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08FR4491"
  ],
  "maxResults": 50
}' |
apify call tagadanar/french-real-estate-pige --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tagadanar/french-real-estate-pige",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Pige Immobilière 🇫🇷 : SeLoger + PAP + Logic-Immo dédupliqués",
        "description": "Pige immobilière multi-sources en un seul run : SeLoger, PAP et Logic-Immo dédupliqués entre portails, avec filtre particulier, vrais numéros de téléphone, prix au m² et DPE. Le mode veille ne renvoie que les nouvelles annonces et alerte par Slack ou webhook.",
        "version": "0.1",
        "x-build-id": "D6b7hDsiXmLWoe3gY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tagadanar~french-real-estate-pige/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tagadanar-french-real-estate-pige",
                "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/tagadanar~french-real-estate-pige/runs": {
            "post": {
                "operationId": "runs-sync-tagadanar-french-real-estate-pige",
                "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/tagadanar~french-real-estate-pige/run-sync": {
            "post": {
                "operationId": "run-sync-tagadanar-french-real-estate-pige",
                "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": [
                    "searchUrls"
                ],
                "properties": {
                    "searchUrls": {
                        "title": "Search URLs (SeLoger, PAP, Logic-Immo)",
                        "type": "array",
                        "description": "Paste one or more search-result URLs from any of the three portals — <b>seloger.com</b>, <b>pap.fr</b>, <b>logic-immo.com</b>. Build the <i>same</i> search (city, buy/rent, budget) on each portal and paste them all: the actor scrapes every source and merges duplicates into one clean feed. The source is detected automatically from each URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "onlyPrivateSeller": {
                        "title": "Owner-direct only (particuliers)",
                        "type": "boolean",
                        "description": "Keep only listings posted by private owners (particuliers) across every source — the core of a pige workflow. Drops agency/builder ads.",
                        "default": false
                    },
                    "withPhoneOnly": {
                        "title": "Only listings with a phone",
                        "type": "boolean",
                        "description": "Keep only listings that carry a phone signal. SeLoger, PAP and Logic-Immo all ship the actual number (PAP via an automatic detail-page fetch — see README).",
                        "default": false
                    },
                    "minPrice": {
                        "title": "Minimum price (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only listings at or above this price."
                    },
                    "maxPrice": {
                        "title": "Maximum price (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only listings at or below this price."
                    },
                    "minSurface": {
                        "title": "Minimum surface (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only listings with at least this living surface."
                    },
                    "minRooms": {
                        "title": "Minimum rooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only listings with at least this many rooms (pièces)."
                    },
                    "propertyTypes": {
                        "title": "Property types",
                        "type": "array",
                        "description": "Keep only these property types. Empty = all types found.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Appartement",
                                "Maison",
                                "Terrain",
                                "Immeuble",
                                "Local commercial",
                                "Bureau",
                                "Parking / Box"
                            ],
                            "enumTitles": [
                                "Apartment",
                                "House",
                                "Land",
                                "Building",
                                "Commercial",
                                "Office",
                                "Parking / Box"
                            ]
                        },
                        "default": []
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Keep only listings whose title, description or city contain at least one of these words (e.g. <code>terrasse</code>, <code>jardin</code>, <code>viager</code>).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "monitorMode": {
                        "title": "Monitor mode (new listings only)",
                        "type": "boolean",
                        "description": "Remember what previous runs already reported (per <code>monitorName</code>) and return only <b>new</b> listings. Schedule this daily to get a live pige feed — you're charged for new listings only.",
                        "default": false
                    },
                    "monitorName": {
                        "title": "Monitor name",
                        "type": "string",
                        "description": "Name for this watch's memory of already-seen listings. Use a distinct name per saved search (e.g. <code>marseille-particuliers</code>).",
                        "default": "default"
                    },
                    "webhookUrl": {
                        "title": "Slack / webhook URL",
                        "type": "string",
                        "description": "Optional. A Slack incoming-webhook URL (or any endpoint) that receives a digest of the listings found in this run — perfect with monitor mode + a daily schedule."
                    },
                    "includeEnlargedResults": {
                        "title": "Include enlarged-area results (Logic-Immo)",
                        "type": "boolean",
                        "description": "For Logic-Immo URLs, also include the broadened-area listings it appends when your zone has few ads.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max unique listings",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Stop after this many de-duplicated listings across all sources.",
                        "default": 500
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
