Today, I get two free account on the zernio webpage.
This python script does three things:
First calls Zernio by sends GET https://zernio.com/api/v1/accounts using your Bearer token and loads the JSON response.
Then filters YouTube accounts: from the returned accounts[] list, it keeps only the items that look like YouTube (based on fields like platform/provider/network == "youtube").
Last one, prints and searches identifiers:
It prints the full JSON object for each connected YouTube account (first ~4000 characters), so you can see what fields Zernio returns.
It recursively scans that object for any string that matches a YouTube Channel ID pattern (strings starting with UC...) and prints the path and value for each match (e.g., meta.channelId = UCxxxx).
The result returns by printing to the console:
how many YouTube accounts Zernio returned.
the JSON for each YouTube account object.
a list of candidate channelId strings (and where they appear in the JSON).
Let's see the script:
import requests
import json
import re
ZERNIO_TOKEN = "sk_API_KEY"
API_BASE = "https://zernio.com/api/v1"
headers = {
"Authorization": f"Bearer {ZERNIO_TOKEN}",
"Accept": "application/json",
}
def is_youtube_account(acc: dict) -> bool:
for k in ("platform", "provider", "network"):
v = acc.get(k)
if isinstance(v, str) and v.lower() == "youtube":
return True
return False
def find_uc_strings(obj, path=""):
hits = []
if isinstance(obj, dict):
for k, v in obj.items():
hits += find_uc_strings(v, f"{path}.{k}" if path else k)
elif isinstance(obj, list):
for i, v in enumerate(obj):
hits += find_uc_strings(v, f"{path}[{i}]")
elif isinstance(obj, str):
# Typical YouTube channel id: starts with UC and is 24 chars, but we’ll be flexible
if re.match(r"^UC[a-zA-Z0-9_-]{10,}$", obj):
hits.append((path, obj))
return hits
resp = requests.get(f"{API_BASE}/accounts", headers=headers, timeout=30)
resp.raise_for_status()
data = resp.json()
accounts = data.get("accounts", [])
yt = [a for a in accounts if is_youtube_account(a)]
print(f"Found {len(yt)} YouTube accounts in Zernio.\n")
for idx, acc in enumerate(yt):
print(f"--- YouTube account #{idx} full object ---")
print(json.dumps(acc, ensure_ascii=False, indent=2)[:4000]) # first 4000 chars
print()
hits = find_uc_strings(acc)
print("Possible channelId candidates (paths):")
for p, v in hits:
print(f" - {p} = {v}")
print()This is a part of result:
...
"displayName": "Cătălin George Feștilă",
"enabled": true,
"externalPostCount": 63,
"followersCount": 110,
"followersLastUpdated": "2026-05-21T18:31:51.857Z",
"gcpProjectId": "default",
"intentionalDisconnectAt": null,
"isActive": true,
...
Possible channelId candidates (paths):
- metadata.profileData.id = UC2Dv01HhPCb8Obb9IxO81Jw
- platformUserId = UC2Dv01HhPCb8Obb9IxO81Jw