Domains

Adds a domain to your account with the capabilities you want.

Pass registration to buy the domain through Whop; it's the default when you pass no capability. Pay its amount_due at purchase_url, or pass registration.payment_method_id to charge a saved card. Whop then registers it, runs its DNS, and renews it every year while auto_renew is on.

Pass registration.auth_code to transfer in a domain you own at another registrar. The transfer starts once its amount_due is paid, or at once when amount_due is null. While registration.phase is transferring, its issues say what the transfer needs from you.

Pass verification to connect a domain you registered elsewhere: its issues list the TXT and routing records to publish. Pass website with an app_id to serve that app on the domain.

To change a domain you already have, update it instead. Adding a domain this account deleted revives it under its original ID.

post/domains

Request

  • Base URL
    https://api.whop.com/api/v1
  • URL
    https://api.whop.com/api/v1/domains
  • Auth
    HTTP bearer

Headers

Idempotency-Keystring
Example:d9105228-4a08-46b1-8b91-42fed586d383

A unique key that makes this request safe to retry. See Idempotent requests.

Request body

account_idstring

Account ID, prefixed biz_. Required for user credentials; otherwise defaults to the credential's account.

apple_payobject nullable

Accept Apple Pay at checkout on the domain. It needs no other capability. Whop registers the domain with Apple: it stays pending until Apple answers, then turns ready, or action_required when Apple couldn't fetch the domain association file. Serve the file, then check the domain to register it again. Pass null to turn Apple Pay off: Whop removes the domain from Apple, and the domain stays, like releasing any other capability.

domainstring required

Bare hostname, such as example.com or checkout.example.com. A bought domain must be a root domain. Wildcards, paths, schemes, and ports are not accepted.

emailobject nullable

Send and receive email on the domain. Only a domain bought through Whop, or a subdomain of one in the same account, can have it. Whop publishes the DNS records and stays pending until its email provider verifies them, then turns ready. Pass null to remove email.

metadataobject

Custom string keys and values.

pixelobject nullable

Track page views on the domain with the Whop pixel. It needs no other capability: it stays pending until the pixel records a page view, and turns action_required if it goes 7 days without one. Pass null to stop tracking.

verificationobject nullable

Prove you control the domain's DNS: Whop returns a TXT record to publish in issues, and whoever publishes it owns the domain on Whop. Pass null to release it. Can't be combined with registration.

Example request

{
  "domain": "store.example.com",
  "metadata": {
    "project": "website"
  },
  "registration": {
    "auth_code": "Tr4nsfer-Code"
  },
  "transfer": {
    "destination": "internal"
  },
  "website": {
    "app_id": "app_xxxxxxxxxxxxxx"
  }
}

Response

Domain created

account_idstring nullable required

ID of the account the domain belongs to, prefixed biz_.

created_atstring nullable required

When the domain was created, as an ISO 8601 timestamp.

domainstring required

Normalized hostname, such as checkout.example.com.

idstring nullable required

Domain ID, prefixed dom_. null when no domain on Whop has this hostname.

metadataobject required

Custom string keys and values attached to this domain. Empty when the domain isn't yours.

status'idle' | 'pending' | 'ready' | 'action_required' | 'releasing' | 'null' nullable required

The most pressing state of the domain's capabilities: releasing, then action_required, then pending, then ready. idle when it wants nothing.

updated_atstring nullable required

When the domain was last updated, as an ISO 8601 timestamp.

Example response

{
  "account_id": "biz_xxxxxxxxxxxxxx",
  "apple_pay": {
    "state": "pending"
  },
  "availability": {
    "available": true,
    "price": {
      "amount": "-1234.56",
      "currency": "usd",
      "decimals": 2,
      "display_decimals": 2
    },
    "renewal_price": {
      "amount": "-1234.56",
      "currency": "usd",
      "decimals": 2,
      "display_decimals": 2
    },
    "score": 75,
    "transfer_price": {
      "amount": "-1234.56",
      "currency": "usd",
      "decimals": 2,
      "display_decimals": 2
    }
  },
  "created_at": "2026-01-01T12:00:00.000Z",
  "domain": "shop.com",
  "email": {
    "state": "pending"
  },
  "id": "dom_xxxxxxxxxxxxxx",
  "issues": [
    {
      "capability": "verification",
      "code": "verification_required",
      "dns_records": [
        {
          "name": "_whop.shop.example.com",
          "type": "TXT",
          "value": "whop-domain-verification=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        }
      ],
      "message": "Publish this TXT record to prove you own the domain. Verification runs automatically."
    }
  ],
  "metadata": {
    "project": "website"
  },
  "owned_by": {
    "id": "biz_xxxxxxxxxxxxxx",
    "route": "biz_xxxxxxxxxxxxxx",
    "title": "Rival Shop"
  },
  "pixel": {
    "state": "pending"
  },
  "platform": {
    "state": "pending"
  },
  "public_record": {
    "expires_at": "2026-01-01T12:00:00.000Z",
    "name_servers": [
      "ns1.example.com"
    ],
    "registered_at": "2026-01-01T12:00:00.000Z",
    "registrant": {
      "address": "Burlington\nMA",
      "contact_url": "https://registrar.example/contact/example.com",
      "country": "US",
      "organization": "Privacy Protect, LLC"
    },
    "registrar": {
      "iana_id": "9999",
      "name": "Example Registrar, Inc.",
      "url": "https://registrar.example"
    },
    "statuses": [
      "client transfer prohibited"
    ],
    "updated_at": "2026-01-01T12:00:00.000Z"
  },
  "registration": {
    "amount_due": {
      "amount": "-1234.56",
      "currency": "usd",
      "decimals": 2,
      "display_decimals": 2
    },
    "auto_renew": true,
    "method": "transfer",
    "phase": "awaiting_payment",
    "purchase_url": "https://whop.com/checkout/ch_xxxxxxxxxxxxxx/",
    "renewal_price": {
      "amount": "-1234.56",
      "currency": "usd",
      "decimals": 2,
      "display_decimals": 2
    },
    "state": "pending"
  },
  "status": "pending",
  "transfer": {
    "destination": "internal",
    "state": "ready"
  },
  "updated_at": "2026-01-01T12:00:00.000Z",
  "verification": {
    "state": "pending",
    "verification_expires_at": "2026-01-01T12:00:00.000Z"
  },
  "website": {
    "app": {
      "base_url": "https://domains-spec-site.whop.site",
      "id": "app_xxxxxxxxxxxxxx"
    },
    "state": "pending"
  }
}

Changes

    • warning

      added the new transfer enum value to the // response property for the response status

    • info

      added the new optional request property

    • info

      added the required property to the response with the status

    • info

      added the required property ///// to the response with the status