v1
latestOpenAPI 3.0.32026-07-267015229.9 KBPatch PAL
Update specific fields of a PAL using JSON Patch operations.
Draft vs live routing
If the PAL has an active PAL Builder draft, this endpoint routes to the draft by default. Live conversations, deployments, and public reads continue to use the previously-published version until you publish (POST /v2/pals/{pal_id}/publish) or repeat the request with ?target=live. PALs without an active draft are unaffected — the patch applies to the live row as it always did.
This default was introduced so an API patch and a PAL Maker edit stay in sync: the Builder reads the draft row, so a PATCH that skipped the draft would produce an editor that still shows the pre-patch state. To bypass the draft, pass ?target=live — this applies the edit to the live row and resyncs the retained draft from live. Any unpublished draft edits are discarded.
The response always includes edit_target, edited_pal_id, live_pal_id, draft_pal_id, and routing_message so you can confirm which row was written. Draft-routed responses also include publish_url. See Draft vs live PALs for the full model.
layers.conferencing is live-owned
layers.conferencing (the conferencing/Google Meet integration) is deployment config that lives on the live row so meeting invitations continue to work while a draft is open. Regardless of ?target, any patch that touches layers.conferencing (or removes layers) is applied to the live PAL and then synced into the open draft, so the draft never carries a stale conferencing config. Consequences:
- ?target=draft with a conferencing op returns 400.
- A single request cannot mix conferencing ops with edits to other fields — split the request in two.
- Publishing a stale draft never wipes deployed conferencing config; live conferencing is preserved.
Query parameters
Which row to write to when the PAL has an active PAL Builder draft.
- Omitted (default): writes to the draft if one exists, otherwise to live. Live traffic is unchanged until you publish.
- draft: same as the default. Rejected with 400 if the patch touches layers.conferencing.
- live: writes directly to the live PAL and resets the draft to match, so live becomes the single source of truth. Any unpublished draft edits are discarded.
For layers.conferencing, omit target or pass target=live. Explicit target=draft is rejected because conferencing is live-owned.
Request body
Example request
[
{
"op": "add",
"path": "/layers/llm/model",
"value": "tavus-llama-4"
}
]Response
The patched PAL body. In addition to the usual PAL fields, the response includes routing metadata so you can confirm which row was written.
Example response
{
"pal_id": "pcb7a34da5fe",
"edited_pal_id": "p5f1e8d2a934",
"edit_target": "draft",
"live_pal_id": "pcb7a34da5fe",
"draft_pal_id": "p5f1e8d2a934",
"publish_url": "/v2/pals/pcb7a34da5fe/publish",
"routing_message": "Edited the Builder draft (p5f1e8d2a934). The live PAL (pcb7a34da5fe) is unchanged and will not reflect these edits until you publish. To edit the live PAL directly, re-send with ?target=live (this discards unpublished draft edits and resyncs the draft from live)."
}