# Become a provider

A provider sells inference on the exchange. Follow these steps from registration to the first served job.

## Start selling

1. **Register** a provider in the console. The handle is reserved at once, and the status is `PENDING`. See [Register](#register).
2. **Wait for admission.** An operator reviews the registration. See [Provider status](#provider-status-and-admission).
3. **Issue a provider key.** See [Provider keys](#provider-keys).
4. **Register deployments.** See [Deployments](https://inference.ai.exchange/docs/provider-models.md).
5. **Quote.** An agent keeps a WebSocket session open and publishes prices. See [Quote over the session](https://inference.ai.exchange/docs/provider-quoting.md).
6. **Serve.** The exchange sends awarded jobs to you and settles on metered usage. See [Choose how to deliver work](#choose-how-to-deliver-work).
7. **Operate.** See [Run your agent](https://inference.ai.exchange/docs/provider-operate.md).

The exchange never stores prices. A price is valid only while the session stays open and the quote has not expired.

You need an inference endpoint (or an upstream in OpenAI or Anthropic format) and a public `http` or `https` dispatch endpoint. Registration rejects loopback, private and link-local addresses.

Sign the Provider Agreement in the console, on the Agreement page of your provider. Enter the details of your company and of the person who signs. The console shows the agreement as a PDF with your details in it, and the PDF updates as you type. Read it, type the name of the signatory, and sign. Architect has already signed the text, so your signature completes the agreement. The exchange keeps the signed PDF, and the console shows it with its status. You can download it.

## Choose how to deliver work

| Path                  | Use it when                                                                                   | Read                                                                                                                     |
| --------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Agent                 | You run the Liquid provider agent. It serves every kind of job.                               | [Serve and get paid](https://inference.ai.exchange/docs/provider-dispatch.md), [Run your agent](https://inference.ai.exchange/docs/provider-operate.md), [Sell video](https://inference.ai.exchange/docs/provider-video.md) |
| OpenAI-compatible API | Your API speaks the OpenAI dialect. No agent. Chat, embeddings, speech and images, not video. | [Sell with an OpenAI-compatible API](https://inference.ai.exchange/docs/provider-openai.md)                                                               |
| Anthropic API         | Your API speaks the Anthropic Messages dialect. No agent. Chat only.                          | [Sell with an Anthropic API](https://inference.ai.exchange/docs/provider-anthropic.md)                                                                    |
| BYOK                  | You have a cloud account. The exchange serves with your key. You only quote.                  | [Sell with bring your own key](https://inference.ai.exchange/docs/provider-byok.md)                                                                       |

## Register

Open **Sell on the exchange** in the console and choose **Request to be a provider**. The console calls `POST /v1/account/providers`.

| Field                 | Required | Description                                                                                                                                       |
| --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `slug`                | Yes      | Your handle: 2 to 63 lowercase letters, digits and hyphens.                                                                                       |
| `legal_entity`        | Yes      | The legal entity of the provider.                                                                                                                 |
| `contact_email`       | Yes      | The address that an operator uses about admission.                                                                                                |
| `website`             | Yes      | The website of the legal entity (`http` or `https`).                                                                                              |
| `declared_endpoint`   | No       | The dispatch endpoint (`http` or `https`). Sessions must log in with the same scheme, host and port. Omit it for only [BYOK](https://inference.ai.exchange/docs/provider-byok.md). |
| `upstream_dependency` | Yes      | The upstream service, or `self-hosted`. The exchange uses it to find affiliations.                                                                |
| `hq_country`          | Yes      | ISO 3166-1 alpha-2 country code of the headquarters.                                                                                              |
| `control_country`     | Yes      | ISO 3166-1 alpha-2 country code of the ultimate owner.                                                                                            |
| `ultimate_parent`     | Yes      | The person, company or government that owns 50% or more, or else the largest owner. Up to 200 characters.                                         |
| `affiliation_group`   | No       | The group for market depth. An operator can override it.                                                                                          |
| `display_name`        | No       | The name buyers see in place of the handle, up to 40 characters.                                                                                  |
| `description`         | No       | Plain text about what you serve, up to 160 characters.                                                                                            |

The response includes a permanent `provider_id`, which receipts, settlements and payouts use. Routes accept the ID or the handle. Store the ID, because another provider can take a released handle.

| Rejection                     | Cause                                                                          |
| ----------------------------- | ------------------------------------------------------------------------------ |
| `400` with a field code       | The exchange rejected a value.                                                 |
| `409 provider_id_taken`       | A different provider uses the handle.                                          |
| `400 jurisdiction_restricted` | The headquarters or ultimate owner is in a country that the exchange excludes. |
| `451 jurisdiction_restricted` | The registration comes from such a location.                                   |

See [Regional availability](https://inference.ai.exchange/docs/availability.md).

### Who has access

Every member of the workspace that registered the provider, and the owners and admins of its organization, have full access. They can give other users read or full access in the People card. Each user must have signed in once.

## Provider status and admission

| Status      | Description                                                                                                            |
| ----------- | ---------------------------------------------------------------------------------------------------------------------- |
| `PENDING`   | Waits for an operator. No keys, no sessions.                                                                           |
| `ADMITTED`  | Approved. Keys, sessions and quotes work.                                                                              |
| `SUSPENDED` | An operator stopped the provider, with a reason in the console. Keys stop and offers go. Only an operator reverses it. |
| `REJECTED`  | An operator refused it, with a reason. The handle stays reserved.                                                      |
| `RETIRED`   | The provider closed itself. All keys are revoked. You cannot reverse it.                                               |

Only an operator can admit a provider. The exchange sends no email, so check the console.

## Provider keys

A provider key authenticates the agent. It opens the session (`/v1/provider/ws`) and the catalogue endpoints (`/v1/provider/models`). It cannot place jobs or act for another provider.

The format is `sk-liquid-<key-id>-<secret>`. The console shows the secret once.

**Issue:** open the provider in the selling console, choose **Issue** and copy the secret. The console calls `POST /v1/account/providers/{provider_id}/keys` and gets `{ "key_id": "k7f2…", "api_key": "sk-liquid-k7f2…-…" }`.

| Status | Code           | Description                                      |
| ------ | -------------- | ------------------------------------------------ |
| 201    |                | The exchange issued the key.                     |
| 403    | `read_only`    | You have read-only access.                       |
| 404    | `not_found`    | The provider does not exist, or you lack access. |
| 409    | `not_admitted` | The provider is not `ADMITTED`.                  |

**Use:** send `Authorization: Bearer sk-liquid-…` to the catalogue endpoints, or the key in the `login` frame of the session. See [Quote over the session](https://inference.ai.exchange/docs/provider-quoting.md).

**Rotate:** a provider can have many live keys. Issue a new key, restart the agent with it, then revoke the old key. If you revoke first, the session closes and the offers go.

**Revoke:** choose **Revoke**. The console calls `DELETE /v1/account/providers/{provider_id}/keys/{key_id}`. The exchange refuses the key at once and closes an open session that uses it within 10 seconds.

## Change the handle

Send `PATCH /v1/account/providers/{provider_id}` with `{"slug": "nimbus"}`. The change starts at once, and the book shows each resting offer under the new handle. Your agent does not reconnect. A new handle keeps the provider ID, keys, registrations, settled jobs and payouts. Change the handle in the agent configuration before the next login. The exchange rejects the old handle.

The same request can change `contact_email`, `declared_endpoint`, `serving_stack`, `website`, `display_name` and `description` (empty clears), and `logo_plate` (`fill`, `light` or `dark`). It cannot change `affiliation_group`. A handle in use returns `409 provider_slug_taken`.

## Publish your terms, privacy policy and status page

The provider page shows your terms, privacy policy and status page to every visitor. A buyer accepts the first two.

| Request                                                                                                  | Effect                                                        |
| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| `GET /v1/account/providers/{provider_id}/documents`                                                      | Lists your published documents.                               |
| `PUT /v1/account/providers/{provider_id}/documents/{kind}` with `{"url": "https://…"}`                   | Publishes a link (`http` or `https`, 500 characters at most). |
| `POST /v1/account/providers/{provider_id}/documents/{kind}/file?name=terms.pdf` with the PDF as the body | Stores a PDF of up to 5 MB.                                   |
| `DELETE /v1/account/providers/{provider_id}/documents/{kind}`                                            | Removes the document.                                         |

`kind` is `terms_of_service`, `privacy_policy` or `status_page`. A status page is a link only. A link replaces a file of the same kind, and the reverse. You need full access to change a document.

## Pause and retire

A pause stops trading. Send `POST /v1/account/providers/{provider_id}/pause` with `{ "paused": true }`. Keys cannot open a session, the exchange closes the open session and removes all offers. It keeps the admission, keys and registrations. Send `{ "paused": false }` to continue. No operator action is needed.

To retire, send `POST /v1/account/providers/{provider_id}/retire` with `{ "reason": "…" }` (required, 500 characters at most). The endpoint requires a recent identity verification. Retirement revokes each key and closes the provider permanently. The handle stays reserved.

## Data the exchange records

For each job, the exchange records completion, time to first token and generated tokens. It also sends paid test jobs to each listed deployment. You see your own offers, awards and settlements, never competitors' bids.

### Auction results

The **Auctions** tab of **Performance** summarizes your auction results, one hour late. **Where your auctions go** starts with auctions where your offer rested, subtracts each exclusion reason in gate order, then shows **Ranked below the winner** and **Won**. Select a deployment or step to see the features or limits that need a change.

The exchange withholds the breakdown when the window, any day in it, or a deployment has fewer than 20 auctions. Rare profiles count as other request shapes.
