ドキュメント本文へスキップ
API

ドメインを更新する

ドメインのカスタムトラッキングドメインとカスタムファイルドメインを設定・再チェック・削除します。この API がドメインについて変更できるのはこの 2 つだけです。

PATCHapi.openemail.uk/domains/{id}

実際の呼び出しを、ご自身のキーで自分のワークスペースに対して実行します。

PATCH /domains/{id}

ドメインのカスタムトラッキングドメインとカスタムファイルドメインを設定・再チェック・削除します。この API がドメインについて変更できるのはこの 2 つだけです。

リクエスト

1 つのドメインは、カスタムトラッキングドメインとカスタムファイルドメインをそれぞれ 1 つ持てます。どちらも自分で選んだそのドメインのサブドメイン(たとえば links.acme.comfiles.acme.com)で、ドメインが検証済みになるか _openemail-challenge TXT レコードが公開された時点で設定できます。まだメールを受信している必要はありません。設定すると、その名前専用のアドレスが用意され target で報告されます。record は、その名前をそこに向ける CNAME レコードです。チェックが通ると、そのドメインからの新しいメール内のトラッキングリンクと開封ピクセルは既定のホストではなく https://links.acme.com/t/... を使い、そこから送られたファイルのダウンロードリンクは https://files.acme.com/f/... を使います。

パラメーター

trackingHoststring | null
トラッキングリンクと開封ピクセルに使うサブドメイン。最大 512 文字です。トリムして小文字化され、先頭の `https://` や `http://`、パス、末尾のドットはチェック前に取り除かれます。新しい値は現在のトラッキングドメインを置き換え、現在の値を送るとチェックを再実行し、`null` または空文字列は削除、フィールドを省略すればそのままです。
storageHoststring | null
ファイルのダウンロードリンクに使うサブドメイン。同じように整形され、同じ 512 文字の制限が適用されます。新しい値は現在のファイルドメインを置き換え、現在の値を送るとチェックを再実行し、`null` または空文字列は削除、フィールドを省略すればそのままです。

ボディはキーには厳格ですが、いくつ送るかについては寛容です。trackingHoststorageHost 以外のキーは 422 unknown_parameter になり、どちらも含まないボディは何もしない操作として、現在のドメインを 200 で返します。両方を 1 回の呼び出しに入れることもでき、trackingHost から順に適用されます。trackingHost が拒否されると storageHost に触れる前に呼び出しが止まり、storageHost が拒否された場合はすでに行われた trackingHost の変更はそのまま残ります。どちらかが単独で成立する必要があるなら、別々に送ってください。

トラッキングドメインとファイルドメインを設定する

domains:write が必要です。各ホストは同じ呼び出しの中で検証・保存・チェックされるため、レスポンスにはすでに最初のチェック結果が含まれています。ボディは GET /domains/{id} と同じです。

curl
curl -X PATCH "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f" -H "$AUTH" -H "Content-Type: application/json" \  -d '{ "trackingHost": "links.acme.com", "storageHost": "files.acme.com" }'
レスポンス
{  "object": "domain",  "id": "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f",  "domain": "acme.com",  "receiving": {    "verified": true,    "verifiedAt": "2026-08-14T10:02:00.000Z",    "catchAll": false,    "lastCheckedAt": "2026-08-29T06:00:00.000Z",    "error": null  },  "sending": {    "status": "verified",    "canSend": true,    "checkedAt": "2026-08-29T06:00:00.000Z",    "error": null,    "note": "Mail from this domain is signed and can be sent."  },  "tracking": {    "host": "links.acme.com",    "status": "pending",    "active": false,    "target": "oelinks3f9a1c7e2b8d4a60.edge.openemail.uk",    "record": { "type": "CNAME", "name": "links.acme.com", "value": "oelinks3f9a1c7e2b8d4a60.edge.openemail.uk" },    "checkedAt": "2026-08-29T06:05:12.000Z",    "verifiedAt": null,    "error": "links.acme.com does not resolve yet. Add a CNAME record named links.acme.com with the value oelinks3f9a1c7e2b8d4a60.edge.openemail.uk, then check again."  },  "storage": {    "host": "files.acme.com",    "status": "pending",    "active": false,    "target": "oefiles81c40d6b2f7e9a35.edge.openemail.uk",    "record": { "type": "CNAME", "name": "files.acme.com", "value": "oefiles81c40d6b2f7e9a35.edge.openemail.uk" },    "checkedAt": "2026-08-29T06:05:12.000Z",    "verifiedAt": null,    "error": "files.acme.com does not resolve yet. Add a CNAME record named files.acme.com with the value oefiles81c40d6b2f7e9a35.edge.openemail.uk, then check again."  },  "addresses": [    { "address": "[email protected]", "enabled": true }  ],  "createdAt": "2026-08-14T09:55:11.000Z"}

tracking.recordstorage.record は、DNS プロバイダー側でプロキシをオフにした素の CNAME として公開してください。チェックは各名前を解決した上で、https://links.acme.com/t/v/<nonce> または https://files.acme.com/f/v/<nonce> に OpenEmail が署名した応答を要求します。リダイレクトはチェックに失敗し、名前の前段にあるプロキシも失敗の原因になりえます。

レコードが解決できるようになると、チェックは「名前は OpenEmail を指していて、有効化待ちである」と報告することがあります。これは HTTPS 証明書の発行中という意味で、当方側で行われ、あなたの側では何も必要なく、多少時間がかかることがあります。完了すると、次に通ったチェックが statusactive にします。

呼び出し中にアドレスを用意できなかった場合、record は null、target は空文字列になり、error が準備中である旨を伝えます。追加の呼び出しなしに数分で完了するので、GET /domains/{id} でドメインをもう一度読み取り、レコードを取得してください。

2 つの名前は独立しています。片方のフィールドだけを含む呼び出しは、もう一方のオブジェクトをそのまま残すため、後からファイルドメインを設定しても、すでに稼働中のトラッキングドメインが乱されることはありません。

再チェック、または削除

すでに設定されているホストをそのまま送ると、次回の定期チェックを待たずに今すぐチェックを実行します。直近のチェックが(定期かどうかを問わず)30 秒以内に実行されていた場合は、保存されている状態をそのまま返します。名前を削除するにはそのフィールドに null を送り、もう一方のフィールドを省略すれば現在の名前が保たれます。

curl
curl -X PATCH "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f" -H "$AUTH" -H "Content-Type: application/json" \  -d '{ "trackingHost": null }'
削除後の tracking
{  "host": null,  "status": "none",  "active": false,  "target": "",  "record": null,  "checkedAt": null,  "verifiedAt": null,  "error": null}

すでに送信済みのメール内のリンクは、送信時のホストを保ち続けます。これはトラッキングリンクと同様、ファイルのダウンロードリンクにも当てはまります。名前を削除または変更した後も、古い CNAME レコードを残しておく限りそれらのリンクは動き続けます。名前を再設定すると record が変わることがあるので、レスポンスが報告したものを公開してください。

tracking オブジェクト

hoststring | null
トラッキングドメイン。設定がない場合は null。
status'none' | 'pending' | 'active' | 'failed'
`none` はトラッキングドメインが設定されていないことを意味します。`pending` は設定済みだがチェックにまだ一度も通っていないこと、`active` は新しいメールがそれを使っていること、`failed` は以前チェックに通ったが現在は使われなくなったことを意味します。
activeboolean
`status` が `active` のときだけ true になります。すなわち、そのドメインからの新しいメールのトラッキングリンクと開封ピクセルがそのホストを使っている状態です。
targetstring
CNAME レコードが指すアドレスで、このトラッキングドメイン専用に用意されたものです。`host` が null の間、および新しいホスト用のアドレスを準備中の間は空文字列になります。
record{ type: 'CNAME'; name: string; value: string } | null
公開すべきレコード。名前は `host`、値は `target` です。トラッキングドメインがない場合、および新しいホスト用のアドレスを準備中の場合は null になります。
checkedAtstring | null
ホストが最後にチェックされた日時(ISO-8601)。最初のチェックまでは null です。
verifiedAtstring | null
最後にチェックに通った日時(ISO-8601)。一度も通っていないホストでは null です。
errorstring | null
直近のチェックで判明したことを、ドメイン所有者が対処できる言葉で示します。直近のチェックに通った場合、またはまだ一度も実行されていない場合は null です。1〜2 回チェックに失敗したホストはまだ `active` のままで、その理由がここに入ります。

storage オブジェクト

ファイルドメインは storage に報告され、フィールドは tracking と 1 つずつ同じです。違うのはその名前が何に使われるかだけで、こちらの active は、そのドメインから送られたファイルのダウンロードリンクがその名前を指していることを意味します。

hoststring | null
ファイルドメイン。設定がない場合は null。
status'none' | 'pending' | 'active' | 'failed'
`none` はファイルドメインが設定されていないことを意味します。`pending` は設定済みだがチェックにまだ一度も通っていないこと、`active` は新しいメールがそれを使っていること、`failed` は以前チェックに通ったが現在は使われなくなったことを意味します。
activeboolean
`status` が `active` のときだけ true になります。すなわち、そのドメインから送られたファイルのダウンロードリンクがそのホストを使っている状態です。
targetstring
CNAME レコードが指すアドレスで、このファイルドメイン専用に用意されたものです。`host` が null の間、および新しいホスト用のアドレスを準備中の間は空文字列になります。
record{ type: 'CNAME'; name: string; value: string } | null
公開すべきレコード。名前は `host`、値は `target` です。ファイルドメインがない場合、および新しいホスト用のアドレスを準備中の場合は null になります。
checkedAtstring | null
ホストが最後にチェックされた日時(ISO-8601)。最初のチェックまでは null です。
verifiedAtstring | null
最後にチェックに通った日時(ISO-8601)。一度も通っていないホストでは null です。
errorstring | null
直近のチェックで判明したことを、ドメイン所有者が対処できる言葉で示します。直近のチェックに通った場合、またはまだ一度も実行されていない場合は null です。1〜2 回チェックに失敗したホストはまだ `active` のままで、その理由がここに入ります。

ホストのチェック方法

どちらの名前も同じスケジュールでチェックされ、それぞれ独立してチェックされます。

  • まだチェックに通っていないホストは、最初の 1 時間は 2 分ごと、最初の 1 日は 10 分ごと、最初の 1 週間は 1 時間ごと、それ以降は 6 時間ごとにチェックされます。
  • アクティブなホストは 10 分ごとにチェックされ、チェックに失敗した場合は 1 分後、次いで 2 分後に再試行されます。
  • アクティブなホストは、チェックに 3 回連続で失敗するか、最後に通ったチェックから 2 時間以上が経過すると使われなくなります。以降、新しいメールは既定のホストに戻り、再びチェックに通るまで statusfailed になります。チェックは継続しますが、間隔は次第に広がり、最大 1 時間間隔になります。

トラッキングドメインはトラッキング用のパスだけを、ファイルドメインはダウンロード用のパスだけを提供し、それぞれ所有するワークスペースが送ったメールにのみ応答します。

エラー

ステータスtypecode発生条件
400invalid_request_errormalformed_jsonボディが正しい JSON ではありません。
403permission_errorinsufficient_scopeキーが domains:write を持っていません。
404not_found_errorresource_not_foundこのワークスペースにその id のドメインがありません。
409conflict_errordomain_not_verifiedreceiving.verified が false で、ドメインの _openemail-challenge TXT レコードもまだ公開されていない状態で、新しいホストが送られました。param は、それが届いたフィールド(trackingHost または storageHost)です。
409conflict_errortracking_host_in_use別のドメインがすでにそのホストをトラッキングドメインとして使っている、そのホストがすでにファイルドメインとして使われている、あるいはそのドメインのトラッキングドメインが別の OpenEmail サーバーで管理されています。paramtrackingHost です。
409conflict_errorstorage_host_in_useファイルドメインについての同じ 3 つのケースです。別のドメインがすでにそのホストをファイルドメインとして使っている、そのホストがすでにトラッキングドメインとして使われている、あるいはここでのファイルドメインが別の OpenEmail サーバーで管理されています。paramstorageHost です。
422validation_errorinvalid_tracking_hostホストが正しいホスト名でないか、許可されていません。ホストはそのドメインの厳密なサブドメインである必要があり、リターンパスホスト bounce.<domain>、OpenEmail に属する名前、メール受信用に設定されたドメインは使えません。paramtrackingHost です。
422validation_errorinvalid_storage_host同じ規則が、ファイルドメインについて拒否された場合です。paramstorageHost です。
422validation_errorunknown_parametertrackingHoststorageHost 以外のボディキーです。
422validation_errorinvalid_parameterボディが JSON オブジェクトでないか、存在するフィールドが string でも null でもないか、512 文字を超えています。どちらのフィールドも含まないボディはエラーではありません。何も変えず 200 を返します。
422validation_errorcapability_unsupportedキーがドメイン全体ではなく個別のアドレスに絞られている一方、この 2 つの名前はドメイン上のすべてのアドレスに影響します。domainAllowlist にそのドメインを持つキーであれば設定できます。paramdomainAllowlist です。