---
title: "Register a custom hostname for this organization’s package apps (Cloudflare for SaaS)."
method: POST
path: "/v1/orgs/package-app-custom-hostnames"
tags: ["account"]
---

# Register a custom hostname for this organization’s package apps (Cloudflare for SaaS).

`POST /v1/orgs/package-app-custom-hostnames`

## Request

- Base URL: `https://api.kody.codes`
- URL: `https://api.kody.codes/v1/orgs/package-app-custom-hostnames`
- Auth: HTTP bearer

Register a custom hostname for this organization’s package apps (Cloudflare for SaaS). App-level hostnames apply to one internet-visible public app and serve it at the host root. Org-level hostnames apply to private apps and serve them at /packages/{kodyId} on the custom host. Only org admins on a paid plan may add domains. Point DNS (usually a CNAME) at the package-app zone before verification completes. Optional ssl_method=txt pre-validates the certificate via TXT before traffic switches.

Org permission: `org:write`.

## Request body

- object
  - `hostname` string, required: Customer hostname to register.
  - `binding_kind` 'app' | 'org', required: app = one public internet-visible app; org = private apps.
  - `package_id` string: Required when binding_kind is app.
  - `ssl_method` 'http' | 'txt': Cloudflare SSL validation method. Default http. Use txt for pre-validation before switching traffic.

## Response `200`

Success.

- object
  - `hostname` object, required
    - `id` string, required
    - `hostname` string, required
    - `binding_kind` 'app' | 'org', required
    - `package_id` string, nullable, required
    - `org_id` string, nullable, required
    - `hostname_status` string, required
    - `ssl_status` string, required
    - `verified_at` string, nullable, required
    - `dns_missing_since` string, nullable, required
    - `verification` object, required
      - `ownership_verification` object, nullable, required
        - `type` string, required
        - `name` string, required
        - `value` string, required
      - `ssl_validation_records` object[], required
        - `type` string, required
        - `name` string, required
        - `value` string, required
    - `created_at` string, required
    - `updated_at` string, required
  - `dns` object, required
    - `type` 'CNAME', required
    - `name` string, required
    - `target` string, nullable, required
  - `verification` object, required
    - `ownership_verification` object, nullable, required
      - `type` string, required
      - `name` string, required
      - `value` string, required
    - `ssl_validation_records` object[], required
      - `type` string, required
      - `name` string, required
      - `value` string, required
  - `billing_note` string, nullable, required

## Other responses

- `400`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `401`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `403`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `404`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `409`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `413`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `429`: Too many requests (edge IP/token limit) or an entitlement / plan-cap limit. Wait at least `Retry-After` seconds before retrying.
- `500`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `503`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `default`: Error envelope `{ "error": { "code", "message", "details"? } }`.

---

[API](https://skmtc.dev/kody/apis/kody-api.md) · [All operations](https://skmtc.dev/kody/apis/kody-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kody/apis/kody-api/revisions/705f4f022728?raw)
