Skip to the page

API reference

Get a contact

One contact, with their tags, custom fields and whether they are on your stop list.

GET/v1/contacts/{id}

One contact, with their tags, custom fields and whether they are on your stop list.

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

Path parameters

  • idstringrequired

    The contact’s id.

    Starts with ct_.

Example

GET/v1/contacts/ct_1Hq2LxW9cVbN3mKpRtYs0aGet a contact →
curl "https://usebluebot.com/api/v1/contacts/ct_1Hq2LxW9cVbN3mKpRtYs0a" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY"

Response

200: The contact.

  • idstringrequired

    A ct_ id.

    Starts with ct_.

  • object"contact"required
  • handlestringrequired

    A phone number in E.164 (+15555550123) or an email address an Apple ID uses (iMessage only).

  • kindstringrequired

    phone or email.

    One of phone, email.

  • first_namestring or nullrequired
  • last_namestring or nullrequired
  • companystring or nullrequired
  • tagsarray of stringsrequired

    The contact’s tags.

  • custom_fieldsmap of stringrequired

    Your own fields, for templates.

  • stoppedbooleanrequired

    True when the person is on your stop list. Texts to them are canceled.

  • stopped_attimestamp or nullrequired

    When they were put on the stop list.

  • stop_sourcestring or nullrequired

    How: reply (they texted a stop word), dashboard, api, import or admin.

    One of reply, dashboard, api, import, admin.

  • last_servicestring or nullrequired

    The service of the newest text with them.

    One of imessage, sms.

  • first_message_attimestamp or nullrequired

    The first text either way. Null for somebody you have never texted with, who counts as a new person.

  • last_message_attimestamp or nullrequired

    The newest text either way.

  • created_viastringrequired

    What first added them.

    One of message, inbound, import, api, dashboard, widget, hook, mcp, assistant.

  • created_attimestamprequired

    When the contact was added.

Response200
{
  "id": "ct_1Hq2LxW9cVbN3mKpRtYs0a",
  "object": "contact",
  "handle": "+15555550123",
  "kind": "phone",
  "first_name": "Maria",
  "last_name": "Alvarez",
  "company": null,
  "tags": [
    "buyer"
  ],
  "custom_fields": {
    "showing": "412 Oak St"
  },
  "stopped": false,
  "stopped_at": null,
  "stop_source": null,
  "last_service": "imessage",
  "first_message_at": "2026-11-02T15:20:00.000Z",
  "last_message_at": "2026-11-13T19:41:00.000Z",
  "created_via": "message",
  "created_at": "2026-11-02T15:20: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.