Organizations

Custom domain step 3: verify platform DNS (manual TXT or Fly certificate readiness)

**Manual path (no Fly ACME):** After staff **`PATCH .../platform-dns-verification`**, the org adds the published TXT and calls this endpoint. The API resolves public TXT at **`platformDnsVerification.recordName`** and matches **`recordValue`**. On success, `status` → **`platform_dns_pending_review`** until staff **`POST .../activate`**. **Fly ACME path (default):** When Fly ACME is enabled and **`CUSTOM_DOMAIN_FLY_LEGACY_STAFF_PIPELINE`** is **not** set, the org calls this after Mudbase TXT and Fly DNS rows are in place (status typically **`cname_approved`** from automated verify-dns). The API triggers Fly **`POST .../check`** and **`GET`** certificate with bounded retries. On success, `status` → **`active`** and the org may receive the activation email—**no** staff **`approve-cname`** or **`activate`** required. **Fly legacy:** If **`CUSTOM_DOMAIN_FLY_LEGACY_STAFF_PIPELINE=true`**, behavior matches the older flow: staff **`approve-cname`** may be required first; after a ready Fly cert, **`status`** becomes **`active`** only when **`CUSTOM_DOMAIN_FLY_AUTO_ACTIVATE=true`**, else **`platform_dns_pending_review`** until staff **`activate`**. **`platform_dns_verification_failed`** may include **`details.flyStatus`** / **`details.flyError`** on the Fly path.

AuthBearer (JWT)
GroupOrganizations
Rate limitSee Rate Limits
POST/api/orgs/{orgId}/projects/{projectId}/domains/{hostname}/verify-platform-dns

SDK setup

Create a client and set credentials (JWT and/or API key) before calling the API. Match the authentication type shown above.

import { Configuration, OrganizationsApi } from 'mudbase-sdk';

const configuration = new Configuration({
  basePath: 'https://cloud.mudbase.dev',
  accessToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfbW9yZ2FuX2RlIiwiZW1haWwiOiJtb3JnYW4uY2hlbkBub3J0aHdpbmQuZGV2IiwiZXhwIjoxODI1MTI5NjAwfQ.doc_preview_sig',
});

const organizations = new OrganizationsApi(configuration);
import { Configuration, OrganizationsApi } from 'mudbase-sdk';

const configuration = new Configuration({
  basePath: 'https://cloud.mudbase.dev',
  accessToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfbW9yZ2FuX2RlIiwiZW1haWwiOiJtb3JnYW4uY2hlbkBub3J0aHdpbmQuZGV2IiwiZXhwIjoxODI1MTI5NjAwfQ.doc_preview_sig',
});

const organizations = new OrganizationsApi(configuration);

Example request

Call this endpoint using the client from SDK setup. Use View HTTP for a raw cURL example.

const { data: result } = await organizations.orgCustomDomainVerifyPlatformDns("org_GuxlF5PyuM", "proj_FkQC8cE9YNwx", "Doyle Wilderman");
const { data: result } = await organizations.orgCustomDomainVerifyPlatformDns("org_GuxlF5PyuM", "proj_FkQC8cE9YNwx", "Doyle Wilderman");

Playground

live

Test this endpoint with your own credentials. Your requests will be sent to the live API.

Use the auth endpoints to obtain a JWT.

No Request Yet

Send a request to see the full inspector

Authentication

Requires JWT
Note
Include your JWT in the Authorization: Bearer YOUR_TOKEN header (user-facing apps, RBAC). View authentication guide →

Path Parameters

NameTypeRequiredDescription
orgIdstringYes
projectIdstringYes
hostnamestringYes

Responses

200Domain row updated (`OrgPatchDomainResponse.domain`). Manual TXT path typically sets `platform_dns_pending_review`. Fly ACME default automation: typically `active` when the certificate is ready. Fly legacy staff pipeline: may set `platform_dns_pending_review` unless `CUSTOM_DOMAIN_FLY_AUTO_ACTIVATE` is enabled. Body may include refreshed `dnsRecords` and `flyCertificateStatus` on the Fly path.
json
{
  "success": true,
  "domain": {
    "_id": "hZnryo8KvYooSGj4",
    "hostname": "Isaias Mann",
    "status": "bandwidth quantify",
    "isPrimary": false,
    "source": "api",
    "createdAt": "2026-07-14T07:18:02.156Z",
    "verifiedAt": "2026-07-18T22:04:03.218Z",
    "lastVerifiedAt": "2026-06-12T17:52:35.550Z",
    "cnameSubmittedAt": "2026-06-07T10:42:43.168Z",
    "cnameApprovedAt": "2026-06-20T06:32:05.674Z",
    "customDomainVerificationStep": 67788,
    "routingCnameTarget": "Katrina Crona",
    "dnsRecords": [
      {
        "type": "hard drive quantify",
        "name": "Jacky Howe",
        "value": "microchip parse",
        "purpose": "feed navigate"
      }
    ],
    "platformActivationPending": false,
    "customDomainLiveForApiTraffic": true,
    "cloudflareEdge": {
      "saasIntegrationEnabled": true,
      "skipped": false,
      "reason": "pixel reboot",
      "customHostnameId": "Miss Alexis Jacobson-Renner",
      "hostnameStatus": "Joshua Mitchell",
      "sslStatus": "transmitter input",
      "ownershipVerification": {
        "name": "Jamie Cummings",
        "type": "panel back up",
        "value": "microchip input"
      },
      "sslValidationRecords": [
        {
          "txtName": "Miss Roma Mante",
          "txtValue": "pixel copy",
          "httpUrl": "https://unkempt-ice-cream.com",
          "httpBody": "application override",
          "cname": "Zachary Kub",
          "cnameTarget": "Sheldon Mann"
        }
      ],
      "lastError": "interface reboot",
      "instructions": "array synthesize"
    },
    "flyCertificateStatus": "driver synthesize",
    "platformDnsVerification": {
      "recordType": "circuit navigate",
      "recordName": "Toby Mosciski",
      "recordValue": "circuit override",
      "ttlSeconds": 91387,
      "staffNote": "alarm quantify",
      "updatedAt": "2026-07-19T16:37:33.303Z"
    },
    "platformDnsVerificationSubmittedAt": "2026-07-04T19:36:05.663Z"
  },
  "dnsVerificationInstructions": "bandwidth reboot"
}
{
  "success": true,
  "domain": {
    "_id": "hZnryo8KvYooSGj4",
    "hostname": "Isaias Mann",
    "status": "bandwidth quantify",
    "isPrimary": false,
    "source": "api",
    "createdAt": "2026-07-14T07:18:02.156Z",
    "verifiedAt": "2026-07-18T22:04:03.218Z",
    "lastVerifiedAt": "2026-06-12T17:52:35.550Z",
    "cnameSubmittedAt": "2026-06-07T10:42:43.168Z",
    "cnameApprovedAt": "2026-06-20T06:32:05.674Z",
    "customDomainVerificationStep": 67788,
    "routingCnameTarget": "Katrina Crona",
    "dnsRecords": [
      {
        "type": "hard drive quantify",
        "name": "Jacky Howe",
        "value": "microchip parse",
        "purpose": "feed navigate"
      }
    ],
    "platformActivationPending": false,
    "customDomainLiveForApiTraffic": true,
    "cloudflareEdge": {
      "saasIntegrationEnabled": true,
      "skipped": false,
      "reason": "pixel reboot",
      "customHostnameId": "Miss Alexis Jacobson-Renner",
      "hostnameStatus": "Joshua Mitchell",
      "sslStatus": "transmitter input",
      "ownershipVerification": {
        "name": "Jamie Cummings",
        "type": "panel back up",
        "value": "microchip input"
      },
      "sslValidationRecords": [
        {
          "txtName": "Miss Roma Mante",
          "txtValue": "pixel copy",
          "httpUrl": "https://unkempt-ice-cream.com",
          "httpBody": "application override",
          "cname": "Zachary Kub",
          "cnameTarget": "Sheldon Mann"
        }
      ],
      "lastError": "interface reboot",
      "instructions": "array synthesize"
    },
    "flyCertificateStatus": "driver synthesize",
    "platformDnsVerification": {
      "recordType": "circuit navigate",
      "recordName": "Toby Mosciski",
      "recordValue": "circuit override",
      "ttlSeconds": 91387,
      "staffNote": "alarm quantify",
      "updatedAt": "2026-07-19T16:37:33.303Z"
    },
    "platformDnsVerificationSubmittedAt": "2026-07-04T19:36:05.663Z"
  },
  "dnsVerificationInstructions": "bandwidth reboot"
}
400custom_domain_invalid_state, platform_dns_verification_failed (manual TXT mismatch or Fly cert not active yet; see response details on Fly path)
401Unauthorized
403Forbidden
503dns_lookup_error

Errors

CodeMeaning
400custom_domain_invalid_state, platform_dns_verification_failed (manual TXT mismatch or Fly cert not active yet; see response details on Fly path)
401Unauthorized
403Forbidden
503dns_lookup_error
Edit this page on GitHub