API Reference
Objects and Fields
💬Get free consultation

Objects and fields

Who can use this feature?

Overview

Use this page when you are mapping Chatty data into something else: a helpdesk, a CRM, a warehouse table, or a spreadsheet. The Chat Conversations API page lists the paths and the parameters; this page lists what comes back inside data.

Read it before you design your own schema. Four fields never carry a value, several exist only on the single-record endpoints, and six fields accept a fixed set of values only.

Applies toEvery /chat/... response from the Chat Conversations API
Envelope{ "data": ..., "paging": ..., "meta": ... } on list endpoints
NamingcamelCase throughout, identical from both datastores
TimestampsISO 8601 UTC, for example 2026-08-03T12:00:00.000Z

How to read these tables

Each table has four columns.

  • Field — the key as it appears in the JSON.
  • Typestring, boolean, integer, number, array, object, or datetime for an ISO 8601 string.
  • Always presentYes means the field is returned with a value on every endpoint that returns this object. Nullable means the field is returned but the value can be null. Detail only means only the single-record endpoint returns it; list and related endpoints omit the key entirely.
  • Description — what the value means.

Treat every Nullable field as optional in your own types. A field marked Detail only will be missing, not null, when you read from a list.

!

Four fields never carry data. customerPhone, memberName, teamId, and unreadCount on a conversation come back empty — null, 0, or missing from the response altogether, depending on the endpoint. Nothing in Chatty writes to them. Don't build a column, a filter, or an alert on any of the four, and don't wait for them to fill in later.


Conversation

Returned by GET /chat/conversations, GET /chat/conversations/{id}, GET /chat/conversations/{id}/related, and GET /chat/customers/{customerUuid}/conversations. 31 documented fields. The single-record endpoint can also return internal keys that are not listed here, so ignore what you don't recognise.

FieldTypeAlways presentDescription
idstringYesApp-wide conversation id.
firestoreIdstringNullableThe conversation's id in the older datastore.
pgConvoIdstringNullableThe conversation's numeric id in the newer datastore.
shopIdstringYesYour store identifier.
sessionIdstringNullableBrowsing session the conversation started in.
customerUuidstringNullableContact id. Pass it to GET /chat/customers/{customerUuid}.
customerNamestringNullableContact name at the time of the chat.
customerEmailstringNullableContact email.
customerPhonestringDetail onlyAlways null.
customerTypestringYesanonymous, guest, or customer.
statusstringYesopen or resolved.
isChatBotbooleanYesThe conversation is currently handled by the AI agent.
hasChatBotbooleanYesThe AI agent took part at some point.
isReadbooleanYesRead state on the agent side.
isCustomerReadbooleanYesRead state on the customer side.
isOnlinebooleanYesThe customer is connected right now.
isBlockbooleanYesThe customer is blocked.
isStarredbooleanYesStarred in the inbox.
hasFirstMsgbooleanYesThe conversation carries a first message.
hidePreChatMessagestringYes'', by-user, or by-admin.
memberIdstringNullableAssigned team member. Resolve it against GET /chat/members.
memberNamestringDetail onlyAlways null.
teamIdstringDetail onlyAlways null.
channelsarray of stringYesChannels used in this conversation.
tagsarray of stringYesTags on the conversation.
messageCountintegerNullableNumber of messages.
unreadCountintegerDetail onlyAlways 0.
lastMessageobjectNullablePreview of the most recent message. Fields below.
lastActivedatetimeNullableLast activity.
createdAtdatetimeNullableWhen the conversation started.
updatedAtdatetimeNullableLast update.

lastMessage

FieldTypeAlways presentDescription
textstringYesMessage text.
senderTypestringYescustomer, agent, bot, or system. bot is the Chatty AI agent, agent is a human team member.
createdAtdatetimeYesWhen the message was sent.

Sort on lastActive rather than updatedAt when you want the newest conversations first, and expect null on both for older records. The three id fields all come back on every conversation, so you can match a record against ids you stored before your integration existed.


Message

Returned by GET /chat/conversations/{id}/messages and GET /chat/conversations/{id}/messages/{messageId}. 20 fields.

FieldTypeAlways presentDescription
idstringYesMessage UUID, or the numeric id when no UUID exists.
textstringYesMessage text.
senderNamestringYesDisplay name of the sender.
memberIdstringNullableTeam member who sent it, when a human did.
isAdminbooleanYesSent from the store side.
isAutomatedbooleanYesSent by an automation rather than by a person.
isBotbooleanYesSent by the AI agent.
isNotebooleanYesInternal note, not visible to the customer.
isFirstbooleanYesFirst message of the conversation.
isTransferbooleanYesMarks a handover between the AI agent and a human.
isQuickReplyMsgbooleanYesSent through a quick reply.
isAskBotMessagebooleanYesThe customer addressed the AI agent.
isDeletedbooleanDetail onlyThe message was deleted. List endpoints exclude deleted messages.
contentTypestringDetail onlytext or file.
topicstringNullableTopic the AI agent assigned.
chatbotProductsarray of objectYesProducts the AI agent showed in this message.
chatbotFaqsarray of objectYesFAQ entries the AI agent used in this message.
filesarray of objectYesAttachments.
replyMessageobjectNullableThe message this one replies to.
createdAtdatetimeYesWhen the message was sent.

A message can carry keys beyond this list, so ignore what you don't recognise rather than rejecting the record.

To reconcile deletions against your own copy, read the single message: it returns the record with "isDeleted": true, while the list endpoint simply stops returning it. Use contentType to word your own placeholder for a deleted message.


Customer

Returned by GET /chat/customers/{customerUuid}. This is the contact profile the widget collects, merged with what the Shopify sync provides. 30 fields.

FieldTypeAlways presentDescription
idstringYesContact id. Matches customerUuid on a conversation.
shopifyIdstringNullableMatching Shopify customer id.
namestringNullableDisplay name.
firstNamestringNullableFirst name.
lastNamestringNullableLast name.
emailstringNullableEmail address.
phonestringNullablePhone number.
typestringYesanonymous, guest, or customer.
channelsarray of stringYesChannels the contact has used.
tagsarray of stringNullableTags on the contact.
notestringNullableFree-text note on the contact.
customAttributesobjectNullableKey/value pairs pushed by the storefront widget. Values are strings.
address1stringNullableAddress line 1.
address2stringNullableAddress line 2.
citystringNullableCity.
zipstringNullablePostal code.
countrystringNullableCountry name.
countryCodestringNullableCountry code.
ordersCountintegerNullableNumber of orders placed.
totalSpentnumberNullableLifetime spend.
ipAddressstringNullableLast seen IP address.
ipLocationstringNullableLocation derived from the IP address.
browserstringNullableBrowser name.
browserVersionstringNullableBrowser version.
osstringNullableOperating system.
deviceTypestringNullableDevice type.
senderSeqintegerNullableSequence number of the contact as a sender.
lastChatAtdatetimeNullableLast time the contact chatted.
createdAtdatetimeYesWhen the contact was first seen.
updatedAtdatetimeNullableLast update.

id, type, channels, and createdAt are the only fields that always carry a value. Everything else depends on what the visitor gave you, so an anonymous visitor produces a profile that is mostly null.


Member

Returned by GET /chat/members and GET /chat/members/{memberId}. 10 fields. Credentials, tokens, and notification internals are never exposed.

FieldTypeAlways presentDescription
idstringYesTeam member id. Matches memberId on conversations and messages.
emailstringYesWork email.
firstNamestringNullableFirst name.
lastNamestringNullableLast name.
fullNamestringYesFull name.
avatarUrlstringYesAvatar image URL.
rolestringYesadmin or member.
activebooleanYesThe member is active.
enableAwayModebooleanNullableAway mode is switched on.
createdAtdatetimeYesWhen the member was added.

Cache this list. Conversations and messages carry memberId only, so every agent name in your own interface comes from here.


Note

Returned by the note endpoints under /chat/conversations/{id}/notes. 5 fields.

FieldTypeAlways presentDescription
idstringYesNote id. Use it on update and delete.
textstringYesNote text, up to 150 characters.
isUpdatedbooleanYesThe note was edited after it was created.
createdAtdatetimeYesWhen the note was created.
updatedAtdatetimeYesWhen the note was last changed.

Attribute

Returned by the attribute endpoints under /chat/conversations/{id}/attributes. 5 fields.

FieldTypeAlways presentDescription
idstringYesAttribute id. Use it on update and delete.
namestringYesAttribute name, up to 255 characters. Writes upsert by name.
valuestringYesAttribute value, up to 1000 characters.
createdAtdatetimeYesWhen the attribute was created.
updatedAtdatetimeYesWhen the attribute was last changed.

Webhook subscription

Returned by the webhook endpoints under /chat/webhooks. 9 fields. Once a subscription has attempted its first delivery it also carries lastDeliveryAt, lastDeliveryStatus, and lastDeliveryError. For the events themselves and for signature verification, see Webhooks.

FieldTypeAlways presentDescription
idstringYesSubscription id. Use it on update and delete.
shopIdstringYesYour store identifier.
urlstringYesEndpoint Chatty posts events to.
eventsarray of stringYesEvents this subscription receives.
isActivebooleanYesThe subscription is delivering.
secretstringYesSigning secret used to verify each delivery.
metadataobjectYesYour own key/value data on the subscription.
createdAtdatetimeYesWhen the subscription was created.
updatedAtdatetimeYesWhen the subscription was last changed.
!

Listing subscriptions returns the signing secret in plain text. Treat the response the way you treat your API key: never log it, never render it in a front-end, never store it outside your secrets manager.


Fixed value sets

Six fields accept a fixed set of values. Compare against the exact lowercase strings below.

  • customerType on a conversation and type on a contact: anonymous, guest, customer
  • status on a conversation: open, resolved
  • hidePreChatMessage on a conversation: '' (empty string), by-user, by-admin
  • senderType inside lastMessage: customer, agent, bot, system
  • contentType on a message: text, file
  • role on a member: admin, member

A seventh sits in the envelope rather than on an object: meta.source reports which datastore served the read, postgresql or firestore. It's diagnostic. The field names and shapes above are identical either way, so don't branch your parsing on it.

Treat an unrecognised value as a value you haven't seen yet, not as an error. New entries can be added to any of these sets.


Need help?

Contact the Chatty support team from your dashboard. Include the endpoint, the timestamp of the request, and the field you're asking about.

For the paths, parameters, and rate limits that go with these objects, see the Chat Conversations API. For contact data over GraphQL, see the GraphQL Customer API.