# 📉 Monitor de Preço Mercado Livre — Alerta de Queda e Estoque (`paulovitor18/mercado-livre-monitor-preco`) Actor

O Keepa do Mercado Livre: monitoramento de preços e estoque de uma watchlist — ou de uma busca/categoria — com alerta de queda, alta, esgotou/voltou e nova oferta. Não é um scraper de snapshot: entrega só o DELTA entre execuções, com histórico por produto. Pague por mudança, não por varredura.

- **URL**: https://apify.com/paulovitor18/mercado-livre-monitor-preco.md
- **Developed by:** [MoreLock](https://apify.com/paulovitor18) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/docs.md):

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

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

## Monitor de Preço Mercado Livre — Alerta de Queda e Estoque

O **Keepa do Mercado Livre**. Você monta uma lista de produtos do Mercado Livre Brasil e, a cada execução, recebe **só o que mudou**: caiu o preço, subiu o preço, esgotou, voltou ao estoque, entrou ou saiu de oferta. Nada de raspar o catálogo inteiro de novo toda vez — o monitor guarda o preço anterior de cada produto e te entrega apenas o **delta**. É o rastreador de preço e histórico de disponibilidade que o Mercado Livre não te dá.

> **In English:** Mercado Livre price tracker & stock alert for Brazil — a Keepa-style price monitor that returns only the delta between runs: price drop/rise alerts, out-of-stock/back-in-stock, and new deals. Watch a fixed product list or a whole search/category.

### Visão geral

Você informa uma **watchlist** — a URL de cada produto ou só o código `MLB...` — e agenda a execução. Na primeira vez, o monitor registra o retrato atual de cada produto (o baseline: preço, estoque, oferta). Nas execuções seguintes, ele compara o estado de agora com o da última vez e emite **só as mudanças reais**:

- **alerta_preco** — o preço mudou (com preço anterior, preço atual, variação % e direção: queda ou alta);
- **mudanca_estoque** — esgotou ou voltou ao estoque;
- **nova_oferta / fim_oferta** — o produto entrou ou saiu de promoção/desconto;
- **removido** — o anúncio saiu do ar (pausado, encerrado ou 404).

Se um produto não mudou, ele não aparece — e você não paga por ele. O valor está na diferença, não na varredura.

### Como se compara a um scraper de Mercado Livre

Um scraper de Mercado Livre te devolve um **retrato**: ele raspa a lista/produto inteiro toda vez que roda, e você paga por item raspado, mudando ou não. Este Actor te devolve o **delta**: ele lê os mesmos produtos, mas só te entrega (e só cobra) quando algo de fato mudou. Para acompanhar preço ao longo do tempo, o delta é mais barato e muito mais acionável — você recebe um alerta de "caiu 12%", não um arquivo com 500 preços iguais aos de ontem para você comparar na mão.

É um monitor **brasileiro**: entende a página de produto do Mercado Livre em pt-BR (preço com vírgula decimal, "de/por" riscado, "sem estoque", "anúncio pausado", frete grátis) e lê o dado limpo do JSON-LD da própria página.

### Features

- **Delta entre execuções:** cada run reporta só o que mudou — queda/alta de preço, esgotou/voltou, entrou/saiu de oferta — nunca a lista inteira de novo.
- **Histórico por produto:** o preço e a disponibilidade anteriores ficam guardados; o alerta já vem com o "de → para" e a variação %.
- **Watchlist que evolui:** adicione ou remova produtos quando quiser. Um produto novo vira só um retrato inicial (não cobra alerta); um removido da lista sai do estado. Editar a lista **não reinicia** o monitor.
- **Filtro de ruído:** defina uma variação mínima (%) para só ser avisado de quedas/altas relevantes.
- **Degradação honesta:** se o Mercado Livre estiver bloqueando ou fora do ar, o monitor **preserva o estado** e não cobra nada — um bloqueio nunca é confundido com "o produto sumiu".
- **Agendável:** feito para rodar de hora em hora ou diariamente via Schedules da Apify; a 1ª run é o baseline, as demais são o alerta.

### Dois modos: watchlist e busca

O Actor tem **dois modos**, e você escolhe pelo input:

- **Modo watchlist (padrão):** você lista produtos fixos no campo `produtos` (URLs ou códigos `MLB...`) e o monitor vigia exatamente esses produtos. É o modo descrito acima.
- **Modo busca:** em vez de produtos fixos, você informa uma **busca** no campo `busca` — um termo (ex.: `"echo dot"`, `"notebook gamer"`) ou uma URL de busca/categoria do Mercado Livre (ex.: `"https://lista.mercadolivre.com.br/notebook-gamer"`). O monitor lê os cards do **topo dos resultados** (até o teto `max_produtos`) e faz o delta do **conjunto** entre execuções. Além dos mesmos alertas de preço/estoque/oferta para os produtos que continuam aparecendo, ele reporta:
  - **produto_novo** — um produto que **entrou** no recorte da busca (retrato inicial; não cobra alerta, como o baseline de um item novo);
  - **produto_saiu** — um produto que **saiu** do recorte da busca. Este alerta só é emitido quando o monitor viu o **fim real** da lista de resultados; se a lista foi cortada pelo teto, um produto que "sumiu" pode só ter caído de posição além do teto, então o monitor **preserva o estado** e não emite um "saiu" falso.

Deixe `busca` **vazio** para usar o modo watchlist. Se `busca` estiver preenchido, o modo busca tem prioridade e a watchlist é ignorada naquela execução. O **estado dos dois modos é separado** — você pode ter uma watchlist e uma busca sem que um interfira no outro. O teto `max_produtos` e a `variacao_minima_pct` valem para os dois modos; no modo busca, o teto também define a **janela** monitorada (o top-N da busca) e faz parte da identidade do monitor (mudar o teto reinicia o baseline daquela busca).

> Observação técnica: no modo busca, o preço vem do **card da vitrine** de resultados (o mesmo que o ML mostra na lista), não da página de cada produto. Para catálogos com variações, o card pode mostrar um preço "a partir de" que difere do preço da variação específica na página do produto — o monitor usa o preço do card por ser a referência consistente entre execuções.

### Input example

```json
{
  "produtos": [
    "https://www.mercadolivre.com.br/p/MLB1027172667",
    "MLB2015804529"
  ],
  "variacao_minima_pct": 5,
  "mode": "auto",
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "BR" }
}
````

### Output example

Alerta de **queda de preço** detectado no delta:

```json
{
  "change_type": "alerta_preco",
  "mlb_id": "MLB1027172667",
  "titulo": "Apple iPhone 15 (128 GB) - Azul",
  "url": "https://www.mercadolivre.com.br/p/MLB1027172667",
  "preco_anterior": 4702.00,
  "preco_atual": 4139.10,
  "variacao_pct": -12.0,
  "direcao": "queda",
  "moeda": "BRL",
  "preco_de": 7209.00,
  "desconto_pct": 43,
  "availability": "InStock",
  "virou_oferta": false,
  "obs": "Preço caiu de 4702 para 4139.1 (-12%).",
  "detected_at": "2026-07-19T09:00:00.000Z"
}
```

Na **primeira execução** de uma watchlist, cada produto sai como `change_type: "baseline"` (o retrato inicial). Um produto que **esgotou** sai como `mudanca_estoque` com `esgotou: true`; um que **saiu do ar** sai como `removido`.

### Parâmetros

| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
| `produtos` | array | 1 exemplo | Watchlist: URL do produto ou código `MLB...`. |
| `variacao_minima_pct` | integer | `0` | Só emite alerta de preço quando a variação, na execução, for ≥ este %. `0` = qualquer mudança. Filtro por execução. |
| `max_produtos` | integer | `90` | Teto de produtos renderizados por execução (custo/tempo; cada produto é um render de ~25-30s). Para listas maiores, divida em watchlists/agendamentos separados. |
| `stateStoreName` | string | `""` (padrão) | Avançado. Vazio = estado padrão da conta (a lista pode crescer/encolher). Preencha só para rodar listas independentes em paralelo. |
| `mode` | select | `auto` | `auto` = baseline na 1ª, delta depois. `baseline` = força rebase do estado atual. |
| `proxy` | object | Residencial BR | O Mercado Livre exige IP residencial-BR para carregar a página; é o padrão medido. |

### Tips

- **Agende, não rode à mão.** O valor é a recorrência: configure um Schedule (diário, ou de hora em hora para ofertas-relâmpago). A 1ª execução vira baseline automaticamente; as seguintes só te avisam do que mudou.
- **Use `variacao_minima_pct` para cortar ruído.** Em produtos que oscilam centavos, ponha `5` ou `10` para só ser avisado de quedas que valem a pena.
- **Uma watchlist por objetivo.** Para monitorar duas listas independentes (ex.: sua lista de compras e a de um cliente), dê a cada agendamento um `stateStoreName` próprio — cada nome é um monitor isolado.
- **O baseline é de graça de alerta.** A primeira execução só cobra a execução (não cobra alerta) — é o retrato inicial. O dinheiro entra quando um preço de fato muda.
- **Cole a URL inteira do produto.** Tanto a URL `/p/MLB...` quanto o código `MLB...` funcionam; o monitor normaliza para a página canônica.

### Use cases

- **Alerta de queda de preço (Keepa do ML):** acompanhe os produtos que você quer comprar e seja avisado no minuto em que o preço cai.
- **Rastreador de estoque:** saiba na hora quando um produto esgotado **volta ao estoque** — útil para lançamentos e itens concorridos.
- **Monitoramento de concorrentes (repricing):** vendedor que acompanha os preços de anúncios concorrentes para reprecificar os seus.
- **Caçador de ofertas / afiliados:** monitore uma cesta de produtos e capture as promoções (`nova_oferta`) assim que entram, para repassar ou publicar.
- **Compras / procurement:** acompanhe insumos e equipamentos recorrentes e registre o histórico de preço para negociar melhor.
- **Higiene de catálogo:** o `removido` aponta anúncios que saíram do ar — útil para manter uma lista de referência limpa.

### FAQ

**O que exatamente muda entre a 1ª execução e as seguintes?** A 1ª execução de uma watchlist é o **baseline**: registra o preço/estoque atual de cada produto e cobra só a execução. Da 2ª em diante, o monitor compara com o estado anterior e entrega o **delta** — só os produtos cujo preço, estoque ou oferta mudou.

**Como o monitor guarda o histórico?** Num armazenamento nomeado que persiste entre execuções. Ele guarda o último preço/estoque/oferta de cada produto — é contra isso que a próxima execução compara. Editar a watchlist (adicionar/remover produtos) não apaga o histórico dos demais.

**Vender uma unidade conta como mudança?** Não. A quantidade vendida é ruído: o monitor só considera "mudança" o preço, a disponibilidade e a oferta. Vender não dispara alerta (nem cobrança).

**Um produto ficou sem estoque — o preço fica null?** Sim, e o Actor é honesto quanto a isso: um produto pausado/esgotado sai com `availability: "OutOfStock"` e `preco_atual: null` (evento `mudanca_estoque`, não um falso "preço zerou").

**Se o Mercado Livre bloquear a execução, o monitor apaga tudo?** Não. Uma execução bloqueada **preserva o estado** e não cobra — emite um registro `STATUS: INDISPONIVEL`. Um bloqueio jamais é lido como "o produto sumiu" (o pecado capital de um monitor). Um produto individual que não carregou também é preservado, não é marcado como removido.

**O que conta como `removido`?** Só quando o Mercado Livre responde que o anúncio não existe mais (404) para um produto que estava no seu monitor — anúncio pausado, encerrado ou catálogo removido. Um produto novo com URL errada sai como `nao_encontrado` (informativo, sem cobrança).

**Por que preciso de proxy residencial do Brasil?** A página de produto do Mercado Livre só hidrata (mostra o preço) para um IP residencial brasileiro; datacenter é bloqueado. É o padrão do Actor e o que foi medido funcionando.

**Dá para monitorar uma busca/categoria inteira, não uma lista?** Sim — use o **modo busca** (campo `busca`): informe um termo ou URL de busca/categoria e o monitor vigia o **top-N** dos resultados (até o teto `max_produtos`), avisando quando um produto entra (`produto_novo`), sai (`produto_saiu`) ou muda de preço/estoque/oferta. Cada produto do recorte conta como um `produto_verificado`. Para vigiar produtos específicos, use a **watchlist**; para vigiar um mercado/categoria, use a **busca**. (Veja "Dois modos: watchlist e busca" acima.)

### Pricing

Pague por resultado (PPE) — você paga a execução e a mudança, não a varredura:

| Evento | Preço | Quando é cobrado |
|---|---|---|
| `monitor_run` | **$0.02** | Uma vez por execução válida (renderiza os produtos e apura o delta). Execução com a fonte totalmente bloqueada/fora do ar **não cobra**. |
| `produto_verificado` | **$0.02** | Cada produto efetivamente lido na execução (preço, estoque e oferta capturados) — no **modo watchlist**, cada produto da sua lista; no **modo busca**, cada produto orgânico do recorte da busca (patrocinados e o excedente do teto **não cobram**). Produto bloqueado, inexistente (404) ou com URL inválida **não cobra**. |
| `alerta` | **$0.05** | Cada mudança real emitida: queda/alta de preço, esgotou/voltou ao estoque, entrou/saiu de oferta, produto removido, ou (no modo busca) produto que **saiu** do recorte. Produto que não mudou **não cobra**; a 1ª execução (baseline), um produto novo na lista e um `produto_novo` na busca **não cobram alerta**. |

**Exemplo:** uma watchlist de 20 produtos checada 1×/dia sem mudanças = `$0.02` + 20×`$0.02` = **$0.42/dia**. Num dia em que 3 caem de preço, soma 3×`$0.05` = **$0.57**. No modo busca é a mesma conta pelo nº de produtos do recorte (o teto `max_produtos` limita o custo). Você paga pelo que acompanha e pelo sinal — nunca por varrer o catálogo inteiro.

**Você NÃO paga por:** o baseline (só execução + produtos lidos), produtos que não mudaram, execução totalmente bloqueada/fora do ar, produto que não deu para ler (preservado, não cobra o `produto_verificado`), erro nosso, ou entrada inválida.

### Actors relacionados

- **[Monitor de Precios Mercado Libre — LatAm](https://apify.com/paulovitor18/mercado-libre-monitor-precios)** — o mesmo monitor para o Mercado Libre de AR/MX/CL/CO/UY/PE, em espanhol e com a moeda de cada país.
- **[Reclame Aqui Scraper](https://apify.com/paulovitor18/reclameaqui-scraper)** — a reputação da empresa por trás do anúncio: útil antes de comprar de um concorrente ou fechar com um fornecedor novo.
- **[Consulta CNPJ em Lote](https://apify.com/paulovitor18/cnpj-bulk-lookup)** — dados cadastrais da Receita Federal em lote, para validar o CNPJ de vendedores e fornecedores.
- **[Google Maps Brasil — Monitor de Novos Negócios](https://apify.com/paulovitor18/gmaps-brasil-monitor)** — o mesmo motor de delta em outra fonte: avisa só quando um negócio novo entra no mapa.

### Changelog

- 0.1: primeira versão — monitor de preço/estoque/oferta de uma watchlist de produtos do Mercado Livre Brasil, com delta entre execuções (queda/alta de preço, esgotou/voltou, nova/fim de oferta, removido), histórico por produto, estado estável a edições da lista e degradação honesta.

### Contato

Dúvidas, problemas ou pedidos: use a aba Issues do Actor.

# Actor input Schema

## `produtos` (type: `array`):

Lista de produtos do Mercado Livre Brasil a monitorar. Cole a URL do produto (ex.: "https://www.mercadolivre.com.br/p/MLB1027172667") ou só o código "MLB...". A cada execução o monitor lê preço, estoque e oferta de cada um e reporta só o que MUDOU desde a execução anterior.

## `busca` (type: `string`):

MODO BUSCA (alternativa à watchlist acima). Em vez de vigiar produtos fixos, vigie o FEED DE RESULTADOS de uma busca do Mercado Livre. Informe um TERMO (ex.: "echo dot", "notebook gamer") OU uma URL de busca/categoria (ex.: "https://lista.mercadolivre.com.br/notebook-gamer"). O monitor lê os cards do topo dos resultados (até o teto abaixo) e reporta só o que MUDOU: produtos que entraram (produto\_novo), saíram (produto\_saiu), ou tiveram queda/alta de preço, mudança de estoque ou de oferta. Deixe VAZIO para usar o modo watchlist normal. Se preenchido, o modo busca tem prioridade e a watchlist é ignorada nesta execução (o estado dos dois modos é separado). O teto "Produtos por execução" e a "Variação mínima" abaixo também valem aqui.

## `variacao_minima_pct` (type: `integer`):

Filtro de ruído: só emite alerta\_preco quando a variação de preço, NAQUELA execução, for de pelo menos este percentual (em módulo). 0 = alerta qualquer mudança de preço. Ex.: 5 = só avisa quedas/altas de 5% ou mais. É um filtro por execução (não acumula variações pequenas entre runs).

## `max_produtos` (type: `integer`):

Limite de segurança de quantos produtos da watchlist são renderizados por execução (controle de custo/tempo — cada produto é um render headless de ~25-30s, sequencial). O excedente é ignorado nesta execução (sinalizado no log). Mantido baixo para caber na janela de execução; para listas maiores, divida em watchlists/agendamentos separados (stateStoreName próprio por lista).

## `stateStoreName` (type: `string`):

Onde o histórico de preços da sua watchlist persiste entre execuções. Deixe VAZIO para usar o estado padrão desta conta — sua lista pode crescer/encolher à vontade (item novo vira retrato inicial, item removido sai do estado; não reinicia o monitor). Preencha com um nome próprio SÓ se quiser rodar LISTAS INDEPENDENTES em paralelo (uma por agendamento): cada nome é um monitor isolado.

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

auto = a 1ª execução vira o retrato inicial (baseline) e as seguintes reportam o delta. baseline = força um novo retrato inicial (rebase do estado atual, sem cobrar alerta) — use para zerar o histórico da watchlist.

## `proxy` (type: `object`):

Roteamento de rede. O padrão (Apify Proxy residencial, país Brasil) é o medido devolvendo a página de produto sem bloqueio. O Mercado Livre exige IP residencial-BR para hidratar a página; não desligue o proxy a menos que saiba o que está fazendo.

## `self_test` (type: `boolean`):

Não use em produção. Ignora a watchlist e roda a bateria de known-answers do motor de parse (produto InStock, produto sem estoque, input inválido, produto inexistente) + a prova de delta, para provar que o parser e a semântica de mudança continuam corretos.

## Actor input object example

```json
{
  "produtos": [
    "https://www.mercadolivre.com.br/p/MLB1027172667"
  ],
  "busca": "echo dot",
  "variacao_minima_pct": 0,
  "max_produtos": 90,
  "stateStoreName": "",
  "mode": "auto",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  },
  "self_test": false
}
```

# Actor output Schema

## `delta` (type: `string`):

Registros apurados nesta execução (baseline na 1ª; alertas de preço/estoque/oferta nas seguintes), no formato descrito em dataset\_schema.json.

## `resumo` (type: `string`):

Contadores da execução: modo (baseline/delta), alertas por tipo, produtos vigiados e a cobrança prevista/efetivada.

# 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 = {
    "produtos": [
        "https://www.mercadolivre.com.br/p/MLB1027172667"
    ],
    "busca": "echo dot",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("paulovitor18/mercado-livre-monitor-preco").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 = {
    "produtos": ["https://www.mercadolivre.com.br/p/MLB1027172667"],
    "busca": "echo dot",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("paulovitor18/mercado-livre-monitor-preco").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 '{
  "produtos": [
    "https://www.mercadolivre.com.br/p/MLB1027172667"
  ],
  "busca": "echo dot",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call paulovitor18/mercado-livre-monitor-preco --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=paulovitor18/mercado-livre-monitor-preco",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "📉 Monitor de Preço Mercado Livre — Alerta de Queda e Estoque",
        "description": "O Keepa do Mercado Livre: monitoramento de preços e estoque de uma watchlist — ou de uma busca/categoria — com alerta de queda, alta, esgotou/voltou e nova oferta. Não é um scraper de snapshot: entrega só o DELTA entre execuções, com histórico por produto. Pague por mudança, não por varredura.",
        "version": "0.2",
        "x-build-id": "T6ItCQGWRiOXcMpis"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/paulovitor18~mercado-livre-monitor-preco/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-paulovitor18-mercado-livre-monitor-preco",
                "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/paulovitor18~mercado-livre-monitor-preco/runs": {
            "post": {
                "operationId": "runs-sync-paulovitor18-mercado-livre-monitor-preco",
                "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/paulovitor18~mercado-livre-monitor-preco/run-sync": {
            "post": {
                "operationId": "run-sync-paulovitor18-mercado-livre-monitor-preco",
                "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": {
                    "produtos": {
                        "title": "Produtos a vigiar (watchlist)",
                        "type": "array",
                        "description": "Lista de produtos do Mercado Livre Brasil a monitorar. Cole a URL do produto (ex.: \"https://www.mercadolivre.com.br/p/MLB1027172667\") ou só o código \"MLB...\". A cada execução o monitor lê preço, estoque e oferta de cada um e reporta só o que MUDOU desde a execução anterior.",
                        "default": [
                            "https://www.mercadolivre.com.br/p/MLB1027172667"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "busca": {
                        "title": "Busca a monitorar (modo busca — alternativa à watchlist)",
                        "type": "string",
                        "description": "MODO BUSCA (alternativa à watchlist acima). Em vez de vigiar produtos fixos, vigie o FEED DE RESULTADOS de uma busca do Mercado Livre. Informe um TERMO (ex.: \"echo dot\", \"notebook gamer\") OU uma URL de busca/categoria (ex.: \"https://lista.mercadolivre.com.br/notebook-gamer\"). O monitor lê os cards do topo dos resultados (até o teto abaixo) e reporta só o que MUDOU: produtos que entraram (produto_novo), saíram (produto_saiu), ou tiveram queda/alta de preço, mudança de estoque ou de oferta. Deixe VAZIO para usar o modo watchlist normal. Se preenchido, o modo busca tem prioridade e a watchlist é ignorada nesta execução (o estado dos dois modos é separado). O teto \"Produtos por execução\" e a \"Variação mínima\" abaixo também valem aqui.",
                        "default": ""
                    },
                    "variacao_minima_pct": {
                        "title": "Variação mínima de preço para alertar (%)",
                        "minimum": 0,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Filtro de ruído: só emite alerta_preco quando a variação de preço, NAQUELA execução, for de pelo menos este percentual (em módulo). 0 = alerta qualquer mudança de preço. Ex.: 5 = só avisa quedas/altas de 5% ou mais. É um filtro por execução (não acumula variações pequenas entre runs).",
                        "default": 0
                    },
                    "max_produtos": {
                        "title": "Teto de produtos por execução",
                        "minimum": 1,
                        "maximum": 150,
                        "type": "integer",
                        "description": "Limite de segurança de quantos produtos da watchlist são renderizados por execução (controle de custo/tempo — cada produto é um render headless de ~25-30s, sequencial). O excedente é ignorado nesta execução (sinalizado no log). Mantido baixo para caber na janela de execução; para listas maiores, divida em watchlists/agendamentos separados (stateStoreName próprio por lista).",
                        "default": 90
                    },
                    "stateStoreName": {
                        "title": "Nome do armazenamento de estado (avançado)",
                        "type": "string",
                        "description": "Onde o histórico de preços da sua watchlist persiste entre execuções. Deixe VAZIO para usar o estado padrão desta conta — sua lista pode crescer/encolher à vontade (item novo vira retrato inicial, item removido sai do estado; não reinicia o monitor). Preencha com um nome próprio SÓ se quiser rodar LISTAS INDEPENDENTES em paralelo (uma por agendamento): cada nome é um monitor isolado.",
                        "default": ""
                    },
                    "mode": {
                        "title": "Modo",
                        "enum": [
                            "auto",
                            "baseline"
                        ],
                        "type": "string",
                        "description": "auto = a 1ª execução vira o retrato inicial (baseline) e as seguintes reportam o delta. baseline = força um novo retrato inicial (rebase do estado atual, sem cobrar alerta) — use para zerar o histórico da watchlist.",
                        "default": "auto"
                    },
                    "proxy": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Roteamento de rede. O padrão (Apify Proxy residencial, país Brasil) é o medido devolvendo a página de produto sem bloqueio. O Mercado Livre exige IP residencial-BR para hidratar a página; não desligue o proxy a menos que saiba o que está fazendo.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "BR"
                        }
                    },
                    "self_test": {
                        "title": "Modo diagnóstico (regressão do fixture-pack)",
                        "type": "boolean",
                        "description": "Não use em produção. Ignora a watchlist e roda a bateria de known-answers do motor de parse (produto InStock, produto sem estoque, input inválido, produto inexistente) + a prova de delta, para provar que o parser e a semântica de mudança continuam corretos.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
