Telemetry

    Meilisearch collects anonymized data from users in order to improve our product. This can be deactivated at any time, and any data that has already been collected can be deleted on request.

    What tools do we use to collect and visualize data?

    We use Segment, a platform for data collection and management, to collect usage data. We then feed that data into Amplitude, a tool for graphing and highlighting data, so that we can build visualizations according to our needs.

    What kind of data do we collect?

    Our data collection is focused on the following categories:

    See below for the complete list of metrics we currently collect.

    We will never:

    Why collect telemetry data?

    We collect telemetry data for only two reasons: so that we can improve our product, and so that we can continue working on this project full-time.

    In order to create a better product, we need reliable quantitative information. The data we collect helps us fix bugs, evaluate the success of features, and better understand our users' needs.

    We also need to prove that people are actually using Meilisearch. Usage metrics help us justify our existence to investors so that we can keep this project alive.

    Why should you trust us?

    Don't trust us—hold us accountable. We feel that it is understandable, and in fact wise, to be distrustful of tech companies when it comes to your private data. That is why we attempt to maintain complete transparency about our data collection, provide an opt-out, and enable users to request the deletion of all their collected data at any time. In the absence of global data protection laws, we believe that this is the only ethical way to approach data collection.

    No company is perfect. If you ever feel that we are being anything less than 100% transparent or collecting data that is infringing on your personal privacy, please let us know by emailing our dedicated account: privacy@meilisearch.com. Similarly, if you discover a data rights initiative or data protection tool that you think is relevant to us, please share it. We are passionate about this subject and take it very seriously.

    How to disable data collection

    Data collection can be disabled at any time by setting a command-line option or environment variable, then restarting the Meilisearch instance.

    meilisearch --no-analytics
    

    For more information about configuring Meilisearch, read our configuration reference.

    How to delete all collected data

    We, the Meilisearch team, provide an email address so that users can request the complete removal of their data from all of our tools.

    To do so, send an email to privacy@meilisearch.com containing the unique identifier generated for your Meilisearch installation (Instance UID when launching Meilisearch). Any questions regarding the management of the data we collect can also be sent to this email address.

    Exhaustive list of all collected data

    Whenever an event is triggered that collects some piece of data, Meilisearch does not send it immediately. Instead, it bundles it with other data in a batch of up to 500kb. Batches are sent either every hour, or after reaching 500kb—whichever occurs first. This is done in order to improve performance and reduce network traffic.

    Be advised!

    This list is liable to change with every new version of Meilisearch. It's not because we're trying to be sneaky! It's because when we add new features we need to collect additional data points to see how they perform.

    Metric nameDescriptionExample
    context.app.versionMeilisearch version number0.23.0
    infos.envValue of --env/MEILI_ENVproduction
    infos.db_pathtrue if --db-path/MEILI_DB_PATH is specified, otherwise falsetrue
    infos.import_dumptrue if --import-dump is specified, otherwise falsetrue
    infos.dump_dirtrue if --dump-dir/MEILI_DUMP_DIR is specified, otherwise falsetrue
    infos.ignore_missing_dumptrue if --ignore-missing-dump is activated, otherwise falsetrue
    infos.ignore_dump_if_db_existstrue if --ignore-dump-if-db-exists is activated, otherwise falsetrue
    infos.import_snapshottrue if --import-snapshot is specified, otherwise falsetrue
    infos.schedule_snapshotValue of --schedule_snapshot/MEILI_SCHEDULE_SNAPSHOT if scheduled snapshots are enabled, otherwise None86400
    infos.snapshot_dirtrue if --snapshot-dir/MEILI_SNAPSHOT_DIR is specified, otherwise falsetrue
    infos.ignore_missing_snapshottrue if --ignore-missing-snapshot is activated, otherwise falsetrue
    infos.ignore_snapshot_if_db_existstrue if --ignore-snapshot-if-db-exists is activated, otherwise falsetrue
    infos.http_addrtrue if --http-addr/MEILI_HTTP_ADDR is specified, otherwise falsetrue
    infos.http_payload_size_limitValue of --http-payload-size-limit/MEILI_HTTP_PAYLOAD_SIZE_LIMIT in bytes336042103
    infos.log_levelValue of --log-level/MEILI_LOG_LEVELdebug
    infos.max_indexing_memoryValue of --max-indexing-memory/MEILI_MAX_INDEXING_MEMORY in bytes336042103
    infos.max_indexing_threadsValue of --max-indexing-threads/MEILI_MAX_INDEXING_THREADS in integer4
    infos.log_levelValue of --log-level/MEILI_LOG_LEVELdebug
    infos.ssl_auth_pathtrue if --ssl-auth-path/MEILI_SSL_AUTH_PATH is specified, otherwise falsefalse
    infos.ssl_cert_pathtrue if --ssl-cert-path/MEILI_SSL_CERT_PATH is specified, otherwise falsefalse
    infos.ssl_key_pathtrue if --ssl-key-path/MEILI_SSL_KEY_PATH is specified, otherwise falsefalse
    infos.ssl_ocsp_pathtrue if --ssl-ocsp-path/MEILI_SSL_OCSP_PATH is specified, otherwise falsefalse
    infos.ssl_require_authValue of --ssl-require-auth/MEILI_SSL_REQUIRE_AUTH as a booleanfalse
    infos.ssl_resumptiontrue if --ssl-resumption/MEILI_SSL_RESUMPTION is specified, otherwise falsefalse
    infos.ssl_ticketstrue if --ssl-tickets/MEILI_SSL_TICKETS is specified, otherwise falsefalse
    system.distributionDistribution on which Meilisearch is launchedArch Linux
    system.kernel_versionKernel version on which Meilisearch is launched5.14.10
    system.coresNumber of cores24
    system.ram_sizeTotal RAM capacity. Expressed in KB16777216
    system.disk_sizeTotal capacity of the largest disk. Expressed in Bytes1048576000
    system.server_providerUsers can tell us on which provider Meilisearch is hosted by filling the MEILI_SERVER_PROVIDER environment variable. This is also filled by our cloud deploy scripts, for example, GCP cloud-config.yamlGCP
    stats.database_sizeDatabase size. Expressed in Bytes2621440
    stats.indexes_numberNumber of indexes2
    start_since_daysNumber of days since instance was launched365
    user_agentUser-agent header encountered during API calls["Meilisearch Ruby (2.1)", "Ruby (3.0)"]
    requests.99th_response_timeHighest latency from among the fastest 99% of successful search requests57ms
    requests.total_succeededTotal number of successful requests3456
    requests.total_failedTotal number of failed requests24
    requests.total_receivedTotal number of received search requests3480
    requests.total_degradedTotal number of searches cancelled after reaching search time cut-off100
    requests.total_used_negative_operatorCount searches using either a negative word or a negative phrase operator.173
    sort.with_geoPointtrue if the sort rule _geoPoint is specified, otherwise falsetrue
    sort.avg_criteria_numberAverage number of sort criteria among all search requests containing the sort parameter2
    filter.with_geoBoundingBoxtrue if the filter rule _geoBoundingBox is specified, otherwise falsefalse
    filter.with_geoRadiustrue if the filter rule _geoRadius is specified, otherwise falsefalse
    filter.most_used_syntaxMost used filter syntax among all search requests containing the filter parameterstring
    q.max_terms_numberHighest number of terms given for the q parameter5
    pagination.max_limitHighest value given for the limit parameter60
    pagination.max_offsetHighest value given for the offset parameter1000
    formatting.max_attributes_to_retrieveMaximum number of attributes to retrieve100
    formatting.max_attributes_to_highlightMaximum number of attributes to highlight100
    formatting.highlight_pre_tagtrue if highlightPreTag is specified, otherwise falsefalse
    formatting.highlight_post_tagtrue if highlightPostTag is specified, otherwise falsefalse
    formatting.max_attributes_to_cropMaximum number of attributes to crop100
    formatting.crop_lengthtrue if cropLength is specified, otherwise falsefalse
    formatting.crop_markertrue if cropMarker is specified, otherwise falsefalse
    formatting.show_matches_positiontrue if showMatchesPosition is used in this batch, otherwise falsefalse
    facets.avg_facets_numberAverage number of facets10
    primary_keyName of primary key when explicitly set as part of document addition, document update, index creation, or index update. Otherwise nullid
    payload_typeAll values encountered in the Content-Type header, including invalid ones["application/json", "text/plain", "application/x-ndjson"]
    index_creationtrue if a document addition or update request triggered index creation, otherwise falsetrue
    ranking_rules.words_positionPosition of the words ranking rule if any, otherwise null1
    ranking_rules.typo_positionPosition of the typo ranking rule if any, otherwise null2
    ranking_rules.proximity_positionPosition of the proximity ranking rule if any, otherwise null3
    ranking_rules.attribute_positionPosition of the attribute ranking rule if any, otherwise null4
    ranking_rules.sort_positionPosition of the sort ranking rule5
    ranking_rules.exactness_positionPosition of the exactness ranking rule if any, otherwise null6
    ranking_rules.valuesA string representing the ranking rules without the custom asc-desc rules"words, typo, attribute, sort, exactness"
    sortable_attributes.totalNumber of sortable attributes3
    sortable_attributes.has_geotrue if _geo is set as a sortable attribute, otherwise falsetrue
    filterable_attributes.totalNumber of filterable attributes3
    filterable_attributes.has_geotrue if _geo is set as a filterable attribute, otherwise falsefalse
    searchable_attributes.totalNumber of searchable attributes4
    searchable_attributes.with_wildcardtrue if * is specified as a searchable attribute, otherwise falsefalse
    per_task_uidtrue if a uids is used to fetch a particular task resource, otherwise falsetrue
    filtered_by_uidtrue if tasks are filtered by the uids query parameter, otherwise falsefalse
    filtered_by_index_uidtrue if tasks are filtered by the indexUids query parameter, otherwise falsefalse
    filtered_by_typetrue if tasks are filtered by the types query parameter, otherwise falsefalse
    filtered_by_statustrue if tasks are filtered by the statuses query parameter, otherwise falsefalse
    filtered_by_canceled_bytrue if tasks are filtered by the canceledBy query parameter, otherwise falsefalse
    filtered_by_before_enqueued_attrue if tasks are filtered by the beforeEnqueuedAt query parameter, otherwise falsefalse
    filtered_by_after_enqueued_attrue if tasks are filtered by the afterEnqueuedAt query parameter, otherwise falsefalse
    filtered_by_before_started_attrue if tasks are filtered by the beforeStartedAt query parameter, otherwise falsefalse
    filtered_by_after_started_attrue if tasks are filtered by the afterStartedAt query parameter, otherwise falsefalse
    filtered_by_before_finished_attrue if tasks are filtered by the beforeFinishedAt query parameter, otherwise falsefalse
    filtered_by_after_finished_attrue if tasks are filtered by the afterFinishedAt query parameter, otherwise falsefalse
    typo_tolerance.enabledtrue if typo tolerance is enabled, otherwise falsetrue
    typo_tolerance.disable_on_attributestrue if at least one value is defined for disableOnAttributes, otherwise falsefalse
    typo_tolerance.disable_on_wordstrue if at least one value is defined for disableOnWords, otherwise falsefalse
    typo_tolerance.min_word_size_for_typos.one_typoThe defined value for the minWordSizeForTypos.oneTypo parameter5
    typo_tolerance.min_word_size_for_typos.two_typosThe defined value for the minWordSizeForTypos.twoTypos parameter9
    pagination.max_total_hitsThe defined value for the pagination.maxTotalHits property1000
    faceting.max_values_per_facetThe defined value for the faceting.maxValuesPerFacet property100
    distinct_attribute.settrue if a field name is specified, otherwise falsefalse
    distinctBoolean indicating whether a distinct was specified in an aggregated list of requests.true
    proximity_precision.settrue if the setting has been manually set, otherwise false.false
    proximity_precision.valuebyWord or byAttribute.byWord
    displayed_attributes.totalNumber of displayed attributes3
    displayed_attributes.with_wildcardtrue if * is specified as a displayed attribute, otherwise falsefalse
    stop_words.totalNumber of stop words3
    separator_tokens.totalNumber of separator tokens3
    non_separator_tokens.totalNumber of non-separator tokens3
    dictionary.totalNumber of words in the dictionary3
    synonyms.totalNumber of synonyms3
    per_index_uidtrue if the uid is used to fetch an index stat resource, otherwise falsefalse
    searches.avg_search_countThe average number of search queries received per call for the aggregated event4.2
    searches.total_search_countThe total number of search queries received for the aggregated event16023
    indexes.avg_distinct_index_countThe average number of queried indexes received per call for the aggregated event1.2
    indexes.total_distinct_index_countThe total number of distinct index queries for the aggregated event6023
    indexes.total_single_indexThe total number of calls when only one index is queried2007
    matching_strategy.most_used_strategyMost used word matching strategylast
    infos.with_configuration_filetrue if the instance is launched with a configuration file, otherwise falsefalse
    infos.experimental_contains_filtertrue if the containsFilter experimental feature is enabledfalse
    infos.experimental_edit_documents_by_functiontrue if the editDocumentsByFunction experimental feature is enabledfalse
    infos.experimental_enable_metricstrue if --experimental-enable-metrics/MEILI_EXPERIMENTAL_ENABLE_METRICS is specified, otherwise falsefalse
    infos.experimental_replication_parameterstrue if --experimental-replication-parameters/MEILI_EXPERIMENTAL_REPLICATION_PARAMETERS is specified at launch, otherwise falsefalse
    infos.experimental_reduce_indexing_memory_usagetrue if --experimental-reduce-indexing-memory-usage/MEILI_EXPERIMENTAL_REDUCE_INDEXING_MEMORY_USAGE is specified at launch, otherwise falsefalse
    infos.experimental_logs_modehuman or json depending on the value specified.human
    infos.experimental_enable_logs_routetrue if --experimental-enable-logs-route/MEILI_EXPERIMENTAL_ENABLE_LOGS_ROUTE is specified at launch, otherwise falsefalse
    infos.gpu_enabledtrue if Meilisearch was compiled with CUDA support, otherwise falsefalse
    swap_operation_numberNumber of swap operations2
    pagination.most_used_navigationMost used search results navigationestimated
    per_document_idtrue if the DELETE /indexes/:indexUid/documents/:documentUid endpoint was used, otherwise falsefalse
    per_filtertrue if POST /indexes/:indexUid/documents/fetch, GET /indexes/:indexUid/documents/, or POST /indexes/:indexUid/documents/delete endpoints were used, otherwise falsefalse
    clear_alltrue if DELETE /indexes/:indexUid/documents endpoint was used, otherwise falsefalse
    per_batchtrue if the POST /indexes/:indexUid/documents/delete-batch endpoint was used, otherwise falsefalse
    facets.total_distinct_facet_countTotal number of distinct facets queried for the aggregated eventfalse
    facets.additional_search_parameters_providedtrue if additional search parameters were provided for the aggregated event, otherwise falsefalse
    faceting.sort_facet_values_by_star_counttrue if all fields are set to be sorted by count, otherwise falsefalse
    faceting.sort_facet_values_by_totalThe number of different values that were set10
    scoring.show_ranking_scoretrue if showRankingScore used in the aggregated event, otherwise falsetrue
    scoring.show_ranking_score_detailstrue if showRankingScoreDetails was used in the aggregated event, otherwise falsetrue
    scoring.ranking_score_thresholdBoolean indicating whether a rankingScoreThreshold was specified in an aggregated list of requeststrue
    vector_storetrue if the vector store feature is enabled, otherwise falsetrue
    attributes_to_search_on.total_number_of_usestrue if the vector store feature is enabled, otherwise falsetrue
    vector.max_vector_sizeHighest number of dimensions given for the vector parameter in this batch1536
    vector.retrieve_vectorstrue if the retrieve_vectors parameter has been used in this batch.false
    hybrid.enabledtrue if hybrid search been used in the aggregated event, otherwise falsetrue
    hybrid.semantic_ratiotrue if semanticRatio was used in this batch, otherwise falsefalse
    embedders.totalNumbers of defined embedders2
    embedders.sourcesAn array representing the different provided sources[”huggingFace”, “userProvided”]
    embedders.document_template_usedA boolean indicating if one of the provided embedders has a custom template definedtrue
    embedders.document_template_max_bytesa value indicating the largest value for document TemplateMaxBytes across all embedder400
    embedders.binary_quantization_usedtrue if the user updated the binary quantized field of the embedded settingsfalse
    infos.task_queue_webhooktrue if the instance is launched with a task queue webhook, otherwise falsefalse
    infos.experimental_search_queue_sizeSize of the search queue750
    localesList of locales used with /search and /settings routes[”fra”, “eng”]
    federation.use_federationtrue if at least one of the multi-search requests from the last aggregate contained a non-null top-level federation objectfalse