Analytics API Tutorial

Introduction

Our Analytics JSON API allows you to easily integrate Userlike with your favorite third-party tracking software, CRM, or your own custom tracking solutions. Each API provides a download interface for all our tracked Analytics events, allowing you to enhance our data with your own. Also, you can create customized reports that incorporate your company setup or build aggregations and generate new insights by combining multiple data vectors. Below you find our general documentation as well as a detailed description of each API resource available. Please note that based on the timeouts defined for chats, some events might appear in your API requests with a short delay.

We prepared some cURL-based examples. With the help of the cURL tool you can test drive our API quickly from the command line. This should give you a straightforward understanding how to use our API.

Topic Description
Resource endpoints Available resource endpoints of the Analytics JSON API
Authentication Accessing the API
Request headers Additional request headers
Rate limits API rate limits
Result filtering Filter list endpoints for specific resource items
Result type The data point format of each resource
Resources Endpoint return values
Resource details Details for respective endpoint
Code samples Working (Python) code examples

Resource endpoints

Currently, the following resource endpoints are available via the Analytics JSON API:
https://api.userlike.com

Resource endpoints Description Allowed methods
/api/um/v1/analytics/um_conversation_first_message/ Received first message in a conversation GET
/api/um/v1/analytics/um_conversation_first_message_assignment_update/ Received first message in a conversation GET
/api/um/v1/analytics/um_conversation_duration/ Conversation duration, guaranteed to be unique per conversation GET
/api/um/v1/analytics/um_chat_messages_total/ Number of messages sent and received in a conversation session GET
/api/um/v1/analytics/um_chat_messages_ct/ Messages sent in a conversation session GET
/api/um/v1/analytics/um_chat_messages_co/ Messages received in a conversation session GET
/api/um/v1/analytics/um_operator_status/ Change of operator status GET
/api/um/v1/analytics/um_operator_slot_usage/ Operator chat slot utilization GET
/api/um/v1/analytics/um_operator_response_time_first/ First response time in a conversation session GET
/api/um/v1/analytics/um_operator_response_time_first_service_time/ First response time in a conversation session (service times considered) GET
/api/um/v1/analytics/um_operator_response_time_conversation_first/ First response time in the first session of a conversation GET
/api/um/v1/analytics/um_operator_response_time_conversation_first_service_time/ First response time in the first session of a conversation (service times considered) GET
/api/um/v1/analytics/um_operator_response_time/ Response times per operator GET
/api/um/v1/analytics/um_operator_response_time_service_time/ Response times per operator (service times considered) GET
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_first/ First response time in an unanswered conversation session with no previous operator messages GET
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_first_service_time/ First response time in an unanswered conversation session with no previous operator messages (service times considered) GET
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session/ Response time in any unanswered conversation session GET
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_service_time/ Response time in any unanswered conversation session (service times considered) GET
/api/um/v1/analytics/um_conversation_rating/ A contact leaves a conversation rating, the actual value will be returned GET
/api/um/v1/analytics/um_conversation_feedback/ A contact leaves feedback GET
/api/um/v1/analytics/um_conversation_unanswered_live/ A live conversation reaches the timeout without an operator’s reply GET
/api/um/v1/analytics/um_conversation_unanswered_ended/ A conversation ends without without a single operator message GET
/api/um/v1/analytics/um_conversation_goal_reached/ A conversation goal is reached GET
/api/um/v1/analytics/um_missed_opportunity/ A contact tries to start a new conversation while no operator is available GET
/api/um/v1/analytics/um_conversation_topic/ A topic or a combination of topics is changed for a conversation GET
/api/um/v1/analytics/um_conversation_topic_change/ Topic(s) were changed for a conversation GET
/api/um/v1/analytics/um_conversation_pre_survey/ A pre-conversation survey is answered GET
/api/um/v1/analytics/um_conversation_post_survey/ A post-conversation survey is answered GET
/api/um/v1/analytics/um_contact_unique_visit/ A unique visitor is identified via cookie and starts a conversation GET
/api/um/v1/analytics/um_contact_country/ A contact starts or resumes a conversation, their country is tracked once GET
/api/um/v1/analytics/um_contact_browser/ A contact starts or resumes a conversation, their browser is tracked once GET
/api/um/v1/analytics/um_contact_response_time_backchannel/ Contact response time to offline replies from operators GET
/api/um/v1/analytics/um_contact_response_time_backchannel_service_time/ Contact response time to offline replies from operators (service times considered) GET
/api/um/v1/analytics/um_conversation_category/ A conversation starts, its status is tracked based on the availability status of operator and contact GET
/api/um/v1/analytics/um_conversation_part_category/ A conversation starts, its state is tracked based on the availability status of operator and contact GET
/api/um/v1/analytics/um_chat_session_bot_forward_received/ A chatbot reassigns a conversation, the event is attributed to the receiving operator. GET

You find the specifics of each resource further below, after our introduction of the Analytics JSON API’s general features.

API versioning

Currently we only offer one version of our Analytics JSON API: /v1/

You can access all endpoints either without version scheme or as described above by explicitly using the version in the URLs like this:

/api/um/v1/analytics/um_conversation_duration/
/api/um/v1/analytics/um_chat_messages_total/
/api/um/v1/analytics/um_conversation_first_message/
/api/um/v1/analytics/um_conversation_first_message_assignment_update/
/api/um/v1/analytics/um_chat_messages_ct/
/api/um/v1/analytics/um_chat_messages_co/
/api/um/v1/analytics/um_operator_status/
/api/um/v1/analytics/um_operator_slot_usage/
/api/um/v1/analytics/um_operator_response_time_first/
/api/um/v1/analytics/um_operator_response_time_first_service_time/
/api/um/v1/analytics/um_operator_response_time_conversation_first/
/api/um/v1/analytics/um_operator_response_time_conversation_first_service_time/
/api/um/v1/analytics/um_operator_response_time/
/api/um/v1/analytics/um_operator_response_time_service_time/
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_first/
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_first_service_time/
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session/
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_service_time/
/api/um/v1/analytics/um_conversation_rating/
/api/um/v1/analytics/um_conversation_feedback/
/api/um/v1/analytics/um_conversation_unanswered_live/
/api/um/v1/analytics/um_conversation_unanswered_ended/
/api/um/v1/analytics/um_conversation_goal_reached/
/api/um/v1/analytics/um_conversation_reopen/
/api/um/v1/analytics/um_missed_opportunity/
/api/um/v1/analytics/um_conversation_topic/
/api/um/v1/analytics/um_conversation_topic_change/
/api/um/v1/analytics/um_conversation_pre_survey/
/api/um/v1/analytics/um_conversation_post_survey/
/api/um/v1/analytics/um_contact_unique_visit/
/api/um/v1/analytics/um_contact_country/
/api/um/v1/analytics/um_contact_browser/
/api/um/v1/analytics/um_contact_response_time/
/api/um/v1/analytics/um_contact_response_time_service_time/
/api/um/v1/analytics/um_conversation_category/
/api/um/v1/analytics/um_conversation_part_category/
/api/um/v1/analytics/um_chat_session_bot_forward_received/

Future new versions will be described here and follow the naming scheme "v{integer}", for example: /v2/. Endpoint URLs without version scheme will always default to the latest version.

Our APIs are constantly evolving, but we are striving to implement any new features in a backwards compatible way. If breaking changes are necessary, we will introduce a new API version. Examples for breaking changes are:

  • Removing, renaming, or moving API entities.
  • Changing or removing functionality.
  • Making optional parameters or properties mandatory.

Non-breaking changes, like new endpoints or new optional properties, can happen anytime.
When we deprecate older versions of the API, we will provide at least 90 days of notice.

Authentication

All API requests must be authenticated with an API token, that means the API token must be passed as an authorization header with each request:

Userlike offers two types of authentication tokens: the “customer authentication token,” allowing access to the resources of all organizations, and the “organization authentication token,” allowing access to the resources of a single organization.

Organization authentication token

The organization authentication token gives you access to the resources of Analytics data of a single organization. You find it in your Dashboard under **Chat tools** > **API settings**:

Customer authentication token

The customer authentication token gives you access to the resources of Analytics data for all organizations. You find it in your Dashboard under **Account** > **API settings**:

API rate limits

You can send up to 10 API requests per minutes to our Analytics API. After the resource limit is reached, you’ll receive a response with HTTP status code 429 (too many requests).
https://api.userlike.com

Resource (per organization) Methods combined requests/minute
/api/um/v1/analytics/um_conversation_first_message/GET10
/api/um/v1/analytics/um_conversation_first_message_assignment_update/GET10
/api/um/v1/analytics/um_conversation_duration/GET10
/api/um/v1/analytics/um_chat_messages_total/GET10
/api/um/v1/analytics/um_chat_messages_ct/GET10
/api/um/v1/analytics/um_chat_messages_co/GET10
/api/um/v1/analytics/um_operator_status/GET10
/api/um/v1/analytics/um_operator_slot_usage/GET10
/api/um/v1/analytics/um_operator_response_time_first/GET10
/api/um/v1/analytics/um_operator_response_time_first_service_time/GET10
/api/um/v1/analytics/um_operator_response_time_conversation_first/GET10
/api/um/v1/analytics/um_operator_response_time_conversation_first_service_time/GET10
/api/um/v1/analytics/um_operator_response_time/GET10
/api/um/v1/analytics/um_operator_response_time_service_time/GET10
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_first/GET10
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_first_service_time/GET10
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session/GET10
/api/um/v1/analytics/um_operator_response_time_to_unanswered_session_service_time/GET10
/api/um/v1/analytics/um_conversation_rating/GET10
/api/um/v1/analytics/um_conversation_feedback/GET10
/api/um/v1/analytics/um_conversation_unanswered_live/GET10
/api/um/v1/analytics/um_conversation_unanswered_ended/GET10
/api/um/v1/analytics/um_conversation_inactivity_action/GET10
/api/um/v1/analytics/um_conversation_goal_reached/GET10
/api/um/v1/analytics/um_conversation_reopen/GET10
/api/um/v1/analytics/um_missed_opportunity/GET10
/api/um/v1/analytics/um_conversation_topic/GET10
/api/um/v1/analytics/um_conversation_topic_change/GET10
/api/um/v1/analytics/um_conversation_pre_survey/GET10
/api/um/v1/analytics/um_conversation_post_survey/GET10
/api/um/v1/analytics/um_contact_unique_visit/GET10
/api/um/v1/analytics/um_contact_country/GET10
/api/um/v1/analytics/um_contact_browser/GET10
/api/um/v1/analytics/um_contact_response_time_backchannel/GET10
/api/um/v1/analytics/um_contact_response_time_backchannel_service_time/GET10
/api/um/v1/analytics/um_conversation_session_count/GET10
/api/um/v1/analytics/um_conversation_session_duration_live/GET10
/api/um/v1/analytics/um_conversation_session_duration_offline/GET10
/api/um/v1/analytics/um_conversation_session_duration_re_engage/GET10
/api/um/v1/analytics/um_conversation_status_duration/GET10
/api/um/v1/analytics/um_conversation_unassigned_duration/GET10
/api/um/v1/analytics/um_chat_session_manual_forward_live/GET10
/api/um/v1/analytics/um_chat_session_manual_forward_offline/GET10
/api/um/v1/analytics/um_chat_session_manual_forward_re_engage/GET10
/api/um/v1/analytics/um_chat_session_manual_forward_group_live/GET10
/api/um/v1/analytics/um_chat_session_manual_forward_group_offline/GET10
/api/um/v1/analytics/um_chat_session_manual_forward_group_re_engage/GET10

Filtering

You can filter the results of each resource’s endpoint. The filters you choose apply to all resources. Here we’ll highlight the details of each Analytics filter.

Organization filter

By default, the resources returned by all Analytics endpoints are returned for all organizations.

Widget filter

By default, the resources returned by all Analytics endpoints are returned for all Widgets.

Operator filter

By default, the resources returned by all Analytics endpoints are returned for all operators.

Operator group filter

By default, the resources returned by all Analytics endpoints are returned for all operator groups.

Date and time filter

By default, the resources returned by all Analytics endpoints are returned for the current day. If only one of the date filters is used, it will default to that single day. The required format for all date filters is YYYY-mm-dd expected to be in UTC time zone.

If needed, the filters 'event_date_from' and 'event_date_to' can be enhanced with time filters in the format YYYY-mm-ddTHH:MM:SS. Please note that it is not possible to request data for a time period larger than 93 days with a single request.

Chatbot filter

By default, the resources returned by all Analytics endpoints are returned for operators.

If needed, the 'operator_mode' filter can be applied to limit the data set to only data points that have been logged while a human operator (operator_mode=human) or chatbot (operator_mode=bot) operator was involved. Please note that you cannot use this filter with multiple keywords.

Combining filters

You can also apply several filters to an API request. Just connect additional filters with an “and”, the selection will return all resource items that match each filter criterion.

The more filters you add, the more specific your request will be and chances are that there are no items matching all criteria.

Multiple keywords

You can search for multiple keywords in one request by providing the parameter with a white-space-separated value. Since you cannot use literal whitespaces in your request URLs, use one of the following encodings:

Encoding Value Example
"Percent" encoding %20 ?um_widget_id=3%204
"Plus" encoding + ?um_widget_id=3+4

You can use multiple keywords by connecting them with a “+”. Still, they’ll follow an “or” logic, which means that a search for um_widget_id “3+4” will return results that match either the first **or** the second Widget ID:

Data point format

Each resource yields a list of data points in the following format:

Key Data type Remarks
um_widget_id list of numbers
organization_id number
operator_id number Not available for um_missed_opportunity
operator_group_id number Not available for um_missed_opportunity
time list of numbers
value number Relevance depends on accessed resource
value_str string Relevance depends on accessed resource
conversation_id number Only available if the metric was tracked based on a conversation event (this will also include some but not all entries for um_operator_status um_operator_slot_usage)
conversation_part_id number Only available if the metric was tracked based on an individual conversation session event (this also includes some but not all entries for um_operator_status um_operator_slot_usage)
conversation_session_id number Only available if the metric was tracked based on an individual conversation session event (this also includes some but not all entries for um_operator_status um_operator_slot_usage)
is_chatbot_metric boolean True if the associated operator while tracking this data point was a chatbot, a detailed explanation on how to interpret is_chatbot_metric, chatbot_interaction and human_interaction can be found in the examples
chatbot_interaction boolean Shows the progression in an individual conversation. Only available if the metric was tracked for a conversation event.
human_interaction boolean Shows the progression in an individual conversation. Only available if the metric was tracked for a conversation event.

Resources

Resource Description 'value' 'value_str' Remarks
um_operator_status Operator status changes, due to an explicit operator action or slot change online
slots_full
away
offline
Detailed explanations
um_operator_slot_usage An operator’s number of occupied chat slots changes Current chat slot utilization of the operator in percent Exact number of occupied slots and maximum number of slots set for the operator, in the form: 'current_slots':'total_slots'
um_conversation_topic Latest topic(s) set for a specific conversation IDs of set topic(s) Verbose names of topic(s) Counts only 1 event per conversation (the latest change)
um_conversation_pre_survey A pre-conversation survey is answered Index ID of selected option Verbose label of selected option
um_conversation_post_survey A post-conversation survey is answered Index ID of selected option Verbose label of selected option
um_contact_browser A contact’s browser is identified during a conversation Browser identification
um_contact_country A contact’s country is identified during a conversation Country identification
um_conversation_duration The duration of a conversation when it ends Duration in seconds Multiple events can occur if a conversation is resumed and ends again
um_conversation_first_message The first message in a conversation is sent Message could be from operator or contact
um_conversation_first_message_assignment_update The first message in a conversation is sent Message could be from operator or contact. This metric is identical to um_conversation_first_message but the assigned operator will be updated according to the state of the corresponding conversation.
um_conversation_rating A contact rates a conversation Rating value selected by contact Only tracks the latest rating in a conversation
um_conversation_feedback A contact leaves feedback in a conversation 1 Only tracks the occurrence of the feedback not its content
um_chat_messages_total A message is sent or received in a conversation Message count Tracked at the end of a conversation session
um_chat_messages_ct An operator sends a message in a conversation session Message count Tracked at the end of a conversation session
um_chat_messages_co Counts all messages received in a conversation session Message count Tracked at the end of a conversation session
um_conversation_unanswered_live A live conversation session times out without an operator reply 1 Only tracks 1 event per conversation, even if the contact made another conversation attempt. Counts only if an operator was online, ignores slot status
um_conversation_unanswered_ended A conversation ends without an operator reply 1 Only tracks 1 event per conversation
um_conversation_inactivity_action The system triggers an inactivity prevention action for a conversation based on the Widget’s settings under **Chat > Behavior > Inactivity prevention**. 1 status_unassign
status_reassign_fail
status_reassign
active_notification
active_reassign_fail
active_reassign
offline_reassign_fail
offline_reassign
Detailed explanations
um_conversation_goal_reached A conversation goal is reached ID of goal reached Name of the actual goal reached
um_conversation_reopen An ended conversation is resumed 1 New status after conversation is resumed
um_missed_opportunity A contact tries to start a new conversation while no operator is available 1 ID of the relevant conversation as text value
um_contact_unique_visit A unique visitor is identified via cookie and starts a conversation 1 ID of the relevant conversation as text value Event is registered at the end of the conversation session
um_operator_response_time_first The first response time of an operator in a conversation session Response time in seconds Tracked at the first operator response
um_operator_response_time_first_service_time The first response time of an operator in a conversation session (service times considered) Response time in seconds Tracked at the first operator response. Service time needs to be enabled.
um_operator_response_time_conversation_first The first response of an operator in the first session of a conversation Response time in seconds Tracked at the first operator response
um_operator_response_time_conversation_first_service_time The first response of an operator in the first session of a conversation (service times considered) Response time in seconds Tracked at the first operator response. Service time needs to be enabled.
um_operator_response_time Response time of an operator in a conversation session Response time in seconds Tracked for all but the first operator response.
um_operator_response_time_service_time Response time of an operator in a conversation session (service times considered) Response time in seconds Tracked for all but the first operator response. Service time needs to be enabled.
um_operator_response_time_to_unanswered_session_first Response time in the first session of a conversation started while no operator was available Response time in seconds
um_operator_response_time_to_unanswered_session_first_service_time Response time in the first session of a conversation started while no operator was available (service times considered) Response time in seconds Service time needs to be enabled.
um_operator_response_time_to_unanswered_session Response time in a conversation session started while no operator was available Response time in seconds
um_operator_response_time_to_unanswered_session_service_time Response time in a conversation session started while no operator was available (service times considered) Response time in seconds Service time needs to be enabled.
um_conversation_part_category A conversation starts, its status is tracked based on the availability status of operator and contact 1 live
offline
re-engage
Detailed explanations
um_contact_response_time_backchannel Response time of a contact to an asynchronous operator reply. Response time in seconds
um_contact_response_time_backchannel_service_time Response time of a contact to an asynchronous operator reply (service times considered) Response time in seconds Service time needs to be enabled.
um_conversation_session_count Number of sessions in a conversation Number of conversation sessions The value is updated with each new session, while the event time remains that of the first session.
um_conversation_session_duration_live Duration of a conversation session in which operator and contact were active at the same time Session duration in seconds live
um_conversation_session_duration_offline Duration of a conversation session in which only the contact was active Session duration in seconds offline Please note that the Analytics dashboard aggregates “offline” and “re_engage” into a single graph.
um_conversation_session_duration_re_engage Duration of a conversation session in which only operators was active Session duration in seconds re-engage Please note that the Analytics dashboard aggregates “offline” and “re_engage” into a single graph.
um_conversation_status_duration Duration that a conversation stays in any active status (“New”, “Open”, “Pending”). Duration in seconds Status value There is one record for each of the status values per conversation.
um_conversation_unassigned_duration Duration that a conversation stays unassigned while in an active status (“New”, “Open”, “Pending”). Duration in seconds The values are only recorded and updated when the conversation is assigned to an operator or ended without assignee. Only one value per conversation per status value is recorded.
um_chat_session_manual_forward_live Number of times a live conversation session was reassigned to an operator 1 Textual compound containing operator ids for 'from', 'to' and 'by' To categorize the event as 'live' the session state at moment of the reassignement is considered
um_chat_session_manual_forward_offline Number of times an offline conversation session was reassigned to an operator 1 Textual compound containing operator ids for 'from', 'to' and 'by' To categorize the event as 'offline' the session state at moment of the reassignement is considered
um_chat_session_manual_forward_re_engage Number of times a re-engage conversation session was reassigned to an operator 1 Textual compound containing operator ids for 'from', 'to' and 'by' To categorize the event as 're-engage' the session state at moment of the reassignement is considered
um_chat_session_manual_forward_group_live Number of times a live conversation session was reassigned to an operator group 1 Textual compound containing operator ids for 'from', 'to' and 'by' To categorize the event as 'live' the session state at moment of the reassignement is considered
um_chat_session_manual_forward_group_offline Number of times an offline conversation session was reassigned to an operator group 1 Textual compound containing operator ids for 'from', 'to' and 'by' To categorize the event as 'offline' the session state at moment of the reassignement is considered
um_chat_session_manual_forward_re_group_engage Number of times a re-engage conversation session was reassigned to an operator group 1 Textual compound containing operator ids for 'from', 'to' and 'by' To categorize the event as 're-engage' the session state at moment of the reassignement is considered
um_chat_session_bot_forward_received A conversation is initially assigned to a chatbot and then reassigned to another operator. 1

Resource Details

Resource Resource value Description
um_operator_status online Operator is available and has open slots
um_operator_status slots_full Operator is available but all slots are full
um_operator_status away Operator is set to away
um_operator_status offline Operator is offline
um_operator_status removed_widget Operator is removed from Widget routing
um_conversation_inactivity_action status_reassign A conversation remained in the “New” or “Open” status for too long (based on your Widget settings) without the assigned operator reacting to it. To not keep the contact waiting, the respective conversation was unassigned, indicating to all available operators that an action is required.
um_conversation_inactivity_action status_unassign A conversation remained in the “New” or “Open” status for too long (based on your Widget settings) without the assigned operator reacting to it. To not keep the contact waiting, the respective conversation was assigned to a different, available operator.
um_conversation_inactivity_action status_reassign_fail A conversation remained in the “New” or “Open” status for too long (based on your Widget settings) without the assigned operator reacting to it. Still, the conversation could not be reassigned as none of the other operators had any free chat slots. If this event occurs more frequently, we suggest to increase your overall availability by adding more operators or increasing the existing operators’ number of chat slots.
um_conversation_inactivity_action active_notification The assigned operator of a live conversation did not reply in time (based on your Widget settings). The respective contact was notified about this.
um_conversation_inactivity_action active_reassign The assigned operator did not reply in time (based on your Widget settings). To not keep the contact waiting, the respective conversation was assigned to a different, available operator. Please note that this event is also triggered if the event Inactivity message sent was triggered before.
um_conversation_inactivity_action active_reassign_fail The assigned operator did not reply in time (based on your Widget settings). Still, the conversation could not be reassigned as none of the other operators had any free chat slots.
um_conversation_inactivity_action offline_reassign A contact resumed a conversation while the last assigned operator was not available.
um_conversation_inactivity_action offline_reassign_fail A contact resumed a conversation while the last assigned operator was not available. Still, the conversation could not be reassigned as none of the other operators had any free chat slots.
um_conversation_category live Conversation is started by operator or contact while both are available
um_conversation_category offline Conversation is started by contact while operator is unavailable
um_conversation_category re-engage Conversation is started by operator while contact is unavailable
um_conversation_part_category live Conversation part is started while both operator and contact are online and a slot is reserved
um_conversation_part_category offline Conversation part is started either while only the contact is online or contact and operator are online while no slot is reserved
um_conversation_part_category re-engage Conversation part is started while only the contact is online

Python examples

We prepared a few examples on how to access the Userlike Analytics API using Python. It’s pretty straightforward, we use the Python library “requests” for the HTTP requests, always adding the required Authorization headers.

More complex example: Calculate 'online', 'away', 'offline' durations for a single operator in a defined timeframe

This larger example shows you how to combine and interpret the data, to access individual operator IDs, please refer to our JSON API tutorial

This larger example shows you how to cluster data and interpret various data points with respect to chatbot and/or human interactions.