---
title: "OpenAI-compatible chat completions"
method: POST
path: "/v1/chat/completions"
tags: ["chat_completions"]
---

# OpenAI-compatible chat completions

`POST /v1/chat/completions`

Creates a chat completion using the OpenAI wire format, proxying to the selected provider with credentials resolved on the server (secret store first, environment second) — callers never handle provider API keys. Model must be '{provider}:{model_name}' for a built-in provider (one of anthropic, aws, azure_openai, cerebras, deepseek, fireworks, google, groq, moonshot, ollama, openai, perplexity, together, xai) or 'custom:{provider_id}:{model_name}' for a stored custom provider, e.g. 'openai:gpt-4o' or 'anthropic:claude-sonnet-4-5'. Set `stream: true` for server-sent events of `chat.completion.chunk` payloads terminated by `data: [DONE]`. Tool calling is not supported.

**Phoenix is not an AI gateway.** The same server also takes on trace ingestion traffic, so routing production LLM calls through it competes with ingestion. Use this endpoint only to quickly try out different models in non-production environments.

## Request body

- CreateChatCompletionRequestBody
  - `model` string, required — Model must be '{provider}:{model_name}' for a built-in provider (one of anthropic, aws, azure_openai, cerebras, deepseek, fireworks, google, groq, moonshot, ollama, openai, perplexity, together, xai) or 'custom:{provider_id}:{model_name}' for a stored custom provider, e.g. 'openai:gpt-4o' or 'anthropic:claude-sonnet-4-5'.
  - `messages` ChatCompletionRequestMessage[], required
    - `role` 'system' | 'developer' | 'user' | 'assistant', required
    - `content` union, required
      - string
      - ChatCompletionTextPart[]
        - `type` 'text', required
        - `text` string, required
  - `stream` boolean
  - `temperature` number, nullable
  - `top_p` number, nullable
  - `max_tokens` integer, nullable
  - `max_completion_tokens` integer, nullable
  - `stop` union
    - string
    - string[]
  - `frequency_penalty` number, nullable
  - `presence_penalty` number, nullable
  - `seed` integer, nullable
  - `n` integer, nullable
  - `stream_options` ChatCompletionStreamOptions
    - `include_usage` boolean
  - `tools` unknown[], nullable
    - unknown
  - `tool_choice` unknown
  - `response_format` object, nullable

## Response `200`

Successful Response

- ChatCompletion
  - `id` string, required
  - `object` 'chat.completion'
  - `created` integer, required
  - `model` string, required
  - `choices` ChatCompletionChoice[], required
    - `index` integer
    - `message` ChatCompletionMessage, required
      - `role` 'assistant'
      - `content` string, required
    - `finish_reason` string, required
  - `usage` ChatCompletionUsage, required
    - `prompt_tokens` integer, required
    - `completion_tokens` integer, required
    - `total_tokens` integer, required

## Other responses

- `400` — Bad Request
- `403` — Forbidden
- `404` — Not Found
- `422` — Unprocessable Entity

---

[API](https://skmtc.net/arize-ai/apis/arize-phoenix-rest-api.md) · [All operations](https://skmtc.net/arize-ai/apis/arize-phoenix-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/arize-ai/arize-phoenix-rest-api/versions/a14d8ad6f708/schema)
