listContactTextThreads
Every text thread ONE contact has, across the org lines the key owner may see.
Every text thread ONE contact has, across the org lines the key owner may see. A slim index: ids and phone numbers, NO message bodies: each entry is { id (the conversationId), contactE164PhoneNumber, phoneLineId, twilioPhoneNumberE164 (the line that carries it) }. Its job is to disambiguate before you read: a contact texted on two different lines has two threads, and getTextThreadMessages needs to be told which. Unpaginated: a contact has a handful of threads, not a feed. An EMPTY LIST means this contact has no text threads on any line you can see, which is a real answer about the contact. It is NOT how a foreign contact reads: a contactId outside your organization is REFUSED (403 forbidden), never answered with an empty list, so you can always tell "no texts" from "not your contact". Bodies come from getTextThreadMessages, or from listContactActivities with activityTypes: [TEXT] when you want texts inline with the rest of the timeline.
curl https://server.goliathdata.com/api/v1/call \
-H "Authorization: Bearer $GOLIATH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operationId": "listContactTextThreads",
"variables": {
"contactId": "<contactId>"
}
}'import { GoliathClient } from '@goliath-data/sdk'
const goliath = new GoliathClient({
apiKey: process.env.GOLIATH_API_KEY!,
baseUrl: 'https://server.goliathdata.com',
})
const result = await goliath.conversations.listContactTextThreads({
contactId: '<contactId>'
})const res = await fetch('https://server.goliathdata.com/api/v1/call', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.GOLIATH_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
operationId: 'listContactTextThreads',
variables: {
contactId: '<contactId>'
}
}),
})
const { data, errors } = await res.json()Variables
The example sends only what the schema requires. Some operations also need one of several optional variables (one filter or another, say); the description above says which.
Response
What comes back under data: a list shows as one entry, and a value as its type.
{
"data": {
"inboxQuery": {
"getContactTextThreads": [
{
"id": "<ID>",
"contactE164PhoneNumber": "…",
"phoneLineId": "<ID>",
"twilioPhoneNumberE164": "…"
}
]
}
}
}Errors
unknown_variableA variable the operation does not declare. A typo is refused rather than silently dropped.
unauthorizedNo bearer header, or the key is invalid or revoked.
insufficient_scopeThe key lacks the scope the operation requires.
forbiddenA referenced record does not exist, was deleted, or is outside your organization. The gateway cannot tell those apart.
Behaviour
A read. It rejects an Idempotency-Key header with 400 bad_request.