design_custom_code_get — read advanced code and availability
[Migration map](../reference/tool-name-migration.md).
# design_custom_code_get — read advanced code and availability
Read the selected channel's CSS, head/body JavaScript, head HTML, revision, and editing availability before planning a change with [design_custom_code_apply](publ_design_custom_code_apply.md).
## Input and prerequisites
The input is `channelCode`, a nonempty string identifying the selected channel. Obtain it through the [directory guide](../guides/channel-directory.md) or the bound hosted resource. Do not substitute a numeric channel ID, URL, credential or environment name.
```json
{"channelCode":"selected-channel-code"}
```
Replace the placeholder with a current channel code. This is an input example, not an executed result.
The HTTP adapter requires a current connection, the selected channel's credential, a matching channel response, an OWNER/DELEGATEE account role, and a configured CHANNEL_ENV origin. Hosted calls must use the bound channel. Availability does not bypass these guards.
## Inputs
This tool takes no input fields.
## Result
A successful `CUSTOM_CODE` result contains `environment`, `channel`, the fields below, `availability`, and `verification:{confirmed:true,method:custom_code_read}`. It also describes the immediate effect of saved code and the need for separate rendering verification.
| Field | Meaning |
| --- | --- |
| `initialized` | Whether the shared custom-settings object exists. |
| `revision` | Lowercase SHA-256 value to pass unchanged to apply for this channel. |
| `css` | Stored CSS source. |
| `headJavaScript`, `bodyJavaScript` | JavaScript decoded from the editor's storage escaping. Pass raw source to apply. |
| `headHtml` | Stored head HTML source. |
| `availability.css` | Always `true` after the preceding context/read guards succeed; independent of the scripts/HTML plan and domain gate. |
| `availability.scriptsAndHtml` | `allowed`, `reason`, and the plan/domain name/domain status when known. |
Only a 404 from the custom-settings GET is treated as absent settings: `initialized:false`, four empty code strings, and a revision for absence. Missing or null individual code fields in a valid object normalize to empty strings. An invalid envelope, a wrong channel ID or a wrong field type fails with `DESIGN_RESPONSE_UNVERIFIED`. Absence differs from an initialized object whose four fields are empty.
The revision hashes the ordered array of all four normalized **stored** fields, including storage-escaped JavaScript, or `null` for absence. It excludes theme tone/palette, plan and domain availability. Do not recalculate it from the displayed decoded source or treat it as proof of current access.
## JavaScript and HTML availability
CSS is independent of this gate. JavaScript and HTML require one of these exact plan values:
- `NORMAL_BUSINESS`
- `NORMAL_PRO`
- `NORMAL_FROM_ENTERPRISE`
- `ENTERPRISE_TRIAL`
- `ENTERPRISE_ENTERPRISE`
- `PARTNER_TRIAL`
- `PARTNER_PARTNER`
- `INTERNAL_INTERNAL`
An eligible plan also requires the configured DNS origin and a connected-domain response with `status:ACTIVATED` and a nonempty `domainName`.
| Reason | Interpretation |
| --- | --- |
| `AVAILABLE` | The plan and returned domain metadata satisfy the bridge's gate. |
| `PLAN_UNVERIFIED` | No usable current plan was returned. |
| `PLAN_UNAVAILABLE` | The plan is outside the allowed set. |
| `DNS_ORIGIN_REQUIRED` | The operator has not configured the domain-service origin. |
| `DOMAIN_NOT_CONNECTED` | The domain lookup returned HTTP 404. |
| `DOMAIN_NOT_ACTIVATED` | The domain response does not satisfy both activation and nonempty-name conditions. |
| `DOMAIN_UNVERIFIED` | The domain response is malformed or the lookup produced another handled service error. |
## Requests and boundaries
After resolving channel context through the general API, the adapter reads `GET /seller/api/v1/channel-management/custom` at CHANNEL_ENV. For eligible plans with a configured DNS origin, it also reads `GET /seller/api/v2/managed-domains/channel-connected-domain` there. These selected-channel requests use the channel bearer and channel-ID header; the caller does not supply either as a tool argument.
Get creates no job, initializes no settings, writes no code and refreshes no credentials. Non-demo get results can include the centrally configured `/channels/{encodedChannelCode}/design/custom/css` console link. That link does not prove navigation or code rendering works.
Missing authentication can require a human login. Missing channel credentials, target mismatch, role denial and missing CHANNEL_ENV fail before a valid code result. Unlike the custom-settings GET's 404, context/authentication/other read failures must not be interpreted as empty code. See [common results](../reference/results.md) for wrapper and error conventions.