Compare current and historical website origins

GET /api/v2/domains/{id}/dns/diagnostics/origin-compare

Run a scoped HTTPS origin comparison for one owned domain host.

The endpoint resolves current public DNS, probes the current public answer using the requested Host header and SNI, probes the current HostUp web-hosting origin from the DNS zone when available, and probes previous web origins from the latest pre-HostUp DNS snapshot.

Use this before telling a customer that Cloudflare/CDN is the root cause: CDN edge IPs are traffic-path evidence, while origin HTTP status shows whether the HostUp origin has website content.

Domains & DNS DNS

Authentication

Required API scopes: read:dnsread:domains

Use Authorization: Bearer <token> for API keys. Dashboard sessions may also use hostup_session.

Context

Path Parameters

id string required Example: dom_01hxa3b4c5d6e7f8g9h0j1k2m3

Public domain ID from GET /api/v2/domains. Do not invent this value; use the exact ID returned by the referenced API response.

Query Parameters

host string · Example: example.se

Domain host to compare. Defaults to the domain apex. Must be the domain itself or one of its subdomains, for example example.se or www.example.se.

Headers

Authorization Bearer <token>
Accept application/json

Responses

200 Current public, HostUp-origin, and previous-origin HTTPS comparison.
host string required
asciiHost string required
checkedAt string required
currentPublic object required
currentPublic.a array<string> required
currentPublic.aaaa array<string> required
currentPublic.cname array<string> required
currentPublic.probedIp string · nullable required

Nullable: may be null when not applicable.

currentPublic.appearsCdnEdge boolean required
currentPublic.edgeProvider string · nullable required · Example: cloudflare

Nullable: may be null when not applicable.

currentPublic.httpStatus integer · nullable required

Nullable: may be null when not applicable.

currentPublic.server string · nullable required

Nullable: may be null when not applicable.

currentPublic.bodyBytes integer required
currentPublic.title string · nullable required

Nullable: may be null when not applicable.

currentPublic.responseMs integer required
currentPublic.errorReason string · nullable required

Nullable: may be null when not applicable.

hostupOrigin null required
hostupOriginReason string · nullable required

previousOrigins array<object> required
previousOrigins[].ip string required · Example: 185.113.11.10
previousOrigins[].recordName string · nullable required · Example: @

Nullable: may be null when not applicable.

previousOrigins[].recordType string · enum required · Example: A
A
AAAA
CNAME
ALIAS
previousOrigins[].target string · nullable required · Example: null

CNAME/ALIAS target hostname when the probed IP came from resolving an alias.

previousOrigins[].source string required · Example: current_hostup_dns_record

Origin source, for example current_hostup_dns_record or the DNS snapshot source such as pre_nameserver_change.

previousOrigins[].snapshotId string · Example: dnss_01hxa3b4c5d6e7f8g9h0j1k2m3

Snapshot public ID when this origin came from DNS history.

previousOrigins[].capturedAt string · Example: 2026-05-19T09:55:00.000Z

Snapshot capture time when this origin came from DNS history.

previousOrigins[].providerHint string · nullable · Example: ns1.old-provider.example (203.0.113.10)

Snapshot provider hint, usually the old authoritative nameserver.

previousOrigins[].httpStatus integer · nullable required · Example: 404

Nullable: may be null when not applicable.

previousOrigins[].server string · nullable required · Example: LiteSpeed

Nullable: may be null when not applicable.

previousOrigins[].bodyBytes integer required · Example: 1251
previousOrigins[].title string · nullable required · Example: 404 Not Found

Nullable: may be null when not applicable.

previousOrigins[].responseMs integer required · Example: 142
previousOrigins[].errorReason string · nullable required · Example: null

Nullable: may be null when not applicable.

previousOriginsReason string · nullable required

diagnosis object required
diagnosis.summary string required
diagnosis.confidence string · enum required
high
medium
low
diagnosis.evidence array<string> required
400 Invalid host filter.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
401 Unauthorized. Authentication is required.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
403 Forbidden. The caller lacks a required scope or does not own the resource.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
404 Not found. The resource does not exist or is not owned by the caller.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
429 Rate limited. Retry after the limit resets. 429 responses include Retry-After seconds plus X-RateLimit-* headers.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
500 Internal error. Retry later or contact support if the issue persists.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
GET https://cloud.hostup.se/api/v2/domains/{id}/dns/diagnostics/origin-compare
For AI assistants
View as Markdown
cURL
curl -X GET "https://cloud.hostup.se/api/v2/domains/dom_01hxa3b4c5d6e7f8g9h0j1k2m3/dns/diagnostics/origin-compare" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
Response
{
  "host": "example.se",
  "asciiHost": "example.se",
  "checkedAt": "2026-05-19T10:30:00.000Z",
  "currentPublic": {
    "a": [
      "104.21.82.230",
      "172.67.207.236"
    ],
    "aaaa": [],
    "cname": [],
    "probedIp": "104.21.82.230",
    "appearsCdnEdge": true,
    "edgeProvider": "cloudflare",
    "httpStatus": 404,
    "server": "cloudflare",
    "bodyBytes": 1251,
    "title": "404 Not Found",
    "responseMs": 188,
    "errorReason": null
  },
  "hostupOrigin": {
    "ip": "185.113.11.10",
    "recordName": "@",
    "recordType": "A",
    "target": null,
    "source": "current_hostup_dns_record",
    "httpStatus": 404,
    "server": "LiteSpeed",
    "bodyBytes": 1251,
    "title": "404 Not Found",
    "responseMs": 142,
    "errorReason": null
  },
  "hostupOriginReason": null,
  "previousOrigins": [
    {
      "ip": "18.208.88.157",
      "recordName": "@",
      "recordType": "A",
      "target": null,
      "source": "pre_nameserver_change",
      "snapshotId": "dnss_01hxa3b4c5d6e7f8g9h0j1k2m3",
      "capturedAt": "2026-05-19T09:55:00.000Z",
      "providerHint": "ns1.old-provider.example (203.0.113.10)",
      "httpStatus": 200,
      "server": "Netlify",
      "bodyBytes": 56057,
      "title": "Example website",
      "responseMs": 210,
      "errorReason": null
    }
  ],
  "previousOriginsReason": null,
  "diagnosis": {
    "summary": "Public DNS appears to use a CDN edge, but the stronger signal is that the HostUp origin returns 404 while a previous origin still returns a working site.",
    "confidence": "high",
    "evidence": [
      "Current public HTTPS response appears to be served through cloudflare.",
      "HostUp origin 185.113.11.10 returned HTTP 404.",
      "Previous origin 18.208.88.157 returned HTTP 200."
    ]
  }
}