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.
channel_id or item_id does not grant access.
Entitlement is resolved server-side from the API-key owner.
Channel → material → source JSON
- List channels available to the API key.
- Select a returned
channel_id. - List material metadata inside that channel.
- Select an
item_idwherehas_source_file=true. - Request the source JSON for $0.01.
/api/v1/client/channels/FREE/api/v1/client/channels/<channel_id>/FREE/api/v1/client/items/<item_id>/$0.01List 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);
{
"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())
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 →