{"audit":{"version":"1.5","generated_at":"2026-10-03T05:44:16.681477+00:00","generated_by":"Agenstry","report_url":"https://agenstry.com/agents/gradetv.net","methodology_url":"https://agenstry.com/methodology","verifier_jwks_url":"https://agenstry.com/.well-known/jwks.json","subject":{"domain":"gradetv.net","name":"Grade","url":"https://gradetv.net/.well-known/agent-card.json"}},"identity":{"provider":{"organization":"Grade","url":"https://gradetv.net"},"registry_verification":null,"signature":{"signed":false,"signature_valid":null}},"protocol":{"version":null,"supports_streaming":true,"supports_push_notifications":false},"operational":{"live_state":"live","live_responds":true,"last_status_code":200,"last_elapsed_ms":243,"last_error":null},"track_record":{"first_seen":"2026-09-30T23:33:08.627772+00:00","last_checked":"2026-10-03T03:59:09.526072+00:00","last_seen_ok":"2026-10-03T03:59:09.526072+00:00","checks_total":10,"checks_ok":10,"uptime_pct":100.0,"uptime_window_days":30,"uptime_probes":1,"archived":false,"archived_reason":null},"conformance":{"score":54,"grade":"D","summary":"D-grade: significant issues, auth-gated, partially broken, or stale.","criteria":[{"key":"valid_card","label":"Valid AgentCard","points":10,"max_points":10,"status":"pass","detail":"Parseable AgentCard returned by the well-known endpoint (Agenstry readiness signal; not an official TCK certification)."},{"key":"live_responds","label":"Live JSON-RPC","points":25,"max_points":25,"status":"pass","detail":"Endpoint responds to a negotiated A2A SendMessage probe (answers in ~468 ms)."},{"key":"protocol_version","label":"Protocol version","points":0,"max_points":10,"status":"fail","detail":"No protocolVersion in card."},{"key":"signature","label":"JWS signature","points":0,"max_points":10,"status":"info","detail":"Card is unsigned (most published agents are)."},{"key":"uptime","label":"Uptime track record","points":0,"max_points":15,"status":"info","detail":"Only 1 probe so far, need ≥5 for an uptime grade."},{"key":"skills","label":"Skill declaration","points":10,"max_points":10,"status":"pass","detail":"Declares 24 skills with structured metadata. 24 skills without tags — optional in 0.x, REQUIRED once you move the card to v1.0."},{"key":"verified_identity","label":"Verified Identity","points":5,"max_points":10,"status":"partial","detail":"Provider declared: Grade (https://gradetv.net). Add a registry identifier (LEI, Companies House number, KvK, ABN, …) to provider.legalEntity for full verified-business credit."},{"key":"freshness","label":"Freshness + modern flags","points":4,"max_points":5,"status":"pass","detail":"seen in upstream source within 0d"},{"key":"security","label":"Security declaration","points":0,"max_points":5,"status":"info","detail":"Neither securitySchemes nor securityRequirements declared — how to authenticate is unstated."}]},"card_read":{"findings":[],"clean":true,"source_url":"https://gradetv.net/.well-known/agent-card.json"},"skills":[{"id":"api_index","name":"api_index","description":"Índice auto-descrito da API inteira, com os idiomas e as páginas HTML de cada um.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/"},{"id":"health","name":"health","description":"Liveness e o commit publicado agora — é como o smoke espera o próprio deploy.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/health"},{"id":"geo","name":"geo","description":"País e idioma sugeridos para quem está chamando. Sem país detectado pela borda, sugere BR com `source: \"fallback\"`; `detected` diz o que a borda viu.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/geo"},{"id":"list_countries","name":"list_countries","description":"Países do catálogo com contagem playable e URL da bandeira (kind=radio conta estações).","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/countries"},{"id":"list_tags","name":"list_tags","description":"Tags das estações de rádio tocáveis, com contagem; opcionalmente por país.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/tags"},{"id":"search_channels","name":"search_channels","description":"Busca canais públicos (filtros: q, country, category, language, network, quality, playable; kind=radio para estações de rádio, tag para tag de rádio; sort=score ordena pela saúde medida por terceiro, sort=votes pelos votos da rádio; online=1 só quem foi visto online nas últimas 48 h). É a porta de entrada do produto. A resposta varia por navegador, sistema e país de quem pede — cada canal traz `social.your_fails`, o recorte do SEU ambiente — por isso ela é `Cache-Control: private`.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/channels"},{"id":"list_languages","name":"list_languages","description":"Idiomas que têm canal tocável, com a contagem de cada um.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/languages"},{"id":"list_networks","name":"list_networks","description":"Redes e emissoras que têm canal tocável, com a contagem.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/networks"},{"id":"list_qualities","name":"list_qualities","description":"Qualidades distintas encontradas nos streams do catálogo (em rádio, codec e bitrate).","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/qualities"},{"id":"list_subdivisions","name":"list_subdivisions","description":"Estados e províncias que têm canal tocável.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/subdivisions"},{"id":"list_cities","name":"list_cities","description":"Cidades que têm canal tocável, filtráveis por país e por estado.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/cities"},{"id":"get_channel","name":"get_channel","description":"Ficha completa de um canal, com os streams já apontando para o nosso hop.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/channels/:id"},{"id":"get_channel_guide","name":"get_channel_guide","description":"Programação de hoje do canal (grabada por nós): agora, a seguir e a lista. Disponível nos canais com guia (`guide=1`), com validade de até dois dias. Confira a data da resposta; a ficha traz o resumo em `guide_now`.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/channels/:id/guia"},{"id":"create_guest","name":"create_guest","description":"Cria guest ipt_… Não pede e-mail nem nada. Guarde o token: perdeu o token, perdeu a biblioteca — a não ser que a conta já o tenha reivindicado (`POST /api/auth/claim`), e aí o que ele guardou está na conta.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"POST /api/guest"},{"id":"get_library","name":"get_library","description":"A galeria inteira do dono: pastas, sub-abas, canais e as URLs de feed de cada nível.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/library"},{"id":"create_category","name":"create_category","description":"Cria tab/categoria pessoal. Teto de 8 pastas por dono. A resposta traz a biblioteca inteira já atualizada — não precisa recarregar `GET /api/library` depois.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"POST /api/categories"},{"id":"create_group","name":"create_group","description":"Cria sub-aba numa categoria. Teto de 12 sub-abas por pasta. A resposta traz a biblioteca inteira já atualizada — não precisa recarregar `GET /api/library` depois.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"POST /api/groups"},{"id":"add_item","name":"add_item","description":"Adiciona canal à sub-aba. Teto de 40 canais por sub-aba. A resposta diz em que pasta e sub-aba o canal caiu, para a tela abrir no lugar certo. A resposta traz a biblioteca inteira já atualizada — não precisa recarregar `GET /api/library` depois.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"POST /api/items"},{"id":"get_history","name":"get_history","description":"Histórico de canais assistidos pelo dono. Exibe somente canais disponíveis no catálogo.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/history"},{"id":"record_watch","name":"record_watch","description":"Registra um canal assistido no histórico do dono.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"POST /api/history"},{"id":"forget_watch","name":"forget_watch","description":"Tira um canal do histórico do dono.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"DELETE /api/history/:channel_id"},{"id":"clear_history","name":"clear_history","description":"Limpa o histórico inteiro do dono, de uma vez.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"DELETE /api/history"},{"id":"legacy_stream","name":"legacy_stream","description":"Metadados públicos: site oficial do canal, URL da transmissão para copiar em outro player e player legado HTTP. O botão legacy_url abre http://legacy.gradetv.net:8080/legacy?stream=ID. A página isolada aceita lang=pt/en/es/fr/de e theme=light/dark. Playlists continuam pelo hop HTTPS e mídia direto da origem. Não remove recusa de acesso nem exigência CORS. Uma leitura indexada; não busca origem nem grava no D1.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/legacy/:id"},{"id":"producer_services","name":"producer_services","description":"Oferta de transmissão autorizada sob consulta: informações e contatos para produtores. Não ativa streams. Somente informações e captação de interesse. Não provisiona, não cobra e não ativa transmissão. Use contact.form_url no browser, contact.email por e-mail ou POST /api/contact para apresentar o projeto. O envio é livre — sem captcha nem pagamento —, uma mensagem a cada 10 s por rede.","tags":[],"examples":[],"inputModes":[],"outputModes":[],"endpoint":"GET /api/producers"}],"provenance":[{"source":"cdp_discovery","first_seen":"2026-09-30T23:33:08.627772+00:00"},{"source":"recrawl_warm","first_seen":"2026-10-03T03:59:09.526072+00:00"}],"recent_probes":[{"fetched_at":"2026-10-03T03:59:09.526072+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":243,"live_responds":true}],"catalog_attestation":null,"operator_revenue_evidence":{"evidence_class":"operator_submitted","authenticity":{"rung":"no_operator_evidence","rank":0,"why":"No verifiable operator evidence has been submitted for this agent.","thresholds":{"min_independent_payers":3,"min_verified_usd":25.0},"engine_table":"agent_authenticity","merge_rule":"max(existing_rank, rank)"},"metric_metadata":{"provenance":"operator_submitted_evidence","confidence":"attested","coverage":{"numerator":0},"as_of":"2026-10-03T05:44:16.685501+00:00","definition":"Revenue proofs submitted by the verified owner and re-checked by Agenstry against the settlement chain or the operator's own Stripe account. Only independently confirmed proofs are counted."},"counts":{"retained":0,"verified":0,"unverifiable":0},"verified":{"gross_usd":0.0,"transactions":0,"independent_payers":0},"detail_url":"https://agenstry.com/api/agents/gradetv.net/evidence","dispute_url":"https://agenstry.com/agents/gradetv.net/dispute"},"verification_history":[]}