---
title: Getting started
description: From zero to your first AI API call.
url: https://developers.wpengine.com/docs/ai/api/getting-started/
image: https://developers.wpengine.com/og/docs/ai/api/getting-started.png
---

# Getting started

This guide takes you from browsing the model catalog to a working chat completion.

## 1. List available models

The model catalog is public, so you don’t need an API key to read it. Use it to find the model IDs that you pass as the `model` field later.

Terminal window

```sh
curl https://api.ai.wpengine.com/v1/models
```

Truncated response:

```json
{
  "object": "list",
  "data": [
    {
      "id": "google/gemini-3.8-flash",
      "object": "model",
      "owned_by": "google",
      "provider": "google",
      "display_name": "Gemini 3.8 Flash",
      "context_window": 1048576,
      "pricing": {
        "input_per_million": "1.5",
        "output_per_million": "7.5",
        "pricing_version": "2026-10-28T00:00:00Z",
        "unit": "ai_credits"
      }
    }
  ]
}
```

Pick a model `id` from the response. You pass it as the `model` field when you make a chat completion.

## 2. Create an API key

[Create a key](https://developers.wpengine.com/docs/ai/api/authentication/#create-a-key) and copy the secret somewhere safe. The User Portal shows it **once**.

For this guide, an **Account** key with **Full access** is the quickest option. Any key with **Chat** set to **Write** also works.

Put the key in an environment variable. The commands below read it from there, so you don’t have to paste the secret:

Terminal window

```sh
export AI_API_KEY="wpe_xxx"
```

## 3. Make a chat completion

Terminal window

```sh
curl https://api.ai.wpengine.com/v1/chat/completions \
  -H "Authorization: Bearer $AI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemini-3.8-flash",
    "messages": [
      {"role": "system", "content": "You are concise."},
      {"role": "user", "content": "What is the speed of light in km/s?"}
    ]
  }'
```

Truncated response:

```json
{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1716240000,
  "model": "google/gemini-3.8-flash",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Approximately 299,792 km/s."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 15,
    "completion_tokens": 129,
    "completion_tokens_details": {
      "reasoning_tokens": 120
    },
    "total_tokens": 144
  }
}
```

On reasoning models, `completion_tokens` includes the tokens the model spends reasoning before it returns the answer. The `completion_tokens_details.reasoning_tokens` field reports that part separately. `total_tokens` is `prompt_tokens` plus `completion_tokens`.

## Stream the response

Set `"stream": true` in the request body to receive a stream of Server-Sent Events. Each event is a JSON chunk shaped like `chat.completion.chunk`. The stream ends with `data: [DONE]`.

For a complete walkthrough, see [Stream a chat completion](https://developers.wpengine.com/docs/ai/api/stream-chat-completions/).

---

> #### Now that you have made a call
>
> - [Authentication — key scopes, rotation, and revocation](https://developers.wpengine.com/docs/ai/api/authentication/)
> - [Errors — handle 400, 401, 403, 429, and 502 responses](https://developers.wpengine.com/docs/ai/api/errors/)

## Was this helpful?

Thanks for the feedback!

```json
{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://developers.wpengine.com/#website","name":"WP Engine Product Documentation","url":"https://developers.wpengine.com/","description":"Resources for developing, deploying, and scaling on WP Engine.","inLanguage":"en-US","keywords":["API documentation","product documentation","headless WordPress","managed WordPress hosting"],"publisher":{"@id":"https://wpengine.com/#organization"}}]}
```
