Flipping de slabs de Pokémon é fácil. O problema: ofertas no Mercari, eBay e Vinted podem ser pegas em minutos ou simplesmente difíceis de encontrar, e nenhum humano consegue vigiar três marketplaces 24 horas por dia, verificando cada anúncio.
Então, pedi para o Claude Code criar um monitor para mim. Dois dias depois, é isso que roda 24/7 no Mac mini do meu escritório:
A ferramenta.
A cada 5 minutos, ela escaneia novos anúncios no Mercari, eBay e Vinted. A foto de cada novo anúncio passa pela API do PokeGrade, que identifica a carta exata e puxa seu valor de mercado atual — comparativos brutos E graduados. A API do PokeGrade é o que alimenta nosso site nos bastidores. Oferecemos acesso gratuito para desenvolvedores. PokeGrade.ai/developers
Se um slab for listado 25%+ abaixo do mercado, anúncios do Mercari recebem "heart" automaticamente e todo o resto notifica meu celular. Duas estratégias rodam lado a lado: slabs com preço abaixo do mercado, e a mais estranha — slabs com preço abaixo do que a carta não graduada vale (arbitragem de quebrar o slab; raro, mas existe).

O terminal.
Um painel ao vivo — estética de mesa de trading escura, ticker rolante, LEDs de status — mostrando cada avaliação, totais de lucro potencial com taxas embutidas, gráficos de preços vendidos para produtos que estou monitorando (amostrados a cada 60 segundos de vendas no eBay), e um livro-razão: cole qualquer URL de anúncio de cinco marketplaces e um scraper registra a compra ou venda e rastreia meu P/L atual. Teoricamente, eu poderia conectar meu script às minhas contas e fazer ele escaneá-las a cada hora; simplesmente ainda não fiz isso. Ienes e euros convertem automaticamente. Um botão move um achado "sniped" diretamente para o livro-razão. Funciona do meu celular.
A parte que ninguém conta. As funcionalidades levaram uma tarde. O outro dia e meio foi a luta contra a realidade: detecção de bots dos marketplaces que rejeita navegadores automatizados, páginas que renderizam códigos diferentes dependendo se você está logado, cartas japonesas escondidas atrás de títulos em inglês, macOS matando silenciosamente tarefas em segundo plano que estão na pasta errada. Cada uma dessas custou horas para diagnosticar e uma linha para corrigir.
É por isso que estou compartilhando o prompt em vez do código. O prompt carrega tudo isso — cada seletor verificado, cada armadilha, cada proteção — para que sua construção pule a luta.
As regras que tornam isso seguro. Ela nunca compra nada. Ela nunca envia ofertas. "Ofertas" extremas (proporções de 5x+) são sinalizadas como suspeitas em vez de celebradas, porque são quase sempre anúncios duvidosos ou a IA comparando a carta errada. Um humano olha cada oferta antes do dinheiro se mover. Construa da mesma forma — a automação encontra, você decide.
Custos: API PokeGrade para identificação de cartas (nível gratuito: 100 avaliações/mês para testar; níveis pagos se você escanear a sério), conta gratuita de desenvolvedor eBay e um computador que fique ligado. Só isso.
O prompt.
Copie tudo abaixo para o Claude Code, preencha os três placeholders e construa fase por fase (cada fase é útil independentemente).
Quero um kit de ferramentas pessoal para flipping de cartas no meu computador, construído como um conjunto de serviços em segundo plano gerenciados pelo launchd (ou equivalente no Windows) mais um painel web local. Stack: Node.js + Playwright, sem frameworks, sem banco de dados — arquivos CSV/JSON em uma única pasta de projeto. Tudo precisa sobreviver a reinicializações. Vou te enviar 5 fases. Após cada fase ser concluída, por favor me avise que está pronto para a próxima fase. Algumas chaves de API e a Fase 1 é a primeira.
Meus inputs (preencha):
Chave da API PokeGrade: PGAI_KEY_AQUI (de
pokegrade.ai/developers — o endpoint /value identifica uma carta a partir de uma foto e retorna preços de mercado brutos + graduados; docs em
Conjunto de chaves de produção eBay: EBAY_CLIENT_ID / EBAY_CLIENT_SECRET (gratuito em
developer.ebay.com ; solicite a isenção de exclusão de conta para ativar)
Meus limites de oferta: heart/alerta quando o valor de mercado for pelo menos 1,25x o preço pedido; faixa de lista de trabalho de oferta 1,15-1,25x (cerca de 26% de margem líquida após uma oferta de 80% aceita e ~12% de taxas de venda)
FASE 1 — Sniper Mercari (auto-heart)
Um serviço que escaneia buscas no Mercari a cada ~10 min, avalia a PRIMEIRA FOTO de cada novo anúncio através do PokeGrade /value, e dá heart nos anúncios que atingem o limite de oferta. Duas estratégias a partir de um array de configuração, um processo de navegador:
raw-crack: busca "pokemon psa 8", compara o valor BRUTO (não graduado) — encontra slabs que valem a pena quebrar (bruto > preço do slab; raro mas real). graded-under: busca psa 8/9/10, compara o comparativo do próprio grau do slab.
**Fatos críticos de implementação (todos verificados, vão te poupar horas): **
A verificação de bot do Mercari (PerimeterX) rejeita fortemente o Chromium empacotado do Playwright — o desafio de pressionar e segurar entra em loop infinito. Inicie o Chrome REAL instalado: channel:'chrome', headful, perfil de diretório persistente, --disable-blink-features=AutomationControlled, ignoreDefaultArgs:['--enable-automation']. Nunca automatize o login: detecte quando estiver deslogado (visitar /mypage/ redireciona do LADO DO CLIENTE após ~15s para /login/?login_callback=... — monitore a URL, não o DOM) e aguarde até 30 min para o humano fazer login uma vez; a sessão persiste no perfil.
Páginas logadas vs deslogadas usam IDs de teste DIFERENTES. Busca logada: tiles a[data-testid="ProductThumbWrapper"], preço ProductThumbItemPrice (deslogado: ItemPrice — aceite ambos), heart do tile ItemLike (dentro da âncora do tile — heart pela página de busca, sem precisar abrir anúncios), heart da página do item LikeComp. ProductThumbItemDiscountedPrice é o preço ORIGINAL riscado — nunca use; tiles com desconto concatenam ambos os preços em um único nó de texto ("$99.75$105"), então analise apenas o PRIMEIRO token de dinheiro.
A primeira foto do anúncio não precisa de visita à página:
https://u-mercari-images.mercdn.net/photos/ITEMID_1.jpg (fetch simples).
"Novo" = ID do item não avaliado anteriormente (arquivo de estado), ordenação do mais recente primeiro, pule tiles VENDIDOS. Cada chamada PokeGrade = 1 crédito — armazene em cache os resultados por ID do item para sempre e compartilhe o cache entre as estratégias. Rastreie IDs com heart separadamente dos IDs vistos (uma falha entre a avaliação e o heart nunca deve causar um clique duplo, que REMOVERIA o heart). Falhas transitórias (API 5xx, preço faltando) permanecem não vistas e tentam novamente no próximo ciclo.
Pegadinha do launchd: agentes NÃO podem ler ~/Desktop (TCC) — o trabalho morre silenciosamente com exit 78. Mantenha o projeto na pasta home, não no Desktop. RunAtLoad + KeepAlive; caminho absoluto do node no plist.
**FASE 2 — Feeds eBay + Vinted (apenas notificação) **
Mesmas estratégias/limites, mas nenhum tem uma API de lista de observação, então ofertas disparam uma notificação do macOS (osascript display notification) + linha CSV em vez de um heart/favorito.
eBay: use a Browse API oficial (OAuth de credenciais de cliente, item_summary/search, sort=newlyListed, filter buyingOptions FIXED_PRICE + itemLocationCountry US — note que priceCurrency só é válido junto com um intervalo de preço). Atualize URLs de imagem s-l225 para s-l1600 para OCR. Cerca de 5k chamadas de API/dia com 3 buscas a cada 10 min é tranquilo; o consumo do PokeGrade é o orçamento real (cerca de 5k créditos/dia no volume do eBay — limite avaliações por busca, ex. 15).
Vinted: faça scrape do catálogo (sem API, mas também sem barreira de bot). Tiles: a[data-testid="product-item-id-ID--overlay-link"] cujo atributo title contém "nome, marca: X, condição: Y,
$preço "; imagens em [data-testid="...--image"] img (aumente o segmento de URL /f###/ para /f800/). Páginas do Vinted QUEBRAM o Chromium headless cerca de 1 em cada 3 carregamentos E podem travar sem lançar erro — envolva cada scrape em um Promise.race de watchdog de 90s e reinicie o navegador em caso de falha. Registre uma linha de heartbeat a cada ciclo para que um log silencioso signifique "travado", não "quieto".
Proteções de qualidade (todas aprendidas com falsos positivos reais):
Pré-crédito: pule títulos que são lotes/pacotes ou mencionam japonês/chinês/coreano/alemão/francês/etc.
Pós-identificação: rejeite se o conjunto identificado pelo PokeGrade for de um mercado estrangeiro (tokens JP/CS/CN/KR) — vendedores escondem o idioma dos títulos.
Armadilha Celebrations: o PokeGrade pode identificar erroneamente reimpressões da "Classic Collection" do Celebrations como os originais vintage (uma reimpressão de $30 comparada a $30k). Se o título disser celebrations/classic collection mas o conjunto identificado não, descarte o comparativo. Mesmo risco de reimpressão: Base Set 2, XY Evolutions.
Qualquer coisa com proporção de 5x ou mais é sinalizada como "suspeito — precisa de revisão" e excluída dos ganhos principais (proporções extremas são quase sempre incompatibilidades de comparativo, não prêmios).
FASE 3 — Painel (aplicativo web localhost)
Servidor HTTP Node único sem dependências (bind 0.0.0.0 para que celulares na LAN possam abrir) servindo um arquivo HTML que consulta um endpoint /data a cada 30s. Estética "terminal de trading" escura primeiro: numerais monoespaçados, LEDs de status por serviço (mtime do arquivo de log = saúde), ticker rolante de avaliações recentes, animações de contagem. Três abas:
1. Sniper — faixa de estatísticas (lucro potencial após taxas excluindo suspeitos, ofertas, ofertas enviadas, precisa-revisão, avaliados), gráfico de atividade de varredura por hora, gráfico de ganhos acumulados, detalhamento de veredito, placar de estratégia e uma tabela de achados ordenável com miniaturas de anúncios, alternadores de estrela/favorito (filtráveis), e um botão "comprado" que copia um achado diretamente para o livro-razão.
2. Observação de mercado — rastreadores de preço vendido (Fase 4).
3. Livro-razão — Fase 5.
Sirva imagens externas através de um proxy /thumb de mesma origem (lista de permissões dos CDNs dos marketplaces) — imagens de origem cruzada/hotlink são bloqueadas em alguns clientes. Achados suspeitos: distintivo de aviso + excluídos dos totais.
FASE 4 — Rastreadores de mercado de preço vendido
Dados de vendas do eBay NÃO estão na API pública. Faça scrape da busca de vendidos (LH_Sold=1, LH_Complete=1, sort newest) com Chromium headless (channel:'chromium'), spoof de UA do navegador e uma visita de aquecimento à página inicial primeiro (deep-linking a frio é bloqueado por bot). Cartões: elementos [data-listingid]; vendas reais têm uma linha "data VENDA" (anúncios patrocinados não têm). A cada minuto, para cada consulta configurada: pegue os 10 preços vendidos mais recentes, anexe média/mediana/mín/máx a um CSV. O painel gráfica a linha média + faixa mín-máx por rastreador com botões de zoom de janela de tempo +/-. Um script de backfill de uma só vez percorre até 10 páginas de resultado agrupando pela data de venda impressa para reconstruir cerca de uma semana de histórico diário (idempotente). Recue 10 minutos após 3 extrações vazias consecutivas.
FASE 5 — Livro-razão (P/L de compra/venda)
Aba do livro-razão com um input de COMPRA e um input de VENDA: cole qualquer URL de anúncio de
japan.us.mercari.com (loja transfronteiriça),
ebay.com (incluindo
ebay.io links curtos de compartilhamento de aplicativo), ou
vinted.com . Um script de busca determinístico (sem IA) extrai título/preço/moeda/imagem:
Primário:
schema.org JSON-LD do Produto (exato em jp.mercari, ebay, vinted).
japan.us .mercari NÃO tem JSON-LD — preço está em [data-testid="main-price"] (símbolo e número em linhas separadas), já em USD.
ebay.io links curtos só resolvem em um navegador real e geralmente caem em uma página de erro — pegue o ID do item da URL resolvida e chame a Browse API get_item_by_legacy_id.
Rejeite páginas de desafio de bot ("Just a moment...", "Error Page") como erros — nunca as armazene como entradas.
Converta não-USD via
frankfurter.app (BCE, gratuito, cache 12h). Armazene entradas em ledger.json; total corrente = vendido menos comprado, mais um valor após taxas de 12%; linhas mostram miniatura, chip do marketplace, preço nativo + USD e um botão de exclusão com confirmação. Preço registrado = preço listado (ignore ofertas) — isso é uma simplificação deliberada.
VERIFICAÇÕES DE ACEITAÇÃO POR FASE
Rode um ciclo real e me mostre o log; verifique um anúncio real de ponta a ponta através do PokeGrade antes de conectar o loop; após qualquer mudança de UI, faça um screenshot do painel no modo claro e escuro; nunca deixe entradas de teste no meu livro-razão ou hearts de teste na minha conta.
Avisos justos antes de rodar: scrapers ficam em uma zona cinzenta com os ToS dos marketplaces — mantenha a cadência suave e espere o captcha ocasional. A identificação de cartas por IA erra com frequência suficiente para que comprar automaticamente seria jogar dinheiro fora. E sua realidade de taxas pode diferir dos meus 12% — reajuste os limites.
Se você construir um, me mostre o que ele encontra.





