GET /v1/async/task/:id o indica webhook.url al enviar; la tarea informa taskType: "CITATION_ANALYSIS".
No envíes este análisis a través de POST /v1/async/task; usa el endpoint dedicado. Los endpoints antiguos
POST /v1/geo-audit, POST /v1/source-influence y POST /v1/research, los tipos de tarea GEO_AUDIT, SOURCE_INFLUENCE y CITATION_ATTRIBUTION e
include.geoAudit, include.sourceInfluence siguen funcionando; las respuestas usan siempre los nombres nuevos.
Analizar una tarea que ya ejecutaste
Si la respuesta vino de esta API, envía su id de tarea en lugar de copiar la respuesta y las citas del resultado:COMPLETED y seguir siendo legible mediante GET /v1/async/task/:id. Su Markdown de
respuesta (el texto si el motor no devolvió Markdown) pasa a ser answer, y sus URL citadas pasan a ser citations en
el orden del motor: las 100 primeras, con un máximo de 10 hilos de discusión. Se omiten los marcadores de tarjetas de
producto y vídeo (enlaces de googleusercontent.com) y los enlaces de búsqueda de Google, porque no tienen página que
leer. Se usan el prompt, el country y el motor de la tarea salvo que los envíes. Enviar taskId junto con answer
o citations se rechaza con 400, igual que una tarea sin terminar o sin texto de respuesta ni URL citada. Un id de
tarea desconocido o caducado devuelve 404.
Analiza cada respuesta mientras la recopilas
Añadeinclude.citationAnalysis: true a una solicitud de recopilación y el análisis se ejecuta sobre la
respuesta en cuanto se recopila. Funciona con los motores de respuesta (CHATGPT, GEMINI, PERPLEXITY, GOOGLE_AIO, GOOGLE_AIMODE, NAVER_AI_BRIEF, NAVER_AI_TAB, BING_SEARCH, BING_COPILOT), en tareas individuales,
lotes de tareas, cuadrículas y POST /v1/batches.
taskId más arriba. El resultado de la respuesta
incluye entonces response.citationAnalysis: la tarea de análisis tal como la devuelve
GET /v1/async/task/:id, con task, credits y response o error.
- Webhook: se envía una sola vez, cuando termina el análisis, con la respuesta y el análisis juntos.
- Consulta periódica: la tarea de respuesta pasa a
COMPLETEDen cuanto la respuesta está lista. Sigue consultando hasta queresponse.citationAnalysis.task.statusseaCOMPLETEDoFAILED. - Los lotes se completan cuando todas las respuestas y sus análisis han terminado.
- Sin análisis: si la respuesta no cita ninguna URL que leer, o tus créditos o el límite diario de la clave no cubren la reserva del análisis,
response.citationAnalysises{ "error": "…" }y la respuesta se entrega de inmediato. - Facturación: el análisis se cobra aparte, por uso, como cualquier tarea de Citation Analysis. El cobro de la respuesta no cambia. Una clave limitada a ciertos tipos de tarea también debe permitir
CITATION_ANALYSIS.
Payload
Con
taskId o include.citationAnalysis, estos campos se rellenan a partir de los datos brutos de la respuesta. Para
CHATGPT, las búsquedas del motor pasan a ser queries y cada página que recuperó pasa a ser una cita con cited,
position, citedText, publishedAt y query; la misma URL con distintos parámetros de seguimiento se fusiona. Para
Google AI Overview, las fuentes del resumen son citadas y los resultados orgánicos fuera de ellas son no citados, con
position igual a su posición orgánica. Los demás motores solo aportan fuentes citadas.
Resultado
Los resultados guardados antes de v4 conservan su forma anterior, sin campoversion.
version
Siempre 4 para esta forma.
answer
La respuesta que enviaste, sin cambios. answerRanges son offsets en exactamente esta cadena: unidades de código
UTF-16 de JavaScript, start inclusivo y end exclusivo. Recórtala tal cual, con answer.slice(start, end), en lugar
de volver a dividir el texto. Cada rango de links[] identifica una unidad semántica completa de tu respuesta: una
frase, un elemento de lista o una celda de tabla. Cada rango de brands[] es el nombre exacto tal como está escrito.
Los límites se refieren al texto original.
queries[]
Las búsquedas que ejecutó el motor para esta respuesta. Cada una tiene un id, su text y sourceIds: las fuentes
que encontró esa búsqueda. Vacío si el motor no expuso búsquedas y no enviaste ninguna.
sources[]: una entrada por página
id: identificador opaco, único dentro del resultado.url: la URL de la página;domain: su host.channel: quién controla la página, deducido de su host:own: el sitio propio de tu marca (exactamente cuandoownestrue).brand: el sitio propio de otra marca que nombra el resultado.editorial: un editor; solo el editor puede cambiar la página. Los hosts no reconocidos se informan comoeditorial.retailer: una tienda online o un marketplace.review_platform: un sitio de reseñas de clientes o de empresas.community: un foro o un sitio de preguntas y respuestas.video: una plataforma de vídeo.social: una red social.blog_platform: un servicio de blogs alojados.reference: una enciclopedia o wiki; nunca es objetivo de una acción.
cited:truesi la respuesta cita la página,falsesi el motor solo la recuperó.position: la posición que el propio motor dio a la página, onullsi no dio ninguna.queryIds[]: las búsquedas que encontraron la página.publishedAt: la fecha de publicación tal como la indicó el motor, onull.citedText[]: pasajes que el propio motor indicó haber citado;[]si no hay ninguno.brandIds[]: marcas nombradas en la página legible, su título ocitedText.own:truesi la página está en el sitio propio de tu marca.paragraphs[]: los párrafos de una página citada incluidos en el resultado. Cada uno tiene unid(único en todo el resultado) y eltextdel párrafo. Un párrafo puede incluirse sin ningún vínculo. Siempre vacío en páginas no citadas.error: solo aparece si la página no se pudo leer. En ese casoparagraphsestá vacío y la cadena es un motivo breve para esa fuente.
brands[]
Todas las marcas que sigue el resultado: tu brand (role: "target"), tus competitors ("competitor") y otras
marcas que nombra la respuesta ("answer").
rank: el orden en que el nombre de la marca aparece por primera vez en la respuesta, empezando por 1;nullsi la respuesta no nombra la marca.answerRanges[]: los tramos exactos donde la respuesta nombra la marca o uno de sus nombres de producto, en los mismos offsets UTF-16;answer.slice(start, end)devuelve el nombre tal como está escrito. La búsqueda no distingue mayúsculas y toma palabras completas (salvo en escrituras sin espacios); incluye títulos y celdas de tabla, nunca URL de enlaces ni marcado de imágenes. A diferencia de los rangos delinks[], no son unidades completas de la respuesta.citedSourceIds[]: fuentes citadas cuya página la nombra.retrievedSourceIds[]: fuentes no citadas cuya página la nombra.ownSourceIds[]: fuentes en el sitio propio de la marca; solo se rellena para la marca objetivo.
links[]: una relación por párrafo
paragraphId: el párrafo al que se refiere el vínculo. Siempre apunta a un párrafo que existe ensources[].answerRanges[]: las partes de la respuesta con las que se corresponde este párrafo, como paresstart/enden los mismos offsets UTF-16. Un vínculo puede tener varios rangos; el mismo texto de respuesta no se repite entre ellos. Cada rango es una unidad completa de la respuesta (frase, elemento de lista o celda de tabla).explanation: una frase breve que describe la correspondencia: qué afirma el párrafo sobre esa parte de la respuesta.
visibility
Dónde se sitúa tu marca en esta respuesta; null si no se envió brand.
brandId: tu marca enbrands[].stage: uno de:mentioned: la respuesta nombra tu marca.on_cited_page: la respuesta no la nombra, pero sí una página citada.on_retrieved_page: solo la nombran páginas que el motor recuperó sin citar.not_found: ninguna página leída la nombra.
rank: elrankde tu marca enbrands[].answerBrands: cuántas marcas nombra la respuesta.
actions[]
Próximos pasos priorizados para tu marca; [] si no se envió brand. priority empieza en 1 (hacer primero) y no
tiene huecos. Las acciones se ordenan por control: primero lo que controla tu marca (owned), luego las plataformas
donde puede publicar (platform) y después el contacto con terceros (outreach). summary es una frase y steps[]
contiene de uno a cinco pasos concretos, ambos en el idioma de la respuesta. sourceIds, brandIds, queryIds y
linkIds apuntan a la evidencia de este resultado.
brandIds nombra tu marca, o las marcas rivales que nombran esas páginas. Las acciones nunca sugieren reseñas falsas
u ocultas, hacerse pasar por un reseñador independiente, comprar enlaces ni editar páginas que tu marca no posee. Las
páginas de terceros que nombran tu marca sin ser citadas aparecen en brands[].retrievedSourceIds, no como acciones.
insights[]
Hasta cuatro resúmenes cortos de lo que suman las páginas: qué canales se citaron, el formato, la actualidad o los
criterios que comparten las páginas citadas, cómo se compara el orden de marcas de la respuesta con lo que cubren las
páginas citadas y dónde se sitúa tu marca. sourceIds nombra las páginas y linkIds los vínculos en que se basa cada
resumen; al menos uno de los dos no está vacío, y solo nombran entradas de este resultado. Los insights describen
correspondencias; no son consejos.
Cómo leer bien el resultado
- La ausencia de vínculo no es un veredicto. Un párrafo sin vínculo simplemente no coincidió con un rango de la respuesta, y una parte de la respuesta sin rango significa que ningún párrafo se vinculó a ella. Ninguna de las dos cosas dice que la página sea irrelevante, no se usara o no sea fiable.
- Una página no leída sigue siendo incierta. Si
sources[].errorestá presente, esa cita quedó fuera del análisis; no trates su falta de vínculos como un hallazgo negativo. Reinténtala o aporta subodysi importa. - Correspondencia, no causalidad. El resultado describe cómo encajan a posteriori una respuesta existente y el texto de una página existente, y qué marcas nombran esas páginas. No mide influencia en la generación, no puntúa la página ni informa de cómo se produjo la respuesta.
not_foundsignifica que no está en ninguna página leída. No significa que tu marca esté ausente de la web.- Los datos de recuperación dependen del motor. Las páginas no citadas solo aparecen cuando el motor las expone
(ChatGPT, Google AI Overview) o cuando envías páginas con
cited: false. Si no, todas las fuentes son citadas y tu propia página solo puede aparecer como citada. - Los canales se deducen del host.
channelse infiere del host de la página, no de leer quién la escribió. - Las acciones son sugerencias, no garantías. Se priorizan a partir de las páginas listadas en este resultado; aplicar una no asegura que la respuesta cambie.
- Los ids son internos. No guardes los identificadores
s…/q…/b…/l…/a…como claves estables entre ejecuciones; solo valen dentro de un resultado.
Ejecución y límites
- El tamaño no es un motivo de fallo. Todo lo que acepta el contrato de la solicitud, una
answerde hasta 200.000 caracteres con hasta 100 citas, se analiza. Las respuestas largas, los conjuntos grandes de fuentes y las páginas muy largas se gestionan dividiendo el trabajo, no rechazando la tarea. - La profundidad depende de la respuesta, no de la página. Una página larga no produce más vínculos de los que la respuesta puede sostener: el análisis se concentra en los pasajes con más probabilidad de corresponderse con la respuesta, y cada fuente que muestra una correspondencia aparece representada. En una página grande, o que repite la misma afirmación en navegación, listados y reseñas, espera los pasajes más sólidos y no cada aparición.
- El marcado no es evidencia. Los mapas del sitio, los índices de enlaces y las galerías de imágenes no aportan vínculos; una página formada solo por ellos se informa sin párrafos en lugar de con correspondencias inventadas.
- Una fuente que no se pudo leer se informa en
sources[].errorsin hacer fallar la tarea si otra fuente es legible. La tarea falla cuando no se pudo leer ninguna fuente, ante un fallo del análisis, un timeout o un error de configuración del servicio. - Las solicitudes se miden por uso, como el resto de la API. La respuesta de envío muestra la retención temporal de créditos; el cargo final se liquida cuando la tarea llega a un estado final.