> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Rede e edge

> Gerencie domínios customizados, DNS, analytics da edge, erros, logs de requisição, percentis de latência e invalidação de cache para aplicações website.

O módulo `network` só está disponível em aplicações **website**. Refine o tipo com `app.isWebsite()` antes de usá-lo:

```typescript theme={null}
const app = await api.applications.fetch("abc123def456abc123def456");

if (!app.isWebsite()) {
    throw new Error("Esta aplicação não é um site");
}

app.network; // NetworkModule
```

## Domínio customizado

`app.network.setCustomDomain(domain)` define ou remove o domínio customizado vinculado ao site.

```typescript theme={null}
await app.network.setCustomDomain("seusite.com");

// Passe "@" para remover o domínio customizado configurado
await app.network.setCustomDomain("@");
```

<Note>
  Domínios customizados exigem o plano [Senior](https://squarecloud.app/plans) ou superior. Há um limite
  diário por usuário de quantas vezes você pode trocar um domínio customizado.
</Note>

<Warning>
  Anexar um domínio customizado além do limite de load balancer do seu plano (veja
  [Domínios e load balancers de toda a conta](#domínios-e-load-balancers-de-toda-a-conta) abaixo) falha
  com `LOAD_BALANCER_LIMIT_REACHED` (403).
</Warning>

## Registros DNS

Depois de vincular um domínio, configure o DNS no seu registrador. `app.network.dns()` retorna um array de registros DNS a criar.

```typescript theme={null}
const records = await app.network.dns();

for (const record of records) {
    console.log(`${record.type.toUpperCase()} ${record.name} → ${record.value} (${record.status})`);
}
```

Cada registro tem o formato `{ type, name, value, status }`:

* `type` é `"txt"` ou `"cname"`. Os registros TXT cobrem a propriedade do domínio e a validação SSL; o registro CNAME carrega o tráfego e sempre aponta `value` para `cname.squareweb.app`.
* `status` reflete o estado atual de validação, ex.: `"pending"`, `"pending_validation"` ou `"active"`.

## Analytics

`app.network.analytics({ start, end })` retorna analytics agregados da edge. `start` e `end` aceitam strings ISO 8601 ou `Date`. A janela máxima de retenção é de **7 dias**.

```typescript theme={null}
const since = new Date(Date.now() - 24 * 60 * 60 * 1000);

const analytics = await app.network.analytics({
    start: since,
    end: new Date(),
});

if ("visits" in analytics) {
    console.log(analytics.visits.length, "buckets de tempo");
    console.log("Principais países:", analytics.countries.slice(0, 5));
    console.log("Principais paths:", analytics.paths.slice(0, 5));
}
```

<Warning>
  Para janelas vazias (ex.: antes da aplicação ser criada) a API retorna `{}`. Verifique com `"visits" in analytics` antes de ler os dados.
</Warning>

### Filtros de drill-down

Além de `start`/`end`, `analytics()` aceita filtros opcionais. Cada filtro restringe todos os breakdowns da resposta de uma vez, não apenas um deles:

| Filtro        | Notas                                                                        |
| ------------- | ---------------------------------------------------------------------------- |
| `country`     | Código de país com 2 letras, ex.: `"BR"`                                     |
| `ip`          | Correspondência exata de IP                                                  |
| `path`        | Correspondência por prefixo, ex.: `"/api"`                                   |
| `status`      | Código de status HTTP, ex.: `"404"`                                          |
| `os`          | Sistema operacional                                                          |
| `browser`     | Nome do navegador                                                            |
| `protocol`    | Protocolo da requisição                                                      |
| `referer`     | Use `"Direct"` para requisições sem referer                                  |
| `provider`    | Provedor de rede, ex.: `"GOOGLE (15169)"` (ASN) ou `"SQUARE-CLOUD-PLATFORM"` |
| `contentType` | Use `"Unknown"` para tipos de conteúdo não classificados                     |
| `bot`         | Use `"Unverified"` para tráfego normal (não-bot)                             |

```typescript theme={null}
const analytics = await app.network.analytics({
    start: since,
    end: new Date(),
    country: "BR",
    status: "404",
    bot: "Unverified",
});
```

### Breakdowns

Além das séries temporais e dos breakdowns top-N já existentes, a resposta inclui quatro breakdowns calculados sobre toda a janela (sem série temporal): `ips` (IPs originados da própria rede da Square Cloud são mascarados), `status_codes`, `bots` e `content_types`. Cada entrada tem o formato `{ type, visits, requests, bytes }`.

```typescript theme={null}
if ("ips" in analytics) {
    console.log("Principais IPs:",     analytics.ips.slice(0, 5));
    console.log("Códigos de status:",  analytics.status_codes);
    console.log("Tráfego de bots:",    analytics.bots);
    console.log("Tipos de conteúdo:",  analytics.content_types);
}
```

## Monitoramento de erros

`app.network.errors({ start, end, include4xx? })` retorna o breakdown de erros da edge. Por padrão, apenas 5xx são considerados.

```typescript theme={null}
const errors = await app.network.errors({
    start: since,
    end: new Date(),
    include4xx: true, // inclui 4xx junto dos 5xx
});

if ("summary" in errors) {
    console.log(`Total: ${errors.summary.total}`);
    console.log("Por classe:",         errors.summary.by_class);
    console.log("Paths que mais falham:", errors.top_paths.slice(0, 3));
}
```

## Logs de requisição

`app.network.logs({ start, end })` retorna os logs por requisição da edge.

```typescript theme={null}
const logs = await app.network.logs({ start: since, end: new Date() });

for (const log of logs.slice(0, 5)) {
    console.log(
        log.timestamp,
        log.request.method, log.request.path,
        "→",
        log.response.status,
        `(${log.client.country ?? "??"})`,
    );
}
```

<Note>
  Logs por requisição exigem o plano [Pro](https://squarecloud.app/plans) ou superior.
</Note>

## Percentis de latência

`app.network.performance({ start, end })` retorna as latências p50 / p95 / p99 para as camadas edge e origin.

```typescript theme={null}
const perf = await app.network.performance({ start: since, end: new Date() });

if ("summary" in perf) {
    const { p50, p95, p99 } = perf.summary.edge;
    console.log(`Edge p50/p95/p99: ${p50}/${p95}/${p99}ms`);
    console.log("Paths mais lentos:", perf.slowest_paths.slice(0, 3));
}
```

<Note>
  Métricas de performance exigem o plano [Pro](https://squarecloud.app/plans) ou superior.
</Note>

## Limpando o cache da edge

`app.network.purgeCache()` invalida o cache inteiro da edge para os domínios da aplicação.

```typescript theme={null}
await app.network.purgeCache();
```

## Domínios e load balancers de toda a conta

`domains()` e `loadBalancers()` ficam em `api.applications`, não em `app.network` — eles operam sobre todas as aplicações da conta, não apenas um único site.

### Listando todos os domínios

`api.applications.domains()` retorna todos os domínios configurados em todas as aplicações da conta.

```typescript theme={null}
const domains = await api.applications.domains();

for (const domain of domains) {
    console.log(domain.app_id, domain.hostname, domain.type); // "subdomain" | "custom"
}
```

Domínios customizados são listados primeiro; aplicações sem domínio web são omitidas. Os resultados vêm de cache e são limitados a 20 requisições/60s por usuário, o que não conta para os limites de taxa de rede por aplicação descritos acima.

### Load balancers

`api.applications.loadBalancers()` agrupa aplicações que compartilham um domínio customizado.

```typescript theme={null}
const { limit, balancers } = await api.applications.loadBalancers();

for (const balancer of balancers) {
    console.log(balancer.hostname, balancer.apps.map((app) => app.name));
}
```

Um grupo com 2 ou mais apps é um load balancer ativo: o tráfego é balanceado na edge com failover automático quando um dos apps está offline. `limit` é o número máximo de aplicações que podem compartilhar um domínio no plano da conta: 2 (Standard), 5 (Pro), 10 (Enterprise). Limitado a 20 requisições/60s por usuário.
