Skip to content
WP EngineDocumentation

Create a chat completion

POST
/v1/chat/completions
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.ai.wpengine.com/v1/chat/completions', [
'body' => '{ "model": "google/gemini-3.5-flash", "messages": [ { "role": "user", "content": "Say hello in one short sentence." } ] }',
'headers' => [
'Authorization' => 'Bearer <token>',
'Content-Type' => 'application/json',
],
]);
echo $response->getBody();

Requires a valid WP Engine bearer token. API keys must carry the “chat:write” permission.

Media typeapplication/json
object
model
required

Model identifier in the format “provider/model-name” (e.g. “openai/gpt-oss-120b-maas”, “google/gemini-3.5-flash”, “anthropic/claude-sonnet-4-6”).

string
Example
google/gemini-3.5-flash
messages
required
Array<object>
>= 1 items
object
role
required
string
Allowed values: system user assistant tool
Example
user
content
required
string
Example
Say hello in one short sentence.
tool_calls

Tool calls made by the assistant.

Array<object>
object
id
required
string
type
required
string
Example
function
function
required
object
name
required
string
description
string
arguments

JSON-encoded arguments for the function call.

string
parameters

JSON Schema describing the function parameters.

tool_call_id

ID of the tool call this message is a response to (role must be “tool”).

string
temperature

Sampling temperature. See the model’s parameters.temperature metadata on /models for the accepted range and support. Rejected with HTTP 400 when out of range, unsupported, or not applicable.

number format: double
top_p

Nucleus sampling parameter.

number format: double
max_tokens

Hard upper bound on output tokens for this request, forwarded to the model provider. Generation stops when the limit is reached; the response may be truncated mid-content rather than rejected. finish_reason: "length" (OpenAI-compatible routes) indicates the budget was hit. On reasoning-capable models (see capabilities on GET /v1/models), internal reasoning tokens may count against this budget alongside visible output. Per-model valid ranges are published in GET /v1/models/{model_id}/schema.

integer
stream

If true, the response is streamed as Server-Sent Events.

boolean
stop

Stop sequences.

Array<string>
tools

Tools available to the model. Function tools invoke caller-defined functions; native web_search tools enable server-side search on models that advertise the web_search capability (see GET /v1/models).

Array
One of: discriminator: type
object
type
required
string
Allowed values: function
Example
function
function
required
object
name
required
string
description
string
arguments

JSON-encoded arguments for the function call.

string
parameters

JSON Schema describing the function parameters.

tool_choice

Controls how the model selects tools. Can be “auto”, “none”, “required”, or an object specifying a particular function.

response_format

Structured output format. See the model’s parameters.response_format_type metadata on /models for the accepted values. Rejected with HTTP 400 when the type is unsupported or not applicable.

object
type
required

The response format type. Use “text” for plain text (default), “json_object” for unstructured JSON mode, or “json_schema” for structured output that conforms to a provided JSON Schema.

string
Allowed values: text json_object json_schema
Example
json_schema
json_schema

Describes the JSON Schema the model must follow when response_format.type is “json_schema”.

object
name
required

A name identifying this schema (for caching and logging).

string
Example
recipe
description

Optional human-readable description of the schema purpose.

string
schema
required

A JSON Schema object describing the desired output structure. Supports standard JSON Schema types (object, array, string, number, integer, boolean) with provider-specific subset limitations.

object
key
additional properties
any
strict

Whether to request strict schema adherence. When true, the gateway forwards this preference to providers that support strict/JSON-schema-constrained decoding (for example, OpenAI and Anthropic). Not all providers honor this flag, and the gateway does not independently validate or guarantee schema compliance.

boolean
reasoning_effort

Catalog-native reasoning effort. Allowed values are the model’s parameters.reasoning_effort on GET /v1/models. Omit to use the provider default. Models that do not publish an enum reject any non-empty value. Mutually exclusive with provider_options.thinking_config on google/* models.

string
Example
high
provider_options

Provider-specific parameters. Supported openai/* and google/* models.

object
key
additional properties
any
Example
{
"thinking_config": {
"thinking_budget": 1024,
"include_thoughts": true
}
}
Example
{
"model": "google/gemini-3.5-flash",
"messages": [
{
"role": "user",
"content": "Say hello in one short sentence."
}
]
}

Chat completion response. When stream is false, returns a single JSON object. When stream is true, returns Server-Sent Events with chunked JSON payloads terminated by a “data: [DONE]” message.

object
id
required
string
object
required
string
created
required

Unix timestamp.

integer format: int64
model
required
string
choices
required
Array<object>
object
index
required
integer
message
object
role
required
string
Allowed values: system user assistant tool
content
required
string
tool_calls

Tool calls made by the assistant.

Array<object>
object
id
required
string
type
required
string
function
required
object
name
required
string
description
string
arguments

JSON-encoded arguments for the function call.

string
parameters

JSON Schema describing the function parameters.

tool_call_id

ID of the tool call this message is a response to (role must be “tool”).

string
finish_reason
string
Allowed values: stop length tool_calls content_filter model_context_window_exceeded
usage
object
prompt_tokens
required
integer
completion_tokens
required
integer
total_tokens
required
integer
Example
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"choices": [
{
"message": {
"role": "system",
"content": "Say hello in one short sentence.",
"tool_calls": [
{
"type": "function"
}
]
},
"finish_reason": "stop"
}
]
}

Invalid request body or parameters

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}

Missing or invalid bearer token

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}
WWW-Authenticate
string
Example
Bearer realm="ai-services"

The account’s credit balance is exhausted. Grant or top up credits before retrying. Distinct from 429, which is edge rate limiting.

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}

The token is valid, but the caller is not permitted to perform this action — either its scope/permission is insufficient or the authenticated user is not authorized for the target account (error type “permission_error”). On /v1/chat/completions specifically, a 403 with error type “content_policy_violation” instead means the request content was blocked by content moderation policy; that response never identifies which filter or category matched.

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}

The requested resource was not found

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}

Rate limit exceeded. The request was throttled at the edge; wait and retry later. The response body is a short HTML page generated by the load balancer, not a structured JSON error — clients should rely on the 429 status code rather than parsing the body.

Media typetext/html
string

Upstream provider returned an error

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}

A required dependency is temporarily unavailable. Retry after a short delay with exponential back-off.

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}

Upstream provider error passed through with its original status code and response body. The shape may vary by provider.

Media typeapplication/json
object
error
required
object
message
required
string
type
required
string
code
required
integer
request_id
required

Correlation ID for this request, matching the X-Request-ID response header — a 32-character trace ID behind the load balancer, otherwise a UUID. Quote it in support reports.

string
Example
{
"error": {
"type": "invalid_request_error",
"request_id": "80f1e2c3a4b5c6d7e8f9a0b1c2d3e4f5"
}
}