GoliathDevelopersGet an API key
Reference/Conversationsgenerated from the gateway manifest

listContactTextThreads

Every text thread ONE contact has, across the org lines the key owner may see.

POST/api/v1/callREADreadruns as the key's owner
View as Markdown

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.

contactIdID!required
userIdID

Response

What comes back under data: a list shows as one entry, and a value as its type.

response shape
{
  "data": {
    "inboxQuery": {
      "getContactTextThreads": [
        {
          "id": "<ID>",
          "contactE164PhoneNumber": "…",
          "phoneLineId": "<ID>",
          "twilioPhoneNumberE164": "…"
        }
      ]
    }
  }
}

Errors

Behaviour

A read. It rejects an Idempotency-Key header with 400 bad_request.