---
title: "action=get_movie"
description: "Fetch a single VOD entry (movie or series episode) by numeric id. Returns the same shape as one item of get_movies."
---

# action=get_movie

Fetches a single VOD entry by its numeric id. Returns the exact shape of one item in the [action=get_movies](/docs/?page=xc-ref-movies-list) list. Use this when you already have a VOD id and want a fresh read without paginating the full catalog.

Both admin and reseller keys can call this endpoint. VOD entries are not filtered by reseller; any valid id is visible to any caller with `vods:read`.

## Endpoint

`GET https://<your-panel-domain>/panel-api/xc/{accesscode}/admin/index.php?action=get_movie&id=<vod-id>`

Also accepted: POST with `action=get_movie` and `id` in the body, and the `/reseller/index.php` sub-path.

## Authentication

Send the API key as `?api_key=<token>`, as an `api_key=<token>` POST field, or as `Authorization: Bearer <token>`.

## Required scope

`vods:read`. A key without the scope gets `STATUS_NO_PERMISSIONS` with `error: "insufficient_scope"`.

## Query parameters

| Name | Type | Required | Default | Description |
| ---- | ---- | -------- | ------- | ----------- |
| `action` | string | Yes | | Must be `get_movie`. |
| `api_key` | string | Yes (if not using Bearer) | | The API key. |
| `id` | int | Yes | | Numeric id of the VOD entry. |

## Response

`data` is a single VOD object (not wrapped in `items`).

```json
{
  "status": "STATUS_SUCCESS",
  "data": {
    "id": 83287,
    "name": "Movie 83287",
    "icon": "",
    "year": 2019,
    "rating": 7.1,
    "is_serie": true,
    "categories": []
  }
}
```

Field-by-field.

| Field | Type | Description |
|---|---|---|
| `id` | int | VOD id. |
| `name` | string | Title. For series episodes typically `Show - SxxEyy - Episode title`. |
| `icon` | string | Absolute URL of the poster or cover image, or empty string if none. |
| `year` | int | Release year, `0` if unknown. |
| `rating` | float | Rating (0-10 scale), `0` if not rated. |
| `is_serie` | bool | `true` if series episode, `false` if standalone movie. |
| `categories` | array | Zero or more category objects (`id`, `name`). May be empty. |

## Examples

### cURL

```bash
curl "https://<your-panel-domain>/panel-api/xc/panel_api/admin/index.php?api_key=<your-api-key>&action=get_movie&id=83287"
```

### PHP raw

```php
$url = 'https://<your-panel-domain>/panel-api/xc/panel_api/admin/index.php'
     . '?' . http_build_query([
         'api_key' => '<your-api-key>',
         'action'  => 'get_movie',
         'id'      => 83287,
       ]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($body['status'] ?? '') !== 'STATUS_SUCCESS') {
    $slug = $body['data']['error'] ?? 'unknown';
    throw new RuntimeException("get_movie failed: {$slug}");
}
$vod = $body['data'];
echo $vod['id'], "\t", $vod['name'], "\t", $vod['is_serie'] ? 'series' : 'movie', "\n";
```

### Python raw

```python
import requests

r = requests.get(
    "https://<your-panel-domain>/panel-api/xc/panel_api/admin/index.php",
    params={"api_key": "<your-api-key>", "action": "get_movie", "id": 83287},
    timeout=30,
)
r.raise_for_status()
body = r.json()
if body["status"] != "STATUS_SUCCESS":
    raise RuntimeError(f"get_movie failed: {body['data'].get('error')}")
vod = body["data"]
print(vod["id"], vod["name"], "series" if vod["is_serie"] else "movie")
```

## Errors

| `status` | `error` slug | When it happens | How to fix |
| -------- | ----------- | --------------- | ---------- |
| `STATUS_INVALID_DATA` | `validation_error` | `id` parameter is missing or empty. Response includes `data.details.field = "id"`. | Include `id=<numeric>`. |
| `STATUS_INVALID_DATA` | `validation_error` | `action` parameter is missing. | Include `action=get_movie`. |
| `STATUS_NO_PERMISSIONS` | `insufficient_scope` | Key does not carry `vods:read`. | Issue a new key with the scope. |
| `STATUS_FAILURE` | `not_found` | No VOD entry exists with that id. Response message: `VOD not found`. | Verify the id against [action=get_movies](/docs/?page=xc-ref-movies-list). |
| `STATUS_FAILURE` | `invalid_key` | Key not sent or not recognized. | Check the key value. |
| `STATUS_FAILURE` | `rate_limited` | Per-minute request budget exceeded. | Slow down. See [Rate limits & Idempotency](/docs/?page=panel-api-rate-limits-idempotency). |

## See also

- [action=get_movies](/docs/?page=xc-ref-movies-list). List endpoint with pagination.
- [action=get_stream](/docs/?page=xc-ref-streams-get). Same shape for a single live stream.
- [Panel API Catalog](/docs/?page=xai-ref-overview#vods). Native v1 detail endpoint.
