Contacts
Keep customer profiles, tags, custom fields, and imports in sync.
24 generated endpoints in this resource group.
/contactsGet contacts#
Returns customer profiles with identities, tags, and custom fields. Use filters to find the segment you want to message, enroll in journeys, or keep in sync.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:list
Allowed roles
- owner
- admin
- agent
List contacts in the caller's contact scope.
Optional parameters
- Name
pageToken- Type
- query string
- Description
- Opaque token from the previous response's `nextPageToken`.
- Name
pageSize- Type
- query integer
- Description
- Optional parameter.
- Name
search- Type
- query string
- Description
- Case-insensitive substring search across name, cf_email, cf_phone, identity phone, and tag name.
- Name
customFields- Type
- query object
- Description
- Filter by custom field values (AND logic)
- Name
tagIds- Type
- query array<string>
- Description
- Include contacts tagged with any of the listed tag IDs (OR semantics).
- Name
channels- Type
- query array<enum>
- Description
- Include contacts that have an identity on any of the listed channels (OR semantics).
- Name
archived- Type
- query boolean
- Description
- Tri-state filter. Omit to exclude archived contacts (default), set to true to return only archived contacts, or false to return only non-archived.
- Name
createdAfter- Type
- query string
- Description
- Inclusive lower bound on createdAt (RFC3339).
- Name
createdBefore- Type
- query string
- Description
- Exclusive upper bound on createdAt (RFC3339).
- Name
orderBy- Type
- query enum
- Description
- Optional parameter.
- Name
orderDirection- Type
- query enum
- Description
- Optional parameter.
Responses
- Name
200- Type
- application/json
- Description
- List of contacts
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -G "https://api.flownally.com/v1/contacts" \
-H "Authorization: Bearer {token}" \
-d pageToken="{pageToken}" \
-d pageSize="{pageSize}" \
-d search="{search}" \
-d customFields="{customFields}" \
-d tagIds="{tagIds}" \
-d channels="{channels}" \
-d archived="{archived}" \
-d createdAfter="{createdAfter}" \
-d createdBefore="{createdBefore}" \
-d orderBy="{orderBy}" \
-d orderDirection="{orderDirection}"Response
{
"contacts": [
{
"id": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"name": "Anna Kowalska",
"createdAt": "2026-04-30T09:20:00Z",
"updatedAt": "2026-04-30T10:10:00Z",
"identities": [
{
"id": "idn_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"metadata": {
"phoneNumber": "+48123456789"
}
}
],
"tagIds": [
"tag_01HV8Y9R3Q4J6A7M8N9P0Q2S4"
],
"customFields": {
"lifecycleStage": "customer",
"preferredStore": "Krakow"
},
"archivedAt": null
}
],
"nextPageToken": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8"
}/contactsCreate contact#
Creates a customer profile that can be matched to messages and events.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:create
Allowed roles
- owner
- admin
- agent
Create a contact in the workspace.
Request body
Send a application/json body. The body is required for this operation.
Optional attributes
- Name
name- Type
- string
- Description
- Optional request attribute.
- Name
phone- Type
- string
- Description
- Phone number in E.164 format (e.g., +48123456789)
- Name
customFields- Type
- object
- Description
- Optional request attribute.
Responses
- Name
201- Type
- application/json
- Description
- Contact created
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/contacts" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Anna Kowalska",
"phone": "+48123456789",
"customFields": {
"lifecycleStage": "lead",
"preferredStore": "Krakow"
}
}'Response
{
"id": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"name": "Anna Kowalska",
"createdAt": "2026-04-30T09:20:00Z",
"updatedAt": "2026-04-30T10:10:00Z",
"identities": [
{
"id": "idn_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"metadata": {
"phoneNumber": "+48123456789"
}
}
],
"tagIds": [
"tag_01HV8Y9R3Q4J6A7M8N9P0Q2S4"
],
"customFields": {
"lifecycleStage": "customer",
"preferredStore": "Krakow"
},
"archivedAt": null
}/contacts/countCount contacts#
Returns the tenant's contact count for a navigation/dashboard badge. This is independent of any list filters; the archived query parameter selects which bucket to count.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:list
Allowed roles
- owner
- admin
- agent
Count contacts in the caller's contact scope.
Optional parameters
- Name
archived- Type
- query boolean
- Description
- Omit or pass false for non-archived count; pass true for archived-bucket count.
Responses
- Name
200- Type
- application/json
- Description
- Contact count
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -G "https://api.flownally.com/v1/contacts/count" \
-H "Authorization: Bearer {token}" \
-d archived="{archived}"Response
{
"totalSize": 0
}/contacts/{id}Get contact by ID#
Returns one customer profile with identities, tags, custom fields, and archive state.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:read
Allowed roles
- owner
- admin
- agent
Read a contact in the caller's contact scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
200- Type
- application/json
- Description
- Contact found
- Name
404- Type
- application/json
- Description
- Contact not found
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/contacts/{id}" \
-H "Authorization: Bearer {token}"Response
{
"id": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"name": "Anna Kowalska",
"createdAt": "2026-04-30T09:20:00Z",
"updatedAt": "2026-04-30T10:10:00Z",
"identities": [
{
"id": "idn_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"metadata": {
"phoneNumber": "+48123456789"
}
}
],
"tagIds": [
"tag_01HV8Y9R3Q4J6A7M8N9P0Q2S4"
],
"customFields": {
"lifecycleStage": "customer",
"preferredStore": "Krakow"
},
"archivedAt": null
}/contacts/{id}Update contact#
Updates mutable contact fields. Fields omitted from the body are left unchanged.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:update
Allowed roles
- owner
- admin
- agent
Update a contact in the caller's contact scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Optional attributes
- Name
name- Type
- string
- Description
- New contact name. Omit the field to leave the name unchanged.
Responses
- Name
200- Type
- application/json
- Description
- Contact updated
- Name
404- Type
- application/json
- Description
- Contact not found
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X PATCH "https://api.flownally.com/v1/contacts/{id}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "order_ready"
}'Response
{
"id": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"name": "Anna Kowalska",
"createdAt": "2026-04-30T09:20:00Z",
"updatedAt": "2026-04-30T10:10:00Z",
"identities": [
{
"id": "idn_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"metadata": {
"phoneNumber": "+48123456789"
}
}
],
"tagIds": [
"tag_01HV8Y9R3Q4J6A7M8N9P0Q2S4"
],
"customFields": {
"lifecycleStage": "customer",
"preferredStore": "Krakow"
},
"archivedAt": null
}/contacts/{id}Delete contact#
Soft deletes a contact. Use archive when you only want to hide the contact from active lists.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:delete
Allowed roles
- owner
- admin
- agent
Delete a contact in the caller's contact scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Contact deleted
- Name
404- Type
- application/json
- Description
- Contact not found
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X DELETE "https://api.flownally.com/v1/contacts/{id}" \
-H "Authorization: Bearer {token}"Response
204 Contact deleted/contacts/importImport contacts from CSV#
Uploads a CSV file and starts a background contact import. Poll the returned import ID to review completion counts and row-level errors.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:create
Allowed roles
- owner
- admin
- agent
Import contacts into the workspace.
Request body
Send a multipart/form-data body. The body is required for this operation.
Responses
- Name
202- Type
- application/json
- Description
- Import initiated
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/contacts/import" \
-H "Authorization: Bearer {token}" \
-F "file=@invoice.pdf"Response
{
"importId": "import_01HV8Z92S0R7M4E5P6Q8T1A2B3"
}/contacts/imports/{id}Get import status#
Returns progress and row-level failures for a contact import.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:list
Allowed roles
- owner
- admin
- agent
Read contact import status.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
200- Type
- application/json
- Description
- Import status
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/contacts/imports/{id}" \
-H "Authorization: Bearer {token}"Response
{
"importId": "import_01HV8Z92S0R7M4E5P6Q8T1A2B3",
"status": "completed",
"totalRows": 1200,
"successCount": 1194,
"failedCount": 6,
"errors": [
{
"row": 17,
"column": "phone",
"message": "must be a valid E.164 phone number"
}
]
}/contacts/{id}/archiveArchive contact#
Hides a contact from active lists without deleting its history.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:update
Allowed roles
- owner
- admin
- agent
Archive a contact in the caller's contact scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Contact archived
- Name
404- Type
- application/json
- Description
- Contact not found
- Name
409- Type
- application/json
- Description
- Contact is already archived
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/contacts/{id}/archive" \
-H "Authorization: Bearer {token}"Response
204 Contact archived/contacts/{id}/unarchiveUnarchive contact#
Restores an archived contact to active lists.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:update
Allowed roles
- owner
- admin
- agent
Unarchive a contact in the caller's contact scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Contact unarchived
- Name
404- Type
- application/json
- Description
- Contact not found
- Name
409- Type
- application/json
- Description
- Contact is not archived
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/contacts/{id}/unarchive" \
-H "Authorization: Bearer {token}"Response
204 Contact unarchived/contacts/{contactId}/custom-fields/{customFieldId}Set contact field value#
Sets or clears one custom field value on a contact. Send an empty string to clear the value while keeping the field definition available for future use.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:update
Allowed roles
- owner
- admin
- agent
Set a custom field value on a contact in scope.
Required parameters
- Name
contactId- Type
- path string
- Description
- Required parameter.
- Name
customFieldId- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
value- Type
- string
- Description
- Field value for this contact.
Responses
- Name
204- Description
- Contact field value set
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X PUT "https://api.flownally.com/v1/contacts/{contactId}/custom-fields/{customFieldId}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"value": "Krakow"
}'Response
204 Contact field value set/contacts/{contactId}/tags/{tagId}Add tag to contact#
Adds a label to the contact for segmentation, routing, or reporting.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:update
Allowed roles
- owner
- admin
- agent
Tag a contact in scope.
Required parameters
- Name
contactId- Type
- path string
- Description
- Required parameter.
- Name
tagId- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Tag added
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/contacts/{contactId}/tags/{tagId}" \
-H "Authorization: Bearer {token}"Response
204 Tag added/contacts/{contactId}/tags/{tagId}Remove tag from contact#
Removes a label from the contact.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:update
Allowed roles
- owner
- admin
- agent
Remove a tag from a contact in scope.
Required parameters
- Name
contactId- Type
- path string
- Description
- Required parameter.
- Name
tagId- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Tag removed
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X DELETE "https://api.flownally.com/v1/contacts/{contactId}/tags/{tagId}" \
-H "Authorization: Bearer {token}"Response
204 Tag removed/tagsList tags#
Returns the labels available for organizing contacts.
Authorization
Scheme
- bearerAuth
Required scopes
- tag:list
Allowed roles
- owner
- admin
- agent
List contact tags in the workspace.
Responses
- Name
200- Type
- application/json
- Description
- List of tags
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/tags" \
-H "Authorization: Bearer {token}"Response
{
"tags": [
{
"id": "string",
"name": "order_ready",
"createdAt": "2026-04-27T00:00:00.000Z",
"createdBy": "string",
"labeledCount": 0
}
]
}/tagsCreate tag#
Creates a label that can be attached to contacts.
Authorization
Scheme
- bearerAuth
Required scopes
- tag:create
Allowed roles
- owner
- admin
- agent
Create a contact tag in the workspace.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
name- Type
- string
- Description
- Required request attribute.
Responses
- Name
201- Type
- application/json
- Description
- Tag created
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/tags" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "VIP"
}'Response
{
"id": "string",
"name": "order_ready",
"createdAt": "2026-04-27T00:00:00.000Z",
"createdBy": "string",
"labeledCount": 0
}/tags/{id}Delete tag#
Authorization
Scheme
- bearerAuth
Required scopes
- tag:delete
Allowed roles
- owner
- admin
- agent
Delete a contact tag in the workspace.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Tag deleted
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X DELETE "https://api.flownally.com/v1/tags/{id}" \
-H "Authorization: Bearer {token}"Response
204 Tag deleted/contacts/custom-fieldsList contact field definitions#
Returns the reusable custom fields that can store structured customer context on contacts, such as lifecycle stage, preferred store, or renewal date.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:list
Allowed roles
- owner
- admin
- agent
List contact field definitions.
Responses
- Name
200- Type
- application/json
- Description
- Contact field definitions
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/contacts/custom-fields" \
-H "Authorization: Bearer {token}"Response
{
"customFields": [
{
"id": "cf_lifecycle_stage",
"name": "Lifecycle stage",
"type": "text",
"createdAt": "2026-04-30T09:00:00Z",
"createdBy": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"predefined": false,
"entityType": "contact"
}
]
}/contacts/custom-fieldsCreate contact field definition#
Creates a reusable custom field for storing customer context on contacts.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:create
Allowed roles
- owner
- admin
- agent
Create a contact field definition.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
name- Type
- string
- Description
- Human-readable label for the field.
- Name
type- Type
- enum
- Description
- Value type accepted by the field.Allowed: text, date
Responses
- Name
201- Type
- application/json
- Description
- Contact field definition created
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/contacts/custom-fields" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Lifecycle stage",
"type": "text"
}'Response
{
"id": "cf_lifecycle_stage",
"name": "Lifecycle stage",
"type": "text",
"createdAt": "2026-04-30T09:00:00Z",
"createdBy": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"predefined": false,
"entityType": "contact"
}/contacts/custom-fields/{id}Update contact field definition#
Renames a contact field definition or changes its value type.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:update
Allowed roles
- owner
- admin
- agent
Update a contact field definition.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
name- Type
- string
- Description
- Human-readable label for the field.
- Name
type- Type
- enum
- Description
- Value type accepted by the field.Allowed: text, date
Responses
- Name
200- Type
- application/json
- Description
- Contact field definition updated
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X PATCH "https://api.flownally.com/v1/contacts/custom-fields/{id}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Region",
"type": "text"
}'Response
{
"id": "cf_region",
"name": "Region",
"type": "text",
"createdAt": "2026-04-30T09:00:00Z",
"createdBy": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"predefined": false,
"entityType": "property"
}/contacts/custom-fields/{id}Delete contact field definition#
Deletes a contact field definition that is no longer needed.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:delete
Allowed roles
- owner
- admin
- agent
Delete a contact field definition.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Contact field definition deleted
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X DELETE "https://api.flownally.com/v1/contacts/custom-fields/{id}" \
-H "Authorization: Bearer {token}"Response
204 Contact field definition deleted/properties/custom-fieldsList property field definitions#
Returns the reusable custom fields that can store structured context on property records, such as region, tier, or renewal date.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:list
Allowed roles
- owner
- admin
- agent
List property field definitions.
Responses
- Name
200- Type
- application/json
- Description
- Property field definitions
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/properties/custom-fields" \
-H "Authorization: Bearer {token}"Response
{
"customFields": [
{
"id": "cf_region",
"name": "Region",
"type": "text",
"createdAt": "2026-04-30T09:00:00Z",
"createdBy": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"predefined": false,
"entityType": "property"
}
]
}/properties/custom-fieldsCreate property field definition#
Creates a reusable custom field for storing context on property records.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:create
Allowed roles
- owner
- admin
- agent
Create a property field definition.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
name- Type
- string
- Description
- Human-readable label for the field.
- Name
type- Type
- enum
- Description
- Value type accepted by the field.Allowed: text, date
Responses
- Name
201- Type
- application/json
- Description
- Property field definition created
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/properties/custom-fields" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Region",
"type": "text"
}'Response
{
"id": "cf_region",
"name": "Region",
"type": "text",
"createdAt": "2026-04-30T09:00:00Z",
"createdBy": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"predefined": false,
"entityType": "property"
}/properties/custom-fields/{id}Update property field definition#
Renames a property field definition or changes its value type.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:update
Allowed roles
- owner
- admin
- agent
Update a property field definition.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
name- Type
- string
- Description
- Human-readable label for the field.
- Name
type- Type
- enum
- Description
- Value type accepted by the field.Allowed: text, date
Responses
- Name
200- Type
- application/json
- Description
- Property field definition updated
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X PATCH "https://api.flownally.com/v1/properties/custom-fields/{id}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Region",
"type": "text"
}'Response
{
"id": "cf_region",
"name": "Region",
"type": "text",
"createdAt": "2026-04-30T09:00:00Z",
"createdBy": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"predefined": false,
"entityType": "property"
}/properties/custom-fields/{id}Delete property field definition#
Deletes a property field definition that is no longer needed.
Authorization
Scheme
- bearerAuth
Required scopes
- custom_field:delete
Allowed roles
- owner
- admin
- agent
Delete a property field definition.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
204- Description
- Property field definition deleted
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X DELETE "https://api.flownally.com/v1/properties/custom-fields/{id}" \
-H "Authorization: Bearer {token}"Response
204 Property field definition deleted