Skip to the page

API reference

Get a Text Hook

One Text Hook with its address and mapping.

GET/v1/hooks/{id}

One Text Hook with its address and mapping.

Needs a key with the messages:read scope. Keys and scopes

Path parameters

  • idstringrequired

    The Text Hook’s id.

    Starts with hook_.

Example

GET/v1/hooks/hook_1Hq2LxW9cVbN3mKpRtYs0aGet a Text Hook →
curl "https://usebluebot.com/api/v1/hooks/hook_1Hq2LxW9cVbN3mKpRtYs0a" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY"

Response

200: The Text Hook.

  • idstringrequired

    A hook_ id.

    Starts with hook_.

  • object"text_hook"required
  • namestringrequired
  • urlstringrequired

    The address to post to. Anyone with it can send texts from your number, so keep it private.

  • enabledbooleanrequired
  • test_modebooleanrequired

    Posts are recorded and checked but no text is sent.

  • mappingobjectrequired

    How a post becomes a text. Each value is a template over the posted fields: body for the JSON or form, query for the address’s query string.

    Show its 5 fields
    • tostring or nullrequired

      Who to text, as a {{body.…}} path into the posted fields.

      Up to 200 characters.

    • textstring or nullrequired

      The words, with {{body.…}} fields. Leave it empty to use template_id.

      Up to 2,000 characters.

    • first_namestring or nullrequired

      Saved on the contact when it has no first name yet.

      Up to 200 characters.

    • last_namestring or nullrequired

      Up to 200 characters.

    • tagsstring or nullrequired

      Tags to add, separated by commas. May use {{body.…}} fields.

      Up to 200 characters.

  • template_idstring or nullrequired
  • sequence_idstring or nullrequired

    A sequence each person is added to.

    Starts with seq_.

  • last_used_attimestamp or nullrequired

    When it last received a post.

  • created_attimestamprequired

    When it was made.

Response200
{
  "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.

CodeStatusWhat it means
unauthorized401The request carried no key, or a key BlueBot doesn’t know: mistyped, revoked, or a test key sent to the live API.
insufficient_scope403The key doesn’t carry the scope the endpoint needs. Each endpoint’s reference names its scope.
rate_limited429Too 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.
internal500Something went wrong on BlueBot’s side. It was reported. Send the request again; with an Idempotency-Key that is always safe.
not_found404There 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.