Skip to main content
GET
/
library
/
sections
/
{sectionId}
/
firstCharacters
PlexGO
package main

import(
	"context"
	"github.com/LukeHagar/plexgo/models/components"
	"github.com/LukeHagar/plexgo"
	"github.com/LukeHagar/plexgo/models/operations"
	"log"
)

func main() {
    ctx := context.Background()

    s := plexgo.New(
        plexgo.WithAccepts(components.AcceptsApplicationXML),
        plexgo.WithClientIdentifier("abc123"),
        plexgo.WithProduct("Plex for Roku"),
        plexgo.WithVersion("2.4.1"),
        plexgo.WithPlatform("Roku"),
        plexgo.WithPlatformVersion("4.3 build 1057"),
        plexgo.WithDevice("Roku 3"),
        plexgo.WithModel("4200X"),
        plexgo.WithDeviceVendor("Roku"),
        plexgo.WithDeviceName("Living Room TV"),
        plexgo.WithMarketplace("googlePlay"),
        plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
    )

    res, err := s.Library.GetFirstCharacters(ctx, operations.GetFirstCharactersRequest{
        SectionID: 3947,
        MediaQuery: &components.MediaQuery{
            Type: components.MediaTypeEpisode.ToPointer(),
            SourceType: plexgo.Pointer[int64](2),
            Sort: plexgo.Pointer("duration:desc,index"),
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    if res.Object != nil {
        // handle response
    }
}
package hello.world;

import dev.plexapi.sdk.PlexAPI;
import dev.plexapi.sdk.models.operations.GetFirstCharactersRequest;
import dev.plexapi.sdk.models.operations.GetFirstCharactersResponse;
import dev.plexapi.sdk.models.shared.*;
import java.lang.Exception;

public class Application {

public static void main(String[] args) throws Exception {

PlexAPI sdk = PlexAPI.builder()
.accepts(Accepts.APPLICATION_XML)
.clientIdentifier("abc123")
.product("Plex for Roku")
.version("2.4.1")
.platform("Roku")
.platformVersion("4.3 build 1057")
.device("Roku 3")
.model("4200X")
.deviceVendor("Roku")
.deviceName("Living Room TV")
.marketplace("googlePlay")
.token(System.getenv().getOrDefault("TOKEN", ""))
.build();

GetFirstCharactersRequest req = GetFirstCharactersRequest.builder()
.sectionId(3947L)
.mediaQuery(MediaQuery.builder()
.type(MediaType.Episode)
.sourceType(2L)
.sort("duration:desc,index")
.build())
.build();

GetFirstCharactersResponse res = sdk.library().getFirstCharacters()
.request(req)
.call();

if (res.object().isPresent()) {
// handle response
}
}
}
import { PlexAPI } from "@lukehagar/plexjs";
import { Accepts, MediaType } from "@lukehagar/plexjs/models/shared";

const plexAPI = new PlexAPI({
accepts: Accepts.ApplicationXml,
clientIdentifier: "abc123",
product: "Plex for Roku",
version: "2.4.1",
platform: "Roku",
platformVersion: "4.3 build 1057",
device: "Roku 3",
model: "4200X",
deviceVendor: "Roku",
deviceName: "Living Room TV",
marketplace: "googlePlay",
token: "<YOUR_API_KEY_HERE>",
});

async function run() {
const result = await plexAPI.library.getFirstCharacters({
sectionId: 3947,
mediaQuery: {
type: MediaType.Episode,
sourceType: 2,
sort: "duration:desc,index",
},
});

console.log(result);
}

run();
curl --request GET \
--url https://{IP-description}.{identifier}.plex.direct:{port}/library/sections/{sectionId}/firstCharacters \
--header 'X-Plex-Client-Identifier: <x-plex-client-identifier>' \
--header 'X-Plex-Token: <api-key>'
import requests

url = "https://{IP-description}.{identifier}.plex.direct:{port}/library/sections/{sectionId}/firstCharacters"

headers = {
"X-Plex-Client-Identifier": "<x-plex-client-identifier>",
"X-Plex-Token": "<api-key>"
}

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

print(response.text)
const options = {
method: 'GET',
headers: {
'X-Plex-Client-Identifier': '<x-plex-client-identifier>',
'X-Plex-Token': '<api-key>'
}
};

fetch('https://{IP-description}.{identifier}.plex.direct:{port}/library/sections/{sectionId}/firstCharacters', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_PORT => "62437",
CURLOPT_URL => "https://{IP-description}.{identifier}.plex.direct:{port}/library/sections/{sectionId}/firstCharacters",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Plex-Client-Identifier: <x-plex-client-identifier>",
"X-Plex-Token: <api-key>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
require 'uri'
require 'net/http'

url = URI("https://{IP-description}.{identifier}.plex.direct:{port}/library/sections/{sectionId}/firstCharacters")

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

request = Net::HTTP::Get.new(url)
request["X-Plex-Client-Identifier"] = '<x-plex-client-identifier>'
request["X-Plex-Token"] = '<api-key>'

response = http.request(request)
puts response.read_body
{
  "MediaContainer": {
    "identifier": "<string>",
    "offset": 123,
    "size": 123,
    "totalSize": 123,
    "Directory": [
      {
        "key": "<string>",
        "size": 123,
        "title": "<string>"
      }
    ]
  }
}

Authorizations

X-Plex-Token
string
header
required

The token which identifies the user accessing the PMS. This can be either:

  • A traditional access token obtained from plex.tv
  • A JWT token obtained through the JWT authentication flow

JWT tokens provide better security with:

  • Short-lived tokens (7 days expiration)
  • Public-key cryptography (ED25519)
  • Better clock synchronization
  • Individual device revocation capability

Headers

accepts
enum<string>
default:application/xml

Indicates the client accepts the indicated media types

Available options:
application/json,
application/xml
X-Plex-Client-Identifier
string
required

An opaque identifier unique to the client

Example:

"abc123"

X-Plex-Product
string

The name of the client product

Example:

"Plex for Roku"

X-Plex-Version
string

The version of the client application

Example:

"2.4.1"

X-Plex-Platform
string

The platform of the client

Example:

"Roku"

X-Plex-Platform-Version
string

The version of the platform

Example:

"4.3 build 1057"

X-Plex-Device
string

A relatively friendly name for the client device

Example:

"Roku 3"

X-Plex-Model
string

A potentially less friendly identifier for the device model

Example:

"4200X"

X-Plex-Device-Vendor
string

The device vendor

Example:

"Roku"

X-Plex-Device-Name
string

A friendly name for the client

Example:

"Living Room TV"

X-Plex-Marketplace
string

The marketplace on which the client application is distributed

Example:

"googlePlay"

Path Parameters

sectionId
integer
required

Section identifier

Query Parameters

type
integer

The metadata type to filter on

sort
integer

The metadata type to filter on

mediaQuery
object

A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:

  • Fields: integer, boolean, tag, string, date, language
  • Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
  • Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
  • Sorting: sort parameter with :desc, :nullsLast modifiers
  • Grouping: group parameter
  • Limits: limit parameter

Examples:

  • Object format: {type: 4, sourceType: 2, title: "24"}type=4&sourceType=2&title=24
  • String format: type=4&sourceType=2&title==24 - type = 4 AND sourceType = 2 AND title = "24"
  • Complex: push=1&index=1&or=1&rating=2&pop=1&duration=10 - (index = 1 OR rating = 2) AND duration = 10

See API Info section for detailed information on building media queries.

A querystring-based filtering language used to select subsets of media. When provided as an object, properties are serialized as a querystring using form style with explode.

Only the defined properties below are allowed. The object serializes to a querystring format like: type=4&sourceType=2&sort=duration:desc,index

Example:
{
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
}

Response

200 - application/json

OK

MediaContainer
object

MediaContainer is the root element of most Plex API responses. It serves as a generic container for various types of content (Metadata, Hubs, Directories, etc.) and includes pagination information (offset, size, totalSize) when applicable. Common attributes: - identifier: Unique identifier for this container - size: Number of items in this response page - totalSize: Total number of items available (for pagination) - offset: Starting index of this page (for pagination) The container often "hoists" common attributes from its children. For example, if all tracks in a container share the same album title, the parentTitle attribute may appear on the MediaContainer rather than being repeated on each track.