diff --git a/docs/configure-keyperf.md b/docs/configure-keyperf.md
new file mode 100644
index 000000000..03197d4c8
--- /dev/null
+++ b/docs/configure-keyperf.md
@@ -0,0 +1,137 @@
+## KeyPerf Collector
+
+The KeyPerf collector is designed to gather performance counters from ONTAP objects that include a statistics field in their REST responses. This collector is an alternative to ZapiPerf and RestPerf collectors when these collectors cannot be used due to unavailable relevant APIs.
+
+### Target System
+
+The KeyPerf collector targets ONTAP systems that support the statistics field in their REST responses.
+
+### Requirements
+
+No additional SDK or software requirements are needed. It is recommended to create a read-only user for Harvest on the ONTAP system. For more details, refer to the [prepare monitored clusters](prepare-cdot-clusters.md#all-apis-read-only-approach) documentation.
+
+### Metrics
+
+The KeyPerf collector gathers a dynamic set of performance metrics, including IOPS, latency, and throughput. These metrics are extracted from the statistics fields in the ONTAP REST responses.
+
+### Parameters
+
+The parameters for the KeyPerf collector are distributed across three files:
+
+- [Harvest configuration file](configure-harvest-basic.md#pollers) (default: `harvest.yml`)
+- KeyPerf configuration file (default: `conf/keyperf/default.yaml`)
+- Each object has its own configuration file (located in `conf/keyperf/$version/`)
+
+Except for `addr` and `datacenter`, all other parameters of the KeyPerf collector can be defined in any of these three files. Parameters defined in the lower-level file override parameters in the higher-level ones, allowing for individual object configuration or shared parameters across all objects.
+
+### Collector Configuration File
+
+This configuration file contains a list of objects that should be collected and the filenames of their templates (explained in the next section).
+
+Additionally, this file contains the parameters that are applied as defaults to all objects. As mentioned before, any of these parameters can be defined in the Harvest or object configuration files as well.
+
+| parameter | type | description | default |
+|--------------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------:|
+| `use_insecure_tls` | bool, optional | skip verifying TLS certificate of the target system | false |
+| `client_timeout` | duration (Go-syntax) | how long to wait for server responses | 30s |
+| `latency_io_reqd` | int, optional | threshold of IOPs for calculating latency metrics (latencies based on very few IOPs are unreliable) | 10 |
+| `jitter` | duration (Go-syntax), optional | Each Harvest collector runs independently, which means that at startup, each collector may send its REST queries at nearly the same time. To spread out the collector startup times over a broader period, you can use `jitter` to randomly distribute collector startup across a specified duration. For example, a `jitter` of `1m` starts each collector after a random delay between 0 and 60 seconds. For more details, refer to [this discussion](https://github.com/NetApp/harvest/discussions/2856). | |
+| `schedule` | list, required | the poll frequencies of the collector/object, should include exactly these three elements in the exact same other: | |
+| - `counter` | duration (Go-syntax) | poll frequency of updating the counter metadata cache | 20 minutes |
+| - `data` | duration (Go-syntax) | poll frequency of updating the data cache
**Note** Harvest allows defining poll intervals on sub-second level (e.g. `1ms`), however keep in mind the following: