curl --request PATCH \
--url https://app.thinnest.ai/api/v1/forms/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Delivery address (v2)"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Delivery address (v2)'})
};
fetch('https://app.thinnest.ai/api/v1/forms/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/forms/{id}"
payload = { "name": "Delivery address (v2)" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"id": "form_9e2c4a7b-1d5f-4c38-8b6e-0a3f7d2c9e15",
"name": "Delivery address (v2)",
"agent": "ag_2c7e9a14-5b3d-4f8e-a1c6-7d9b0e3f5a21",
"category": "CONTACT_US",
"form": {
"title": "Where should we deliver?",
"submitLabel": "Send",
"fields": [
{
"name": "address",
"label": "Full address",
"kind": "paragraph",
"required": true
},
{
"name": "pincode",
"label": "PIN code",
"kind": "number",
"required": true
}
]
},
"published": false,
"publishedAt": null,
"createdAt": "2026-10-06T10:20:51.093Z",
"updatedAt": "2026-10-06T11:02:14.208Z"
}{
"error": "`agent` cannot be changed — a form stays with the agent it was made for."
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "That form was not found."
}{
"error": "A form with that name already exists."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Update Form
Changes any of name, category and form (form is replaced whole). Any change unpublishes the form, as saving does in the console — the published copy still asks the old questions — so publish it again before sending it. A build key may do this.
curl --request PATCH \
--url https://app.thinnest.ai/api/v1/forms/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Delivery address (v2)"
}
'const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Delivery address (v2)'})
};
fetch('https://app.thinnest.ai/api/v1/forms/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/forms/{id}"
payload = { "name": "Delivery address (v2)" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"id": "form_9e2c4a7b-1d5f-4c38-8b6e-0a3f7d2c9e15",
"name": "Delivery address (v2)",
"agent": "ag_2c7e9a14-5b3d-4f8e-a1c6-7d9b0e3f5a21",
"category": "CONTACT_US",
"form": {
"title": "Where should we deliver?",
"submitLabel": "Send",
"fields": [
{
"name": "address",
"label": "Full address",
"kind": "paragraph",
"required": true
},
{
"name": "pincode",
"label": "PIN code",
"kind": "number",
"required": true
}
]
},
"published": false,
"publishedAt": null,
"createdAt": "2026-10-06T10:20:51.093Z",
"updatedAt": "2026-10-06T11:02:14.208Z"
}{
"error": "`agent` cannot be changed — a form stays with the agent it was made for."
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "That form was not found."
}{
"error": "A form with that name already exists."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Authorizations
Your API key (ta_live_…) from Settings → API keys, sent as Authorization: Bearer <key>. Keep it on a server: it can message every customer you have. A key is full, build or read-only; a request its level does not allow is refused with 403.
Headers
Developers only: the customer workspace this request acts in — its org_… id from POST /customers. Leave it out to act in your own workspace.
"org_3fKq9TzQ1mN8vB2xR7cLpA"
Path Parameters
The form's id (form_…).
Body
Any of these; at least one. agent cannot be changed.
Response
The form as saved, now unpublished.
The form's id (form_…).
What you call it. Customers never see it.
The agent it belongs to (ag_…).
WhatsApp's category for it. Affects reporting only.
SIGN_UP, APPOINTMENT_BOOKING, LEAD_GENERATION, CONTACT_US, CUSTOMER_SUPPORT, SURVEY, OTHER Show child attributes
Show child attributes
Whether it can be sent. False until published, and again after any edit until it is republished.
When it was last published.
When it was created.
When it was last changed.