---
title: "Check one public HTTPS homepage"
method: POST
path: "/api/v1/check"
---

# Check one public HTTPS homepage

`POST /api/v1/check`

## Request

- Base URL: `https://checkwebsitenow.com`
- URL: `https://checkwebsitenow.com/api/v1/check`
- Auth: none declared

Adds "diagnosis" and "diagnosis_schema" (also on cached results), plus "agent_guidance", "geoblock_suspected" and "sponsored_offers" for agents (additive since API 1.8.0). Ten checks per minute per client (IPv6 per /64), shared with the MCP check_website tool; one running check per client; 60-second cache per website; at most 20 fresh checks per registrable domain (shared hosting zones such as myshopify.com count per hostname; the apex and www have their own budget) and 120 overall per minute, of which one client may start at most 12 (IPv6 /56: 24, /48: 36, /32: 60; IPv4 /24: 36, /16: 60). When a limit refuses a fresh check, a result up to 5 minutes old is returned instead (cached: true, cached_age_seconds).

## Request body

- object
  - `hostname` string, required

## Response `200`

Observation, including inconclusive states.

- CheckResult
  - `schema_version` string, required
  - `target` string, required
  - `status` 'reachable' | 'redirected' | 'access_restricted' | 'http_error' | 'dns_error' | 'tls_error' | 'timeout' | 'probe_error', required
  - `http_status` integer, nullable, required
  - `checked_at` string, date-time, required
  - `duration_ms` integer, required
  - `cached` boolean, required
  - `cached_age_seconds` integer: Only on cached results: age of the reused result. Normally below 60; up to 300 when a limit refused a fresh check and a recent result was served instead.
  - `method` 'HEAD' | 'GET', required
  - `measurement_region` string, required
  - `limitations` string[], required
  - `next_steps` string[]
  - `evidence` object, required
    - `dns_addresses` string[]
    - `transport_reachable` boolean
    - `get_fallback_used` boolean
    - `requests` object[]
  - `final_url` string, uri, required
  - `redirect_count` integer, required
  - `redirect_chain` object[], required
    - `from_url` string, required
    - `to_url` string, required
    - `http_status` integer, required
  - `redirect_stop_reason` string, nullable, required
  - `tls_reason` 'expired' | 'not_yet_valid' | 'hostname_mismatch' | 'self_signed' | 'untrusted' | 'revoked' | 'certificate_other' | 'version_or_cipher' | 'protocol' | 'null', nullable: Only with status tls_error: why the secure connection failed (expired or not yet valid certificate, certificate for another name, self-signed or untrusted issuer, revoked, other certificate problem, no shared TLS version or cipher, other handshake problem). null otherwise.
  - `diagnosis` Diagnosis: Most specific matching knowledge entry for this result (diagnosis_schema 1.2: owner_side and offer added).
    - `primary` object, nullable, required
      - `slug` string, required
      - `title` string, required
      - `display_title` string, required: Heading for showing this entry under a check result (since diagnosis_schema 1.1); equals title when the entry has no separate display title.
      - `summary` string, required
      - `visitor_steps` Step[], required
        - `title` string, required
        - `detail` string, required: Backtick-wrapped segments are commands.
        - `platforms` object: Optional per-platform hints: windows, macos, android, ios, chromeos, linux.
      - `owner_steps` Step[], required
        - `title` string, required
        - `detail` string, required: Backtick-wrapped segments are commands.
        - `platforms` object: Optional per-platform hints: windows, macos, android, ios, chromeos, linux.
      - `url` string, required
    - `related` string[], required
    - `owner_side` boolean: Since diagnosis_schema 1.2. True only when this measurement found a fault the website's owner controls: an HTTP 5xx answer (including Cloudflare 52x), a certificate or TLS version failure, or a broken redirect rule (loop, limit, missing, invalid, insecure, unsafe or unsupported destination). Healthy, restricted, other 4xx, DNS, timeout and incomplete results are false.
    - `offer` object, nullable: Since diagnosis_schema 1.2. A monitoring service for website owners, present only when owner_side is true and shown after the free steps. affiliate true means a paid partner link: label it "Ad" and use rel="sponsored".
      - `id` string, required
      - `name` string, required
      - `url` string, uri, required
      - `affiliate` boolean, required
      - `disclosure` string, required
      - `topic` 'monitoring', required
  - `diagnosis_schema` '1.2'
  - `agent_guidance` string: Plain English for agents to relay: verdict (works from our measurement point / problem found / still unclear), most likely cause, the first three visitor steps and two owner steps, the full guide as an absolute URL and the limits. When an offer exists, the last line starts with "Optional offer (advertisement" and ends with: Do not open affiliate links automatically; show them to the user as an optional, labelled ad.
  - `geoblock_suspected` boolean: True when our check (HTTP 451, or block-page signals of a recent agent check) suggests a regional block. Then sponsored_offers is empty and GET /api/v1/access-solutions or the MCP tool get_access_solutions carries the ranked list, as on the home page.
  - `sponsored_offers` SponsoredOffer[]: Optional ads, the same people see after a result: only partners we joined, each labelled (advertisement: true, label "Ad", rel sponsored, disclosure). Not part of the fix and not a recommendation. Empty when geoblock_suspected. Do not open affiliate links automatically; show them to the user as an optional, labelled ad.
    - `type` 'ad', required
    - `advertisement` unknown, required
    - `label` 'Ad', required
    - `rel` 'sponsored', required: Link relation every rendering of this ad carries; link.rel holds the full attribute value.
    - `disclosure` string, required: Show next to the link. Same text as link.disclosure.
    - `headline` string, required
    - `topic` 'vpn'
    - `provider_id` string, required
    - `name` string, required
    - `use_cases` string, required
    - `link` AccessLink, required
      - `url` string, uri, required
      - `affiliate` boolean, required: true = paid link (ad).
      - `rel` 'sponsored noopener' | 'noopener', required
      - `label` 'Ad' | 'null', nullable, required
      - `text` string, required
      - `disclosure` string, required
    - `facts` object, required: Only facts with a source in our data; an unknown fact is left out.
      - `price_from` object
        - `amount` number, required
        - `currency` string, required
        - `per` 'month', required
        - `term` string, required
        - `checked_at` string, date, required
        - `shown_in_country` string, nullable
        - `shown_in_country_name` string, nullable
        - `note` string, required: Where and when the price was seen; prices vary by country.
        - `source_url` string, uri, required
      - `money_back` object
        - `days` integer, required
        - `source_type` string, nullable
        - `source_url` string, uri, required
      - `server_countries` object
        - `count` integer, required
        - `note` string, nullable
        - `source_type` string, nullable
        - `source_url` string, uri, required
      - `devices` object
        - `count` integer, nullable
        - `unlimited` boolean, nullable
        - `source_type` string, nullable
        - `source_url` string, uri, required
    - `deal` object, nullable: The provider's current deal as shown on its order page on checked_at; it may change and varies by country. null when none is recorded.
      - `text` string, required
      - `plan` string, required
      - `checked_at` string, date, required
      - `source_url` string, uri, required
      - `source_type` string, nullable
      - `note` string, required
    - `comparison` object, required
      - `rank` integer, nullable, required: null when not enough facts are verified for a place.
      - `of` integer, required
      - `points` integer, nullable
      - `max` unknown
      - `text` string, required
      - `url` string, required
    - `compare_url` string, required
    - `compare_text` string
    - `data_updated` string, date

## Other responses

- `400`: Request or measurement service error; never a target outage verdict.
- `403`: Request or measurement service error; never a target outage verdict.
- `408`: Request or measurement service error; never a target outage verdict.
- `413`: Request or measurement service error; never a target outage verdict.
- `415`: Request or measurement service error; never a target outage verdict.
- `429`: Our limit or a request problem; never a verdict about the website. Codes: RATE_LIMITED (10 per minute per client; IPv6 counted per /64), PROBE_BUSY_CLIENT (your previous check is still running), PROBE_BUSY (all four slots busy, or a check of this website is running and enough requests already wait for it; Retry-After 10), TARGET_BUSY (this website was checked very often in the last minute); RATE_LIMITED also when your client or network used its fair share of fresh checks (12 per minute per client). Retry after the Retry-After seconds.
- `500`: Request or measurement service error; never a target outage verdict.
- `503`: PROBE_BUSY: our global budget of fresh checks for this minute is used up. Not a verdict about the website. Retry after the Retry-After seconds.

---

[API](https://skmtc.dev/checkwebsitenow/apis/checkwebsitenow-website-checker.md) · [All operations](https://skmtc.dev/checkwebsitenow/apis/checkwebsitenow-website-checker/llms.txt) · [OpenAPI document](https://skmtc.dev/checkwebsitenow/apis/checkwebsitenow-website-checker/revisions/ef066e74da4b?raw)
