{"id":4828,"date":"2026-05-20T11:17:02","date_gmt":"2026-05-20T11:17:02","guid":{"rendered":"https:\/\/latinleap.vc\/?page_id=4828"},"modified":"2026-05-21T16:16:59","modified_gmt":"2026-05-21T16:16:59","slug":"next-gen-ceapi","status":"publish","type":"page","link":"https:\/\/latinleap.vc\/zh\/next-gen-ceapi\/","title":{"rendered":"Next Gen CEAPI"},"content":{"rendered":"\n\n\n<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\">\n<title>Latin Leap \u00d7 CEAPI Next Gen \u2014 Mi Score de Visibilidad P\u00fablica<\/title>\n<style>\n* { box-sizing: border-box; margin: 0; padding: 0; }\nbody { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #f5f5f3; color: #111; min-height: 100vh; }\n\n.header { background: #111; color: white; padding: 1rem 1.5rem; }\n.header-title { font-size: 18px; font-weight: 600; letter-spacing: -0.3px; }\n.header-sub { font-size: 12px; color: #888; margin-top: 3px; }\n\n.container { max-width: 480px; margin: 0 auto; padding: 1.25rem; }\n\n.score-card { background: white; border-radius: 16px; padding: 1.5rem; margin-bottom: 1rem; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }\n.score-row { display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: 1rem; }\n.score-main { font-size: 52px; font-weight: 600; line-height: 1; letter-spacing: -2px; }\n.score-denom { font-size: 20px; color: #999; font-weight: 400; }\n.score-right { text-align: right; }\n.level-badge { font-size: 13px; font-weight: 600; padding: 4px 12px; border-radius: 20px; display: inline-block; margin-bottom: 6px; }\n.level-high { background: #CBFF4D; color: #111; }\n.level-avg { background: #FFE566; color: #111; }\n.level-low { background: #FFE0D6; color: #C0392B; }\n.score-sub { font-size: 12px; color: #666; }\n.score-change { font-size: 12px; font-weight: 500; color: #0F6E56; }\n.bar-wrap { height: 8px; background: #eee; border-radius: 4px; overflow: hidden; margin-bottom: 6px; }\n.bar-fill { height: 100%; background: #111; border-radius: 4px; transition: width 0.4s cubic-bezier(.4,0,.2,1); }\n.bar-labels { display: flex; justify-content: space-between; font-size: 10px; color: #aaa; }\n\n.formula-note { background: #f5f5f3; border-radius: 10px; padding: 10px 14px; font-size: 12px; color: #666; line-height: 1.5; margin-bottom: 1rem; }\n.formula-note strong { color: #111; }\n\n.section-label { font-size: 11px; font-weight: 600; color: #999; letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 10px; }\n\n.card { background: white; border-radius: 14px; padding: 1rem 1.25rem; margin-bottom: 10px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }\n.card-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 10px; }\n.card-label { font-size: 15px; font-weight: 500; }\n.card-desc { font-size: 12px; color: #888; margin-top: 2px; }\n.card-score { font-size: 16px; font-weight: 600; min-width: 36px; text-align: right; }\n\ninput[type=range] { width: 100%; height: 4px; border-radius: 2px; background: #eee; outline: none; -webkit-appearance: none; cursor: pointer; }\ninput[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 24px; height: 24px; border-radius: 50%; background: #111; cursor: pointer; box-shadow: 0 1px 4px rgba(0,0,0,0.2); }\ninput[type=range]::-moz-range-thumb { width: 24px; height: 24px; border-radius: 50%; background: #111; cursor: pointer; border: none; }\n.slider-labels { display: flex; justify-content: space-between; font-size: 10px; color: #bbb; margin-top: 6px; }\n.step-hint { font-size: 12px; color: #888; text-align: center; padding: 8px 0 4px; font-style: italic; }\n\n.divider { border: none; border-top: 1px solid #eee; margin: 1.25rem 0; }\n\n.add-card { background: white; border-radius: 14px; padding: 1rem 1.25rem; margin-bottom: 10px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }\n.add-card-title { font-size: 15px; font-weight: 500; margin-bottom: 4px; }\n.add-card-desc { font-size: 12px; color: #888; margin-bottom: 14px; line-height: 1.5; }\n.input-wrap { display: flex; gap: 8px; }\n.input-wrap input { flex: 1; font-size: 14px; padding: 10px 14px; border: 1.5px solid #eee; border-radius: 10px; background: white; color: #111; }\n.input-wrap input:focus { outline: none; border-color: #111; }\n.eval-btn { background: #111; color: white; border: none; border-radius: 10px; padding: 10px 18px; font-size: 14px; font-weight: 500; cursor: pointer; white-space: nowrap; }\n.eval-btn:disabled { background: #999; cursor: not-allowed; }\n.eval-status { font-size: 12px; color: #888; margin-top: 8px; min-height: 18px; }\n\n\/* Verification steps display *\/\n.verify-steps { background: #f9f9f9; border-radius: 10px; padding: 10px 14px; margin-top: 8px; font-size: 12px; color: #666; line-height: 1.8; display: none; }\n.verify-step { display: flex; align-items: flex-start; gap: 8px; }\n.verify-icon { flex-shrink: 0; font-size: 13px; }\n.verify-icon.done { color: #0F6E56; }\n.verify-icon.loading { color: #999; }\n.verify-icon.fail { color: #C0392B; }\n\n.extra-card { border-radius: 12px; padding: 12px 14px; margin-bottom: 8px; }\n.extra-card.verified { background: #f0fdf4; border: 1px solid #bbf7d0; }\n.extra-card.unverified { background: #fff8e6; border: 1px solid #fde68a; }\n.extra-card.failed { background: #fff1f0; border: 1px solid #fca5a5; }\n.extra-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 4px; }\n.extra-name { font-size: 14px; font-weight: 500; }\n.extra-right { display: flex; align-items: center; gap: 8px; }\n.extra-badge { font-size: 12px; font-weight: 600; padding: 2px 10px; border-radius: 20px; }\n.badge-verified { background: #CBFF4D; color: #111; }\n.badge-unverified { background: #FFE566; color: #111; }\n.badge-failed { background: #FFE0D6; color: #C0392B; }\n.extra-remove { background: none; border: none; cursor: pointer; color: #aaa; font-size: 20px; line-height: 1; padding: 0; }\n.extra-reasoning { font-size: 12px; color: #555; line-height: 1.5; margin-top: 4px; }\n.extra-impact { font-size: 12px; font-weight: 500; color: #0F6E56; margin-top: 4px; }\n.extra-source { font-size: 11px; color: #888; margin-top: 3px; font-style: italic; }\n.verification-tag { font-size: 10px; font-weight: 500; padding: 1px 7px; border-radius: 10px; display: inline-block; margin-top: 4px; }\n.tag-verified { background: #dcfce7; color: #166534; }\n.tag-unverified { background: #fef9c3; color: #854d0e; }\n.tag-private { background: #f3f4f6; color: #6b7280; }\n.cap-note { font-size: 11px; color: #aaa; text-align: center; margin-top: 4px; padding-bottom: 4px; }\n\n.peer-section { background: white; border-radius: 14px; padding: 1rem 1.25rem; margin-bottom: 1.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }\n.peer-title { font-size: 13px; font-weight: 500; margin-bottom: 3px; }\n.peer-sub { font-size: 12px; color: #888; margin-bottom: 10px; }\n.peer-bar-wrap { height: 8px; background: #eee; border-radius: 4px; overflow: hidden; margin: 8px 0; }\n.peer-bar-fill { height: 100%; background: linear-gradient(90deg, #CBFF4D, #111); border-radius: 4px; transition: width 0.4s cubic-bezier(.4,0,.2,1); }\n.peer-labels { display: flex; justify-content: space-between; font-size: 10px; color: #bbb; }\n\n.footer { text-align: center; padding: 1.5rem; background: #111; margin: 0 -1.25rem -1.25rem; }\n.footer-logos { display: flex; justify-content: center; align-items: center; gap: 8px; margin-bottom: 6px; }\n.footer-ll { font-size: 13px; font-weight: 700; color: white; }\n.footer-sep { font-size: 11px; color: #555; }\n.footer-ceapi { font-size: 13px; font-weight: 700; color: white; }\n.footer-sub { font-size: 11px; color: #aaa; }\n\n@keyframes spin { to { transform: rotate(360deg); } }\n.spinner { display: inline-block; width: 12px; height: 12px; border: 2px solid #eee; border-top-color: #111; border-radius: 50%; animation: spin 0.7s linear infinite; vertical-align: middle; margin-right: 4px; }\n\n<\/style>\n<\/head>\n<body>\n\n<div class=\"header\">\n  <div class=\"header-title\">Latin Leap \u00d7 CEAPI Next Gen<\/div>\n  <div class=\"header-sub\">\u00bfQu\u00e9 tan visible eres p\u00fablicamente? \u00b7 Congreso CEAPI Next Gen CDMX 2026<\/div>\n<\/div>\n\n<div class=\"container\">\n\n  <!-- Score Card -->\n  <div class=\"score-card\">\n    <div class=\"score-row\">\n      <div>\n        <div class=\"score-main\" id=\"score-display\">6.4<\/div>\n        <div class=\"score-denom\">\/ 10<\/div>\n      <\/div>\n      <div class=\"score-right\">\n        <div class=\"level-badge level-avg\" id=\"level-badge\">AVERAGE<\/div>\n        <div id=\"score-sub-text\" class=\"score-sub\">base evaluado por la IA<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"bar-wrap\"><div class=\"bar-fill\" id=\"main-bar\" style=\"width:52%\"><\/div><\/div>\n    <div class=\"bar-labels\"><span>0<\/span><span>5<\/span><span>10<\/span><\/div>\n  <\/div>\n\n  <div class=\"formula-note\">\n    <strong>F\u00f3rmula:<\/strong> red heredada \u00d7 0.8 + agencia propia \u00d7 1.2<br>\n    La agencia propia pesa m\u00e1s \u2014 es el factor que t\u00fa controlas.\n  <\/div>\n\n  <!-- Sliders -->\n  <div class=\"section-label\">Paso 1 \u2014 Tu score base<\/div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <div>\n        <div class=\"card-label\">Red heredada<\/div>\n        <div class=\"card-desc\">Apellido, familia empresaria, instituci\u00f3n de origen<\/div>\n      <\/div>\n      <div class=\"card-score\" id=\"red-val\">2 \/ 5<\/div>\n    <\/div>\n    <input type=\"range\" min=\"1\" max=\"5\" value=\"2\" step=\"1\" id=\"red-slider\" oninput=\"onSlider()\">\n    <div class=\"slider-labels\"><span>1<\/span><span>2<\/span><span>3<\/span><span>4<\/span><span>5<\/span><\/div>\n  <\/div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <div>\n        <div class=\"card-label\">Agencia propia<\/div>\n        <div class=\"card-desc\">Lo que has construido t\u00fa independientemente<\/div>\n      <\/div>\n      <div class=\"card-score\" id=\"agency-val\">4 \/ 5<\/div>\n    <\/div>\n    <input type=\"range\" min=\"1\" max=\"5\" value=\"4\" step=\"1\" id=\"agency-slider\" oninput=\"onSlider()\">\n    <div class=\"slider-labels\"><span>1<\/span><span>2<\/span><span>3<\/span><span>4<\/span><span>5<\/span><\/div>\n  <\/div>\n\n  <div class=\"step-hint\">Ajusta los valores para que coincidan con los de tu mensaje de Stefan.<\/div>\n\n  <hr class=\"divider\">\n\n  <!-- Add Sources -->\n  <div class=\"section-label\">Paso 2 \u2014 Agrega fuentes \u00b7 la IA las verifica<\/div>\n\n  <div id=\"extra-list\"><\/div>\n\n  <div class=\"add-card\">\n    <div class=\"add-card-title\">Agregar una fuente p\u00fablica<\/div>\n    <div class=\"add-card-desc\">\n      Pega el link directo de tu fuente \u2014 Instagram, LinkedIn, art\u00edculo de prensa, podcast, web personal&#8230;<br>\n      <strong style=\"color:#111\">La IA busca y verifica la fuente en tiempo real.<\/strong> No se aceptan n\u00fameros inventados.\n    <\/div>\n    <div class=\"input-wrap\">\n      <input type=\"url\" id=\"source-input\" placeholder=\"https:\/\/instagram.com\/tuhandle\" maxlength=\"200\" autocomplete=\"off\">\n      <button class=\"eval-btn\" id=\"eval-btn\" onclick=\"evaluateSource()\">Verificar<\/button>\n    <\/div>\n    <div class=\"eval-status\" id=\"eval-status\"><\/div>\n    <div class=\"verify-steps\" id=\"verify-steps\">\n      <div class=\"verify-step\" id=\"step-1\">\n        <span class=\"verify-icon loading\" id=\"step-1-icon\">\u25cb<\/span>\n        <span id=\"step-1-text\">Verificando que el link existe y es p\u00fablico&#8230;<\/span>\n      <\/div>\n      <div class=\"verify-step\" id=\"step-2\" style=\"display:none\">\n        <span class=\"verify-icon loading\" id=\"step-2-icon\">\u25cb<\/span>\n        <span id=\"step-2-text\">Buscando datos p\u00fablicos indexados&#8230;<\/span>\n      <\/div>\n      <div class=\"verify-step\" id=\"step-3\" style=\"display:none\">\n        <span class=\"verify-icon loading\" id=\"step-3-icon\">\u25cb<\/span>\n        <span id=\"step-3-text\">Calculando impacto en score&#8230;<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n  <div class=\"cap-note\" id=\"cap-note\"><\/div>\n\n  <!-- Peer Bar -->\n  <div class=\"peer-section\">\n    <div class=\"peer-title\">Tu posici\u00f3n en el grupo<\/div>\n    <div class=\"peer-sub\">Comparado con los 23 participantes \u00b7 media del grupo: 6.4<\/div>\n    <div style=\"display:flex;justify-content:space-between;font-size:12px;color:#666;margin-bottom:4px;\">\n      <span>2.8 m\u00edn<\/span>\n      <span id=\"peer-pos\" style=\"font-weight:600;color:#111\">6.4<\/span>\n      <span>8.8 m\u00e1x<\/span>\n    <\/div>\n    <div class=\"peer-bar-wrap\"><div class=\"peer-bar-fill\" id=\"peer-bar\" style=\"width:52%\"><\/div><\/div>\n    <div class=\"peer-labels\"><span>LOW<\/span><span>AVERAGE<\/span><span>HIGH \u22657.6<\/span><\/div>\n  <\/div>\n\n  <div class=\"footer\">\n    <div class=\"footer-logos\">\n      <span class=\"footer-ll\">Latin Leap<\/span>\n      <span class=\"footer-sep\">\u00d7<\/span>\n      <span class=\"footer-ceapi\">CEAPI<\/span>\n    <\/div>\n    <div class=\"footer-sub\">Congreso CEAPI Next Gen \u00b7 CDMX 2026<\/div>\n  <\/div>\n\n<\/div>\n\n<script>\nconst GROUP_MIN = 2.8, GROUP_MAX = 8.8, BONUS_CAP = 2.0;\nlet extraBonus = 0, extraItems = [], apiKey = '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';\n\nfunction baseScore() {\n  const r = parseInt(document.getElementById('red-slider').value);\n  const a = parseInt(document.getElementById('agency-slider').value);\n  return (r * 8 + a * 12) \/ 10;\n}\n\nfunction totalScore() {\n  return Math.min(10, Math.round((baseScore() + extraBonus) * 10) \/ 10);\n}\n\nfunction levelInfo(s) {\n  if (s >= 7.6) return { label: 'HIGH', cls: 'level-high' };\n  if (s >= 5.6) return { label: 'AVERAGE', cls: 'level-avg' };\n  return { label: 'LOW', cls: 'level-low' };\n}\n\nfunction updateUI() {\n  const r = parseInt(document.getElementById('red-slider').value);\n  const a = parseInt(document.getElementById('agency-slider').value);\n  document.getElementById('red-val').textContent = r + ' \/ 5';\n  document.getElementById('agency-val').textContent = a + ' \/ 5';\n  const score = totalScore();\n  document.getElementById('score-display').textContent = score.toFixed(1);\n  const diff = Math.round((score - baseScore()) * 10) \/ 10;\n  const sub = document.getElementById('score-sub-text');\n  sub.className = diff > 0 ? 'score-change' : 'score-sub';\n  sub.textContent = diff > 0 ? '+' + diff.toFixed(1) + ' por fuentes verificadas' : 'base evaluado por la IA';\n  const lv = levelInfo(score);\n  const badge = document.getElementById('level-badge');\n  badge.textContent = lv.label;\n  badge.className = 'level-badge ' + lv.cls;\n  document.getElementById('main-bar').style.width = Math.max(2, Math.min(98, score \/ 10 * 100)) + '%';\n  const pct = Math.max(2, Math.min(98, (score - GROUP_MIN) \/ (GROUP_MAX - GROUP_MIN) * 100));\n  document.getElementById('peer-bar').style.width = pct + '%';\n  document.getElementById('peer-pos').textContent = score.toFixed(1);\n  const remaining = Math.max(0, Math.round((BONUS_CAP - extraBonus) * 10) \/ 10);\n  const capNote = document.getElementById('cap-note');\n  capNote.textContent = extraBonus > 0\n    ? (remaining > 0 ? `Puedes agregar hasta +${remaining.toFixed(1)} puntos m\u00e1s.` : 'Has alcanzado el m\u00e1ximo de puntos adicionales (+2.0).')\n    : '';\n}\n\nfunction onSlider() { updateUI(); }\n\nfunction setStep(n, status, text) {\n  const icon = document.getElementById(`step-${n}-icon`);\n  const textEl = document.getElementById(`step-${n}-text`);\n  const stepEl = document.getElementById(`step-${n}`);\n  stepEl.style.display = 'flex';\n  if (text) textEl.textContent = text;\n  icon.className = `verify-icon ${status}`;\n  icon.textContent = status === 'done' ? '\u2713' : status === 'fail' ? '\u2717' : status === 'loading' ? '\u25cb' : '\u25cb';\n}\n\nasync function evaluateSource() {\n  if (!apiKey) {\n    document.getElementById('eval-status').innerHTML = '<span style=\"color:#C0392B\">Conecta tu API key primero.<\/span>';\n    return;\n  }\n  if (extraBonus >= BONUS_CAP) {\n    document.getElementById('eval-status').textContent = 'Has alcanzado el m\u00e1ximo de puntos adicionales (+2.0).';\n    return;\n  }\n\n  const input = document.getElementById('source-input');\n  const url = input.value.trim();\n  if (!url) return;\n\n  \/\/ Basic URL validation\n  const isUrl = url.startsWith('http:\/\/') || url.startsWith('https:\/\/') || url.includes('.com\/') || url.includes('.vc\/');\n  if (!isUrl) {\n    document.getElementById('eval-status').innerHTML = '<span style=\"color:#C0392B\">Por favor pega un link completo, ej: https:\/\/instagram.com\/tuhandle<\/span>';\n    return;\n  }\n\n  const btn = document.getElementById('eval-btn');\n  const status = document.getElementById('eval-status');\n  const stepsEl = document.getElementById('verify-steps');\n  btn.disabled = true;\n  btn.textContent = 'Verificando...';\n  status.textContent = '';\n  stepsEl.style.display = 'block';\n\n  \/\/ Reset steps\n  setStep(1, 'loading', 'Verificando que el link existe y es p\u00fablico...');\n  document.getElementById('step-2').style.display = 'none';\n  document.getElementById('step-3').style.display = 'none';\n\n  const remaining = Math.round((BONUS_CAP - extraBonus) * 10) \/ 10;\n  const r = document.getElementById('red-slider').value;\n  const a = document.getElementById('agency-slider').value;\n\n  \/\/ Detect platform from URL\n  const isInstagram = url.includes('instagram.com');\n  const isLinkedIn = url.includes('linkedin.com');\n  const isTikTok = url.includes('tiktok.com');\n  const platform = isInstagram ? 'Instagram' : isLinkedIn ? 'LinkedIn' : isTikTok ? 'TikTok' : 'web';\n\n  const prompt = `Eval\u00faa esta fuente p\u00fablica. Usa web search para buscarla.\n\nURL: ${url} | Plataforma: ${platform}\nScore base: ${baseScore()}\/10 (red ${r}\/5, agencia ${a}\/5) | Bonus disponible: +${remaining} pts\n\nBusca el URL en Google. Devuelve SOLO JSON v\u00e1lido:\n{\"source_name\":\"nombre 35 chars\",\"exists\":true\/false,\"is_public\":true\/false,\"verified_data\":\"datos reales encontrados o sin datos\",\"score_awarded\":n\u00famero,\"reasoning\":\"1 frase espa\u00f1ol basada en evidencia\",\"verification_status\":\"verified\" o \"unverified\" o \"private\" o \"not_found\"}\n\nReglas score_awarded: privado\/no existe=0.1 | <1k seguidores=0.1-0.2 | 1k-10k=0.2-0.4 | 10k-100k=0.4-0.7 | 100k-1M=0.7-1.0 | >1M o prensa intl=1.0-${Math.min(1.5,remaining)} | sin evidencia real=0.1 m\u00e1ximo. No inventes datos.`\n\n  try {\n    await new Promise(r => setTimeout(r, 800));\n    setStep(1, 'done', 'Link recibido \u2014 iniciando b\u00fasqueda p\u00fablica...');\n    setStep(2, 'loading', `Buscando datos p\u00fablicos de ${platform}...`);\n\n    const res = await fetch('https:\/\/api.anthropic.com\/v1\/messages', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/json',\n        'x-api-key': apiKey,\n        'anthropic-version': '2023-06-01',\n        'anthropic-dangerous-direct-browser-access': 'true'\n      },\n      body: JSON.stringify({\n        model: 'claude-sonnet-4-5',\n        max_tokens: 1000,\n        tools: [{ type: 'web_search_20250305', name: 'web_search' }],\n        messages: [{ role: 'user', content: prompt }]\n      })\n    });\n\n    const data = await res.json();\n    if (!res.ok) throw new Error(data.error?.message || `API error ${res.status}`);\n\n    await new Promise(r => setTimeout(r, 400));\n    setStep(2, 'done', 'B\u00fasqueda completada.');\n    setStep(3, 'loading', 'Calculando impacto en score...');\n\n    \/\/ Extract text response - may include tool use blocks\n    let textContent = '';\n    if (data.content) {\n      for (const block of data.content) {\n        if (block.type === 'text') textContent += block.text;\n      }\n    }\n\n    \/\/ If web_search was used, there might be a follow-up needed\n    \/\/ Check if response contains JSON\n    let parsed;\n    try {\n      const jsonMatch = textContent.match(\/\\{[\\s\\S]*\\}\/);\n      if (jsonMatch) {\n        parsed = JSON.parse(jsonMatch[0]);\n      } else {\n        throw new Error('No JSON in response');\n      }\n    } catch(e) {\n      \/\/ If no JSON yet (tool use happened), make a follow-up call\n      if (data.stop_reason === 'tool_use' || !textContent.includes('{')) {\n        const followUp = await fetch('https:\/\/api.anthropic.com\/v1\/messages', {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application\/json',\n            'x-api-key': apiKey,\n            'anthropic-version': '2023-06-01',\n            'anthropic-dangerous-direct-browser-access': 'true'\n          },\n          body: JSON.stringify({\n            model: 'claude-sonnet-4-5',\n            max_tokens: 500,\n            messages: [\n              { role: 'user', content: prompt },\n              { role: 'assistant', content: data.content },\n              { role: 'user', content: 'Ahora devuelve el JSON final de evaluaci\u00f3n bas\u00e1ndote en lo que encontraste.' }\n            ]\n          })\n        });\n        const followData = await followUp.json();\n        const followText = followData.content?.find(b => b.type === 'text')?.text || '';\n        const jsonMatch2 = followText.match(\/\\{[\\s\\S]*\\}\/);\n        if (jsonMatch2) parsed = JSON.parse(jsonMatch2[0]);\n      }\n    }\n\n    if (!parsed) throw new Error('No se pudo obtener evaluaci\u00f3n');\n\n    const bonus = Math.min(remaining, Math.max(0.1, Math.round(parseFloat(parsed.score_awarded) * 10) \/ 10));\n    extraBonus = Math.round((extraBonus + bonus) * 10) \/ 10;\n\n    setStep(3, 'done', `Score calculado: +${bonus.toFixed(1)} puntos`);\n\n    const item = {\n      id: Date.now(),\n      name: parsed.source_name || url,\n      bonus,\n      reasoning: parsed.reasoning,\n      verified_data: parsed.verified_data,\n      status: parsed.verification_status || 'unverified',\n      is_public: parsed.is_public\n    };\n    extraItems.push(item);\n    renderItem(item);\n    updateUI();\n    input.value = '';\n\n    setTimeout(() => {\n      stepsEl.style.display = 'none';\n      status.textContent = '';\n    }, 3000);\n\n  } catch(e) {\n    setStep(1, 'fail');\n    setStep(2, 'fail', 'Error en la verificaci\u00f3n.');\n    status.innerHTML = `<span style=\"color:#C0392B\">${e.message.includes('web_search') ? 'Web search no disponible con esta API key. Contacta a Stefan.' : 'Error: ' + e.message}<\/span>`;\n  }\n\n  btn.disabled = false;\n  btn.textContent = 'Verificar';\n}\n\nfunction renderItem(item) {\n  const statusClass = item.status === 'verified' ? 'verified' : item.status === 'private' || item.status === 'not_found' ? 'failed' : 'unverified';\n  const badgeClass = item.status === 'verified' ? 'badge-verified' : item.status === 'private' || item.status === 'not_found' ? 'badge-failed' : 'badge-unverified';\n  const tagClass = item.status === 'verified' ? 'tag-verified' : item.status === 'private' ? 'tag-private' : 'tag-unverified';\n  const tagText = { verified: '\u2713 Verificado p\u00fablicamente', unverified: '\u26a0 Sin datos verificables', private: '\ud83d\udd12 Perfil privado', not_found: '\u2717 No encontrado' }[item.status] || '\u25cb Evaluado';\n\n  const div = document.createElement('div');\n  div.className = `extra-card ${statusClass}`;\n  div.id = 'item-' + item.id;\n  div.innerHTML = `\n    <div class=\"extra-header\">\n      <div>\n        <div class=\"extra-name\">${item.name}<\/div>\n        <span class=\"verification-tag ${tagClass}\">${tagText}<\/span>\n      <\/div>\n      <div class=\"extra-right\">\n        <span class=\"extra-badge ${badgeClass}\">+${item.bonus.toFixed(1)}<\/span>\n        <button class=\"extra-remove\" onclick=\"removeItem(${item.id},${item.bonus})\">\u00d7<\/button>\n      <\/div>\n    <\/div>\n    <div class=\"extra-reasoning\">${item.reasoning}<\/div>\n    ${item.verified_data && item.verified_data !== 'sin datos verificables' ? `<div class=\"extra-source\">Fuente: ${item.verified_data}<\/div>` : ''}\n    <div class=\"extra-impact\">+${item.bonus.toFixed(1)} puntos al score<\/div>\n  `;\n  document.getElementById('extra-list').appendChild(div);\n}\n\nfunction removeItem(id, bonus) {\n  extraBonus = Math.max(0, Math.round((extraBonus - bonus) * 10) \/ 10);\n  extraItems = extraItems.filter(i => i.id !== id);\n  const el = document.getElementById('item-' + id);\n  if (el) el.remove();\n  updateUI();\n}\n\ndocument.getElementById('source-input').addEventListener('keydown', e => {\n  if (e.key === 'Enter') evaluateSource();\n});\n\nupdateUI();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Latin Leap \u00d7 CEAPI Next Gen \u2014 Mi Score de Visibilidad P\u00fablica Latin Leap \u00d7 CEAPI Next Gen \u00bfQu\u00e9 tan visible eres p\u00fablicamente? \u00b7 Congreso CEAPI Next Gen CDMX 2026 6.4 \/ 10 AVERAGE base evaluado por la IA 0510 F\u00f3rmula: red heredada \u00d7 0.8 + agencia propia \u00d7 1.2 La agencia propia pesa m\u00e1s [&#8230;]\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-blank-landingpage.php","meta":{"footnotes":""},"class_list":["post-4828","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/pages\/4828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/comments?post=4828"}],"version-history":[{"count":6,"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/pages\/4828\/revisions"}],"predecessor-version":[{"id":4838,"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/pages\/4828\/revisions\/4838"}],"wp:attachment":[{"href":"https:\/\/latinleap.vc\/zh\/wp-json\/wp\/v2\/media?parent=4828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}