> 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

POST https://api.beatapi.io/v1/videos/tasks
Content-Type: application/json

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`.

Reference: https://docs.beatapi.io/api-reference/video-api/minimax-h3-normal

## Authentication

- `Authorization` header (bearer token, required) — Send your API key as `Authorization: Bearer <BEATAPI_API_KEY>`.

## Request

### Headers

- `Idempotency-Key` (string, optional)

### Body (application/json)

This endpoint expects a MinimaxH3NormalVideoRequest.

- `model` ("minimax-h3-normal", required) — Must be `minimax-h3-normal`.
- `prompt` (string, required) — Video generation instructions.
- `images` (list of string, optional) — One first-frame image or first- and last-frame images in order. Cannot be combined with reference_images or reference_videos.
- `reference_images` (list of string, optional) — Up to four public HTTPS reference images, optionally combined with one reference video. Cannot be combined with images.
- `reference_videos` (list of string, optional) — One public HTTPS reference video, optionally combined with up to four reference images. Cannot be combined with images.
- `duration` (integer, optional, default: 5) — Requested output duration in whole seconds.
- `aspect_ratio` (enum, optional, default: 16:9) — Output aspect ratio. Adaptive is not supported.
  - Allowed values: `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, `21:9`
- `resolution` (enum, optional, default: 768p) — Normal output resolution. This model does not offer 2K or 4K.
  - Allowed values: `480p`, `768p`, `1080p`
- `seed` (integer, optional) — Optional integer generation seed from 0 to 9007199254740991. Omit for a random seed.

## Response

### 201

Video generation task accepted

## Errors

### 400 Bad Request Error

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.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 401 Unauthorized Error

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.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 402 Payment Required Error

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.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 403 Forbidden Error

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.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 409 Conflict Error

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.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 429 Too Many Requests Error

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`).

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 500 Internal Server Error

Unexpected internal error (`internal_error`). Retryable; keep `request_id` for support if it persists.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

### 503 Service Unavailable Error

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.

- `error` (ErrorError, required) — Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

## Types

### ErrorError

Structured BeatAPI error. Use `code` (or `retryable`) for program logic and retain `request_id` for support.

- `code` (enum, required) — Stable machine-readable error code. `unauthorized` is the deprecated name for a 401; since 2026-09-29 a 401 is `missing_api_key` or `invalid_api_key`. Treat a legacy `unauthorized` like `invalid_api_key`.
  - Allowed values: `bad_request`, `missing_api_key`, `invalid_api_key`, `unauthorized`, `forbidden`, `not_found`, `insufficient_credits`, `idempotency_conflict`, `user_concurrency_exceeded`, `rate_limit_exceeded`, `content_policy_violation`, `processing_unavailable`, `processing_failed`, `processing_timeout`, `result_transfer_failed`, `invalid_signature`, `realtime_disabled`, `realtime_capacity_unavailable`, `realtime_session_expired`, `origin_not_allowed`, `invalid_client_secret`, `transport_not_allowed`, `internal_error`
- `message` (string, required) — English sentence that states the cause; for `bad_request` it names the field. Written for people and logs, not for parsing.
- `retryable` (boolean, required) — Whether making the same call again could succeed. Present on every error; branch on it instead of the status code. True for 429, 500 and 503 (rate_limit_exceeded, user_concurrency_exceeded, internal_error, processing_unavailable, processing_timeout, processing_failed, result_transfer_failed, realtime_capacity_unavailable). False for a request, key or balance that must change first (bad_request, content_policy_violation, missing_api_key, invalid_api_key, insufficient_credits, forbidden, not_found, idempotency_conflict, realtime_disabled and the other realtime credential codes).
- `request_id` (string, required) — Correlation ID to retain for BeatAPI support.
- `retry_after_seconds` (integer, optional) — Seconds to wait before retrying. Present on every 429, and on a 503 when the wait is known; the same value is sent in the `Retry-After` header.
- `docs` (string, optional) — The public Skill page that says what to do about an error. Present on errors answered by the capability endpoints (`/v1/capabilities/search`, `/v1/capabilities/inspect`, `/v1/capabilities/run`); absent on every other endpoint.

## Examples

### MiniMax H3

**Response**

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

**SDK Code**

```python MiniMax H3
import requests

url = "https://api.beatapi.io/v1/videos/tasks"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript MiniMax H3
const url = 'https://api.beatapi.io/v1/videos/tasks';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go MiniMax H3
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.beatapi.io/v1/videos/tasks"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby MiniMax H3
require 'uri'
require 'net/http'

url = URI("https://api.beatapi.io/v1/videos/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java MiniMax H3
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.beatapi.io/v1/videos/tasks")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php MiniMax H3
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.beatapi.io/v1/videos/tasks', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp MiniMax H3
using RestSharp;

var client = new RestClient("https://api.beatapi.io/v1/videos/tasks");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift MiniMax H3
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.beatapi.io/v1/videos/tasks")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Text to video

**Request**

```json
{
  "model": "minimax-h3-normal",
  "prompt": "A slow cinematic push through a misty mountain village at dawn.",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "768p"
}
```

**Response**

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

**SDK Code**

```python Text to video
import requests

url = "https://api.beatapi.io/v1/videos/tasks"

payload = {
    "model": "minimax-h3-normal",
    "prompt": "A slow cinematic push through a misty mountain village at dawn.",
    "duration": 5,
    "aspect_ratio": "16:9",
    "resolution": "768p"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Text to video
const url = 'https://api.beatapi.io/v1/videos/tasks';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"model":"minimax-h3-normal","prompt":"A slow cinematic push through a misty mountain village at dawn.","duration":5,"aspect_ratio":"16:9","resolution":"768p"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Text to video
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.beatapi.io/v1/videos/tasks"

	payload := strings.NewReader("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"A slow cinematic push through a misty mountain village at dawn.\",\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Text to video
require 'uri'
require 'net/http'

url = URI("https://api.beatapi.io/v1/videos/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"A slow cinematic push through a misty mountain village at dawn.\",\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}"

response = http.request(request)
puts response.read_body
```

```java Text to video
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.beatapi.io/v1/videos/tasks")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"A slow cinematic push through a misty mountain village at dawn.\",\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}")
  .asString();
```

```php Text to video
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.beatapi.io/v1/videos/tasks', [
  'body' => '{
  "model": "minimax-h3-normal",
  "prompt": "A slow cinematic push through a misty mountain village at dawn.",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "768p"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Text to video
using RestSharp;

var client = new RestClient("https://api.beatapi.io/v1/videos/tasks");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"A slow cinematic push through a misty mountain village at dawn.\",\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Text to video
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "model": "minimax-h3-normal",
  "prompt": "A slow cinematic push through a misty mountain village at dawn.",
  "duration": 5,
  "aspect_ratio": "16:9",
  "resolution": "768p"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.beatapi.io/v1/videos/tasks")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### First frame

**Request**

```json
{
  "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"
}
```

**Response**

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

**SDK Code**

```python First frame
import requests

url = "https://api.beatapi.io/v1/videos/tasks"

payload = {
    "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"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript First frame
const url = 'https://api.beatapi.io/v1/videos/tasks';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"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"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go First frame
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.beatapi.io/v1/videos/tasks"

	payload := strings.NewReader("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"The performer turns toward the camera as neon light sweeps across the scene.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby First frame
require 'uri'
require 'net/http'

url = URI("https://api.beatapi.io/v1/videos/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"The performer turns toward the camera as neon light sweeps across the scene.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}"

response = http.request(request)
puts response.read_body
```

```java First frame
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.beatapi.io/v1/videos/tasks")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"The performer turns toward the camera as neon light sweeps across the scene.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}")
  .asString();
```

```php First frame
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.beatapi.io/v1/videos/tasks', [
  'body' => '{
  "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"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp First frame
using RestSharp;

var client = new RestClient("https://api.beatapi.io/v1/videos/tasks");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"The performer turns toward the camera as neon light sweeps across the scene.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift First frame
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "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"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.beatapi.io/v1/videos/tasks")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### First and last frames

**Request**

```json
{
  "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"
}
```

**Response**

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

**SDK Code**

```python First and last frames
import requests

url = "https://api.beatapi.io/v1/videos/tasks"

payload = {
    "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"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript First and last frames
const url = 'https://api.beatapi.io/v1/videos/tasks';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"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"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go First and last frames
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.beatapi.io/v1/videos/tasks"

	payload := strings.NewReader("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Move smoothly from the opening portrait to the final product reveal.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\",\n    \"https://media.beatapi.io/samples/smart-bottle.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby First and last frames
require 'uri'
require 'net/http'

url = URI("https://api.beatapi.io/v1/videos/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Move smoothly from the opening portrait to the final product reveal.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\",\n    \"https://media.beatapi.io/samples/smart-bottle.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}"

response = http.request(request)
puts response.read_body
```

```java First and last frames
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.beatapi.io/v1/videos/tasks")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Move smoothly from the opening portrait to the final product reveal.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\",\n    \"https://media.beatapi.io/samples/smart-bottle.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}")
  .asString();
```

```php First and last frames
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.beatapi.io/v1/videos/tasks', [
  'body' => '{
  "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"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp First and last frames
using RestSharp;

var client = new RestClient("https://api.beatapi.io/v1/videos/tasks");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Move smoothly from the opening portrait to the final product reveal.\",\n  \"images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\",\n    \"https://media.beatapi.io/samples/smart-bottle.png\"\n  ],\n  \"duration\": 5,\n  \"resolution\": \"768p\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift First and last frames
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "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"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.beatapi.io/v1/videos/tasks")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Multimodal references

**Request**

```json
{
  "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**

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

**SDK Code**

```python Multimodal references
import requests

url = "https://api.beatapi.io/v1/videos/tasks"

payload = {
    "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"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Multimodal references
const url = 'https://api.beatapi.io/v1/videos/tasks';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"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"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Multimodal references
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.beatapi.io/v1/videos/tasks"

	payload := strings.NewReader("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Create a cinematic performance using the supplied visual reference.\",\n  \"reference_images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Multimodal references
require 'uri'
require 'net/http'

url = URI("https://api.beatapi.io/v1/videos/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Create a cinematic performance using the supplied visual reference.\",\n  \"reference_images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}"

response = http.request(request)
puts response.read_body
```

```java Multimodal references
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.beatapi.io/v1/videos/tasks")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Create a cinematic performance using the supplied visual reference.\",\n  \"reference_images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}")
  .asString();
```

```php Multimodal references
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.beatapi.io/v1/videos/tasks', [
  'body' => '{
  "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"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Multimodal references
using RestSharp;

var client = new RestClient("https://api.beatapi.io/v1/videos/tasks");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"model\": \"minimax-h3-normal\",\n  \"prompt\": \"Create a cinematic performance using the supplied visual reference.\",\n  \"reference_images\": [\n    \"https://media.beatapi.io/samples/neon-singer.png\"\n  ],\n  \"duration\": 5,\n  \"aspect_ratio\": \"16:9\",\n  \"resolution\": \"768p\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Multimodal references
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "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"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.beatapi.io/v1/videos/tasks")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```