Skip to content
ChatfuelSDK

Contacts

Every contact the bot has, not only the ones who have written in — filtered on any field it stores, kept as a view, edited in the row, and out again as CSV.

Every contact, not only the ones who wrote

Filter the table on anything the bot stores, keep that filter as a view, and change the rows you picked.

Lists every contact

The default engine is the one that sees the whole address book, including the contacts a CSV import created who have never written in.

Finds anyone, by anything

By name or phone, by owner, stage, unread, channel or when they last wrote — or by any field the bot has ever stored on somebody.

Counts you can trust

When a filter can only narrow the rows already on screen, the list says so — rather than printing the smaller number as though it were the answer.

Opens a record

Name, note, stage, owner, every field the contact carries, the conversation itself, and the appointments inside a window.

Administers the fields

The bot’s whole attribute catalogue: how many contacts carry each field, how many flows read it, what it is stored as, and what its bot-wide default is.

Counts the audience

Contacts you can see, contacts on the bot, how many have a conversation, and the split by channel, by stage and by owner — every figure a count the server returned.

Conditions that nest

Up to twenty conditions over any field the bot carries, in groups, with and inside a group and or between them. “Berlin or Hamburg, no phone, not Lost” is one filter — and it saves as a view.

Your views, and edits in the row

A view stores the filter, the columns, the density and its rolling window under your own account, and five are there before you save anything. Name, stage, owner and note are editable in the cell.

Bulk changes that own the arithmetic

There is no bulk mutation in this API, so a run of 500 is 500 requests: the cap is stated up front, a partial result is reported row by row, and undo writes the old value back rather than rolling anything back.

CSV in both directions

An import arrives with its columns already mapped and counts up as it runs, because the API never says how many rows the file has; a row whose phone matches an existing contact updates it. An export runs as a server-side task and hands back a plain URL.

Filter, save, act

One filter model feeds every surface, and it is deliberately larger than either engine can honour alone — the module works out what the server can answer and what has to be narrowed here.

01

Filter

Conditions over any field in the bot’s catalogue, plus the conversation filters — search, owner, unread, stage, a last-message window. A field name that no longer exists matches nobody in silence, so names are checked against the catalogue before the query goes out.

02

Save the view

The filter, the columns, the density and the rolling window, stored under your signed-in account. Forty of them, and a bot with none starts on five: Unassigned, Unread, Hot leads, No phone, Recently active.

03

Act on the rows

Edit a cell, open the record, change the stage or the owner across a selection, export exactly what is selected. Reading needs People · View, and every write — including the import — needs People · Edit.

Eight ways to compare a field

A condition is a field, an operator and its values. The tick says whether the server answers it exactly, or whether it is reading the value several ways at once and keeping the row if any of them matches.

NameWhat it matchesExact
Matching
isThe field equals one of the values you list — several values read as an or.
is notThe field is anything other than the values you list.
containsThe value appears somewhere inside the field.
starts withThe field begins with what you typed. One value, not a list.
ComparisonThe server reads the field and the value as text, as whole numbers, as decimals and as dates, and keeps the row if the condition holds for any one of those readings.
is after / greater thanGreater than the value, compared every one of those ways at once.
is before / less thanLess than the value, compared the same approximate way.
Presence
is emptyThe contact carries no value for the field. Takes no value of its own.
is not emptyThe contact has a value — and a bot-wide default on the field makes that true of everyone.

The eight columns of the table

Every one is a field on the contact itself, and any name in the attribute catalogue can be added beside them. None of the eight sorts: the server orders by an attribute name, and there is no attribute name for a stage, an unread count or a last message.

NameWhat it showsEditable
NameThe contact’s own name, or Unnamed. The one column that cannot be hidden.
ChannelWhatsApp, Instagram, Facebook, TikTok or the web widget — a contact is a different type on each.
PhoneWhatsApp only. The field does not exist on any other channel.
StageNew, Sorting, Ready, Working on, Won or Lost.
OwnerThe teammate assigned, Fuely AI, Unassigned, or Deleted user when the account is gone.
Last activeThe last message on the conversation, or when the record last changed for a contact that has never messaged.
UnreadHow many messages are waiting on the conversation.
NoteThe free-text note kept on the record.

What it holds

The API documents almost none of these. They are the module’s own ceilings, picked against what the API actually does — a page of 500 works and a page of 1,000 fails, and there is no bulk mutation, so a run of 500 is 500 requests.

Rows in a page50
Pages pulled before a click6
Rows one query may ask for500
Rows one bulk run touches500
Contacts in an export by selection100
Conditions in a filter20
Groups in a filter10
Saved views40
Saved view name60 characters
Fields read from the catalogue500

FAQs

No. There is no delete mutation in this API — not soft, not hard, not one at a time and not in bulk — and there is no merge, no block, no unsubscribe and no tags either. A button for any of them is a button that has to be taken back, so the module ships none.

One command, and your contacts are in your app

npx @chatfuel/wizard