---
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`

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

---

[API](https://skmtc.net/kong/apis/konnect-api.md) · [All operations](https://skmtc.net/kong/apis/konnect-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/kong/konnect-api/revisions/06734a9c491f/schema)
