Documentação da API
API REST para extração de dados de negócios locais do Google Maps. Base URL:
Base URL
1https://api.local-api.com
Prefixo da API: /api/v1. Todas as respostas em JSON. Desenvolvimento local em http://localhost:8000.
Quick Start
Comece a usar a API em 3 passos:
1. Faça uma busca rápida
Busca rápida
1curl "https://api.local-api.com/api/v1/search?query=Restaurantes+em+Brasilia&limit=5" \
2 -H "X-API-Key: sua-api-key" 2. Crie um job assíncrono para mais resultados
Criar job assíncrono
1curl -X POST "https://api.local-api.com/api/v1/search/jobs" \
2 -H "X-API-Key: sua-api-key" \
3 -H "Content-Type: application/json" \
4 -d '{"query": "Hotéis em São Paulo", "limit": 50, "mode": "complete"}' 3. Consulte o status do job
Consultar status
1curl "https://api.local-api.com/api/v1/jobs/{job_id}" \
2 -H "X-API-Key: sua-api-key" \
3 -H "Prefer: wait=30" Autenticação
Todos os endpoints autenticados requerem o header X-API-Key.
Header de autenticação
1X-API-Key: <sua-api-key> Headers de Rate Limit
Presentes em todas as respostas autenticadas:
| Header | Descrição |
|---|---|
X-Request-ID | UUID único da requisição |
X-RateLimit-Limit | Limite de RPM |
X-RateLimit-Remaining | Requisições restantes |
X-RateLimit-Reset | Timestamp de reset |
X-RateLimit-Daily-Limit | Limite diário |
X-RateLimit-Daily-Remaining | Diárias restantes |
X-Request-Latency-Ms | Latência em ms |
Rate Limiting
Cada plano possui limites de requisições por minuto (RPM) e diárias. Ao exceder qualquer limite, a API retorna status 429 com um dos códigos abaixo:
| Code | Descrição |
|---|---|
RATE_LIMIT_EXCEEDED | RPM excedido |
DAILY_LIMIT_EXCEEDED | Limite diário excedido |
QUEUE_OVERLOADED | Fila sobrecarregada |
CONCURRENT_JOBS_LIMIT_EXCEEDED | Jobs concorrentes no limite |
PLAN_QUOTA_EXCEEDED | Quota do plano atingida |
Códigos de Erro
| Código HTTP | Code | Descrição |
|---|---|---|
| 401 | MISSING_API_KEY | Header X-API-Key ausente |
| 403 | INVALID_API_KEY | API key inválida |
| 403 | TENANT_INACTIVE | Tenant inativo/suspenso |
| 403 | PLAN_REQUIRES_UPGRADE | Plano não permite o modo |
| 429 | (vários) | Ver Rate Limiting |
| 503 | CIRCUIT_BLOCKED | Circuit breaker ativado |
Busca Síncrona
GET
/api/v1/search
Auth
Busca síncrona de negócios no Google Maps. Somente mode=fast. Query Parameters
Param
Tipo
Default
Descrição
query * string(2-200)
—
Termo de busca
limit int(1-100)
20
Máx resultados (max 20 sync)
language string
pt-BR
Idioma dos resultados
mode string
fast
Apenas fast aceito
use_cache bool
true
Usar cache Redis
Response
{
"status": "OK",
"request_id": "550e8400-...",
"query": "Restaurantes em Brasília",
"total_results": 20,
"results": [
{
"place_id": "ChIJN1t_tDeu...",
"name": "Restaurante Exemplo",
"phone_number": "+55 61 3333-4444",
"website": "https://exemplo.com.br",
"full_address": "SQS 308 Bloco A, Brasília - DF",
"rating": 4.5,
"review_count": 230,
"opening_status": "Aberto agora",
"type": "Restaurante",
"subtypes": [
"Restaurante italiano",
"Pizza"
],
"price_level": "$$",
"verified": true,
"latitude": -15.7942,
"longitude": -47.8822
}
],
"cached": false,
"mode": "fast"
} Errors
429 SYNC_MODE_NOT_ALLOWED — mode diferente de fast 400 SYNC_LIMIT_EXCEEDED — limit > 20 500 SEARCH_FAILED — Erro interno POST
/api/v1/search
Auth
Wrapper POST para busca síncrona. Mesmo comportamento do GET. Request Body
{
"query": "Restaurantes em Brasília",
"limit": 20,
"language": "pt-BR",
"mode": "fast"
} Response
Idêntica ao GET /api/v1/search Jobs Assíncronos
POST
/api/v1/search/jobs
Auth
Cria job assíncrono de scraping. Retorna job_id imediatamente. Headers
Idempotency-Key Chave para evitar jobs duplicados Request Body
{
"query": "Hotéis em São Paulo",
"limit": 50,
"language": "pt-BR",
"mode": "complete",
"use_cache": true,
"callback_url": "https://meu-site.com/webhook",
"idempotency_key": "busca-hoteis-sp-2026",
"auto_retry_on_recovery": false
} Response
{
"job_id": "550e8400-...",
"status": "queued",
"estimated_wait_s": 15,
"queued": true
} GET
/api/v1/jobs/{job_id}
Auth
Consulta status do job. Suporta long-polling via header Prefer. Path Parameters
job_id UUID do job Headers
Prefer wait=30 Espera até 30s por mudança de status Response
{
"job_id": "550e8400-...",
"status": "completed",
"progress": 100,
"payload": {
"query": "Hotéis em São Paulo",
"limit": 50,
"mode": "complete"
},
"result": {
"status": "OK",
"total_results": 50,
"results": [
{
"place_id": "ChIJ...",
"name": "Hotel Exemplo"
}
]
},
"error": null,
"attempts": 1,
"created_at": "2026-02-20T10:30:00Z",
"completed_at": "2026-02-20T10:31:00Z",
"cost_cents": 10
} Estados do job
| Status | Descrição |
|---|---|
queued | Aguardando na fila |
running | Em execução |
completed | Finalizado com sucesso |
failed | Falhou após tentativas |
timeout | Expirou |
cancelled | Cancelado |
POST
/api/v1/jobs/{job_id}/retry
Auth
Reenfileira job em estado terminal. Path Parameters
job_id UUID do job Request Body
{
"force": false
} GET
/api/v1/jobs/{job_id}/stream
Auth
Stream SSE para acompanhamento em tempo real. Content-Type: text/event-stream. Path Parameters
job_id UUID do job Eventos SSE
1event: queued
2data: {"job_id":"...","status":"queued","progress":0}
3
4event: running
5data: {"job_id":"...","status":"running","progress":35}
6
7event: completed
8data: {"job_id":"...","status":"completed","progress":100,"result":{...}} Detalhes de Negócio
GET
/api/v1/business/{place_id}
Auth
Detalhes completos de um negócio pelo place_id do Google. Path Parameters
place_id ID do local no Google Maps Query Parameters
Param
Tipo
Default
Descrição
mode string
fast
fast (básico) ou complete (com popular_times, social_media)
use_cache bool
true
Usar cache
Response
{
"place_id": "ChIJN1t_tDeu...",
"name": "Restaurante Exemplo",
"phone_number": "+55 61 3333-4444",
"full_address": "SQS 308 Bloco A, Brasília - DF",
"rating": 4.5,
"review_count": 230,
"working_hours": {
"segunda-feira": [
"11:00–15:00",
"18:00–23:00"
]
},
"popular_times": {
"days": [
{
"day": "Segunda-feira",
"hours": [
{
"hour": 12,
"percentage": 75
}
]
}
],
"live_busyness": 45
},
"social_media": {
"facebook": "https://facebook.com/exemplo",
"instagram": "https://instagram.com/exemplo"
}
} Cache & Webhooks
DELETE
/api/v1/cache
Auth
Limpa cache de resultados. Query Parameters
Param
Tipo
Default
Descrição
pattern string
*
Padrão glob de chaves
Response
{
"cleared": 42,
"pattern": "lbs:*"
} POST
/api/v1/webhooks/test
Auth
Envia callback assinado para validar endpoint. Requer feature webhook_enabled. Request Body
{
"callback_url": "https://meu-site.com/webhook",
"secret": "meu-secret-opcional"
} Response
{
"sent": true,
"callback_url": "https://meu-site.com/webhook"
} SDKs & Exemplos
cURL
1curl "https://api.local-api.com/api/v1/search?query=Restaurantes+em+Brasilia&limit=5" \
2 -H "X-API-Key: sua-api-key" JavaScript (fetch)
1const response = await fetch(
2 "https://api.local-api.com/api/v1/search?query=Restaurantes+em+Brasilia&limit=5",
3 { headers: { "X-API-Key": "sua-api-key" } }
4);
5const data = await response.json();
6console.log(data.results); Python (requests)
1import requests
2
3response = requests.get(
4 "https://api.local-api.com/api/v1/search",
5 params={"query": "Restaurantes em Brasilia", "limit": 5},
6 headers={"X-API-Key": "sua-api-key"}
7)
8data = response.json()
9print(data["results"])