API v1 · Developer documentation

YouTube Public API

Documentation for public YouTube intelligence discovery, channels, categories, item metadata and concrete source JSON access.

Public-source intelligence organized for discovery

YouTube Public lets an integration first discover topics, channels and materials without paying for source content. A concrete source JSON is requested only after the integration has selected a specific item_id.

Available public categories

The following categories are present in the public data map. The documentation intentionally avoids publishing material totals because the dataset grows continuously.

Category What it covers
intelOSINT, security and strategic intelligence
geopoliticGeopolitics and international affairs
politicsPolitics, policy and institutions
societySociety and public-interest developments
newtechAI, technology and emerging systems
startupStartups, venture and entrepreneurship
energyEnergy markets, infrastructure and policy
estateReal estate, construction and financing
businessCompanies, economy and business strategy

The category catalog is intentionally documented without material counts because the dataset grows continuously. Use GET /api/v1/public/categories/ whenever your integration needs current discovery metadata.

Endpoint reference

GET/api/v1/public/categories/FREE
GET/api/v1/public/categories/<category>/FREE
GET/api/v1/public/categories/<category>/channels/FREE
GET/api/v1/public/categories/<category>/slugs/<slug_token>/FREE
GET/api/v1/public/channels/FREE
GET/api/v1/public/items/<item_id>/$0.01

List categories

cURL

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

PowerShell

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

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

$categories.items |
  Select-Object category, slugs_count, channels_count |
  Format-Table -AutoSize

Python

import requests

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

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

for row in r.json()["items"]:
    print(
        row["category"],
        row.get("slugs_count"),
        row.get("channels_count"),
    )

JavaScript

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

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

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

const data = await r.json();

for (const row of data.items) {
  console.log(
    row.category,
    row.slugs_count,
    row.channels_count
  );
}
Example responseFREE
{
  "ok": true,
  "charged": false,
  "items": [
    {
      "category": "intel",
      "slugs_count": 12,
      "channels_count": 100
    },
    {
      "category": "geopolitic",
      "slugs_count": 8,
      "channels_count": 66
    },
    {
      "category": "politics",
      "slugs_count": 69,
      "channels_count": 140
    }
  ]
}

Inspect one category and its channels

GET /api/v1/public/categories/intel/
GET /api/v1/public/categories/intel/channels/

The category endpoint is used to discover its thematic structure and material metadata. The channels endpoint is useful when an integration wants to filter or group intelligence by publisher/source.

# Python
import requests

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

intel_response = requests.get(
    f"{base}/api/v1/public/categories/intel/",
    headers=headers,
    timeout=30,
)
intel_response.raise_for_status()
intel = intel_response.json()

channels_response = requests.get(
    f"{base}/api/v1/public/categories/intel/channels/",
    headers=headers,
    timeout=30,
)
channels_response.raise_for_status()
channels = channels_response.json()

Select an item, then fetch its source JSON

Discovery responses expose lightweight metadata such as title, channel, publication date, source URL and an opaque item_id. They do not need to expose the complete source payload.

idOpaque item identifier used in the paid source request.
channelHuman-readable source/channel name.
channel_idStable channel identifier when present.
titleMaterial title.
published_atPublication timestamp.
source_urlOriginal source URL.
content_urlAPI route for the concrete source JSON.
content_price_centsCurrent source-file price.
has_source_fileWhether the concrete source JSON can be returned.
GET /api/v1/public/items/<item_id>/
GET /api/v1/public/items/<item_id>/?download=1
# Python
import requests

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

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

print("charged:", r.headers.get("X-AA-Charged"))
print("price:", r.headers.get("X-AA-Price-Cents"))
print("balance:", r.headers.get("X-AA-Balance-Cents"))
print(r.json())
Inline return and ?download=1 both deliver the same concrete source file and therefore use the same $0.01 billing rule.

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 →