at.happyproto.server.checkDomain

happyproto.at

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "altRecord": {
      "properties": {
        "type": {
          "description": "A.",
          "type": "string"
        },
        "value": {
          "description": "The instance host's public IPv4.",
          "type": "string"
        }
      },
      "required": [
        "type",
        "value"
      ],
      "type": "object"
    },
    "checks": {
      "properties": {
        "checkedAt": {
          "description": "When the check ran.",
          "type": "string"
        },
        "ownership": {
          "description": "Whether the TXT record carries this claim's token.",
          "knownValues": [
            "ok",
            "missing",
            "error"
          ],
          "type": "string"
        },
        "pointing": {
          "description": "Whether the hostname resolves to the instance's host. Absent when the check didn't get that far, such as when the TXT record was missing.",
          "knownValues": [
            "ok",
            "elsewhere",
            "error"
          ],
          "type": "string"
        }
      },
      "required": [
        "ownership",
        "checkedAt"
      ],
      "type": "object"
    },
    "domain": {
      "description": "A custom domain on one of the caller's instances.",
      "properties": {
        "checks": {
          "description": "The latest DNS check. Absent until the first check has run.",
          "ref": "#checks",
          "type": "ref"
        },
        "createdAt": {
          "description": "When the domain was added.",
          "type": "string"
        },
        "expiresAt": {
          "description": "When a pending claim expires if it is never verified. Absent once verified.",
          "type": "string"
        },
        "hostname": {
          "description": "The hostname, lowercase, internationalized names in punycode.",
          "type": "string"
        },
        "id": {
          "description": "The domain's UUID.",
          "type": "string"
        },
        "lapsesAt": {
          "description": "When HappyProto stops serving the domain if its TXT record stays missing. Absent while the record is present.",
          "type": "string"
        },
        "primary": {
          "description": "Whether this is the instance's primary domain, the one its PUBLIC_URL follows.",
          "type": "boolean"
        },
        "records": {
          "description": "The DNS records the customer publishes: the TXT that proves ownership, then the CNAME that points the hostname at the instance.",
          "items": {
            "ref": "#record",
            "type": "ref"
          },
          "type": "array"
        },
        "serving": {
          "description": "Whether the domain actually works: off until it is verified, issuing while its certificate is ordered, live once it serves over HTTPS.",
          "knownValues": [
            "routing",
            "issuing",
            "live",
            "failed",
            "off"
          ],
          "type": "string"
        },
        "state": {
          "description": "pending: waiting for the DNS records. verified: proven and served. lapsed: the TXT record went missing, and HappyProto stopped serving it; it recovers if the record comes back before expiresAt.",
          "knownValues": [
            "pending",
            "verified",
            "lapsed"
          ],
          "type": "string"
        },
        "verifiedAt": {
          "description": "When the domain was first verified.",
          "type": "string"
        }
      },
      "required": [
        "id",
        "hostname",
        "state",
        "primary",
        "records",
        "serving",
        "createdAt"
      ],
      "type": "object"
    },
    "main": {
      "description": "Check a custom domain's DNS records now, rather than at the next scheduled check. Customers only.",
      "errors": [
        {
          "description": "This endpoint requires an authenticated caller.",
          "name": "AuthRequired"
        },
        {
          "description": "The caller is not a HappyProto customer, or the provisioner refused them.",
          "name": "Forbidden"
        },
        {
          "description": "instanceId, domainId or idempotencyKey is not a UUID.",
          "name": "InvalidRequest"
        },
        {
          "description": "No such instance or domain, or it is not the caller's. The cases are indistinguishable.",
          "name": "NotFound"
        },
        {
          "description": "Custom domains are not switched on yet.",
          "name": "NotAvailable"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "InvalidSlug"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "SlugTaken"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "NotEntitled"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "InstanceLimit"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "NoCapacity"
        },
        {
          "description": "Passed through from the provisioner: the instance is already changing, or a request with this idempotencyKey is still running.",
          "name": "OperationInProgress"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "InvalidHostname"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "PlatformHostname"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "DomainExists"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "DomainLimit"
        },
        {
          "description": "The domain was checked moments ago. Wait a few seconds and try again.",
          "name": "TooSoon"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "DomainIsPrimary"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "NotVerified"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "CertificateNotReady"
        },
        {
          "description": "Passed through from the provisioner.",
          "name": "VersionTooOld"
        },
        {
          "description": "The provisioner is unreachable, not configured, or answered with an error it does not explain to callers, or the job could not be started.",
          "name": "Upstream"
        }
      ],
      "input": {
        "encoding": "application/json",
        "schema": {
          "properties": {
            "domainId": {
              "description": "The domain's UUID.",
              "type": "string"
            },
            "idempotencyKey": {
              "description": "A UUID the client generates once per intended change and resends on every retry of it, so a retry gets the original reply instead of acting twice.",
              "type": "string"
            },
            "instanceId": {
              "description": "The instance's UUID.",
              "type": "string"
            }
          },
          "required": [
            "instanceId",
            "domainId",
            "idempotencyKey"
          ],
          "type": "object"
        }
      },
      "output": {
        "encoding": "application/json",
        "schema": {
          "properties": {
            "domain": {
              "ref": "#domain",
              "type": "ref"
            }
          },
          "required": [
            "domain"
          ],
          "type": "object"
        }
      },
      "type": "procedure"
    },
    "record": {
      "properties": {
        "alt": {
          "description": "For an apex name, which cannot hold a CNAME: the A record to publish instead. Absent when the instance's host has no public IPv4.",
          "ref": "#altRecord",
          "type": "ref"
        },
        "name": {
          "description": "The record's name.",
          "type": "string"
        },
        "type": {
          "description": "TXT or CNAME.",
          "type": "string"
        },
        "value": {
          "description": "The record's value.",
          "type": "string"
        }
      },
      "required": [
        "type",
        "name",
        "value"
      ],
      "type": "object"
    }
  },
  "id": "at.happyproto.server.checkDomain",
  "lexicon": 1
}

Validate Record

Validate a record against at.happyproto.server.checkDomain

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:mo7vq4jbioxwafy5zkcc3eux
CID
bafyreicougfofnggjnjferdwhmbrcmtxxumvtpn7aunfj374py32burp2i
Indexed At
2026-10-29 15:52 UTC
AT-URI
at://did:plc:mo7vq4jbioxwafy5zkcc3eux/com.atproto.lexicon.schema/at.happyproto.server.checkDomain

Version History (2 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • Add a custom domain to one of the caller's instances. It starts pending, with the DNS records to publish. Customers only.

  • The domains of one of the caller's instances: its platform subdomain and any custom domain. Customers only.

  • place.wisp.v2.domain.verify procedurenot from the namespace authority

    Run DNS verification for a custom domain owned by the authenticated DID and update its verified status.

  • Make a domain the primary of one of the caller's instances: a verified custom domain that is serving, or the platform subdomain. The instance restarts onto it. Customers only.

  • Everything a client needs to onboard one domain: registration state, DNS records to publish, last verification result, and certificate state. This is the endpoint to poll.

Lexicon Garden

@