---
title: "Refresh Catalog"
method: POST
path: "/api/v1/hosted-providers/refresh"
tags: ["hosted-providers"]
---

# Refresh Catalog

`POST /api/v1/hosted-providers/refresh`

## Request

- The document declares no server URL.
- Auth: one of:
  - API key in header `Otari-Key`
  - API key in header `x-api-key`

Re-ask every enabled provider what it lists, then take the rest off the catalog.

The whole deployment rather than one provider: a stored price is what puts a
model on a tenant's Models page, and a price under a provider nothing here
serves cannot be reached by a per-provider refresh. A model list whose
provider nothing defines any more, such as a removed ``config.yml`` entry,
goes too, and is named in ``orphaned_rosters``. Where no provider offers a
model, only those lists go and every price stays; with none of them either,
the sweep answers 409. Declared before the
``/{provider}`` paths to read in the order the surface is used; no method
collides in any case.

## Response `200`

Successful Response

- HostedCatalogRefreshPublic: What a catalog sweep did, or would do. ``removed`` is a sample and ``removed_count`` the total, so a deployment that has never been swept does not answer one button press with a few thousand strings. ``orphaned_rosters`` names the providers that still have a model list but nothing defining them, such as a removed ``config.yml`` entry: nothing serves them, and an apply deletes their model lists.
  - `kept` HostedCatalogKeptGroupPublic[], required
    - `count` integer, required
    - `models` string[], required
    - `reason` string, required
  - `orphaned_rosters` string[]
  - `providers` HostedCatalogProviderRefreshPublic[], required
    - `added` string[], required
    - `credential_unreadable` boolean
    - `discovery_unsupported` boolean
    - `error` string, nullable
    - `provider` string, required
    - `repriced` string[]
    - `source` 'database' | 'config'
  - `removed` string[], required
  - `removed_count` integer, required
  - `removed_override_rows` integer, required
  - `removed_price_rows` integer, required

## Changes

- **2026-10-16** `1c433ac914dc`: 2 info
  - added the optional property `orphaned_rosters` to the response with the `200` status
  - added the optional property `providers/items/source` to the response with the `200` status
- **2026-10-16** `cde937c0ea7e`: 2 warning
  - removed the optional property `orphaned_rosters` from the response with the `200` status
  - removed the optional property `providers/items/source` from the response with the `200` status
- **2026-10-16** `6e67fc94c224`: 2 info
  - added the optional property `orphaned_rosters` to the response with the `200` status
  - added the optional property `providers/items/source` to the response with the `200` status
- **2026-10-16** `b53c45c6d0fc`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/mozilla-ai/apis/otari/changes/api/v1/hosted-providers/refresh/post.md)

---

[API](https://skmtc.dev/mozilla-ai/apis/otari.md) · [All operations](https://skmtc.dev/mozilla-ai/apis/otari/llms.txt) · [OpenAPI document](https://skmtc.dev/mozilla-ai/apis/otari/revisions/2c95b115b0a8?raw)
