# Providers

Upseam watches nine providers, two MCP servers and your own OpenAPI and
GraphQL contracts. The id in the first column is what you write in
[`ignore.providers`](configuration.md#ignore).

## Versioned APIs

For these providers Upseam finds the API version your code is pinned to and
lists every change published after it.

| Id        | Provider | API                        | SDKs, JavaScript                                                                                          | SDKs, Python  |
| --------- | -------- | -------------------------- | --------------------------------------------------------------------------------------------------------- | ------------- |
| `stripe`  | Stripe   | REST API                   | `stripe`                                                                                                  | `stripe`      |
| `shopify` | Shopify  | Admin GraphQL API          | `@shopify/shopify-api`, `@shopify/shopify-app-react-router`, `@shopify/shopify-app-remix`, `@shopify/admin-api-client` | `ShopifyAPI`  |
| `hubspot` | HubSpot  | REST APIs                  | `@hubspot/sdk`, `@hubspot/api-client`                                                                     | `hubspot-sdk`, `hubspot-api-client` |
| `twilio`  | Twilio   | REST APIs                  | `twilio`                                                                                                  | `twilio`      |
| `github`  | GitHub   | REST API, GraphQL removals | `octokit`, `@octokit/rest`, `@octokit/core`, `@octokit/graphql`, `@octokit/request`                        | `PyGithub`    |

- **Stripe**: pins in `apiVersion`, `stripe.api_version` or the
  `Stripe-Version` header. Without a pin, the version follows from the SDK's
  major version, for the majors Upseam has a default for. Source: the Stripe changelog.
- **Shopify**: pins in `apiVersion`, `ApiVersion.October25` and
  `/admin/api/<version>/` paths; in Python, `shopify.Session(url, "2025-10",
  token)`, `shopify.Session.temp(...)` and `api_version = "2025-10"`. The
  Python SDK has no default version, so it needs a pin.
  Source: the shopify.dev changelog, plus a schema diff between versions.
  History starts with the changelog feed on 2024-09-25.
- **HubSpot**: the version is part of the request path, either a legacy `v1`
  to `v4` segment or a date version such as `/crm/objects/2026-03/contacts`.
  Without a pin, `@hubspot/sdk` and `hubspot-sdk` count as `2026-03`, and
  `@hubspot/api-client` and `hubspot-api-client` as the legacy `v3`.
  Source: the developers.hubspot.com changelog, plus endpoints removed between
  OpenAPI specs of date versions.
- **Twilio**: there is no global API version, so the base is the release date
  of the installed `twilio` package. Source: the changelogs of `twilio-oai`,
  `twilio-node` and `twilio-python`. History starts on 2022-01-01.
- **GitHub**: REST API versions from the `X-GitHub-Api-Version` header;
  without it, a request gets `2022-11-28`. Changes come from
  the REST breaking-changes list plus a diff of the OpenAPI descriptions, and
  scheduled GraphQL removals from GitHub's upcoming-changes list.

## Go

Only official Go SDKs are recognised:

| Id          | Module                                                          | API version                                                              |
| ----------- | --------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `stripe`    | `github.com/stripe/stripe-go` (v72 to v86)                      | the major's default, or a `"Stripe-Version", "<version>"` header in code |
| `twilio`    | `github.com/twilio/twilio-go`                                   | release date of the required tag on the Go module proxy                  |
| `github`    | `github.com/octokit/go-sdk`                                     | the `X-GitHub-Api-Version` header in code                                |
| `openai`    | `github.com/openai/openai-go`                                   | none; model ids in strings                                               |
| `anthropic` | `github.com/anthropics/anthropic-sdk-go`                        | none; model ids in strings                                               |
| `gemini`    | `google.golang.org/genai`, `github.com/google/generative-ai-go` | none; model ids in strings                                               |

`github.com/google/go-github` is maintained by Google, not GitHub, and is not
recognised; neither are community clients such as
`github.com/sashabaranov/go-openai`. Shopify, HubSpot and Mistral have no
official Go SDK. Model constants such as `openai.ChatModelGPT4o` are not
matched, only model ids in string literals.

## AI model retirements

These APIs have no dated version. What breaks is a retired model, endpoint or
beta header that your code still names. Upseam lists only the retirements that
match your code, with the shutdown date and the replacement the vendor names.

| Id          | Provider | Source                              | SDKs, JavaScript                                                                    | SDKs, Python                                                     |
| ----------- | -------- | ----------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| `openai`    | OpenAI   | Deprecations page                   | `openai`, `@ai-sdk/openai`, `@langchain/openai`                                     | `openai`, `langchain-openai`                                     |
| `anthropic` | Claude   | Model deprecations page             | `@anthropic-ai/sdk`, `@ai-sdk/anthropic`, `@langchain/anthropic`                    | `anthropic`, `langchain-anthropic`                               |
| `gemini`    | Gemini   | Gemini API deprecations table       | `@google/genai`, `@google/generative-ai`, `@ai-sdk/google`, `@langchain/google-genai` | `google-genai`, `google-generativeai`, `langchain-google-genai` |
| `mistral`   | Mistral  | "Deprecated & retired models" table | `@mistralai/mistralai`, `@ai-sdk/mistral`, `@langchain/mistralai`                   | `mistralai`, `langchain-mistralai`                               |

- OpenAI retirements cover models, endpoints and beta headers; the others
  cover models (and, for Gemini, managed agents).
- Model ids in `.env`, YAML or JSON config files are not searched.
- Gemini code that targets Vertex AI is still checked against Gemini API
  dates.
- When a vendor names exactly one replacement and **New capabilities** is on,
  Upseam can open a [successor model](how-it-works.md#successor-models) pull
  request after approval.

## MCP servers

| Id                    | Server                     | Source                                              |
| --------------------- | -------------------------- | --------------------------------------------------- |
| `github-mcp`          | GitHub MCP server          | Release tool lists and the renamed-tools table      |
| `microsoft-learn-mcp` | Microsoft Learn MCP server | The server's `tools/list`, checked every hour       |

MCP servers are found in MCP configs and agent files, not in package
manifests. Their changes are tool renames, removals and argument changes; see
[MCP servers](mcp.md).

## Internal contracts

| Contract | Formats    | Compared                                         |
| -------- | ---------- | ------------------------------------------------ |
| OpenAPI  | JSON, YAML | two commits of the spec on your default branch   |
| GraphQL  | SDL schema | two commits of the schema on your default branch |

- **OpenAPI**: schemas, request bodies, query parameters and responses per
  status code and media type. Removed properties, schemas, endpoints and enum
  values and type changes break in both directions. In requests, a field that
  becomes required and a new required field break; in responses, a field that
  becomes optional or nullable breaks. A removed status code is listed for
  review.
- **GraphQL**: breaking and dangerous changes. Federation directives such as
  `@key` are accepted. Code and `.graphql` query files are searched.

Set contracts up in [`.github/upseam.yml`](configuration.md#internal).

## Limits of matching

- Matching is textual. It finds the lines that name a changed symbol, not
  every call path: dynamic calls and wrappers can be missed, and common names
  can match unrelated code. For HubSpot, Twilio and GitHub, very common
  symbol names are on a stop-list.
- Changes without symbols are listed without matches.
- Twilio fields named by two common words, such as `callStatus`, are listed
  without matches.
- GitHub: `github-script` steps in workflow files are not scanned, and GraphQL
  removals that already happened are not listed.
