---
url: /reference/api-levels.md
description: >-
  What each level of the public API promises, and the declarations that are
  experimental or SPI.
---

# API Levels

Every public declaration of a published module has one of four levels. The ABI dumps (`<module>/api/<module>.api`) record the signatures of the first three, so a change to them shows in review.

| Level | Marker | Promise |
| --- | --- | --- |
| Public | none | A 10.x patch release keeps it binary compatible. A 10.x minor release may change it; its release notes name every such change. |
| Experimental | `@ExperimentalWowApi` | A 10.x minor release may change or remove it. Using it needs `@OptIn(ExperimentalWowApi::class)`, a compiler warning otherwise. |
| SPI | `@WowSpi` | A port that backends and transports implement; a minor release may change it. Using it needs `@OptIn(WowSpi::class)`, a compiler warning otherwise. |
| Internal | `@InternalWowApi` | For Wow's own modules: it may change or go in any release. An application cannot opt in (a compiler error), and the dumps leave it out. |

The two lists below are generated from the sources of the published modules: the public declarations that carry the marker.

## Experimental declarations

| Declaration | Kind | Module |
| --- | --- | --- |
| `me.ahoo.wow.api.read.Queries.datasets` | fun | `wow-api` |
| `me.ahoo.wow.api.read.datasets` | fun | `wow-api` |
| `me.ahoo.wow.query.AbacQueryOptions` | class | `wow-query` |
| `me.ahoo.wow.query.AbacQueryPolicy` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.DatasetQueryBackend` | interface | `wow-query` |
| `me.ahoo.wow.query.dataset.DatasetQueryBackendFactory` | interface | `wow-query` |
| `me.ahoo.wow.query.dataset.AbstractDatasetQueryBackendFactory` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.DatasetQueryGateway` | interface | `wow-query` |
| `me.ahoo.wow.query.dataset.DefaultDatasetQueryGateway` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.DatasetQueryGateways` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.DatasetQueryModelProfile` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.DatasetVisibility` | interface | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDatasetScope` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDataset` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDatasetBuilder` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDatasetFiles` | class | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDatasetChange` | interface | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDatasetListener` | interface | `wow-query` |
| `me.ahoo.wow.query.dataset.QueryDatasets` | class | `wow-query` |
| `me.ahoo.wow.query.read.datasetTrees` | fun | `wow-query` |
| `me.ahoo.wow.query.schema.DeclarationValue` | interface | `wow-query` |
| `me.ahoo.wow.query.schema.QuerySchemaDeclaration` | class | `wow-query` |
| `me.ahoo.wow.query.schema.QueryFieldDeclaration` | class | `wow-query` |
| `me.ahoo.wow.query.schema.QueryFieldDeclarationBuilder` | class | `wow-query` |
| `me.ahoo.wow.query.schema.QueryValueType` | class | `wow-query` |
| `me.ahoo.wow.query.schema.QueryValueKind` | class | `wow-query` |
| `me.ahoo.wow.query.schema.QuerySemanticType` | interface | `wow-query` |
| `me.ahoo.wow.query.schema.Temporal` | interface | `wow-query` |
| `me.ahoo.wow.clickhouse.query.ClickHouseDatasetQueryBackendFactory` | class | `wow-clickhouse` |
| `me.ahoo.wow.clickhouse.query.ClickHouseDatasetOptions` | class | `wow-clickhouse` |
| `me.ahoo.wow.http.ops.parkedRoutes` | fun | `wow-http` |
| `me.ahoo.wow.http.ops.OpsPaths` | object | `wow-http` |
| `me.ahoo.wow.http.ops.WebhookNotifier` | class | `wow-http` |
| `me.ahoo.wow.client.java.JavaQueries.datasets` | fun | `wow-client` |

## SPI declarations

| Declaration | Kind | Module |
| --- | --- | --- |
| `me.ahoo.wow.spi.VirtualThreads` | object | `wow-spi` |
| `me.ahoo.wow.spi.ledger.FailureLedger` | interface | `wow-spi` |
| `me.ahoo.wow.spi.log.EventLog` | interface | `wow-spi` |
| `me.ahoo.wow.spi.log.TailPacer` | class | `wow-spi` |
| `me.ahoo.wow.spi.log.TailPolling` | class | `wow-spi` |
| `me.ahoo.wow.spi.observation.Observer` | interface | `wow-spi` |
| `me.ahoo.wow.spi.reservation.ReservationStore` | interface | `wow-spi` |
| `me.ahoo.wow.spi.sink.Sink` | interface | `wow-spi` |
| `me.ahoo.wow.spi.snapshot.SnapshotStore` | interface | `wow-spi` |
| `me.ahoo.wow.spi.store.Store` | class | `wow-spi` |
| `me.ahoo.wow.spi.store.StoreConfig` | class | `wow-spi` |
| `me.ahoo.wow.spi.store.StoreResources` | interface | `wow-spi` |
| `me.ahoo.wow.spi.store.StoreProvider` | interface | `wow-spi` |
| `me.ahoo.wow.spi.subscription.CheckpointStore` | interface | `wow-spi` |
| `me.ahoo.wow.spi.subscription.FailureClassifier` | interface | `wow-spi` |
| `me.ahoo.wow.spi.subscription.LeaseStore` | interface | `wow-spi` |
| `me.ahoo.wow.spi.timer.TimerStore` | interface | `wow-spi` |
| `me.ahoo.wow.spi.transport.PartitionedSource` | interface | `wow-spi` |
| `me.ahoo.wow.spi.transport.TopicAdmin` | interface | `wow-spi` |
| `me.ahoo.wow.spi.transport.TopicProducer` | interface | `wow-spi` |
| `me.ahoo.wow.query.QueryBackend` | interface | `wow-query` |
| `me.ahoo.wow.query.QueryBackendFactory` | interface | `wow-query` |
| `me.ahoo.wow.query.schema.QueryStorageAdapter` | interface | `wow-query` |
| `me.ahoo.wow.query.store.StoreQueryProvider` | interface | `wow-query` |
| `me.ahoo.wow.query.store.SnapshotQueries` | interface | `wow-query` |
| `me.ahoo.wow.query.store.EventQueries` | interface | `wow-query` |
| `me.ahoo.wow.query.store.QueryIndexReport` | class | `wow-query` |
| `me.ahoo.wow.query.store.StoreQueryOptions` | class | `wow-query` |
