> ## Documentation Index
> Fetch the complete documentation index at: https://manifest.build/llm-gateway/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# M102: Provider subscription credentials unusable

> M102 is returned when subscription credentials cannot be refreshed or used.

## What you saw

```text theme={"theme":{"light":"github-light","dark":"github-dark"}}
[🦚 Manifest M102] openai subscription credentials could not be refreshed. Reconnect OAuth here: https://app.manifest.build/...
See https://manifest.build/llm-gateway/docs/errors/M102
```

The provider name (`openai` in the example) varies based on which subscription route the gateway selected.

## Why it happened

Routing elected a **subscription** connection (ChatGPT OAuth, Claude Max token, Copilot device code, and similar), and the gateway still has a stored credential blob for it — but that credential cannot produce a usable access token.

Typical causes:

* The OAuth **refresh token expired**, was revoked, or the user signed out of the provider account
* A pasted subscription token is no longer valid
* Provider-side session invalidation after a password change or security reset

This is different from [M100](/llm-gateway/docs/llm-gateway/docs/errors/M100): M100 means there is no key on file. M102 means a subscription row exists and was elected, but the unwrap/refresh step failed.

When fallback routes are configured, the gateway records the M102 hop and continues the chain. You only see a terminal M102 response when no usable fallback remains.

## How to fix it

1. Open the dashboard link in the error message. It goes straight to the harness's **Routing** page.
2. Open **Providers → Subscriptions** in the sidebar, click **Connect** on the provider, and redo the auth: OAuth, device code, or a fresh token.
3. Optionally add a working [API key](/llm-gateway/docs/llm-gateway/docs/providers/api-key-providers) or another [subscription](/llm-gateway/docs/llm-gateway/docs/providers/subscription-based-providers) as a fallback so a dead primary does not block traffic.
4. Retry the request.

## Related

* [M100: Provider API key missing](/llm-gateway/docs/llm-gateway/docs/errors/M100)
* [M101: No providers configured](/llm-gateway/docs/llm-gateway/docs/errors/M101)
* [Subscription-based providers](/llm-gateway/docs/llm-gateway/docs/providers/subscription-based-providers)
* [API key providers](/llm-gateway/docs/llm-gateway/docs/providers/api-key-providers)
* [Routing](/llm-gateway/docs/llm-gateway/docs/llm-gateway)
* [All error codes](/llm-gateway/docs/llm-gateway/docs/errors)
