> ## 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.

# ネットワークとエッジ

> ウェブサイトアプリケーションのカスタムドメイン、DNS、エッジアナリティクス、エラートラッキング、リクエストログ、レイテンシパーセンタイル、キャッシュの無効化を管理します。

<Note>
  このページのエンドポイントは、**ウェブサイトアプリケーション** — ウェブドメインを持つアプリ — にのみ適用されます。ウェブ以外のアプリケーションに対して呼び出すと失敗します。
</Note>

```go theme={null}
client := rest.NewClient(os.Getenv("SQUARECLOUD_API_KEY"))
defer client.Close()

api := rest.New(client)
```

## カスタムドメイン

`api.SetApplicationCustomDomain(appID, domain)` は、ウェブサイトに紐付けるカスタムドメインを設定します。

```go theme={null}
err := api.SetApplicationCustomDomain("abc123def456abc123def456", "yoursite.com")
if err != nil {
	panic(err)
}
```

## DNS レコード

カスタムドメインを紐付けた後は、レジストラ側で DNS を設定する必要があります。`api.GetApplicationDNS(appID)` は、作成すべきレコードを `[]squarecloud.DNSRecord` として返します。

```go theme={null}
records, err := api.GetApplicationDNS("abc123def456abc123def456")
if err != nil {
	panic(err)
}

for _, record := range records {
	fmt.Printf("%s %s → %s (%s)\n", record.Type, record.Name, record.Value, record.Status)
}
```

| Field    | Type     | Description                                                                                      |
| -------- | -------- | ------------------------------------------------------------------------------------------------ |
| `Type`   | `string` | `"txt"` または `"cname"` — TXT レコードは所有権と SSL の検証を担い、CNAME はトラフィックを運び、常に `cname.squareweb.app` を指します |
| `Name`   | `string` | 作成するレコード名                                                                                        |
| `Value`  | `string` | レコードの値                                                                                           |
| `Status` | `string` | 検証状態: `"pending"`、`"pending_validation"` または `"active"`                                          |

## アナリティクス

`api.GetApplicationAnalytics(appID, start, end)` は、指定した期間の集約されたエッジアナリティクスを `squarecloud.NetworkAnalytics` として返します。期間の指定は必須で、最大保持期間は **7 日間** です。

```go theme={null}
end := time.Now()
start := end.Add(-24 * time.Hour)

analytics, err := api.GetApplicationAnalytics("abc123def456abc123def456", start, end)
if err != nil {
	panic(err)
}

fmt.Println(len(analytics.Visits), "time buckets") // 15分単位の時系列
fmt.Println(analytics.Countries)
fmt.Println(analytics.Paths)
```

レスポンスには 15 分単位の時系列（`Visits`、`Countries`、`Devices`、`OS`、`Browsers`、`Protocols`、`Methods`、`Paths`、`Referers`、`Providers`）と、期間全体のバケット（`IPs`、`StatusCodes`、`Bots`、`ContentTypes`）が含まれます。

<Note>
  アプリケーションの作成前に完全に収まる期間を指定した場合、API は空のオブジェクトを返します — レスポンス内のすべてのスライスが `nil` になります。インデックスアクセスの前に長さを確認してください。
</Note>

### ドリルダウンフィルタ

期間に加えて、このエンドポイントはクエリパラメータとしてオプションのフィルタを受け付けます — `rest.WithQueryParam` で渡してください。各フィルタは、レスポンス内のすべての内訳を一度に絞り込みます:

| Filter         | Notes                                  |
| -------------- | -------------------------------------- |
| `country`      | 2 文字の国コード、例: `"BR"`                    |
| `ip`           | IP の完全一致                               |
| `path`         | 前方一致、例: `"/api"`                       |
| `status`       | HTTP ステータスコード、例: `"404"`               |
| `os`           | オペレーティングシステム                           |
| `browser`      | ブラウザ名                                  |
| `protocol`     | リクエストプロトコル                             |
| `referer`      | リファラのないリクエストには `"Direct"` を使用          |
| `provider`     | ネットワークプロバイダ、例: `"GOOGLE (15169)"`（ASN） |
| `content_type` | 未分類のコンテンツタイプには `"Unknown"` を使用         |
| `bot`          | 通常（非ボット）のトラフィックには `"Unverified"` を使用   |

```go theme={null}
analytics, err := api.GetApplicationAnalytics(
	"abc123def456abc123def456",
	start, end,
	rest.WithQueryParam("country", "BR"),
	rest.WithQueryParam("status", "404"),
	rest.WithQueryParam("bot", "Unverified"),
)
```

## エラートラッキング

`api.GetApplicationNetworkErrors(appID, start, end)` は、エッジのエラー内訳を返します。デフォルトでは 5xx エラーのみが含まれます — 4xx を含めるには `include_4xx=true` を追加してください。

```go theme={null}
errs, err := api.GetApplicationNetworkErrors(
	"abc123def456abc123def456",
	start, end,
	rest.WithQueryParam("include_4xx", "true"),
)
if err != nil {
	panic(err)
}
```

## リクエスト単位のログ

`api.GetApplicationNetworkLogs(appID, start, end)` は、リクエスト単位のエッジログを返します。

```go theme={null}
logs, err := api.GetApplicationNetworkLogs("abc123def456abc123def456", start, end)
if err != nil {
	panic(err)
}
```

<Note>
  リクエスト単位のログには [Pro プラン](https://squarecloud.app/plans) 以上が必要です。
</Note>

## レイテンシパーセンタイル

`api.GetApplicationNetworkPerformance(appID, start, end)` は、エッジレイヤーとオリジンレイヤーの p50 / p95 / p99 レイテンシを返します。

```go theme={null}
perf, err := api.GetApplicationNetworkPerformance("abc123def456abc123def456", start, end)
if err != nil {
	panic(err)
}
```

<Note>
  パフォーマンスメトリクスには [Pro プラン](https://squarecloud.app/plans) 以上が必要です。
</Note>

## エッジキャッシュのパージ

`api.PurgeApplicationCache(appID)` は、アプリケーションのドメインに対するエッジキャッシュ全体を無効化します。

```go theme={null}
err := api.PurgeApplicationCache("abc123def456abc123def456")
if err != nil {
	panic(err)
}
```

## アカウント全体のドメインとロードバランサー

この 2 つのメソッドは、単一のウェブサイトではなく、アカウント内のすべてのアプリケーションを対象に動作します。

### すべてのドメインの一覧取得

`api.GetApplicationDomains()` は、アカウントのすべてのアプリケーションにわたって設定されているすべてのドメインを `[]squarecloud.AppDomain` として返します。カスタムドメインが先に列挙され、ウェブドメインを持たないアプリケーションは含まれません。

```go theme={null}
domains, err := api.GetApplicationDomains()
if err != nil {
	panic(err)
}

for _, domain := range domains {
	fmt.Println(domain.AppID, domain.Hostname, domain.Type) // "subdomain" | "custom"
}
```

### ロードバランサー

`api.GetLoadBalancers()` は、カスタムドメインを共有するアプリケーションをグループ化し、`squarecloud.LoadBalancers` を返します。

```go theme={null}
lb, err := api.GetLoadBalancers()
if err != nil {
	panic(err)
}

fmt.Println("plan limit:", lb.Limit)
for _, balancer := range lb.Balancers {
	fmt.Println(balancer.Hostname, len(balancer.Apps), "apps")
}
```

2 つ以上のアプリを持つグループはアクティブなロードバランサーです: トラフィックはエッジで分散され、いずれかのアプリがオフラインになった場合は自動フェイルオーバーが働きます。`Limit` は、アカウントのプランで 1 つのドメインを共有できるアプリケーションの最大数です: 2（Standard）、5（Pro）、10（Enterprise）。
