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

# MiniMax H3 Normal

> Slower MiniMax H3 generation at half the Fast price. Generate 3–15 second videos with native audio at 480p, 768p, or 1080p.

`POST https://api.beatapi.io/v1/videos/tasks`

Slower MiniMax H3 generation at half the Fast price. Generate 3–15 second videos with native audio at 480p, 768p, or 1080p.

### Supported modes

| Mode                  | Required input                                                  | Rules                                              |
| --------------------- | --------------------------------------------------------------- | -------------------------------------------------- |
| Text to video         | `model`, `prompt`                                               | Omit all media arrays.                             |
| First frame           | `model`, `prompt`, `images`                                     | Provide one image URL.                             |
| First and last frames | `model`, `prompt`, `images`                                     | Provide two image URLs in first-to-last order.     |
| Multimodal references | `model`, `prompt`, `reference_images` and/or `reference_videos` | Do not combine `images` with `reference_*` inputs. |

**Normal versus Fast:** Normal has a longer processing wait and costs half of Fast at matching resolution and duration: USD 0.0175/s at 480p, USD 0.02/s at 768p, and USD 0.025/s at 1080p. The original `minimax-h3` ID remains Fast; `minimax-h3-fast` is its explicit alias. Normal accepts at most two frame images OR up to four reference images and one reference video. It does not accept audio input, adaptive aspect ratio, 2K, or 4K. Output includes native audio with no audio-off switch. Optional `seed` must be an integer from 0 to 9007199254740991. Do not confuse speed tiers with a quality parameter: no quality field is exposed here.

**Async flow:** Create the task, save `data.id`, then [poll the Task](/quick-guide#get-task-status) with `GET /v1/tasks/{task_id}`. On `succeeded`, read `data.output.media`. On `failed`, read `data.error_code` and `data.error_message`, then follow the [error and retry policy](/quick-guide#errors-and-retry-policy).

**Using a local file?** [upload a local input](/quick-guide#upload-an-input-file) first and pass the returned `data.url`.

## Authorization

`Authorization`   `string`   **required**

Send your BeatAPI API key as a Bearer token. Create one on the [Dashboard](https://beatapi.io/dashboard).

```
Authorization: Bearer <BEATAPI_API_KEY>
```

Keep permanent API keys on trusted servers. `Content-Type: application/json` is required for the request body. `Idempotency-Key` is optional when the endpoint exposes it and is recommended for safe retries with the exact same body.

## Request body

`model`   `string`   **required**

Must be `minimax-h3-normal`.

**Value:** `minimax-h3-normal`

---

`prompt`   `string`   **required**

Video generation instructions.

**Length:** 1 to 5000 characters

---

`images`   `string[]`   **optional**

One first-frame image or first- and last-frame images in order. Cannot be combined with reference\_images or reference\_videos.

**Count:** 1 to 2 items

---

`reference_images`   `string[]`   **optional**

Up to four public HTTPS reference images, optionally combined with one reference video. Cannot be combined with images.

**Count:** 1 to 4 items

---

`reference_videos`   `string[]`   **optional**

One public HTTPS reference video, optionally combined with up to four reference images. Cannot be combined with images.

**Count:** 1 to 1 items

---

`duration`   `integer`   **optional**

Requested output duration in whole seconds.

**Default:** `5`  \
**Range:** 3 to 15

---

`aspect_ratio`   `enum<string>`   **optional**

Output aspect ratio. Adaptive is not supported.

**Available options:** `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, `21:9`  \
**Default:** `"16:9"`

---

`resolution`   `enum<string>`   **optional**

Normal output resolution. This model does not offer 2K or 4K.

**Available options:** `480p`, `768p`, `1080p`  \
**Default:** `"768p"`

---

`seed`   `integer`   **optional**

Optional integer generation seed from 0 to 9007199254740991. Omit for a random seed.

**Range:** 0 to 9007199254740991

## Request examples

### Text to video

```bash
curl --request POST \
  --url https://api.beatapi.io/v1/videos/tasks \
  --header 'Authorization: Bearer <BEATAPI_API_KEY>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "minimax-h3-normal",
  "prompt": "A slow cinematic push through a misty mountain village at dawn.",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "768p"
}'
```

### First frame

```bash
curl --request POST \
  --url https://api.beatapi.io/v1/videos/tasks \
  --header 'Authorization: Bearer <BEATAPI_API_KEY>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "minimax-h3-normal",
  "prompt": "The performer turns toward the camera as neon light sweeps across the scene.",
  "images": [
    "https://media.beatapi.io/samples/neon-singer.png"
  ],
  "duration": 5,
  "resolution": "768p"
}'
```

### First and last frames

```bash
curl --request POST \
  --url https://api.beatapi.io/v1/videos/tasks \
  --header 'Authorization: Bearer <BEATAPI_API_KEY>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "minimax-h3-normal",
  "prompt": "Move smoothly from the opening portrait to the final product reveal.",
  "images": [
    "https://media.beatapi.io/samples/neon-singer.png",
    "https://media.beatapi.io/samples/smart-bottle.png"
  ],
  "duration": 5,
  "resolution": "768p"
}'
```

### Multimodal references

```bash
curl --request POST \
  --url https://api.beatapi.io/v1/videos/tasks \
  --header 'Authorization: Bearer <BEATAPI_API_KEY>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "minimax-h3-normal",
  "prompt": "Create a cinematic performance using the supplied visual reference.",
  "reference_images": [
    "https://media.beatapi.io/samples/neon-singer.png"
  ],
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "768p"
}'
```

## Response

A successful request returns HTTP `201`.

```json
{
  "data": {
    "id": "task_8K2qA",
    "object": "task",
    "task_kind": "video",
    "capability_id": "minimax-h3-normal",
    "capability_version": null,
    "media_type": "video",
    "model": "minimax-h3-normal",
    "status": "queued",
    "stage": "queued",
    "created_at": 1782210000,
    "updated_at": 1782210000,
    "completed_at": null,
    "output": null,
    "usage": {
      "credits_reserved": 0.1,
      "credits_charged": 0.1,
      "billable_duration_seconds": 5,
      "credits_settled": 0,
      "credits_refunded": 0
    },
    "request_id": "req_abc123",
    "error_code": null,
    "error_message": null
  }
}
```

## Errors

| Status | Meaning                                                                                                                                                                                                                                                              |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | Malformed JSON or a field, value or combination this endpoint does not accept (`bad_request`; the message names the field), or input refused by moderation (`content_policy_violation`). Not retryable unchanged.                                                    |
| `401`  | No API key (`missing_api_key`), or a key that is wrong, expired, disabled or exhausted (`invalid_api_key`; the message says which). Send it as `Authorization: Bearer <key>`; the key works with or without the `sk-` prefix. Not retryable.                         |
| `402`  | Insufficient balance (`insufficient_credits`). The account balance is zero or below the price of this request. Top up, then send it again; not retryable before that.                                                                                                |
| `403`  | The key or account is not permitted to make this call (`forbidden`), for example a model that is not available on free credit (a top-up unlocks it), a request from outside the key's IP allowlist, or a model outside the key's group. Not retryable.               |
| `409`  | The `Idempotency-Key` was already used with a different request body, or the first request with it is still being processed (`idempotency_conflict`). Not retryable unchanged.                                                                                       |
| `429`  | Too many requests (`rate_limit_exceeded`, including the free-model limits) or too many tasks processing at once (`user_concurrency_exceeded`). Retryable after `Retry-After` seconds (also `error.retry_after_seconds`).                                             |
| `500`  | Unexpected internal error (`internal_error`). Retryable; keep `request_id` for support if it persists.                                                                                                                                                               |
| `503`  | The request could not be completed (`processing_unavailable`, `processing_timeout`, `processing_failed` or `result_transfer_failed`). Nothing was charged. Retryable with backoff; `Retry-After` is sent when the wait is known. BeatAPI does not answer 502 or 504. |