# Operações em Lote

## Quando usar

Use operações em lote quando precisar consultar **múltiplos pontos ou endereços** em uma única chamada. Isso reduz latência e simplifica a integração.

## Endpoints disponíveis

| Endpoint | Método | Descrição |
|----------|--------|-----------|
| `/location/batch` | POST | Consulta de localização em lote (presídios, favelas, etc.) |
| `/location/batch/aggregator` | POST | Agregador de múltiplos serviços em lote |
| `/routing/batch/route` | POST | Cálculo de múltiplas rotas |
| `/routing/batch/isochrone` | POST | Cálculo de múltiplas isocronas |

## Formato de entrada (localização)

Envie um JSON onde as **chaves são identificadores únicos** (strings) e os valores são arrays `[latitude, longitude]`:

```json
{
  "ponto_1": [-23.550520, -46.633308],
  "ponto_2": [-22.906847, -43.172897]
}
```

## Formato de saída

A resposta é um dicionário com as **mesmas chaves** enviadas na requisição, mapeando para os objetos de resposta do serviço:

```json
{
  "ponto_1": {
    "prismadata__prison__nome_estabelecimento": "...",
    "prismadata__prison__distancia_borda_m": 1500.0
  },
  "ponto_2": {
    "prismadata__prison__nome_estabelecimento": "...",
    "prismadata__prison__distancia_borda_m": 3200.0
  }
}
```

## Formato de entrada (roteamento)

Para rotas, cada item contém coordenadas de origem e destino:

```json
{
  "rotas": [
    {
      "origem": {"lat": -19.9191, "lng": -43.9378},
      "destino": {"lat": -19.9498, "lng": -43.9477}
    }
  ]
}
```

## Limites

| Serviço | Máx. itens por batch |
|---------|---------------------|
| Localização (`/location/batch`) | 1024 |
| Agregador (`/location/batch/aggregator`) | 1024 |
| Roteamento (`/routing/batch/route`) | 16 |
| Isocronas (`/routing/batch/isochrone`) | 16 |

**Sem falha parcial:** cada ponto é processado independentemente. Todos os pontos retornam resultado — pontos fora de cobertura recebem campos de detalhe `null` (veja seção **Formato de Resposta**).

**Agregador sem serviços habilitados:** se nenhum flag de serviço for informado via query parameter (`slum`, `prison`, `border`, etc.), a resposta contém **objetos vazios** `{}` para cada ponto.

## Cobrança

A cobrança de chamadas batch é feita por **número de itens no lote**. Um batch com 10 pontos equivale a 10 chamadas individuais.

## Exemplos

**Python (httpx):**

```python
import httpx

coordenadas = {
    "ponto_1": [-23.550520, -46.633308],
    "ponto_2": [-22.906847, -43.172897],
}

resp = httpx.post(
    "https://api.prismadata.io/v1/location/batch",
    json=coordenadas,
    headers={"X-Apikey": "ak_xxxxxxxxxxxxxxxx"},
)
resultados = resp.json()

for chave, dados in resultados.items():
    print(f"{chave}: {dados}")
```

**curl:**

```bash
curl -X POST "https://api.prismadata.io/v1/location/batch" \
  -H "X-Apikey: ak_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"ponto_1": [-23.55, -46.63], "ponto_2": [-22.90, -43.17]}'
```

**JavaScript (fetch):**

```javascript
const coordenadas = {
  ponto_1: [-23.550520, -46.633308],
  ponto_2: [-22.906847, -43.172897]
};

const resp = await fetch(
  "https://api.prismadata.io/v1/location/batch",
  {
    method: "POST",
    headers: {
      "X-Apikey": "ak_xxxxxxxxxxxxxxxx",
      "Content-Type": "application/json"
    },
    body: JSON.stringify(coordenadas)
  }
);
const resultados = await resp.json();
Object.entries(resultados).forEach(([chave, dados]) => {
  console.log(`${chave}:`, dados);
});
```

---

- Índice geral: https://prismadata.io/llms.txt
- Documentação Redoc interativa: https://prismadata.io/redoc.html
