---
title: "Create Custom Domain"
method: POST
path: "/v3/portals/{portalId}/custom-domain"
tags: ["Portal Custom Domains"]
---

# Create Custom Domain

`POST /v3/portals/{portalId}/custom-domain`

## Request

- Base URL: `https://global.api.konghq.com`
- URL: `https://global.api.konghq.com/v3/portals/{portalId}/custom-domain`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer

Creates the custom domain associated with the portal. Only one custom domain can be associated with a portal at a time.

## Request body

- CreatePortalCustomDomainRequest
  - `hostname` string, required
  - `enabled` boolean, required
  - `ssl` CreatePortalCustomDomainSSL, required
    - `domain_verification_method` 'custom_certificate' | 'http'
    - `custom_certificate` string: Custom certificate to be used for the SSL termination. Only used when domain_verification_method == "custom_certificate"
    - `custom_private_key` string: Custom certificate private key to be used for the SSL termination. Only used when domain_verification_method == "custom_certificate"
    - `skip_ca_check` boolean: Advanced option. If true, the custom certificate is served exactly as provided, without attempting to bundle against a public trust store. Required for certificates issued by an internal/private CA.

## Response `201`

Portal custom domain

- PortalCustomDomain
  - `hostname` string, required
  - `enabled` boolean, required
  - `ssl` PortalCustomDomainSSL, required
    - `domain_verification_method` 'http' | 'custom_certificate', required
    - `verification_status` 'verified' | 'pending' | 'error', required
    - `validation_errors` string[]
    - `uploaded_at` string, date-time: An ISO-8601 timestamp representation of the ssl certificate upload date.
    - `expires_at` string, date-time: An ISO-8601 timestamp representation of the ssl certificate expiration date.
    - `skip_ca_check` boolean: True when the provided certificate chain is served as-is without validation against a public trust store.
  - `cname_status` 'verified' | 'pending', required
  - `created_at` string, date-time, required: An ISO-8601 timestamp representation of entity creation date.
  - `updated_at` string, date-time, required: An ISO-8601 timestamp representation of entity update date.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found

## Changes

- **2025-11-06** `5d2b35832e3f`: 1 warning, 1 info
  - added the new `type` enum value to the `allOf[subschema #2]/invalid_parameters/items/oneOf[#/components/schemas/InvalidParameterStandard]/rule` response property for the response status `400`
  - added the new optional request property `ssl/skip_ca_check`
- **2025-10-02** `ecce2daf9de6`: 5 breaking, 1 info
  - the response property `allOf[subschema #2]/invalid_parameters/items/oneOf[#/components/schemas/InvalidParameterChoiceItem]/source` became nullable for the status `400`
  - the response property `allOf[subschema #2]/invalid_parameters/items/oneOf[#/components/schemas/InvalidParameterDependentItem]/source` became nullable for the status `400`
  - the response property `allOf[subschema #2]/invalid_parameters/items/oneOf[#/components/schemas/InvalidParameterMaximumLength]/source` became nullable for the status `400`
  - the response property `allOf[subschema #2]/invalid_parameters/items/oneOf[#/components/schemas/InvalidParameterMinimumLength]/source` became nullable for the status `400`
  - …2 more
- **2025-08-12** `b2800570b3e2`: 1 info
  - the request property `ssl/domain_verification_method` became optional
- …earlier changes not shown

[Operation history](https://skmtc.dev/kong/apis/konnect-api-beta/changes/v3/portals/:portalId/custom-domain/post.md)

---

[API](https://skmtc.dev/kong/apis/konnect-api-beta.md) - [All operations](https://skmtc.dev/kong/apis/konnect-api-beta/llms.txt) - [OpenAPI document](https://skmtc.dev/kong/apis/konnect-api-beta/revisions/cef0f947e9c9?raw)
