ghl_clientportal_plan_project_change
Validate a planned client portal change of one kind and sign it into a plan before applying, so you can preview what records, modules, appearance, mobile, assets, or domain edits would do without writing anything.
Instructions
CLIENT PORTAL AI BUILDER API (/ai-builder-api) — side-effecting: opens/edits sandboxes and starts builds. Edit a sandbox only once sandbox.status is ready; checkpoint after edits and before starting the run that builds them; 409 means a cloud build owns the sandbox or it is not running.
Check a change of one kind and sign a plan for it, without writing anything.
The caller's AI writes a change of one kind; the server validates it
against that kind's schema and against what exists now (CRM, modules,
saved customization) and answers what applying it would do. Nothing is
written and no model is called. planId is a signed token over
{projectId, locationId, kind, changeHash} that expires at expiresAt;
it is null when ok is false. The location is the session's, never
the body's. Kinds: records, modules, appearance, mobile,
assets, domain; any other kind is 400 unsupported_change_kind
naming the supported ones. assets plans also return upload: PUT the
image bytes to upload.url with upload.headers, then apply (apply is
409 customizer_image_not_uploaded until they land, and the plan stays
open). domain apply returns the DNS records to add in
result.dnsRecords; GET /custom-domains reports when it is active.
Endpoint: POST /ai-builder-api/projects/{projectId}/changes/plan (Version header: v3; source: v3/clientportal-ai-v3.json)
OAuth scopes: clientportal-ai.write
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body (schema carried verbatim from the official OpenAPI spec). | |
| projectId | Yes | The project's id. |