PLP por URL
Informa a URL publica da busca da Magalu e pagina explicitamente.
{
"url": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/",
"target": "magazineluiza.com.br",
"type": "plp",
"page": 2
} // docs
Extrai listagem de produtos (PLP) da Magalu via endpoint mobile nao renderizado, com paginação.
Nota importante: alguns campos podem retornar null em produção,
dependendo da página de origem. Nesta documentação, os exemplos de output são
preenchidos intencionalmente com valores não nulos para facilitar integração.
Quando a entidade consultada não existe na origem, o extract e a tool MCP retornam
200 com data: null e
notFound: true. Esse caso é tratado como resposta concluída,
não como erro de servidor.
curl -X POST https://api.geckoapi.com.br/v1/extract \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/",
"target": "magazineluiza.com.br",
"type": "plp",
"page": 2
}'
A mesma seam também aparece no MCP hospedado como uma tool dedicada.
Os argumentos reaproveitam os campos do extract, mas target e type
já ficam fixos pela tool.
Endpoint
POST /v1/mcp
Tool name
magazineluiza_com_br_plp
Auth
Bearer ou X-API-Key
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "magazineluiza_com_br_plp",
"arguments": {
"url": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/",
"page": 2,
"executionId": "exec_example_123"
}
}
}
Campos suportados nesta API do POST /v1/extract,
com regras específicas de obrigatoriedade e condicionais.
| Campo | Tipo | Status | Regra | Default | Exemplo |
|---|---|---|---|---|---|
| url URL alvo da extração. Para alguns PLPs pode ser omitida quando a API monta a URL a partir de outros campos. | string (URL) | Condicional | Obrigatorio somente quando keyword nao for enviada. | - | https://www.mercadolivre.com.br/p/MLB123456 |
| keyword Palavra-chave para buscas PLP. Em Google Search ela representa a query enviada ao Google; em Booking PLP é obrigatória; em outros PLPs pode substituir a URL. | string | Condicional | Obrigatorio quando url nao for enviada. | - | iphone 15 pro max |
| priceMin Preço mínimo para busca no Zapimoveis PLP. | integer | Opcional | Preco minimo em reais inteiros; convertido internamente para centavos no app API (filters[type=price].values[0]) e na URL publica (filters=price---min:max). | - | 1000 |
| priceMax Preço máximo para busca no Zapimoveis PLP. | integer | Opcional | Preco maximo em reais inteiros; convertido internamente para centavos no app API (filters[type=price].values[1]); quando ausente, a API usa 9000000 centavos. | - | 2000 |
| target Fonte alvo da extração. | enum | Obrigatório | Sempre obrigatorio no payload e deve combinar com o seam. | - | mercadolivre.com.br |
| type Tipo da extração: pdp, idp, plp, quote, review ou places. | enum | Obrigatório | Sempre obrigatorio no payload e deve combinar com o seam. | - | pdp |
| page Paginacao. Em PLP inicia em 1; em review (MercadoLivre, Booking e Hoteis) inicia em 0. | integer | Opcional | Suportado para PLP; deve ser inteiro >= 1. | - | 2 |
Informa a URL publica da busca da Magalu e pagina explicitamente.
{
"url": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/",
"target": "magazineluiza.com.br",
"type": "plp",
"page": 2
} Gateway monta a URL automaticamente a partir da keyword.
{
"keyword": "iphone 15 pro max",
"target": "magazineluiza.com.br",
"type": "plp",
"page": 1
} Busca por keyword com preco minimo e maximo.
{
"keyword": "iphone",
"target": "magazineluiza.com.br",
"type": "plp",
"page": 1,
"priceMin": 400,
"priceMax": 600
} Mapa de paths de saída com tipo esperado para esta API.
{
"requestId": "string (uuid)",
"executionId": "string (uuid)",
"notFound": "boolean (optional; true when the upstream entity was not found and data is null)",
"data.source": "string",
"data.type": "string",
"data.url": "string",
"data.requestUrl": "string",
"data.extractedAt": "string (iso datetime)",
"data.query": "string",
"data.page": "number",
"data.totalPages": "number",
"data.resultsPerPage": "number",
"data.offset": "number",
"data.nextPage": "number",
"data.nextPageUrl": "string",
"data.items[].url": "string",
"data.items[].sku": "string",
"data.items[].name": "string",
"data.items[].brand": "string",
"data.items[].currency": "string",
"data.items[].currencyRaw": "string",
"data.items[].price": "number",
"data.items[].cashPrice": "number",
"data.items[].regularPrice": "number",
"data.items[].aggregateRating.rating": "number",
"data.items[].aggregateRating.reviewCount": "number",
"data.items[].sellerId": "string",
"data.items[].sellerName": "string",
"data.items[].thumbnail": "string"
} {
"requestId": "33333333-1111-4111-8111-333333333333",
"executionId": "33333333-2222-4222-8222-333333333333",
"data": {
"source": "magazineluiza.com.br",
"type": "plp",
"url": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/",
"requestUrl": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/?page=2",
"extractedAt": "2026-04-08T19:45:00.000Z",
"query": "iphone 15 pro max",
"page": 2,
"totalPages": 5,
"resultsPerPage": 10,
"offset": 10,
"nextPage": 3,
"nextPageUrl": "https://www.magazineluiza.com.br/busca/iphone-15-pro-max/?page=3",
"items": [
{
"url": "https://www.magazineluiza.com.br/apple-iphone-15-128gb-azul-61-48mp-ios-5g/p/238034800/te/ip15/?seller_id=magazineluiza",
"sku": "238034800",
"name": "Apple iPhone 15 128GB Azul 6,1\" 48MP iOS 5G",
"brand": "Apple",
"currency": "BRL",
"currencyRaw": "R$",
"price": 4776.67,
"cashPrice": 4299,
"regularPrice": 7299,
"aggregateRating": {
"rating": 4.9,
"reviewCount": 3951
},
"sellerId": "magazineluiza",
"sellerName": "Magalu",
"thumbnail": "https://a-static.mlcdn.com.br/1000x1000/sample.jpg"
}
]
}
} | Path | Tipo | Descrição | Exemplo |
|---|---|---|---|
| data.extractedAt | string (iso datetime) | Campo data.extractedAt retornado no payload de resposta. | 2026-04-08T19:45:00.000Z |
| data.items[].aggregateRating.rating | number | Campo data.items[].aggregateRating.rating retornado no payload de resposta. | 4.9 |
| data.items[].aggregateRating.reviewCount | number | Campo data.items[].aggregateRating.reviewCount retornado no payload de resposta. | 3951 |
| data.items[].brand | string | Campo data.items[].brand retornado no payload de resposta. | Apple |
| data.items[].cashPrice | number | Campo data.items[].cashPrice retornado no payload de resposta. | 4299 |
| data.items[].currency | string | Campo data.items[].currency retornado no payload de resposta. | BRL |
| data.items[].currencyRaw | string | Campo data.items[].currencyRaw retornado no payload de resposta. | R$ |
| data.items[].name | string | Campo data.items[].name retornado no payload de resposta. | Apple iPhone 15 128GB Azul 6,1" 48MP iOS 5G |
| data.items[].price | number | Campo data.items[].price retornado no payload de resposta. | 4776.67 |
| data.items[].regularPrice | number | Campo data.items[].regularPrice retornado no payload de resposta. | 7299 |
| data.items[].sellerId | string | Campo data.items[].sellerId retornado no payload de resposta. | magazineluiza |
| data.items[].sellerName | string | Campo data.items[].sellerName retornado no payload de resposta. | Magalu |
| data.items[].sku | string | Campo data.items[].sku retornado no payload de resposta. | 238034800 |
| data.items[].thumbnail | string | Campo data.items[].thumbnail retornado no payload de resposta. | https://a-static.mlcdn.com.br/1000x1000/sample.jpg |
| data.items[].url | string | Campo data.items[].url retornado no payload de resposta. | https://www.magazineluiza.com.br/apple-iphone-15-128gb-azul-61-48mp-ios-5g/p/238034800/te/ip15/?seller_id=magazineluiza |
| data.nextPage | number | Campo data.nextPage retornado no payload de resposta. | 3 |
| data.nextPageUrl | string | Campo data.nextPageUrl retornado no payload de resposta. | https://www.magazineluiza.com.br/busca/iphone-15-pro-max/?page=3 |
| data.offset | number | Campo data.offset retornado no payload de resposta. | 10 |
| data.page | number | Campo data.page retornado no payload de resposta. | 2 |
| data.query | string | Campo data.query retornado no payload de resposta. | iphone 15 pro max |
| data.requestUrl | string | Campo data.requestUrl retornado no payload de resposta. | https://www.magazineluiza.com.br/busca/iphone-15-pro-max/?page=2 |
| data.resultsPerPage | number | Campo data.resultsPerPage retornado no payload de resposta. | 10 |
| data.source | string | Campo data.source retornado no payload de resposta. | magazineluiza.com.br |
| data.totalPages | number | Campo data.totalPages retornado no payload de resposta. | 5 |
| data.type | string | Campo data.type retornado no payload de resposta. | plp |
| data.url | string | Campo data.url retornado no payload de resposta. | https://www.magazineluiza.com.br/busca/iphone-15-pro-max/ |
| executionId | string (uuid) | ID de execucao para rastreio e deduplicacao. | 33333333-2222-4222-8222-333333333333 |
| notFound | boolean (optional; true when the upstream entity was not found and data is null) | Present and true when the upstream entity was not found. In this case data is null and the request still completes successfully. | N/A |
| requestId | string (uuid) | ID unico da requisicao no gateway. | 33333333-1111-4111-8111-333333333333 |
Respostas com notFound: true não entram nesta tabela,
porque retornam sucesso HTTP 200.
| Status | errorCode | Quando acontece |
|---|---|---|
| 400 | INVALID_PAYLOAD | JSON inválido ou violação das regras de validação do payload. |
| 401 | UNAUTHORIZED | Header Authorization ausente ou token/chave inválida. |
| 402 | INSUFFICIENT_CREDITS | Saldo de créditos insuficiente para a API solicitada. |
| 403 | FORBIDDEN | Usuário sem acesso ou API temporariamente desabilitada. |
| 409 | EXECUTION_CONFLICT | executionId conflita com uma execução em estado incompatível. |
| 429 | RATE_LIMIT_EXCEEDED / TOO_MANY_INFLIGHT_REQUESTS | Limite de taxa ou limite de requisições em voo excedido. |
| 5xx | UPSTREAM_TIMEOUT / UPSTREAM_HTTP_ERROR / WORKER_INVOCATION_FAILED / WORKER_FUNCTION_ERROR / WORKER_INVALID_RESPONSE / INTERNAL_ERROR | Falha de servidor no worker, provider/proxy ou gateway. Nesses casos os créditos são estornados automaticamente. |