/v1/contacts
Your contacts, the most recently texted first. q finds people by name, company, phone number or email, and a few digits of a number work. Filter by tag, or by stopped for the stop list.
Needs a key with the contacts:read scope.
Query parameters
qstringFind people by name, company, phone number or email. Part of one works, and each word can match a different one, so
Dana Oakfinds Dana at Oak Realty.Up to 100 characters.
tagstringOnly people with this tag.
Up to 50 characters.
stoppedstringtruefor only people on your stop list,falsefor only people who aren’t.One of
true,false.limitintegerHow many to return, 1 to 100. Default 25.
1 to 100.Default
25.cursorstringThe
next_cursorof the page before. Leave it out for the first page.Up to 200 characters.
Example
/v1/contactscurl "https://usebluebot.com/api/v1/contacts" \
-H "Authorization: Bearer $BLUEBOT_API_KEY"Response
200: A page of contacts.
object"list"requireddataarray of ContactrequiredShow its 17 fieldsHide its fields
idstringrequiredA ct_ id.
Starts with
ct_.object"contact"requiredhandlestringrequiredA phone number in E.164 (
+15555550123) or an email address an Apple ID uses (iMessage only).kindstringrequiredphoneoremail.One of
phone,email.first_namestring or nullrequiredlast_namestring or nullrequiredcompanystring or nullrequiredtagsarray of stringsrequiredThe contact’s tags.
custom_fieldsmap of stringrequiredYour own fields, for templates.
stoppedbooleanrequiredTrue when the person is on your stop list. Texts to them are canceled.
stopped_attimestamp or nullrequiredWhen they were put on the stop list.
stop_sourcestring or nullrequiredHow:
reply(they texted a stop word),dashboard,api,importoradmin.One of
reply,dashboard,api,import,admin.last_servicestring or nullrequiredThe service of the newest text with them.
One of
imessage,sms.first_message_attimestamp or nullrequiredThe first text either way. Null for somebody you have never texted with, who counts as a new person.
last_message_attimestamp or nullrequiredThe newest text either way.
created_viastringrequiredWhat first added them.
One of
message,inbound,import,api,dashboard,widget,hook,mcp,assistant.created_attimestamprequiredWhen the contact was added.
has_morebooleanrequiredWhether another page follows.
next_cursorstring or nullrequiredSend as
cursorfor the next page; null on the last.
{
"object": "list",
"data": [
{
"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"
}
],
"has_more": false,
"next_cursor": null
}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. |
Try it
Call this operation from the page with your own key. The key stays in this tab and is forgotten when you leave.