Change a Text Hook
Changes its name, mapping, words, sequence, or turns it or test mode on or off.
/v1/hooks/{id}
Changes its name, mapping, words, sequence, or turns it or test mode on or off. Fields left out keep their values; within mapping, too.
Needs a key with the messages:send scope.
Path parameters
idstringrequiredThe Text Hook’s id.
Starts with
hook_.
Request body
namestringUp to 80 characters.
mappingobjectShow its 5 fieldsHide its fields
tostringUp to 200 characters.
textstringUp to 2,000 characters.
first_namestringUp to 200 characters.
last_namestringUp to 200 characters.
tagsstringUp to 200 characters.
template_idstring or nullA saved template to use instead of
text.Starts with
tpl_.sequence_idstring or nullA seq_ id.
Starts with
seq_.enabledbooleantest_modeboolean
Example
/v1/hooks/hook_1Hq2LxW9cVbN3mKpRtYs0acurl -X PATCH "https://usebluebot.com/api/v1/hooks/hook_1Hq2LxW9cVbN3mKpRtYs0a" \
-H "Authorization: Bearer $BLUEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"test_mode": false
}'Response
200: The changed Text Hook.
idstringrequiredA hook_ id.
Starts with
hook_.object"text_hook"requirednamestringrequiredurlstringrequiredThe address to post to. Anyone with it can send texts from your number, so keep it private.
enabledbooleanrequiredtest_modebooleanrequiredPosts are recorded and checked but no text is sent.
mappingobjectrequiredHow a post becomes a text. Each value is a template over the posted fields:
bodyfor the JSON or form,queryfor the address’s query string.Show its 5 fieldsHide its fields
tostring or nullrequiredWho to text, as a
{{body.…}}path into the posted fields.Up to 200 characters.
textstring or nullrequiredThe words, with
{{body.…}}fields. Leave it empty to usetemplate_id.Up to 2,000 characters.
first_namestring or nullrequiredSaved on the contact when it has no first name yet.
Up to 200 characters.
last_namestring or nullrequiredUp to 200 characters.
tagsstring or nullrequiredTags to add, separated by commas. May use
{{body.…}}fields.Up to 200 characters.
template_idstring or nullrequiredsequence_idstring or nullrequiredA sequence each person is added to.
Starts with
seq_.last_used_attimestamp or nullrequiredWhen it last received a post.
created_attimestamprequiredWhen it was made.
{
"id": "hook_1Hq2LxW9cVbN3mKpRtYs0a",
"object": "text_hook",
"name": "Calendly bookings",
"url": "https://usebluebot.com/h/th_8Rk2mQ4zN7wX1cVbL5pT9yHsQ2aVc0Ld",
"enabled": true,
"test_mode": false,
"mapping": {
"to": "{{body.payload.questions_and_answers.0.answer}}",
"text": "Hi {{body.payload.name}}, you’re booked for {{body.payload.scheduled_event.start_time}}. Text back if anything changes.",
"first_name": "{{body.payload.first_name}}",
"last_name": "{{body.payload.last_name}}",
"tags": "calendly"
},
"template_id": null,
"sequence_id": null,
"last_used_at": "2026-11-13T18:02:00.000Z",
"created_at": "2026-11-03T16:00:00.000Z"
}Errors
Every refusal has the same envelope and a page of its own. These are the ones this operation can give.
| Code | Status | What it means |
|---|---|---|
| 401 | The request carried no key, or a key BlueBot doesn’t know: mistyped, revoked, or a test key sent to the live API. | |
| 403 | The key doesn’t carry the scope the endpoint needs. Each endpoint’s reference names its scope. | |
| 429 | Too many requests. A key may make 120 requests a minute. The RateLimit header says how many are left, and Retry-After how long to wait. | |
| 500 | Something went wrong on BlueBot’s side. It was reported. Send the request again; with an Idempotency-Key that is always safe. | |
| 400 | Something in the request doesn’t fit: a missing or malformed field, a bad id, or a combination the endpoint refuses. details names each field. | |
| 404 | There is no such thing on this account. Ids are prefixed by kind, so a message id starts with msg_. |
Try it
Call this operation from the page with your own key. The key stays in this tab and is forgotten when you leave.