API v1 · Developer documentation

YouTube Client Content API

Documentation for owner-scoped private YouTube channel discovery, material metadata and concrete client source JSON access.

Private channel content scoped to the API-key owner

YouTube Client Content exposes source data from channels currently assigned or purchased for the authenticated account. Discovery requests reveal only entitled channels and lightweight material metadata.

Supplying another client's channel_id or item_id does not grant access. Entitlement is resolved server-side from the API-key owner.

Channel → material → source JSON

  1. List channels available to the API key.
  2. Select a returned channel_id.
  3. List material metadata inside that channel.
  4. Select an item_id where has_source_file=true.
  5. Request the source JSON for $0.01.
GET/api/v1/client/channels/FREE
GET/api/v1/client/channels/<channel_id>/FREE
GET/api/v1/client/items/<item_id>/$0.01

List your channels

cURL

curl \
  -H "Authorization: Bearer aa_live_..." \
  https://art-argentum.com/api/v1/client/channels/

PowerShell

$key = "aa_live_..."
$base = "https://art-argentum.com"
$headers = @{ Authorization = "Bearer $key" }

$channels = Invoke-RestMethod `
  -Uri "$base/api/v1/client/channels/" `
  -Headers $headers `
  -Method GET

$channels.items |
  Select-Object channel_id, handle, available, source_file_price_cents |
  Format-Table -AutoSize

Python

import requests

base = "https://art-argentum.com"
headers = {
    "Authorization": "Bearer aa_live_..."
}

r = requests.get(
    f"{base}/api/v1/client/channels/",
    headers=headers,
    timeout=30,
)
r.raise_for_status()
channels = r.json()

for channel in channels.get("items", []):
    print(
        channel["channel_id"],
        channel.get("handle"),
        channel.get("available"),
    )

JavaScript

const base = "https://art-argentum.com";
const headers = {
  Authorization: "Bearer aa_live_..."
};

const r = await fetch(
  `${base}/api/v1/client/channels/`,
  { headers }
);

if (!r.ok) {
  throw new Error(`HTTP ${r.status}`);
}

const channels = await r.json();
console.table(channels.items);
Example channel responseFREE
{
  "ok": true,
  "charged": false,
  "items": [
    {
      "channel_id": "ch_634fa84de97faa",
      "handle": "biznesmisja",
      "available": true,
      "items_url": "/api/v1/client/channels/ch_634fa84de97faa/",
      "source_file_price_cents": 1
    }
  ]
}

List material metadata in one channel

# PowerShell
$key = "aa_live_..."
$base = "https://art-argentum.com"
$headers = @{ Authorization = "Bearer $key" }

$channels = Invoke-RestMethod `
  -Uri "$base/api/v1/client/channels/" `
  -Headers $headers `
  -Method GET

$channel = $channels.items | Select-Object -First 1

$materials = Invoke-RestMethod `
  -Uri "$base/api/v1/client/channels/$($channel.channel_id)/" `
  -Headers $headers `
  -Method GET

$materials.items |
  Select-Object -First 10 `
    id, channel, title, published_at, `
    content_price_cents, has_source_file |
  Format-Table -Wrap -AutoSize
idOpaque material identifier used in the source-file request.
channel_idOwner-scoped channel identifier.
titleMaterial title.
published_atPublication timestamp.
source_urlOriginal source URL when available.
content_price_centsPrice of opening the concrete source JSON.
has_source_fileWhether the source file is available for retrieval.

Open or download one source JSON

GET /api/v1/client/items/<item_id>/
GET /api/v1/client/items/<item_id>/?download=1
# Python
import requests

base = "https://art-argentum.com"
headers = {
    "Authorization": "Bearer aa_live_..."
}

channels = requests.get(
    f"{base}/api/v1/client/channels/",
    headers=headers,
    timeout=30,
)
channels.raise_for_status()

channel_id = channels.json()["items"][0]["channel_id"]

materials = requests.get(
    f"{base}/api/v1/client/channels/{channel_id}/",
    headers=headers,
    timeout=30,
)
materials.raise_for_status()

item_id = materials.json()["items"][0]["id"]

r = requests.get(
    f"{base}/api/v1/client/items/{item_id}/",
    headers=headers,
    timeout=30,
)
r.raise_for_status()

print("price:", r.headers.get("X-AA-Price-Cents"))
print("balance:", r.headers.get("X-AA-Balance-Cents"))
print(r.json())
The server authenticates the key, verifies channel entitlement and resolves the item before a successful billable source-file response is returned.

Authentication, billing and errors

Send Authorization: Bearer aa_live_... on every request. For YouTube source files, successful concrete-file access costs $0.01; discovery is free.

Common responses: 200 success · 401 invalid key · 402 insufficient balance · 404 missing or unauthorized resource · 405 method not allowed.

See API overview, billing headers and common response semantics →