changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$defs": {
+ "Comparison": {
+ "description": "Revisit current standard prices with supported website filters. Omits proposed names and API pagination; does not save prices or availability.",
+ "properties": {
+ "omittedParameters": {
+ "description": "Estimate horizons outside 2, 3, 5 and 10 years use the website default. Favorites are browser-local preferences and are never written by a link. Disclose omitted settings.",
+ "items": {
+ "enum": [
+ "years",
+ "favorites"
+ ]
+ },
+ "type": "array"
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "required": [
+ "url",
+ "omittedParameters"
+ ],
+ "type": "object"
+ },
+ "Coverage": {
+ "properties": {
+ "error": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "freshOffers": {
+ "type": "integer"
+ },
+ "notCompared": {
+ "items": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "partial": {
+ "type": "boolean"
+ },
+ "scope": {
+ "type": "string"
+ },
+ "sources": {
+ "items": {
+ "$ref": "#/$defs/Source"
+ },
+ "type": "array"
+ },
+ "totalOffers": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "scope",
+ "totalOffers",
+ "freshOffers",
+ "sources",
+ "notCompared",
+ "partial"
+ ],
+ "type": "object"
+ },
+ "Envelope": {
+ "properties": {
+ "apiVersion": {
+ "type": "string"
+ },
+ "availability": {
+ "const": "not_checked"
+ },
+ "coverage": {
+ "$ref": "#/$defs/Coverage"
+ },
+ "currency": {
+ "const": "USD"
+ },
+ "generatedAt": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "limits": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "service": {
+ "$ref": "#/$defs/ServiceInformation"
+ }
+ },
+ "required": [
+ "service",
+ "apiVersion",
+ "generatedAt",
+ "currency",
+ "coverage",
+ "limits"
+ ],
+ "type": "object"
+ },
+ "Error": {
+ "properties": {
+ "apiVersion": {
+ "type": "string"
+ },
+ "error": {
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "retryAfterSeconds": {
+ "minimum": 0,
+ "type": "number"
+ }
+ },
+ "required": [
+ "code",
+ "message"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "apiVersion",
+ "error"
+ ],
+ "type": "object"
+ },
+ "HistoryStep": {
+ "properties": {
+ "approximate": {
+ "description": "Converted to USD from another currency.",
+ "type": "boolean"
+ },
+ "archiveUrl": {
+ "format": "uri",
+ "type": "string"
+ },
+ "cents": {
+ "description": "Integer USD cents; 1000 = USD 10.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "changedAfter": {
+ "description": "The previous price was last seen then: the change happened between this and from.",
+ "format": "date-time",
+ "type": "string"
+ },
+ "firstRecord": {
+ "description": "No earlier record; the price may be older than from.",
+ "type": "boolean"
+ },
+ "from": {
+ "description": "When this price was first seen.",
+ "format": "date-time",
+ "type": "string"
+ },
+ "lastConfirmed": {
+ "description": "Archived prices: the last archived copy still showing this price.",
+ "format": "date-time",
+ "type": "string"
+ },
+ "regularCents": {
+ "description": "Published regular price while this price is a promotion.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "source": {
+ "description": "refresh: our scheduled refresh (since 2026-09-28). archive: the registrar’s own price page as copied by the Internet Archive.",
+ "enum": [
+ "refresh",
+ "archive"
+ ]
+ },
+ "to": {
+ "description": "When the next price or a removal was first seen; null while current.",
+ "format": "date-time",
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "from",
+ "to",
+ "cents",
+ "approximate",
+ "source",
+ "firstRecord"
+ ],
+ "type": "object"
+ },
+ "PriceHistory": {
+ "allOf": [
+ {
+ "$ref": "#/$defs/Envelope"
+ },
+ {
+ "properties": {
+ "comparison": {
+ "$ref": "#/$defs/Comparison"
+ },
+ "historyStart": {
+ "format": "date-time",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "notes": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "pageUrl": {
+ "format": "uri",
+ "type": "string"
+ },
+ "price": {
+ "enum": [
+ "renewal",
+ "registration"
+ ]
+ },
+ "registrars": {
+ "items": {
+ "properties": {
+ "changes": {
+ "minimum": 0,
+ "type": "integer"
+ },
+ "current": {
+ "description": "The current step, with the same fields as steps[]; null when the registrar does not list the extension now.",
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "fetchedAt": {
+ "description": "When the current saved offer was retrieved.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "highestCents": {
+ "description": "Integer USD cents; 1000 = USD 10.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "listedNow": {
+ "type": "boolean"
+ },
+ "lowestCents": {
+ "description": "Integer USD cents; 1000 = USD 10.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "pageUrl": {
+ "format": "uri",
+ "type": "string"
+ },
+ "pricingBasis": {
+ "description": "The current saved offer’s sample label, as on price offers; absent for published price lists. Preserve it when quoting the current price.",
+ "enum": [
+ "sampled_standard",
+ "sampled_api"
+ ],
+ "type": "string"
+ },
+ "registrarId": {
+ "type": "string"
+ },
+ "registrarName": {
+ "type": "string"
+ },
+ "stale": {
+ "description": "True when the source’s last refresh failed and its saved catalog is at least 24 hours old. Passing nextRefreshAt alone does not make prices stale; a scheduled refresh every 15 minutes replaces due catalogs.",
+ "type": "boolean"
+ },
+ "steps": {
+ "items": {
+ "$ref": "#/$defs/HistoryStep"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "registrarId",
+ "registrarName",
+ "pageUrl",
+ "listedNow",
+ "current",
+ "changes",
+ "lowestCents",
+ "highestCents",
+ "steps"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "tld": {
+ "type": "string"
+ },
+ "truncated": {
+ "description": "True when only the newest periods fit one response.",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "comparison",
+ "tld",
+ "price",
+ "pageUrl",
+ "historyStart",
+ "registrars",
+ "truncated",
+ "notes"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "ServiceInformation": {
+ "description": "Cheapest Domains identity and optional setup links, separate from upstream evidence. Does not establish client installation or provider health.",
+ "properties": {
+ "name": {
+ "const": "Cheapest Domains"
+ },
+ "pluginUrl": {
+ "format": "uri",
+ "type": "string"
+ },
+ "setupUrl": {
+ "format": "uri",
+ "type": "string"
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "url",
+ "setupUrl",
+ "pluginUrl"
+ ],
+ "type": "object"
+ },
+ "Source": {
+ "properties": {
+ "error": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fetchedAt": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "freshOfferCount": {
+ "type": "integer"
+ },
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "nextRefreshAt": {
+ "description": "When the saved catalog is due for its next scheduled refresh; not an expiry of its prices.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "note": {
+ "type": "string"
+ },
+ "offerCount": {
+ "type": "integer"
+ },
+ "refresh": {
+ "description": "Progress of a staged catalog refresh, when one exists. Saved prices remain usable meanwhile.",
+ "properties": {
+ "completed": {
+ "minimum": 0,
+ "type": "integer"
+ },
+ "phase": {
+ "enum": [
+ "queued",
+ "running",
+ "waiting",
+ "paused",
+ "complete"
+ ]
+ },
+ "resumeAt": {
+ "description": "Unix time in milliseconds.",
+ "type": "integer"
+ },
+ "startedAt": {
+ "description": "Unix time in milliseconds.",
+ "type": "integer"
+ },
+ "total": {
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "phase",
+ "completed",
+ "total",
+ "startedAt",
+ "resumeAt"
+ ],
+ "type": "object"
+ },
+ "refreshing": {
+ "type": "boolean"
+ },
+ "stale": {
+ "description": "True when the source’s last refresh failed and its saved catalog is at least 24 hours old. Passing nextRefreshAt alone does not make prices stale; a scheduled refresh every 15 minutes replaces due catalogs.",
+ "type": "boolean"
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url",
+ "offerCount",
+ "freshOfferCount",
+ "stale",
+ "refreshing"
+ ],
+ "type": "object"
+ }
+ },
+ "anyOf": [
+ {
+ "$ref": "#/$defs/PriceHistory"
+ },
+ {
+ "$ref": "#/$defs/Error"
+ }
+ ],
+ "description": "Successful results are PriceHistory, the REST 200 response; results with isError: true are Error.",
+ "type": "object"
+}