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 o card exato e busca seu valor de mercado atual — comparativos de cards crus 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 anunciado 25%+ abaixo do mercado, os anúncios do Mercari recebem um "like" automático e todo o resto envia uma notificação para o meu celular. Duas estratégias rodam lado a lado: slabs com preço abaixo do mercado, e a mais incomum — slabs com preço abaixo do que o card não graduado vale (arbitragem de "quebrar o slab"; raro, mas existe).

O terminal.
Um painel ao vivo — estética de mesa de negociações escura, ticker rolante, LEDs de status — mostrando cada avaliação, totais de lucro potencial com taxas incluídas, gráficos de preços vendidos dos produtos que estou monitorando (amostrados a cada 60 segundos dos vendidos 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 acompanha meu P/L atual. Teoricamente, eu poderia conectar meu script às minhas contas e fazer com que ele as escaneasse a cada hora; simplesmente ainda não fiz isso. Ienes e euros são convertidos automaticamente. Um botão move um achado "sniped" diretamente para o livro-razão. Funciona pelo meu celular.
A parte que ninguém conta. As funcionalidades levaram uma tarde. O outro dia e meio foi uma briga de faca com a realidade: detecção de bot dos marketplaces que rejeita navegadores automatizados, páginas que renderizam código diferente dependendo se você está logado, cards japoneses escondidos atrás de títulos em inglês, o 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 briga de faca.
As regras que o tornam seguro. Ele nunca compra nada. Ele 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 o card errado. Um humano olha para cada negócio antes de o dinheiro se mover. Construa da mesma forma — a automação encontra, você decide.
Custos: API do PokeGrade para identificação de cards (plano gratuito: 100 avaliações/mês para testar; planos 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 é independentemente útil).
Quero um kit de ferramentas pessoal para revenda de cards no meu computador, construído como um conjunto de serviços de fundo 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 pasta do 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.
Minhas entradas (preencha):
Chave da API PokeGrade: PGAI_KEY_HERE (de
pokegrade.ai/developers — o endpoint /value identifica um card a partir de uma foto e retorna os preços de mercado bruto + graduado; docs em
Conjunto de chaves de produção do 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 negócio: curtir/alertar 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 aceita de 80% e ~12% de taxas de venda)
FASE 1 — Snipador do Mercari (curtir automático)
Um serviço que escaneia pesquisas do Mercari a cada ~10 min, precifica a PRIMEIRA FOTO de cada novo anúncio através do PokeGrade /value, e curte os anúncios que atingem o limite de negócio. Duas estratégias a partir de um array de configuração, um processo de navegador:
raw-crack: pesquisa "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: pesquisa 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 nativo do Playwright — o desafio de pressionar e segurar trava eternamente. Inicie o Chrome REAL instalado: channel:'chrome', headful, perfil persistente, --disable-blink-features=AutomationControlled, ignoreDefaultArgs:['--enable-automation']. Nunca automatize o login: detecte quando está deslogado (visitar /mypage/ redireciona CLIENT-SIDE 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. Pesquisa logada: tiles a[data-testid="ProductThumbWrapper"], preço ProductThumbItemPrice (deslogado: ItemPrice — aceite ambos), curtir do tile ItemLike (dentro da âncora do tile — curta pela página de pesquisa, sem necessidade de abrir anúncios), curtir da página do item LikeComp. ProductThumbItemDiscountedPrice é o preço ORIGINAL riscado — nunca o 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), ordenar do mais recente primeiro, pular tiles VENDIDOS. Cada chamada ao 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 curtidos separadamente dos IDs vistos (uma falha entre a avaliação e a curtida nunca deve causar um clique duplo, que REMOVERIA a curtida). Falhas transitórias (API 5xx, preço ausente) permanecem não vistas e tentam novamente no próximo ciclo.
Pegadinha do launchd: agentes NÃO conseguem ler ~/Desktop (TCC) — o job 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 do eBay + Vinted (somente notificação) **
Mesmas estratégias/limites, mas nenhum deles tem uma API de lista de favoritos, então ofertas disparam uma notificação do macOS (osascript display notification) + linha CSV em vez de curtir/favoritar.
eBay: use a API Browse 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 uma faixa de preço). Atualize URLs de imagem de s-l225 para s-l1600 para OCR. Cerca de 5k chamadas de API/dia com 3 pesquisas a cada 10 min está OK; o consumo do PokeGrade é o orçamento real (cerca de 5k créditos/dia no volume do eBay — limite avaliações por pesquisa, 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 /f###/ da URL para /f800/). Páginas do Vinted QUEBRAM o Chromium sem interface gráfica cerca de 1 em cada 3 carregamentos E podem travar sem lançar erro — envolva cada scrape em um Promise.race de 90s de watchdog 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/chines/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 do Celebrations: o PokeGrade pode identificar erroneamente reimpressões do Celebrations "Classic Collection" como os originais vintage (uma reimpressão de $30 avaliada em $30k). Se o título disser celebrations/classic collection mas o conjunto identificado não, descarte a comparação. 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 comparação, não jackpots).
FASE 3 — Painel (aplicativo web localhost)
Servidor HTTP Node único sem dependências (bind 0.0.0.0 para que telefones na LAN possam abri-lo) servindo um arquivo HTML que consulta um endpoint /data a cada 30s. Estética "terminal de negociação" escuro 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 regressiva. Três abas:
1. Snipador — faixa de estatísticas (lucro potencial após taxas, excluindo suspeitos, negócios, ofertas, precisa-revisão, avaliados), gráfico de atividade de escaneamento 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, alternâncias de estrela/favorito (filtrável), e um botão "comprado" que copia um achado diretamente para o livro-razão.
2. Monitor de mercado — rastreadores de preços vendidos (Fase 4).
3. Livro-razão — Fase 5.
Sirva imagens externas através de um proxy /thumb de mesma origem (lista branca dos CDNs dos marketplaces) — imagens de origem cruzada/linkadas são bloqueadas em alguns clientes. Achados suspeitos: distintivo de aviso + excluídos dos totais.
FASE 4 — Rastreadores de mercado de preços vendidos
Dados de vendas do eBay NÃO estão na API pública. Faça scrape da pesquisa de vendidos (LH_Sold=1, LH_Complete=1, sort mais recente) com Chromium sem interface gráfica (channel:'chromium'), spoof de user-agent do navegador, e uma visita de aquecimento à página inicial primeiro (link direto a frio é bloqueado como bot). Cards: elementos [data-listingid]; vendas reais têm uma linha "DATA DE VENDA" (anúncios patrocinados não têm). A cada minuto, para cada consulta configurada: pegue os 10 preços vendidos mais recentes, acrescente média/mediana/mín/máx a um CSV. O painel mostra gráfico da linha média + faixa mín-máx por rastreador com botões de zoom de janela de tempo +/-. Um script de backfill único percorre até 10 páginas de resultados agrupando pela data de venda impressa para reconstruir cerca de uma semana de histórico diário (idempotente). Faça uma pausa de 10 minutos após 3 extrações vazias consecutivas.
FASE 5 — Livro-razão (compra/venda P/L)
Aba Livro-razão com um campo de entrada COMPRA e um campo de entrada VENDA: cole qualquer URL de anúncio de
japan.us.mercari.com (vitrine 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:
Principal:
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 muitas vezes caem em uma página de erro — pegue o ID do item da URL resolvida e chame a API Browse get_item_by_legacy_id.
Rejeite páginas de desafio de bot ("Aguarde um momento...", "Página de Erro") como erros — nunca as armazene como entradas.
Converta moedas que não sejam 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, selo do marketplace, preço nativo + USD, e um botão de exclusão com confirmação. Preço registrado = preço anunciado (ignore ofertas) — é uma simplificação deliberada.
VERIFICAÇÕES DE ACEITAÇÃO POR FASE
Execute 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 na interface, faça uma captura de tela do painel nos modos claro e escuro; nunca deixe entradas de teste no meu livro-razão ou curtidas de teste na minha conta.
Avisos justos antes de executar: scrapers ficam em uma zona cinzenta com os Termos de Serviço dos marketplaces — mantenha um ritmo suave e espere o captcha ocasional. A identificação de cards por IA erra com frequência suficiente para que comprar automaticamente seria jogar dinheiro fora. E sua realidade de taxas pode ser diferente dos meus 12% — reajuste os limites.
Se você construir um, me mostre o que ele encontra.





