# \_mod\_TAUTULLI

Provider ID: `TAUTULLI`\
Version (module): `1.0.0`

{% tabs %}
{% tab title="End users" %}
Tautulli support in the sync engine.

This provider is **read-only**.

Use it to import / sync:

* history

Setup docs:

* [Auth: Tautulli](/crosswatch/providers/authentication/auth-others/auth-tautulli.md)
* [Adapter: Tautulli](/crosswatch/providers/synchronization/adapter-tautulli.md)

{% hint style="info" %}
Don’t sync Tautulli directly to other providers.

Sync Tautulli → CrossWatch first, then sync CrossWatch → other providers.

Don’t forget to enter your Tautulli **User ID**.

See also: [Auth: Tautulli](/crosswatch/providers/authentication/auth-others/auth-tautulli.md)
{% endhint %}

### What “read-only” means

Read-only means CrossWatch will **never write** to Tautulli.

So Tautulli can only be used as a **source** in a pair.

### Syncing Tautulli with the CrossWatch tracker

Use this to import Plex history into the local CrossWatch tracker:

1. Create a pair: `TAUTULLI` → `CROSSWATCH`
2. Enable only: `history`
3. Run a **dry run** first.
4. Run the real sync.

Then you can sync from the local tracker into other providers:

* [CrossWatch module](/blueprint-architecture/sync/_mod_crosswatch.md)
* [Adapter: CrossWatch](/crosswatch/providers/synchronization/adapter-crosswatch.md)

{% hint style="info" %}
This won’t work in reverse (`CROSSWATCH` → `TAUTULLI`).
{% endhint %}
{% endtab %}

{% tab title="Power users" %}
**Entry point:** `sync/_mod_TAUTULLI.py`

### Provider surface

* `health()`
* `build_index(feature)`
* `add(feature, items)` (no-op in practice)
* `remove(feature, items)` (no-op in practice)

### Features

* `history` → `providers/tautulli/_history.py`

### Capabilities

* `read_only: true`
* `can_source: true`
* `can_target: false`
* `bidirectional: false`
* `provides_ids: true`
* `index_semantics: "present"`

### Config

Config block name:

* `Tautulli` or `tautulli`

Common keys:

* `server_url`, `api_key`
* `verify_ssl` (default `true`)
* `timeout` (default `10.0`), `max_retries` (default `3`)

### Gotchas

Keep this provider as a source only.

Write calls may exist on the surface, but should be treated as no-ops.

<details>

<summary>Runtime call flow</summary>

```
Orchestrator
  └─ OPS.build_index(cfg, feature)
       └─ TAUTULLIModule.build_index(feature)
            └─ providers/tautulli/_{feature}.py : build_index(adapter, ...)
```

</details>

<details>

<summary>OPS contract</summary>

* `name()`
* `label()`
* `features()`
* `capabilities()`
* `is_configured(cfg)`
* `build_index(cfg, feature=...)`
* `add(cfg, items, feature=..., dry_run=False)`
* `remove(cfg, items, feature=..., dry_run=False)`
* `health(cfg)`

</details>

<details>

<summary>Full config reference</summary>

Config namespace:

* `cfg["tautulli"]` (fallback: `cfg["auth"]["tautulli"]`)

Fields:

* `server_url`, `api_key`
* `verify_ssl` (default: `true`)
* `timeout` (default: `10.0`)
* `max_retries` (default: `3`)

Dependencies:

* `requires: []`

</details>
{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.crosswatch.app/blueprint-architecture/sync/_mod_tautulli.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
