> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.reka.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.reka.ai/_mcp/server.

# Images and Video

> Send images and short videos to Chat Completions as OpenAI content parts.

Content parts use the OpenAI shape. A user message's `content` can be a list mixing `text`, `image_url` and `video_url` parts. Check a model's `input_modalities` on [`GET /v1/models`](/chat/models) to see whether it accepts images or video.

## Images

![Image of a cat on a keyboard](https://v0.docs.reka.ai/_images/000000245576.jpg)

**`Python`**

```python title="Python"
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.reka.ai/v1",
    api_key=os.environ["REKA_API_KEY"],
)

response = client.chat.completions.create(
    model="reka-edge-2603",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "image_url", "image_url": {"url": "https://v0.docs.reka.ai/_images/000000245576.jpg"}},
                {"type": "text", "text": "What animal is this? Answer briefly."},
            ],
        }
    ],
)
print(response.choices[0].message.content)
```

**`JavaScript`**

```javascript title="JavaScript"
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.reka.ai/v1",
  apiKey: process.env.REKA_API_KEY,
});

const response = await client.chat.completions.create({
  model: "reka-edge-2603",
  messages: [
    {
      role: "user",
      content: [
        { type: "image_url", image_url: { url: "https://v0.docs.reka.ai/_images/000000245576.jpg" } },
        { type: "text", text: "What animal is this? Answer briefly." },
      ],
    },
  ],
});
console.log(response.choices[0].message.content);
```

**`curl`**

```shell title="curl"
curl https://api.reka.ai/v1/chat/completions \
  -H "Authorization: Bearer $REKA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "reka-edge-2603",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "image_url", "image_url": {"url": "https://v0.docs.reka.ai/_images/000000245576.jpg"}},
        {"type": "text", "text": "What animal is this? Answer briefly."}
      ]
    }]
  }'
```

### Local files as data URLs

To send a local file, base64-encode it into a data URL and pass that as the `url`.

**`Python`**

```python title="Python"
import base64

with open("cat.jpg", "rb") as f:
    data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="reka-edge-2603",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "image_url", "image_url": {"url": data_url}},
                {"type": "text", "text": "Describe this image."},
            ],
        }
    ],
)
```

**`JavaScript`**

```javascript title="JavaScript"
import { readFileSync } from "node:fs";

const dataUrl = "data:image/jpeg;base64," + readFileSync("cat.jpg").toString("base64");

const response = await client.chat.completions.create({
  model: "reka-edge-2603",
  messages: [
    {
      role: "user",
      content: [
        { type: "image_url", image_url: { url: dataUrl } },
        { type: "text", text: "Describe this image." },
      ],
    },
  ],
});
```

### Multiple images

Add one `image_url` part per image to the same message. Some models cap the number of images per prompt: `reka-edge-2603` accepts at most three and returns a 400 error beyond that.

```python
response = client.chat.completions.create(
    model="reka-edge-2603",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "image_url", "image_url": {"url": "https://example.com/image_1.jpg"}},
                {"type": "image_url", "image_url": {"url": "https://example.com/image_2.jpg"}},
                {"type": "text", "text": "What colours and shapes are present in both images?"},
            ],
        }
    ],
)
```

## Video

Models that list `video` in `input_modalities`, such as `reka-edge-2603` and `qwen3.8-27b`, accept a `video_url` part. The URL must be publicly downloadable; sites such as YouTube block direct downloads.

**`Python`**

```python title="Python"
response = client.chat.completions.create(
    model="reka-edge-2603",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "video_url", "video_url": {"url": "https://demo-videos-bucket-reka.s3.eu-west-2.amazonaws.com/evYsMdBrFXc.mp4"}},
                {"type": "text", "text": "Describe this video in one sentence."},
            ],
        }
    ],
)
print(response.choices[0].message.content)
```

**`JavaScript`**

```javascript title="JavaScript"
const response = await client.chat.completions.create({
  model: "reka-edge-2603",
  messages: [
    {
      role: "user",
      content: [
        { type: "video_url", video_url: { url: "https://demo-videos-bucket-reka.s3.eu-west-2.amazonaws.com/evYsMdBrFXc.mp4" } },
        { type: "text", text: "Describe this video in one sentence." },
      ],
    },
  ],
});
console.log(response.choices[0].message.content);
```

**`curl`**

```shell title="curl"
curl https://api.reka.ai/v1/chat/completions \
  -H "Authorization: Bearer $REKA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "reka-edge-2603",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "video_url", "video_url": {"url": "https://demo-videos-bucket-reka.s3.eu-west-2.amazonaws.com/evYsMdBrFXc.mp4"}},
        {"type": "text", "text": "Describe this video in one sentence."}
      ]
    }]
  }'
```

### Sampling frames yourself

To control frame sampling or keep uploads small, extract frames and send them as `image_url` parts. This command extracts one frame per second:

```bash
ffmpeg -i input.mp4 -vf "fps=1" -q:v 2 frame_%03d.jpg
```

Then send the frames in order, followed by the question. Pick a model whose image limit fits your frame count; `reka-edge-2603` accepts at most three images per prompt.

```python
import base64
import glob

content = []
for path in sorted(glob.glob("frame_*.jpg")):
    with open(path, "rb") as f:
        content.append({
            "type": "image_url",
            "image_url": {"url": "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()},
        })
content.append({"type": "text", "text": "Describe what happens in this video."})

response = client.chat.completions.create(
    model="qwen3.8-27b",
    messages=[{"role": "user", "content": content}],
)
print(response.choices[0].message.content)
```

For long videos you want to index, search and query repeatedly, the [Vision API](/vision/video-chat) uploads and processes the video once.