Skip to main content
Client App BuilderVersion: v3

Check a change of one kind and sign a plan for it, without writing anything.

POST/ai-builder-api/projects/{projectId}/changes/plan

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.

Authorizations

Authorizationstringheaderrequired

Bearer authentication header of the form Bearer <token>, where <token> is your access token.

Scope:clientportal-ai.write
Auth methods:OAuthPrivate Integration
Token type:Sub-Account Token

Request​

Headers

Versionstringrequired

The API version.

Available optionsv3
Example:v3

Path Parameters

projectIdstringrequired

The project's id.

Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$

Example:prj_5f0c2a3e

Body

kindstringrequired

records, modules, appearance, mobile, assets or domain.

Possible values: Value must match regular expression ^[a-z][a-z_]{0,39}$

Example:modules
changeobjectrequired

The change, in the shape GET /changes/schema gives for kind.

Response

The checked plan, or the problems to fix first.

planIdstring | nullnullablerequired

Signed, expiring plan id; null when ok is false.

Example:cp1.eyJwIjoicHJqXzVmMGMyYTNlIn0.c2lnbmF0dXJl
okbooleanrequired

True when the change is valid and can be applied.

Example:true
summarystringrequired

The change, in one line.

Example:Turns off Communities
diffstring[]required

What apply would do, one line per step, in order.

Example:["Turn off the Communities module"]
errorsobject[]required

Why the change cannot be applied, when ok is false.

warningsstring[]required

Things to know before applying; they do not block it.

Example:["Members lose access to their community posts"]
expiresAt(string | null)<date-time>nullablerequired

When planId stops working; null when ok is false.

Example:2026-10-15T10:30:00.000Z
uploadobject

Where to upload the file the change needs, for a change that needs one.