# 独自ドメインとフォームの許可ドメイン

> お店のドメイン（www.example.jp）で公開するための DNS の設定（CNAME と TXT）、www の無い形の扱い、状態とエラーの意味。フォームを受け付けるドメイン（許可ドメイン）の登録と、403 origin_not_allowed の直し方。AI エージェント向けの手順つき。

URL: https://siteon.dev/ja/docs/domains

Siteon は、AI で作ったサイトのためのインフラです。AI や手で作った静的サイト（HTML）に、ホスティング・お客さん（お店の人）が直せる CMS・お問い合わせフォーム・アクセス解析・AI エージェントからの操作（CLI・MCP）を足し、そのまま納品できる状態にします。

このページには 2 つのことが書いてあります。

| やりたいこと | 読む節 |
|---|---|
| Siteon のホスティングで公開しているサイトを、お店のドメイン（`www.example.jp`）で見せたい | [独自ドメイン](#custom-domain) |
| フォームを送ると `403`・`origin_not_allowed` になる。フォームを置くサイトのドメインを登録したい | [フォームの許可ドメイン](#allowed-origins) |

Siteon のホスティングで独自ドメインが有効になると、そのドメインは許可ドメインにも自動で入ります。ほかのホスティング（Cloudflare Pages・Vercel など）にフォームだけを置く場合は、許可ドメインだけを設定します。

## 独自ドメイン （近日）

> 独自ドメインの受け付けは準備中です （近日）。この節は、受け付けを始めたときの手順です。それまでは `https://<名前>.siteun.com/` で公開できます。

お店のドメインで公開するときは、**`www.example.jp` を本体（主ドメイン）にし、`example.jp`（www の無い形）は `www` へ転送**します。

### 前提

- そのサイトが **有料プラン** であること。使える数は Lite 1・Standard 3・Business 10 です。`www.example.jp` と `example.jp` の組で 1 つと数えます。Free では使えません（`plan_required`）
- そのサイトで **ホスティングを有効** にしていること（`siteon hosting enable`。[ホスティングと配信](https://siteon.dev/ja/docs/hosting)）
- 管理画面で操作できるのは、そのサイトのオーナーです。API キー（CLI・MCP）では権限 `domains:write` が要ります。この権限は既定では付かないので、鍵の発行のときに明示して選びます（`siteon login --scopes +domains:write`）
- ドメインの DNS を自分で編集できること。ドメインを買った会社（レジストラ）と、DNS を編集する場所が違うことがあります。**ネームサーバーが向いている先** で編集します
- 申請はアカウント全体で 1 日 5 件までです（日本時間の日付で数えます）

### 手順

1. 管理画面のサイドバーの「公開」を開き、「独自ドメイン」の欄に `www.example.jp` を入れて「追加」を押します（CLI では `siteon domains add www.example.jp --site <サイトID>`）
2. 画面に出る **2 つのレコード**（`TXT` と `CNAME`）を、ドメインの DNS に追加します（[入れるレコード](#dns-records)）
3. 待ちます。Siteon が 5 分ごとに DNS と証明書を自動で確かめ、そろえば状態が「有効」になり、そのドメインで表示されます。管理画面の「公開」を開き直すと、その場でもう一度確かめます（CLI では `siteon domains status`）
4. `example.jp`（www の無い形）を `www.example.jp` に転送します（[www の無い形](#apex)）

申請から 72 時間たっても確かめられないと、その申請は取り消されます（状態が「失敗」になります）。その場合はもう一度追加します。

### 入れるレコード

`www.example.jp` を申請したときに入れるのは次の 2 つです。値は申請ごとに変わるので、**必ず画面（または CLI・API の応答）に出たものをそのまま** 写します。

| 種類 | 名前（ホスト名） | 値 |
|---|---|---|
| `TXT` | `_sitekit-verify.www.example.jp` | `sitekit-verify=` で始まる、画面に出た値 |
| `CNAME` | `www.example.jp` | `cname.siteun.com` |

- **TXT は所有の確認です。** 申請のたびに必要で、値は申請ごとに変わります。有効になった後も **消さないでください**。Siteon は有効になった後も 5 分ごとに確かめていて、TXT が無くなると、そのドメインでの表示がすぐに止まります（許可ドメインからも外れます）
- **CNAME は配信先です。** `www.example.jp` に今あるレコード（`A`・`AAAA`・別の `CNAME`）は、CNAME と同時には置けません。消してから CNAME を入れます。CNAME を切り替えた時点で前のサイトは見えなくなり、証明書が発行されるまでの数分ほどは `https://` で開けないことがあります。**先に TXT を入れ、アクセスの少ない時間に CNAME を切り替える** と、止まる時間を短くできます
- DNS の画面の多くは、名前の欄の後ろにドメイン名（`.example.jp`）を自動で付けます。その場合は `www` と `_sitekit-verify.www` だけを入れます。`www.example.jp` と入れると `www.example.jp.example.jp` になってしまいます
- メール（`MX`）など、`www` 以外のレコードには触りません
- 日本語のドメインは、`xn--` で始まる形（Punycode）で申請し、DNS にもその形で入れます

入れた後は、次のコマンドで DNS に出ているかを確かめられます。

```sh
dig +short CNAME www.example.jp                   # cname.siteun.com. と出れば OK
dig +short TXT _sitekit-verify.www.example.jp     # 画面と同じ値が出れば OK
```

#### DNS の入れ方の例

画面の名前やメニューの位置は、各社の変更で変わることがあります。どの会社でも、**DNS レコードの設定画面で「種類 CNAME・ホスト名 `www`・値 `cname.siteun.com`」と「種類 TXT・ホスト名 `_sitekit-verify.www`・値 画面に出た値」の 2 行を足す** ことに変わりはありません。

- **Cloudflare** — ドメインの「DNS」→「Records」で「Add record」。CNAME は Name `www`・Target `cname.siteun.com`、**Proxy status は「DNS only」（灰色の雲）にします**。TXT は Name `_sitekit-verify.www`・Content に画面の値
- **お名前.com** — お名前.com Navi の DNS 関連機能（「DNS 設定」・「DNS レコード設定」）で、ホスト名 `www`・TYPE `CNAME`・VALUE `cname.siteun.com` と、ホスト名 `_sitekit-verify.www`・TYPE `TXT`・VALUE 画面の値を追加します。ネームサーバーがお名前.com のものになっているときに使える画面です
- **ムームードメイン** — 「ムームー DNS」のカスタム設定で、サブドメイン `www`・種別 `CNAME`・内容 `cname.siteun.com` と、サブドメイン `_sitekit-verify.www`・種別 `TXT`・内容 画面の値を追加します
- **Xserver ドメイン** — ドメインの「DNS レコード設定」で、ホスト名 `www`・種別 `CNAME`・内容 `cname.siteun.com` と、ホスト名 `_sitekit-verify.www`・種別 `TXT`・内容 画面の値を追加します。ネームサーバーをレンタルサーバー（エックスサーバーなど）に向けている場合は、そちらの DNS レコード設定で行います
- **さくらのドメイン** — 会員メニューのドメインの「ゾーン編集」で、エントリ名 `www`・種別 `CNAME`・値 `cname.siteun.com.`（末尾にドットが要る画面があります）と、エントリ名 `_sitekit-verify.www`・種別 `TXT`・値 画面の値を追加します
- **Squarespace（旧 Google Domains）** — ドメインの「DNS」設定のカスタムレコードで、Host `www`・Type `CNAME`・Data `cname.siteun.com` と、Host `_sitekit-verify.www`・Type `TXT`・Data 画面の値を追加します

Cloudflare でプロキシ（オレンジの雲）をオンにすると、`www.example.jp` へのアクセスはお客様側の Cloudflare の設定を通ってから Siteon に届くため、証明書の発行や確認がうまく進まないことがあります。Siteon は Cloudflare を通して配信と証明書を用意するので、プロキシをオンにする必要はありません。

### www の無い形（example.jp）

`example.jp` は、普通の DNS では CNAME を置けません（ドメインそのもの＝apex には CNAME を置けない決まりのため）。次のどちらかで `www.example.jp` に転送します。

**A. CNAME flattening（ALIAS・ANAME）が使える DNS の場合**

1. 先に `www.example.jp` を追加しておきます（主ドメインが無いまま `example.jp` だけを追加すると、転送先が無く `404` になります）
2. `example.jp` も追加します。`www.example.jp` と合わせて 1 つと数えるので、枠は増えません。自動で「メインへ転送」になります
3. 画面に出る `TXT`（`_sitekit-verify.example.jp`）と、apex（名前の欄は `@` か空欄）の `CNAME` → `cname.siteun.com` を入れます。apex に今ある `A`・`AAAA` は消します（`MX` と `TXT` は残せます）
4. 有効になると、`https://example.jp/…` は `https://www.example.jp/…` に転送されます（パスとクエリはそのまま）

**Cloudflare** は apex の CNAME を標準で flattening するので、この方法が使えます。ほかの会社は、ALIAS・ANAME などの対応を各社の案内で確かめてください。

**B. レジストラの URL 転送を使う場合**

DNS の会社の「URL 転送」（ウェブ転送・転送設定など）で、`example.jp` を `https://www.example.jp` に転送します。Siteon には `example.jp` を追加しません（枠も使いません）。転送の仕組みは各社のものなので、`https://example.jp` で開いたときに証明書のエラーが出ないか、パスが引き継がれるかは、その会社の仕様によります。

`www` を使わず `example.jp` を本体にすることもできます（追加のときに主ドメインに指定する。CLI では `--primary`）。ただし、DNS の制約が少ない `www` を本体にするのをおすすめします。

### 状態の意味

| 状態（API の値） | 意味 | 次にすること・待ち時間の目安 |
|---|---|---|
| 受付中（`requested`） | 申請を受け付け、配信の準備をしている | 待つだけ。通常は数秒〜数分で「DNS の設定待ち」になる |
| DNS の設定待ち（`pending_dns`） | CNAME か TXT がまだ確かめられない | 2 つのレコードを入れる。入れてから DNS に反映されるまで数分〜数時間（DNS の会社と TTL による）。その後の 5 分ごとの確認で進む |
| 証明書の発行待ち（`pending_ssl`） | DNS は確かめられ、`https://` の証明書を発行している | 待つだけ。通常は数分〜数十分 |
| 有効（`active`） | このドメインで表示している。許可ドメインにも自動で入っている | TXT と CNAME を消さない。5 分ごとの確認が通るたびに 72 時間延びる |
| 失敗（`failed`） | 申請から 72 時間以内に確かめられず、申請が取り消された | もう一度追加する（TXT の値は新しくなるので、古い TXT を新しい値に入れ替える） |

- 「有効」の後に TXT や CNAME が消えると、すぐに「DNS の設定待ち」に戻り、そのドメインでの表示が止まります（許可ドメインからも外れます）。レコードを戻せば、申請し直さなくても次の確認で「有効」に戻ります
- Siteon 側や Cloudflare 側の一時的な障害で確かめられないときは、表示を止めません（最後に確かめられてから 72 時間まで）
- 待ち時間は目安です。DNS の反映が遅い会社では、半日ほどかかることもあります

### 削除と主ドメインの変更

- **削除** — 管理画面の「公開」→「独自ドメイン」で「削除」（CLI では `siteon domains remove www.example.jp --yes`）。そのドメインでの表示はすぐに止まり、元に戻せません。もう一度使うには、追加と DNS の確認をやり直します（TXT の値も新しくなります）。枠が空くのは、Siteon 側の後片付けが終わってから（通常は数分）です。不要になった DNS のレコードは自分で消します。主ドメインを消すと、転送にしているドメイン（`example.jp`）は転送先が無くなり `404` になります
- **主ドメインの変更** — `siteon domains primary <ドメイン> --yes`（MCP では `domains_primary`）。有効になっているドメインを主にします。ほかのドメインはすぐに新しい主ドメインへ転送され、ページの正規 URL（canonical）も変わります
- 独自ドメインが主ドメインとして有効な間も、共通サブドメイン（`<名前>.siteun.com`）は表示を続けます。ただし検索に載らない設定（`noindex`）になり、正規 URL として独自ドメインを示します

### エラー

管理画面では日本語の説明が、CLI・API・MCP では `error` にコードが出ます。

| コード | 意味 | 直し方 |
|---|---|---|
| `plan_required`（402） | そのサイトのプランでは独自ドメインを使えない（Free） | そのサイトを有料プラン（Lite から）にする |
| `quota_hostnames`（402） | プランの枠を使い切っている（`limit` と `used` が返る） | 使っていないドメインを削除するか、プランを上げる。削除した直後は、後片付けが終わるまで数分ほど枠に数えられる |
| `invalid_hostname`（400） | ドメインの形が違う（`reason` が `bad_format`）、または siteun.com のドメインを入れた（`base_domain`） | `www.example.jp` の形で入れる。`https://`・末尾の `/`・パスは付けない。使える文字は英小文字・数字・ハイフン（日本語ドメインは `xn--` の形） |
| `hostname_blocked`（400） | ブランド名と、ログイン・認証などの語を組み合わせたドメイン（なりすましに使われやすい形）は登録できない | 別のドメインを使う |
| `hostname_reserved`（409） | そのドメインは別のアカウントが申請中か、使っている（申請中なら `reserved_until` に期限） | 自分のドメインなら、期限（申請から 72 時間）が過ぎてから申請する。期限が出ないとき（ほかで有効になっている）は Siteon に問い合わせる |
| `hostname_in_use`（409） | 同じアカウントの別のサイトに登録されている（`site_id`） | そのサイトで削除してから追加する |
| `too_many_domain_requests`（429） | 申請はアカウント全体で 1 日 5 件まで | 翌日（日本時間の日付が変わってから）申請する |
| `hosting_disabled`（409） | そのサイトでホスティングを有効にしていない | 先に `siteon hosting enable` |
| `billing_inactive`（402） | 支払いが確認できない | 管理画面の請求を確かめる |
| `account_held` / `transferring`（409） | アカウントの公開が止められている / サイトの移管の手続き中 | 停止の連絡メールを確かめる / 移管が終わってから行う |
| `hostname_not_live`（409） | 主にしようとしたドメインが「失敗」か削除済み | 追加からやり直す |
| `site_changed`（409） | 別の操作と重なった | 状態を読み直してから、もう一度行う |
| `insufficient_scope`（403） | API キーに `domains:write` が無い | `domains:write` を付けた鍵を発行し直す（`siteon login --scopes +domains:write`） |
| `confirmation_required`（400） | API キーでの削除・主ドメインの変更に確認が付いていない | 人に確かめてから `confirm: true`（CLI では `--yes`）を付ける |

## フォームの許可ドメイン

許可ドメイン（API では `allowed_origins`）は、**そのサイトのフォームを置いてよいページのドメイン** の一覧です。ここに無いドメインのページから送られたお問い合わせは受け付けません。ほかの人が自分のサイトにあなたのフォームを置いて、受付の件数を使ってしまうのを防ぐためです。サイトのページビューの計測も同じ一覧で判断します。

- 管理画面: サイトの「設定」→「ドメイン・サイト名」の「フォームを受け付けるドメイン」。1 行に 1 つ書いて「保存する」。変えられるのはそのサイトのオーナーです。保存するとすぐに効きます
- 管理画面では `https://` を省けます（`localhost` は `http://` とみなします）。パスを書いても、ドメインの部分だけが登録されます
- 登録できるのは 20 個までです
- **完全に一致したものだけ** を受け付けます。`https://www.example.jp` と `https://example.jp` は別なので、両方で使うなら両方入れます。`http://` と `https://`、ポート番号の違いも別です。`*` のようなワイルドカードは使えません（Cloudflare Pages のプレビュー URL `<ハッシュ>.<プロジェクト>.pages.dev` のように毎回変わるものは、それぞれ入れるか、固定のプレビュー URL を使います）
- `Origin` の付かない送信（curl・サーバーからの送信）は、許可ドメインに関係なく受け付けます

### 自動で入るドメイン

次の 2 つは、一覧に書かなくても受け付けます（一覧の欄には出ません）。

- Siteon のホスティングの共通サブドメイン（`https://<名前>.siteun.com`）
- 「有効」になっている独自ドメイン（`https://www.example.jp`、転送にしている `https://example.jp` も）。有効でなくなると自動で外れます。いま入っているものは `siteon domains status` の `auto_origins` で確かめられます

### Free で入れられるドメイン

Free のサイトに入れられるのは、開発・プレビュー用のドメインだけです。それ以外（独自ドメイン）を入れると `402 upgrade_required` になります。そのサイトを有料プランにしてから入れます。

```text
localhost
127.0.0.1
*.pages.dev
*.vercel.app
*.netlify.app
*.github.io
*.workers.dev
```

ここでの `*.pages.dev` は「この形のものなら登録できる」という意味です。受け付けるのは、一覧に入れた個々のドメインだけです。

### API で変える

API キー（権限 `sites:write`）で、サイトの許可ドメインを **まるごと置き換え** ます。送った一覧がそのまま新しい一覧になるので、今の一覧（`GET` で読めます。権限 `sites:read`）に足した形で送ります。

```sh
curl -X PATCH "https://cdn.siteon.dev/v1/accounts/<アカウントID>/sites/<サイトID>" \
  -H "Authorization: Bearer stk_..." \
  -H "Content-Type: application/json" \
  -d '{"allowed_origins":["https://www.example.jp","https://example.jp","https://my-shop.pages.dev"]}'
```

- 1 つずつ `https://www.example.jp` の形で書きます。末尾の `/`・パス・大文字は使えません（`400`）。21 個以上も `400` です
- 本人の鍵（`siteon login` で作ったもの）では、アカウントのオーナーか管理者である必要があります
- Free のサイトに開発用でないドメインを送ると `402 upgrade_required` です

### 403 origin_not_allowed の直し方

次のどちらかが出ているときは、**フォームを置いたページのドメインが許可ドメインに入っていません**。お問い合わせは保存されず、件数にも数えられません。

- フォームに「送信できませんでした」と出て、ブラウザの開発者ツールのコンソールに CORS のエラー（`Access-Control-Allow-Origin` が無い、など）が出る。Siteon の script からの送信は、ブラウザが送る前の確認（プリフライト）で止めるので、送信そのものが行われません
- 自分で書いた送信処理（`fetch`・素の `<form>` の送信など）で、応答が `403` の `{"ok":false,"error":"origin_not_allowed"}` になる

1. フォームを置いたページを開き、開発者ツールのコンソールで `location.origin` を実行して、ページのドメインを正確に調べます（例: `https://www.example.jp`）
2. 管理画面の「設定」→「ドメイン・サイト名」の「フォームを受け付けるドメイン」と見比べます。`www` の有無・`http` と `https`・ポート番号まで一致しているかを確かめます
3. 無ければ追加して保存します。保存するとすぐに効くので、ページを読み込み直してもう一度送ります
4. 追加できないとき
   - 「本番のドメインは有料プランで使えます」（`402 upgrade_required`）— Free のサイトです。そのサイトを有料プランにしてから追加します
   - 「ドメインは20個までです」— 使っていないものを消します
5. Siteon のホスティングの独自ドメインなら、一覧に足さなくても、「有効」になれば自動で入ります。「DNS の設定待ち」などのままなら、[状態の意味](#status) を見て、ドメインのほうを直します

## AI エージェントがこのページを使うとき

人に「独自ドメインを設定して」「フォームが 403 になる」と頼まれたときの手順です。MCP の操作は準備中です （近日）（それまでは管理画面での手順を人に案内します）。

### 独自ドメインを頼まれたら

1. 人に確かめる: 使うドメイン（`www.example.jp` の形）、そのドメインの持ち主であること、DNS を編集できる会社（Cloudflare・お名前.com など）、そのサイトが有料プランでホスティングを有効にしていること。**持ち主でないドメインは申請しない**
2. `domains_add`（`site`・`hostname: "www.example.jp"`）を呼ぶ。鍵に `domains:write` が無ければ `insufficient_scope` になるので、人に `siteon login --scopes +domains:write` で鍵を作り直してもらう
3. 応答の `dns.txt`（`name`・`value`）と `dns.cname`（`name`・`target`）を、**値を変えずにそのまま** 人に見せる。人の DNS の会社に合わせて、名前の欄に入れる形（`_sitekit-verify.www` と `www`）も添える（[入れるレコード](#dns-records)・[入れ方の例](#dns-examples)）。Cloudflare なら「DNS only」にすることも伝える。`expires_at`（72 時間後）までに入れるよう伝える
4. 応答に `next_steps` があれば、このページより **`next_steps` に従う**
5. 人が「入れた」と言ったら `domains_status` を呼ぶ（呼んだときにその場で確かめる）。続けて呼ぶときは 1〜5 分あける
6. 状態ごとの次の一手（[状態の意味](#status)）
   - `requested` — 少し待ってもう一度 `domains_status`
   - `pending_dns` — `last_check_detail` を見る。`txt` が `mismatch` / `nxdomain` なら TXT の名前・値の写し間違い、`cf` が `ok` でも `cf_status` が `active` でなければ CNAME が向いていない。`dig` の結果を人に見てもらう。入れて間もないなら DNS の反映を待つ
   - `pending_ssl` — 待つ（数分〜数十分）
   - `active` — 完了。`https://www.example.jp/` を開いて確かめるよう伝える。TXT と CNAME を消さないよう伝える
   - `failed` — 72 時間を過ぎた。人に確かめてから `domains_add` をやり直し、**新しい TXT の値** に入れ替えてもらう
7. `www` の無い形を聞く（[www の無い形](#apex)）。DNS が CNAME flattening（Cloudflare など）に対応していれば、`www` が追加済みであることを確かめてから `domains_add`（`hostname: "example.jp"`）。対応していなければ、レジストラの URL 転送で `https://www.example.jp` へ転送するよう案内する
8. エラーは `error` のコードで [エラー](#domain-errors) を引く。`domains_remove`・`domains_primary` は、何が起きるかを人に伝えて明示の同意を得てから `confirm: true` で呼ぶ

### フォームが 403 になると言われたら

1. 症状が `403`・`origin_not_allowed`、またはコンソールの CORS のエラーかを確かめる（[直し方](#origin-not-allowed)）。`429`・`400` なら別の原因（[よくあるエラーと対処](https://siteon.dev/ja/docs/troubleshooting)）
2. フォームを置いたページの正確なドメイン（`location.origin`）を人に教えてもらう
3. `list_sites` でそのサイトの `allowed_origins` を読み、完全に一致するものがあるかを見る（`www` の有無・`http` / `https`・ポート）
4. 無ければ、人に管理画面の「設定」→「ドメイン・サイト名」で追加してもらう。API で足すときは、人に確かめてから、今の一覧に足した全体を `PATCH`（[API で変える](#origins-api)）。Free のサイトに独自ドメインは入れられない（`upgrade_required`）ので、有料プランが要ることを伝える
5. Siteon のホスティングの独自ドメインなら、許可ドメインには足さずに `domains_status` で状態を確かめる（有効になれば自動で入る）
