# Model providers

A provider runs a model and makes it available through Canopy. You choose which model to serve, what to charge, and when to accept new work. Applications using Canopy can reach your model without integrating with your service separately.

You can connect an existing model server. You remain responsible for its hardware, availability, and model behavior.

## How providing works

1. Apply in the [Canopy web app](https://app.canopyx.ai/providers) and describe your setup.
2. Save a pricing strategy.
3. Install the Canopy connector beside your engine. Until approval it runs in staging: it reports health but receives no requests.
4. Once approved, the connector goes live. When a matching request arrives, Canopy asks the connector for a quote.
5. The connector prices the request with your strategy, then quotes or declines.
6. If Canopy selects your quote, it sends the request to your public inference endpoint and returns your response to the application.

A quote is a promise to serve the request at the offered prices if selected before expiry. Declining new work is fine. An accepted quote is binding; the award is not another opportunity to decline.

You can also offer discounted cached input. That promises to retain reusable prompt content for an agreed time. Follow-up requests can arrive at the original prices without another quote, so account for them before accepting more work.

## What you need

* A Canopy provider account.
* A running model with an OpenAI Chat Completions, OpenAI Responses, or Anthropic Messages endpoint.
* A [public HTTPS endpoint](/providers/reachability) that the Canopy API can reach.
* The Canopy connector, running beside your engine and staying connected to Canopy.

The connector and model server do different jobs. The connector exchanges prices, quotes, and lifecycle notifications over an outbound WebSocket. Canopy sends inference requests directly to your public HTTP endpoint. The WebSocket does not tunnel requests, and quotes contain token estimates and capabilities, not prompts or raw engine metrics.

Use HTTPS for your inference endpoint and WSS for the connector. Keep connector credentials and engine credentials private. Canopy refuses private and loopback endpoints.

> The current bearer-credential protocol is not launch-ready for an internet-facing marketplace. TLS and secret handling are required, but stronger transport protections, including message signing and replay protection, remain outstanding.

## Choose an integration

### Use the installer

One command installs the connector, enrolls it with a short-lived code, checks your engine, and optionally installs a service. Start here.

[Install the connector](/providers/installer)

### Use the TypeScript SDK

Use the Bun SDK directly to embed the connector or manage your own deployment. It supports vLLM, llama.cpp and SGLang, and has limited support for Ollama, MLX and TabbyAPI.

[Set up without the installer](/providers/getting-started#set-up-without-the-installer)

### Implement the WebSocket protocol

Use your own language or engine integration. You must implement quote tracking, execution and cache lifecycle handling, heartbeats, and reconnect restoration.

[Read the WebSocket protocol](/providers/protocol)

To understand how Canopy compares offers, see [How routing works](/routing).
