Contacts
Keep customer profiles, tags, custom fields, and imports in sync.
38 generated endpoints in this resource group.
/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",
"conversations": [
{
"conversationId": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"metadata": {
"phoneNumber": "+48123456789"
}
}
],
"tagIds": [
"tag_01HV8Y9R3Q4J6A7M8N9P0Q2S4"
],
"customFields": {
"lifecycleStage": "customer",
"preferredStore": "Krakow"
},
"archivedAt": null
}/contacts/searchSearch contacts#
Returns contact summaries matching one canonical conjunction of filter conditions.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:list
Allowed roles
- owner
- admin
- agent
Search contacts in the caller's contact scope.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
filter- Type
- ContactFilter
- Description
- Required request attribute.
Optional attributes
- Name
sort- Type
- ContactSort
- Description
- Optional request attribute.
- Name
limit- Type
- integer
- Description
- Optional request attribute.
- Name
cursor- Type
- string
- Description
- Optional request attribute.
Responses
- Name
200- Type
- application/json
- Description
- Contacts matching the filter
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- ContactSearchRequest
- ContactFilter
- ContactCondition
- SearchTextCondition
- ArchiveStatusCondition
- ArchiveStatus
- CreatedAtCondition
- FirstSeenCondition
- LastInteractionCondition
- ChatCountCondition
- EngagementWindow
- CustomFieldTextCondition
- CustomFieldDateCondition
- HasAnyTagCondition
- HasAnyChannelCondition
- ContactChannel
- ContactSort
- ContactSummarySort
- SortDirection
- ContactSummariesResponse
- ContactSummary
- ContactSummaryTag
Request
curl -X POST "https://api.flownally.com/v1/contacts/search" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
},
"sort": {
"field": "createdAt",
"direction": "asc"
},
"limit": 0,
"cursor": "string"
}'Response
{
"items": [
{
"id": "string",
"name": "order_ready",
"email": "name@example.com",
"phone": "+48123456789",
"tags": [
{
"id": "string",
"name": "order_ready"
}
],
"channels": [
"whatsapp"
],
"hasConversations": true,
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z",
"archivedAt": "2026-04-27T00:00:00.000Z"
}
],
"nextCursor": "string",
"hasMore": true
}/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 conversations, 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",
"conversations": [
{
"conversationId": "cnv_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",
"conversations": [
{
"conversationId": "cnv_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/segmentsList saved contact segments#
Returns tenant-scoped saved contact filters without evaluating member counts.
Authorization
Scheme
- bearerAuth
Required scopes
- segment:list
Allowed roles
- owner
- admin
- agent
List saved contact segments.
Optional parameters
- Name
limit- Type
- query integer
- Description
- Optional parameter.
- Name
cursor- Type
- query string
- Description
- Optional parameter.
Responses
- Name
200- Type
- application/json
- Description
- Saved segments
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- ContactFilter
- ContactCondition
- SearchTextCondition
- ArchiveStatusCondition
- ArchiveStatus
- CreatedAtCondition
- FirstSeenCondition
- LastInteractionCondition
- ChatCountCondition
- EngagementWindow
- CustomFieldTextCondition
- CustomFieldDateCondition
- HasAnyTagCondition
- HasAnyChannelCondition
- ContactChannel
- SegmentsResponse
- Segment
Request
curl -G "https://api.flownally.com/v1/segments" \
-H "Authorization: Bearer {token}" \
-d limit="{limit}" \
-d cursor="{cursor}"Response
{
"items": [
{
"id": "string",
"name": "order_ready",
"description": "string",
"createdBy": "string",
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
},
"revision": 0,
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}
],
"nextCursor": "string",
"hasMore": true
}/segmentsCreate a saved contact segment#
Authorization
Scheme
- bearerAuth
Required scopes
- segment:create
Allowed roles
- owner
- admin
Create a saved contact segment.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
name- Type
- string
- Description
- Required request attribute.
- Name
filter- Type
- ContactFilter
- Description
- Required request attribute.
Optional attributes
- Name
description- Type
- string
- Description
- Optional request attribute.
Responses
- Name
201- Type
- application/json
- Description
- Segment created
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- ContactFilter
- ContactCondition
- SearchTextCondition
- ArchiveStatusCondition
- ArchiveStatus
- CreatedAtCondition
- FirstSeenCondition
- LastInteractionCondition
- ChatCountCondition
- EngagementWindow
- CustomFieldTextCondition
- CustomFieldDateCondition
- HasAnyTagCondition
- HasAnyChannelCondition
- ContactChannel
- Segment
- CreateSegmentRequest
Request
curl -X POST "https://api.flownally.com/v1/segments" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "order_ready",
"description": "string",
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
}
}'Response
{
"id": "string",
"name": "order_ready",
"description": "string",
"createdBy": "string",
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
},
"revision": 0,
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/segments/{segmentId}Get a saved contact segment#
Authorization
Scheme
- bearerAuth
Required scopes
- segment:read
Allowed roles
- owner
- admin
- agent
Read a saved contact segment.
Responses
- Name
200- Type
- application/json
- Description
- Saved segment
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- ContactFilter
- ContactCondition
- SearchTextCondition
- ArchiveStatusCondition
- ArchiveStatus
- CreatedAtCondition
- FirstSeenCondition
- LastInteractionCondition
- ChatCountCondition
- EngagementWindow
- CustomFieldTextCondition
- CustomFieldDateCondition
- HasAnyTagCondition
- HasAnyChannelCondition
- ContactChannel
- Segment
Request
curl -X GET "https://api.flownally.com/v1/segments/{segmentId}" \
-H "Authorization: Bearer {token}"Response
{
"id": "string",
"name": "order_ready",
"description": "string",
"createdBy": "string",
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
},
"revision": 0,
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/segments/{segmentId}Update a saved contact segment#
Replaces any supplied filter atomically. The If-Match header must contain the current segment ETag.
Authorization
Scheme
- bearerAuth
Required scopes
- segment:update
Allowed roles
- owner
- admin
Update a saved contact segment.
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
description- Type
- string
- Description
- Optional request attribute.
- Name
filter- Type
- ContactFilter
- Description
- Optional request attribute.
Responses
- Name
200- Type
- application/json
- Description
- Segment updated
- Name
412- Type
- application/json
- Description
- The supplied ETag is stale.
- Name
428- Type
- application/json
- Description
- If-Match is required.
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- ContactFilter
- ContactCondition
- SearchTextCondition
- ArchiveStatusCondition
- ArchiveStatus
- CreatedAtCondition
- FirstSeenCondition
- LastInteractionCondition
- ChatCountCondition
- EngagementWindow
- CustomFieldTextCondition
- CustomFieldDateCondition
- HasAnyTagCondition
- HasAnyChannelCondition
- ContactChannel
- Segment
- UpdateSegmentRequest
Request
curl -X PATCH "https://api.flownally.com/v1/segments/{segmentId}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "order_ready",
"description": "string",
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
}
}'Response
{
"id": "string",
"name": "order_ready",
"description": "string",
"createdBy": "string",
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
},
"revision": 0,
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/segments/{segmentId}Delete a saved contact segment#
Authorization
Scheme
- bearerAuth
Required scopes
- segment:delete
Allowed roles
- owner
- admin
Delete a saved contact segment.
Responses
- Name
204- Description
- Segment deleted
- Name
412- Type
- application/json
- Description
- The supplied ETag is stale.
- Name
428- Type
- application/json
- Description
- If-Match is required.
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X DELETE "https://api.flownally.com/v1/segments/{segmentId}" \
-H "Authorization: Bearer {token}"Response
204 Segment deleted/segments/{segmentId}/contacts/searchSearch contacts matching a saved segment#
Applies the current saved definition and any temporary filters using AND semantics.
Authorization
Scheme
- bearerAuth
Required scopes
- contact:list
- segment:read
Allowed roles
- owner
- admin
- agent
Search contacts matching a saved segment in the caller's contact scope.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
filter- Type
- ContactFilter
- Description
- Required request attribute.
Optional attributes
- Name
sort- Type
- ContactSort
- Description
- Optional request attribute.
- Name
limit- Type
- integer
- Description
- Optional request attribute.
- Name
cursor- Type
- string
- Description
- Optional request attribute.
Responses
- Name
200- Type
- application/json
- Description
- Current segment members
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- ContactFilter
- ContactCondition
- SearchTextCondition
- ArchiveStatusCondition
- ArchiveStatus
- CreatedAtCondition
- FirstSeenCondition
- LastInteractionCondition
- ChatCountCondition
- EngagementWindow
- CustomFieldTextCondition
- CustomFieldDateCondition
- HasAnyTagCondition
- HasAnyChannelCondition
- ContactChannel
- ContactSort
- ContactSummarySort
- SortDirection
- ContactSummariesResponse
- ContactSummary
- ContactSummaryTag
- SegmentContactSearchRequest
Request
curl -X POST "https://api.flownally.com/v1/segments/{segmentId}/contacts/search" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"match": "all",
"conditions": [
{
"type": "searchText",
"text": "string"
}
]
},
"sort": {
"field": "createdAt",
"direction": "asc"
},
"limit": 0,
"cursor": "string"
}'Response
{
"items": [
{
"id": "string",
"name": "order_ready",
"email": "name@example.com",
"phone": "+48123456789",
"tags": [
{
"id": "string",
"name": "order_ready"
}
],
"channels": [
"whatsapp"
],
"hasConversations": true,
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z",
"archivedAt": "2026-04-27T00:00:00.000Z"
}
],
"nextCursor": "string",
"hasMore": true
}/campaignsList campaigns#
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:list
Allowed roles
- owner
- admin
- agent
List campaigns in the workspace.
Optional parameters
- Name
status- Type
- query CampaignStatus
- Description
- Optional parameter.
- Name
limit- Type
- query integer
- Description
- Optional parameter.
- Name
cursor- Type
- query string
- Description
- Optional parameter.
Responses
- Name
200- Type
- application/json
- Description
- Campaigns
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- OutboundMessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- WhatsAppFlowAction
- WhatsAppMessageContent
- WhatsAppContent
- WhatsAppRequestContactInfoContent
- CampaignStatus
- CampaignsResponse
- Campaign
Request
curl -G "https://api.flownally.com/v1/campaigns" \
-H "Authorization: Bearer {token}" \
-d status="{status}" \
-d limit="{limit}" \
-d cursor="{cursor}"Response
{
"items": [
{
"id": "string",
"name": "order_ready",
"status": "draft",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"channel": "string",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"revision": 0,
"scheduledAt": "2026-04-27T00:00:00.000Z",
"evaluatedAt": "2026-04-27T00:00:00.000Z",
"sentAt": "2026-04-27T00:00:00.000Z",
"audienceCount": 0,
"dispatchError": "string",
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}
],
"nextCursor": "string",
"hasMore": true
}/campaignsCreate a draft campaign#
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:create
Allowed roles
- owner
- admin
Create a draft campaign.
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
- Campaign created
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- OutboundMessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- WhatsAppFlowAction
- WhatsAppMessageContent
- WhatsAppContent
- WhatsAppRequestContactInfoContent
- CampaignStatus
- Campaign
- CreateCampaignRequest
Request
curl -X POST "https://api.flownally.com/v1/campaigns" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "order_ready"
}'Response
{
"id": "string",
"name": "order_ready",
"status": "draft",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"channel": "string",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"revision": 0,
"scheduledAt": "2026-04-27T00:00:00.000Z",
"evaluatedAt": "2026-04-27T00:00:00.000Z",
"sentAt": "2026-04-27T00:00:00.000Z",
"audienceCount": 0,
"dispatchError": "string",
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/campaigns/{campaignId}Get a campaign#
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:read
Allowed roles
- owner
- admin
- agent
Read a campaign.
Responses
- Name
200- Type
- application/json
- Description
- Campaign
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- OutboundMessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- WhatsAppFlowAction
- WhatsAppMessageContent
- WhatsAppContent
- WhatsAppRequestContactInfoContent
- CampaignStatus
- Campaign
Request
curl -X GET "https://api.flownally.com/v1/campaigns/{campaignId}" \
-H "Authorization: Bearer {token}"Response
{
"id": "string",
"name": "order_ready",
"status": "draft",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"channel": "string",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"revision": 0,
"scheduledAt": "2026-04-27T00:00:00.000Z",
"evaluatedAt": "2026-04-27T00:00:00.000Z",
"sentAt": "2026-04-27T00:00:00.000Z",
"audienceCount": 0,
"dispatchError": "string",
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/campaigns/{campaignId}Update a draft campaign#
Only draft campaigns are editable. If-Match is optional; when supplied, it must contain the current campaign ETag.
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:update
Allowed roles
- owner
- admin
Update a draft campaign.
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
segmentId- Type
- string
- Description
- Optional request attribute.
- Name
inboxId- Type
- string
- Description
- Optional request attribute.
- Name
content- Type
- OutboundMessageContent
- Description
- Optional request attribute.
Responses
- Name
200- Type
- application/json
- Description
- Campaign updated
- Name
412- Type
- application/json
- Description
- The supplied ETag is stale.
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- OutboundMessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- WhatsAppFlowAction
- WhatsAppMessageContent
- WhatsAppContent
- WhatsAppRequestContactInfoContent
- CampaignStatus
- Campaign
- UpdateCampaignRequest
Request
curl -X PATCH "https://api.flownally.com/v1/campaigns/{campaignId}" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "order_ready",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
}
}'Response
{
"id": "string",
"name": "order_ready",
"status": "draft",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"channel": "string",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"revision": 0,
"scheduledAt": "2026-04-27T00:00:00.000Z",
"evaluatedAt": "2026-04-27T00:00:00.000Z",
"sentAt": "2026-04-27T00:00:00.000Z",
"audienceCount": 0,
"dispatchError": "string",
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/campaigns/{campaignId}/scheduleSchedule a draft campaign#
Set sendAt to now to dispatch immediately, or supply an RFC 3339 timestamp. If-Match is optional.
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:schedule
Allowed roles
- owner
- admin
Schedule a draft campaign.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
sendAt- Type
- string
- Description
- The literal now or an RFC 3339 timestamp.
Responses
- Name
200- Type
- application/json
- Description
- Campaign scheduled
- Name
412- Type
- application/json
- Description
- The supplied ETag is stale.
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- OutboundMessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- WhatsAppFlowAction
- WhatsAppMessageContent
- WhatsAppContent
- WhatsAppRequestContactInfoContent
- CampaignStatus
- Campaign
- ScheduleCampaignRequest
Request
curl -X POST "https://api.flownally.com/v1/campaigns/{campaignId}/schedule" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"sendAt": "2026-04-27T00:00:00.000Z"
}'Response
{
"id": "string",
"name": "order_ready",
"status": "draft",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"channel": "string",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"revision": 0,
"scheduledAt": "2026-04-27T00:00:00.000Z",
"evaluatedAt": "2026-04-27T00:00:00.000Z",
"sentAt": "2026-04-27T00:00:00.000Z",
"audienceCount": 0,
"dispatchError": "string",
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/campaigns/{campaignId}/unscheduleReturn a scheduled campaign to draft#
If-Match is optional. A campaign cannot be unscheduled after dispatch starts.
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:schedule
Allowed roles
- owner
- admin
Return a scheduled campaign to draft.
Responses
- Name
200- Type
- application/json
- Description
- Campaign returned to draft
- Name
412- Type
- application/json
- Description
- The supplied ETag is stale.
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- OutboundMessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- WhatsAppFlowAction
- WhatsAppMessageContent
- WhatsAppContent
- WhatsAppRequestContactInfoContent
- CampaignStatus
- Campaign
Request
curl -X POST "https://api.flownally.com/v1/campaigns/{campaignId}/unschedule" \
-H "Authorization: Bearer {token}"Response
{
"id": "string",
"name": "order_ready",
"status": "draft",
"segmentId": "string",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"channel": "string",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"revision": 0,
"scheduledAt": "2026-04-27T00:00:00.000Z",
"evaluatedAt": "2026-04-27T00:00:00.000Z",
"sentAt": "2026-04-27T00:00:00.000Z",
"audienceCount": 0,
"dispatchError": "string",
"createdAt": "2026-04-27T00:00:00.000Z",
"updatedAt": "2026-04-27T00:00:00.000Z"
}/campaigns/{campaignId}/recipientsList campaign recipients#
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:recipients
- contact:list
Allowed roles
- owner
- admin
List campaign recipients.
Optional parameters
- Name
status- Type
- query CampaignRecipientStatus
- Description
- Optional parameter.
- Name
limit- Type
- query integer
- Description
- Optional parameter.
- Name
cursor- Type
- query string
- Description
- Optional parameter.
Responses
- Name
200- Type
- application/json
- Description
- Campaign recipients
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -G "https://api.flownally.com/v1/campaigns/{campaignId}/recipients" \
-H "Authorization: Bearer {token}" \
-d status="{status}" \
-d limit="{limit}" \
-d cursor="{cursor}"Response
{
"items": [
{
"id": "string",
"contactId": "ctc_01HV8Z2JH0Q7K4M9N6P2A1B3C5",
"status": "pending",
"messageId": "string",
"sentAt": "2026-04-27T00:00:00.000Z",
"deliveredAt": "2026-04-27T00:00:00.000Z",
"readAt": "2026-04-27T00:00:00.000Z",
"failedAt": "2026-04-27T00:00:00.000Z",
"failureCode": "string"
}
],
"nextCursor": "string",
"hasMore": true
}/campaigns/{campaignId}/analyticsGet campaign delivery analytics#
Authorization
Scheme
- bearerAuth
Required scopes
- campaign:read
Allowed roles
- owner
- admin
- agent
Read campaign delivery analytics.
Responses
- Name
200- Type
- application/json
- Description
- Campaign analytics
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/campaigns/{campaignId}/analytics" \
-H "Authorization: Bearer {token}"Response
{
"audienceCount": 0,
"pending": 0,
"unknown": 0,
"sent": 0,
"delivered": 0,
"read": 0,
"failed": 0,
"sentStage": 0,
"deliveredStage": 0,
"readStage": 0,
"failedStage": 0,
"deliveryRate": 0,
"readRate": 0
}/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
- segment:update
- tag:delete
Allowed roles
- owner
- admin
Delete a contact tag and update any referencing segments.
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.
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.
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"
}'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
- segment:update
Allowed roles
- owner
- admin
Delete a contact field definition and update any referencing segments.
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.
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.
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"
}'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