---
sidebar_position: 8
title: Homepage Integration
description: Add Houndarr library-health totals to a Homepage dashboard with the Custom API widget.
---
import Image from '@theme/IdealImage';
# Homepage Integration
Use Homepage's `customapi` widget when you want Houndarr on the same
dashboard as the rest of your stack. The widget reads Houndarr's
key-gated `/api/v1/widget` endpoint and displays the same library-health
rollup that the Houndarr dashboard uses.
## Before you start
| Requirement | Why it matters |
|-------------|----------------|
| Houndarr is running with at least one configured instance | The widget reads the current Houndarr dashboard totals. |
| Homepage can reach Houndarr from its server or container | `widget.url` is fetched by Homepage, not by your browser. |
| You can edit Homepage `services.yaml` | The widget is configured in the service block. |
| You can open `Settings > Admin > API key` in Houndarr | The widget needs a Houndarr API key in the `X-Api-Key` header. |
## Generate the Houndarr API key
Open **Settings > Admin > API key**, then select **Generate key**.
Houndarr shows the plaintext key once. Copy it before closing the
dialog.
:::warning[Copy the key now]
Houndarr stores only a SHA-256 hash of the Houndarr API key. If you
lose the plaintext value, regenerate it and update Homepage.
:::
## Add Houndarr to `services.yaml`
Add a service entry like this. Replace the URLs and the placeholder key
with values from your deployment.
```yaml
- Media:
- Houndarr:
icon: https://av1155.github.io/houndarr/img/houndarr-logo-dark.png
href: http://houndarr:8877
description: Polite media search scheduler
widget:
type: customapi
url: http://houndarr:8877/api/v1/widget
method: GET
refreshInterval: 30000
headers:
X-Api-Key: hndarr_xxxxxxxxxxxxxxxxxxxxxxxxxx
mappings:
- { field: totals.eligible, label: Eligible, format: number }
- { field: totals.gated, label: Gated, format: number }
- { field: totals.unreleased, label: Unreleased, format: number }
- { field: totals.searches_7d, label: Searches, format: number }
```
| Setting | Value |
|---------|-------|
| `href` | The browser link Homepage opens when you select the service. Use the URL you normally use for Houndarr. |
| `widget.url` | The URL the Homepage server or container can reach. In Docker, this is often `http://houndarr:8877/api/v1/widget`. |
| `headers.X-Api-Key` | The Houndarr API key copied from `Settings > Admin > API key`. |
| `refreshInterval` | `30000` asks Homepage to refresh every 30 seconds. |
| `mappings` | The four fields shown in Homepage's compact service card. |
Restart or reload Homepage after saving `services.yaml`.
## When Homepage ships a first-class widget
If Homepage adds an official `houndarr` widget type, keep the same
Houndarr API key and endpoint. Follow the Homepage widget docs for the
new block shape, and use this guide for the Houndarr-side key lifecycle
and network checks.
Until that widget is available in your Homepage release, use
`customapi`.
## Test the endpoint from the Homepage network
Run the same request from the host or container network where Homepage
runs:
```bash
curl -i \
-H 'X-Api-Key: hndarr_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
http://houndarr:8877/api/v1/widget
```
A working response returns HTTP 200 and a JSON body with `schema`,
`generated_at`, and `totals`. Endpoint fields and error responses are
listed in the [Widget API reference](/docs/reference/widget-api).
## Troubleshooting
| Symptom | Check |
|---------|-------|
| Homepage shows a connection error | Make sure `widget.url` is reachable from the Homepage server or container. The browser-facing `href` can use a different host. |
| The curl test returns `401` | The `X-Api-Key` header is missing, invalid, regenerated, or revoked. Use the saved current key or generate a new one. |
| The curl test returns `429` | Too many failed key attempts came from the same client IP. Wait 60 seconds and retry with the current key. |
| Totals are zero | Confirm Houndarr has enabled, healthy instances and that its dashboard shows library data. |
## Proxy auth mode
`/api/v1/widget` uses the Houndarr API key in both built-in auth and
proxy auth modes. Homepage does not need a browser session, proxy-auth
header, or CSRF token. It only needs the `X-Api-Key` header.
See [API keys](/docs/reference/api-keys) for the key lifecycle and
[SSO Proxy Auth](/docs/guides/sso-proxy-auth#api-key-endpoints-in-proxy-mode)
for the proxy-mode trust model.