---
title: "Add a website"
method: POST
path: "/v1/domains"
tags: ["Domains"]
---

# Add a website

`POST /v1/domains`

## Request

- Base URL: `https://api.upcheck.so`
- URL: `https://api.upcheck.so/v1/domains`
- Auth: HTTP bearer

Creates the website with its monitors (uptime, certificate, DNS, registration, plus a keyword check, a content check and a port check that stay disabled until `PUT /domains/{id}/keyword`, `/content` and `/port` give them something to look at) and probes it inline, so the response usually already carries a first result; anything too slow is finished by the scheduler within a minute. The uptime check requests the root over GET until `PUT /domains/{id}/http` gives it HTTP options. If the organization has no alert rules yet, one email rule per check is created so alerts reach the key's creator with no further setup.

## Request body

- object
  - `domain` string, required: A hostname. A scheme, path or port is stripped, so a full URL is accepted.
  - `friendlyName` string: A label shown instead of the hostname.

## Response `201`

Created.

- object: A monitored website with the latest state of its certificate and registration.
  - `id` string, required: Opaque identifier.
  - `organizationId` string, required: Opaque identifier.
  - `domain` string, required
  - `friendlyName` string, nullable, required
  - `hostname` string, required
  - `certificateStatus` 'checking' | 'healthy' | 'expiring_soon' | 'expired' | 'invalid' | 'unreachable', required
  - `certificateIssuer` string, required
  - `certificateExpiresAt` number, required: Unix ms.
  - `certificateDaysRemaining` number, required
  - `certificateLastChecked` number, required
  - `certificateNextCheck` number, required
  - `certificateAutoRenew` boolean, nullable, required
  - `certificate` object, required
    - `issuer` string, required
    - `commonName` string, required
    - `subjectAlternativeNames` string[], required
    - `serialNumber` string, required
    - `signatureAlgorithm` string, required
    - `publicKeyType` string, required
    - `publicKeySize` number, required
    - `validFrom` number, required: Unix ms.
    - `expirationDate` number, required: Unix ms.
    - `fingerprintSha256` string, required
    - `sslVersion` string, required
    - `chain` object[], required
      - `commonName` string, required
      - `issuer` string, required
      - `type` 'leaf' | 'intermediate' | 'root', required
  - `certificateLastError` string, nullable, required
  - `registrationStatus` 'checking' | 'healthy' | 'expiring_soon' | 'expired' | 'at_risk' | 'unsupported' | 'lookup_failed', nullable, required
  - `registrar` string, required
  - `registrationExpiresAt` number, required
  - `registrationDaysRemaining` number, required
  - `registration` object, nullable, required
    - `registrableDomain` string, required
    - `registrar` string, required
    - `registrarUrl` string
    - `createdAt` number, required
    - `expiresAt` number, required: Unix ms. 0 when the registry publishes no expiry.
    - `updatedAt` number, required
    - `statuses` string[], required
    - `nameservers` string[], required
    - `source` string, required
  - `registrationLastChecked` number, nullable, required
  - `registrationNextCheck` number, nullable, required
  - `registrationLastError` string, nullable, required

## Other responses

- `400`: The request body or parameters are invalid. `error` names the first problem.
- `401`: The API key is missing, invalid, or revoked.
- `402`: The organization has no active subscription.
- `403`: The key's role does not allow this action.
- `409`: The request conflicts with the current state, for example the website limit.
- `429`: The key's rate limit was exceeded. Honour `Retry-After`.

---

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