---
title: "Watch a domain, or park it"
method: POST
path: "/domains/watch"
tags: ["Domains"]
---

# Watch a domain, or park it

`POST /domains/watch`

## Request

- Base URL: `https://api.hypamoon.com/api/v1`
- URL: `https://api.hypamoon.com/api/v1/domains/watch`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.hypamoon.com/oauth/authorize`, token URL `https://api.hypamoon.com/oauth/token`, scopes: `sites:write`)

Watches a domain the user owns, registered anywhere, without connecting it to a site. Ownership is proven with the same TXT record as connect_domain (ownership.challenge); a domain that is already active in this project or bought through Hypamoon needs none. Until it is proven the status is pending (202) and nothing is checked. park page or redirect also moves the domain to Hypamoon's nameservers (like connect_domain without a site) and then shows a neutral page or sends visitors to redirect_to with a 301; a domain without mail gets a null MX, SPF -all and DMARC p=reject against spoofing. park off stops parking. remove true stops watching.

## Request body

- object
  - `domain` string, required: The domain, like example.com. It can be registered anywhere.
  - `expected_hosts` string[]: Optional. Where the domain is hosted on purpose (vercel, netlify, github, heroku, aws, azure, shopify, fly, render). If its DNS points to another one of these, that is a problem. Leave it out and we remember the host from the first check, and warn when it changes.
  - `expected_language` string, nullable: Optional. The language of the site, as a two-letter code like en or nl. A homepage in another language is a warning.
  - `park` 'off' | 'page' | 'redirect': Optional. page: park the domain on Hypamoon with a neutral page ("This domain is reserved"). redirect: park it and send visitors to redirect_to with a 301. off: stop parking. Parking moves the domain's DNS to Hypamoon (nameservers), so nobody can claim it elsewhere.
  - `redirect_to` string: Only with park redirect: the address to send visitors to, like https://example.com. Path and query of the request are kept.
  - `remove` boolean: true: stop watching the domain. Parking stays as it is.

## Response `200`

The watched domain, with its health.

## Other responses

- `202`: Watched, waiting for the ownership proof in ownership.challenge.
- `400`: Bad Request: invalid_json.
- `401`: Unauthorized: unauthorized, missing_api_key, invalid_api_key, api_key_revoked, project_deleted.
- `402`: Payment Required: plan_limit_reached.
- `403`: Forbidden: project_not_enabled, key_mode_mismatch, missing_scope, verification_required, forbidden, phone_verification_required.
- `404`: Not Found: not_found.
- `409`: Conflict: conflict, plan_limit_reached.
- `422`: Unprocessable Content: validation_failed.
- `429`: Too Many Requests: rate_limited.
- `500`: Internal Server Error: internal_error.
- `502`: Bad Gateway: upstream_error.
- `503`: Service Unavailable: service_unavailable.

---

[API](https://skmtc.dev/hypamoon/apis/hypamoon-api.md) · [All operations](https://skmtc.dev/hypamoon/apis/hypamoon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hypamoon/apis/hypamoon-api/revisions/9f0b90004c06?raw)
