Gráficos
Pide con tus palabras y recibe una tarjeta de gráfico terminada, con el gráfico justo, las cifras clave, un título que cuenta el hallazgo y la fuente de cada valor.
POST /v1/charts convierte una pregunta con tus palabras en una tarjeta de gráfico que ya tomó las
decisiones de visualización de datos: qué gráfico, qué medir, cómo agregarlo (totales, cuotas, agrupado por
semana, media móvil, índice base 100), las cifras clave arriba, un título que cuenta el hallazgo («El dólar
blue subió 4,1 % en la semana»), anotaciones y la fuente de cada valor. También puedes enviar tus propios
datos y recibir la misma tarjeta.
- El gráfico que lo cuenta. Uno de 12 tipos, elegido para los datos. Si fuerzas otro, se respeta mientras los datos lo permitan.
- Cifras que puedes comprobar. Una cifra (un precio, una tasa, una encuesta) se encuentra tal cual en lo publicado y viene con las notas de donde salió. Nunca se inventa.
- Lista para publicar. Un iframe que se adapta a su ancho, una PNG al doble de resolución y un SVG, en cuatro temas, públicos por id. Desde la API, el servidor MCP o el playground del panel.
- Rápida. Una tarjeta se dibuja en menos de un milisegundo de nuestro lado. Los gráficos de cobertura vuelven en alrededor de un segundo; los de cifras, en 2 a 5 segundos.
Desde una consulta
curl https://api.typesearch.ai/v1/charts \
-H "Authorization: Bearer $TYPESEARCH_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept-Language: es" \
-d '{ "query": "dólar blue esta semana" }'Responde 201 con la tarjeta:
{
"id": "chart_8k2m9q4x7w1p3n5z",
"object": "chart",
"type": "line",
"theme": "light",
"locale": "es",
"chart": {
"type": "line",
"title": "El dólar blue subió 4,1 % en la semana",
"subtitle": "Cotización de venta, en pesos · 19–25 sep",
"x": { "kind": "time", "granularity": "day" },
"y": { "format": "currency", "currency": "ARS", "label": "Venta" },
"series": [
{
"name": "Venta",
"points": [
{ "x": "2026-09-19", "y": 1215, "sources": [2] },
{ "x": "2026-09-24", "y": 1250, "sources": [1] },
{ "x": "2026-09-25", "y": 1265, "sources": [0, 1] }
]
}
],
"kpis": [
{ "label": "Último", "value": 1265, "change": { "value": 4.1, "percent": true } },
{ "label": "Máximo", "value": 1265 },
{ "label": "Mínimo", "value": 1215 }
]
},
"compatible_types": ["line", "area", "bar", "kpi", "table"],
"plan": {
"recipe": "figure_trend",
"type": "line",
"confidence": 1,
"alternatives": [
{ "type": "area", "probability": 0.3 },
{ "type": "bar", "probability": 0.22 },
{ "type": "kpi", "probability": 0.14 }
],
"topic": "el dólar blue",
"needs": { "queries": ["dólar blue esta semana"], "mode": "fast", "days": 7, "min_points": 3, "max_results": 50 }
},
"sources": [
{
"url": "https://diario.example/economia/dolar-blue-hoy",
"title": "El dólar blue cerró a 1.265 pesos",
"source": "Diario Ejemplo",
"published_at": "2026-09-25T18:10:00Z"
},
{
"url": "https://noticias.example/mercados/cotizacion",
"title": "Cotización del dólar: el blue tocó su máximo del mes",
"source": "Noticias Ejemplo",
"published_at": "2026-09-24T17:02:00Z"
},
{
"url": "https://cronica.example/economia/blue-arranca-la-semana",
"title": "El blue arranca la semana en 1.215 pesos",
"source": "La Crónica Demo",
"published_at": "2026-09-19T15:40:00Z"
}
],
"embed_url": "https://api.typesearch.ai/embed/chart_8k2m9q4x7w1p3n5z",
"image_url": "https://api.typesearch.ai/embed/chart_8k2m9q4x7w1p3n5z.png",
"svg_url": "https://api.typesearch.ai/embed/chart_8k2m9q4x7w1p3n5z.svg",
"svg": null,
"created_at": "2026-09-26T14:02:11.482Z",
"expires_at": "2026-12-25T14:02:11.482Z",
"cached": false,
"usage": { "cost_usd": 0.0019, "mode": "fast", "queries": 1, "duration_ms": 2840 },
"warnings": []
}chart: lo que se dibuja. Las series, las cifras clave de arriba (kpis), las anotaciones, el formato de cada eje y untitleque cuenta el hallazgo (salvo que envíes tu propiotitle).plan: qué se midió (recipe), el gráfico que eligió yalternatives: otros tipos que sirven, a los que puedes cambiar gratis conPATCH.compatible_types: todos los tipos que admiten estos datos.sourcesy lossourcesde cada punto: las notas detrás del gráfico, y los índices ensourcesdonde se publicó cada valor.embed_url,image_urlysvg_url: públicos por id, sin key. Mira Insertar en tu sitio y PNG y SVG.usage.cost_usd: lo que se cobró el pedido. Mira Precios.
Todo lo que conoces de la búsqueda también acota un gráfico: days, published_after, published_before,
countries, languages, include_domains, exclude_domains y timezone. Si la consulta no nombra con «vs»
lo que se compara, pásalo en compare (de 2 a 5).
Qué puedes pedir
El plan lee tu consulta y elige una receta: qué medir, el gráfico que lo cuenta, los días que mira y el modo
más barato que consigue los datos (mode: "auto", el valor por defecto).
recipe | Pide | Qué mide | Gráfico | Días | Modo |
|---|---|---|---|---|---|
coverage | «cobertura del Presupuesto» | Las notas que mencionan el tema, por día, en todo el período. Un pico claro se marca con el titular de ese día. | area | 30 | ultra |
coverage_compare | «evolución de la cobertura de Milei vs Bullrich» | El mismo conteo para 2 a 5 nombres, una línea cada uno. | line | 21 | ultra |
share_of_voice | «cobertura de Milei vs Bullrich vs Kicillof» | La cuota de notas de cada nombre. | donut | 30 | ultra |
tone | «tono de la cobertura del FMI» | Notas positivas, neutrales y negativas, respecto de tu consulta. | donut | 14 | fast |
tone_compare | «tono de la cobertura de Milei vs Bullrich» | El mismo reparto, para cada nombre. | stacked_bar | 30 | fast |
outlets | «qué medios publican sobre el litio» | Notas por medio. | bar_horizontal | 30 | ultra |
timeline | «cronología del caso de la represa» | Los hitos de una historia: el día con más notas de cada semana, y la noticia que más medios contaron ese día. | timeline | 60 | fast |
figure_trend | «dólar blue esta semana» | Una cifra que publican las notas (un precio, una tasa, una encuesta), día por día. | line, o kpi para «hoy» | 7 | fast |
figure_compare | «inflación» con compare: ["Chile", "Perú"] | El último valor publicado de una cifra, para cada nombre. | bar | 14 | fast |
answers | Cualquier consulta, más una pregunta tipada en questions | Cómo se reparten las respuestas entre las notas. | donut | 7 | fast |
index_prices | «precios» con index | El precio de cada producto, del más barato al más caro (hasta 12). | bar_horizontal | todo el índice | fast |
index_scatter | «precio y puntuación» con index | El precio frente a la puntuación. El tamaño de cada punto es su cantidad de reseñas. | scatter | todo el índice | fast |
index_availability | «disponibilidad» con index | Productos en stock, agotados y en preventa. | donut | todo el índice | fast |
index_brands | «marcas» con index | Productos por marca. | donut | todo el índice | fast |
- Días. Los de la tabla valen salvo que una fecha en la consulta («esta semana», «en agosto»),
days,published_afteropublished_beforefijen el período. - Modo. Envía
modepara fijarlo. Enauto, un gráfico de cifras que no encuentra suficientes en los titulares y las bajadas lee las mejores notas (normal), y se cobra en ese modo. - Primero, las palabras. Cuando la consulta lo dice («cobertura», «tono», «qué medios», «cronología»,
«precio», «vs»), el plan sigue a las palabras (
plan.confidence: 1). Si no, se decide una vez y se recuerda 7 días. - Índice propio. Con
index(idx_…), el gráfico sale de los datos estructurados que declara cada página de tu índice propio: precio, puntuación, reseñas, disponibilidad, marca.
Una pregunta tipada arma un gráfico answers: cómo la responden las notas. Una pregunta por gráfico, con el
mismo formato que en la salida estructurada:
{
"query": "el Presupuesto 2027",
"questions": {
"postura": {
"type": "choice",
"instructions": "¿Qué postura toma la nota sobre el Presupuesto?",
"criteria": { "a_favor": null, "critica": null, "neutral": "Informa sin tomar partido." }
}
}
}Cómo se encuentran las cifras
Un gráfico con cifras (figure_trend, figure_compare) nunca inventa un número:
- Tal cual. Los números se encuentran como están escritos en los titulares, las bajadas y los fragmentos de las notas, con su moneda o su unidad. Después, cada uno sólo se confirma, o se descarta, como el valor que pediste.
- Un valor por día. Cada punto es la mediana de lo publicado ese día, así dos medios con cifras apenas distintas no dibujan un zigzag. En una comparación, cada nombre lleva su último valor publicado.
- Una fuente para cada punto. Los
sourcesde cada punto son índices en lossourcesde la respuesta: las notas donde se publicó ese valor. Muéstralas en un tooltip o en una nota al pie.
{ "x": "2026-09-25", "y": 1265, "sources": [0, 1] }Si un medio pide después que no lo mostremos, sus fuentes salen de la tarjeta cuando se sirve, y un punto que se queda sin fuente se oculta.
Desde tus datos
Envía data en lugar de query y recibes la misma tarjeta: elegimos el gráfico (con type: "auto"),
ordenamos, resumimos, agregamos las cifras clave y escribimos un título (salvo que envíes title). Cuesta
$0,30 cada 1.000 gráficos. source fija la línea del pie.
Series
curl https://api.typesearch.ai/v1/charts \
-H "Authorization: Bearer $TYPESEARCH_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept-Language: es" \
-d '{
"data": {
"series": [
{
"name": "Suscriptores",
"points": [
{ "x": "2026-06-01", "y": 18200 },
{ "x": "2026-07-01", "y": 19650 },
{ "x": "2026-08-01", "y": 21400 },
{ "x": "2026-09-01", "y": 23900 }
]
}
],
"y": { "label": "Suscriptores", "format": "number" }
},
"source": "Diario Ejemplo, datos internos"
}'xes una fecha (2026-09-01) para un eje de tiempo, un número para uno numérico (una dispersión) o un texto para categorías. Para decirlo tú, usadata.x.kind:time,categoryonumber.data.yda formato a los valores:format(number,percentocurrency, concurrency: "USD"),unit,decimals,label, yhigher_is_better: falsecuando menos es mejor (un precio): los rankings ponen entonces lo más bajo primero.- En una dispersión,
data.x_measureda formato al eje x, elrde cada punto fija su tamaño ylabelle pone nombre. roleen una serie (positive,neutral,negative,other) la pinta como un tono.highlightnombra la categoría que se destaca.
Eventos
Una lista de hechos con fecha arma una cronología:
{
"data": {
"events": [
{ "date": "2026-07-30", "label": "El informe técnico sobre las filtraciones de la represa", "detail": "Diario Ejemplo" },
{ "date": "2026-08-06", "label": "La provincia frena la obra" },
{ "date": "2026-08-19", "label": "La constructora presenta un amparo", "end": "2026-08-22" }
]
},
"title": "El caso de la represa, en tres hitos"
}Columnas y filas
{
"data": {
"columns": [
{ "key": "modelo", "label": "Modelo" },
{ "key": "precio", "label": "Precio", "format": { "format": "currency", "currency": "USD" } },
{ "key": "puntuacion", "label": "Puntuación", "format": { "decimals": 1 } }
],
"rows": [
{ "modelo": "Ridgeline Trail 4", "precio": 109, "puntuacion": 4.6 },
{ "modelo": "Canyon Grip GTX", "precio": 119, "puntuacion": 4.4 }
]
}
}| Límite | |
|---|---|
| Series | 12, de hasta 1.000 puntos cada una |
| Eventos | 50 |
| Columnas | 8 |
| Filas | 100 |
Con type: "auto", los eventos arman una timeline; las columnas y filas, una table; un x numérico, un
scatter; las fechas, una line (un kpi si son uno o dos puntos); varias series de categorías, un
stacked_bar; porcentajes que suman 100 en hasta 6 partes, un donut; más de 7 categorías, un
bar_horizontal; menos, un bar.
Tipos de gráfico
type: "auto" (el valor por defecto) elige el que mejor cuenta los datos. Los otros 12:
type | Cuándo lo elige auto | Qué necesitan los datos |
|---|---|---|
line | Una cifra en el tiempo, o varios nombres en el tiempo. | 3 puntos en el tiempo o más. |
area | La cobertura en el tiempo: un volumen. | 3 puntos en el tiempo o más. |
bar | Pocas categorías, o una cifra comparada entre nombres. | Hasta 12 categorías. |
bar_horizontal | Rankings: medios, precios, nombres largos o más de 12 categorías. | Una serie de categorías. |
stacked_bar | Cada categoría partida en componentes: el tono de cada nombre. | 2 series o más, valores positivos, hasta 12 categorías. |
pie | Las partes de un todo. | Valores positivos, de 2 a 30 partes. |
donut | Las partes de un todo, con el total en el centro: cuota de voz, tono, marcas, disponibilidad. | Valores positivos, de 2 a 30 partes. |
scatter | Dos cifras frente a frente: precio y puntuación. | Un x numérico, 5 puntos o más. |
funnel | Etapas que se van achicando. | Una serie de 3 a 7 categorías que nunca crece. |
timeline | Los hitos de una historia. | Hechos con fecha. |
kpi | Una cifra con su variación: «hoy», «ahora». | Un punto o más. |
table | Filas y columnas. | Siempre se puede. |
Forzar un tipo ("type": "donut") funciona mientras los datos lo permitan. Si no, la tarjeta se dibuja con
el tipo más cercano que sí sirve y lo dice en warnings con chart_type_adjusted. compatible_types lista
los tipos que admiten estos datos, del mejor al aceptable.
Las reglas que aplicamos
Lo que haría alguien que vive de hacer gráficos, aplicado a cada tarjeta. Los mismos datos dan siempre la misma tarjeta.
- Las series diarias largas pasan a semanas (más de 45 días) o a meses (más de 8 meses), sumando los
conteos y quedándose con el último valor de una cifra (
grouped). - Nada de doble eje. Las líneas de escalas muy distintas (más de 25 veces) se comparan como índice, base
100 (
indexed). - Las series diarias ruidosas de tres semanas o más llevan una media móvil de 7 puntos, con la serie cruda
tenue debajo (
chart.smoothing). - Las tortas y las donas muestran como mucho 6 porciones, con el resto en «Otros», siempre al final. Los rankings muestran como mucho 12 barras; las líneas, las áreas y las barras apiladas, hasta 6 series.
- Los rankings van de mayor a menor, o de menor a mayor cuando bajar es mejor: un precio, la inflación, el riesgo país.
- Con nombres largos, las barras verticales pasan a un ranking horizontal, para que entre cada etiqueta.
- Escala logarítmica sólo en líneas, y sólo cuando los valores abarcan más de 200 veces. Nunca en barras.
- Las cifras clave arriba: total, pico y promedio diario en la cobertura; último (con su variación), máximo y mínimo en una cifra.
- El título cuenta el hallazgo: «La cobertura del Presupuesto tuvo su pico el 10 sep», «Milei concentra el 42 % de la cobertura», «Los modelos más caros no son los mejor puntuados».
Temas
theme | Cómo se ve | Para |
|---|---|---|
light | Blanco y grises cálidos. El valor por defecto. | Apps, paneles, documentación. |
dark | Casi negro. | Interfaces oscuras. |
editorial | Papel cálido, tinta de imprenta, cifras con serifa. | Medios y blogs. |
electric | Degradé azul profundo. | Presentaciones y landings. |
La primera serie es siempre el azul eléctrico de typesearch, y las demás se distinguen también con
daltonismo. Fija theme al crear el gráfico, cámbialo gratis con PATCH, o muestra una vista con otro tema
con ?theme= en el embed o en la imagen.
Insertar en tu sitio
embed_url es una página hecha para ir dentro de un iframe. Se adapta a su ancho (por debajo de 480 px pasa a
una versión compacta), muestra tooltips con el mouse y al tocar, pesa pocos KB y no carga nada de terceros: las
fuentes son nuestras.
<iframe
src="https://api.typesearch.ai/embed/chart_8k2m9q4x7w1p3n5z"
title="El dólar blue subió 4,1 % en la semana"
style="width: 100%; border: 0"
height="440"
loading="lazy"
></iframe>La página le avisa a la tuya el alto que necesita, al cargar y cada vez que cambia de tamaño, con
{ type: "typesearch:chart:resize", id, height }. Escúchalo una vez y cada gráfico de la página entra sin
barras de desplazamiento:
<script>
window.addEventListener('message', (event) => {
if (event.origin !== 'https://api.typesearch.ai') return;
const data = event.data;
if (!data || data.type !== 'typesearch:chart:resize') return;
for (const frame of document.querySelectorAll('iframe')) {
if (frame.contentWindow === event.source) frame.style.height = `${data.height}px`;
}
});
</script>data.id es el id del gráfico, si prefieres reconocerlo por ahí. Agrega ?theme=dark (o editorial,
electric) para mostrarlo con otro tema sin crear otro gráfico.
Los embeds, las imágenes y los SVG se guardan en caché 5 minutos: un cambio hecho con PATCH se ve dentro de
ese plazo. Cada IP puede cargar hasta 600 por minuto.
PNG y SVG
image_url(….png): la tarjeta al doble de resolución, para chat, email o presentaciones. En Markdown:.svg_url(….svg): la tarjeta en vectores.?size=compactda cualquiera de las dos en la versión angosta, para celulares e historias, y?theme=, con otro tema:https://api.typesearch.ai/embed/chart_8k2m9q4x7w1p3n5z.png?size=compact&theme=electric.
Cambiar un gráfico
PATCH /v1/charts/{id} cambia el type, el theme, el title, el subtitle o el locale (en o
es). Vuelve a dibujar con los mismos datos, sin buscar de nuevo, y es gratis. Elige el tipo de
compatible_types. Sin un título tuyo, el título se vuelve a escribir para el nuevo tipo y el nuevo idioma.
curl -X PATCH https://api.typesearch.ai/v1/charts/chart_8k2m9q4x7w1p3n5z \
-H "Authorization: Bearer $TYPESEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "area", "theme": "editorial" }'Responde con el gráfico actualizado. embed_url, image_url y svg_url no cambian.
Listar, ver y borrar
GET /v1/charts: tus gráficos, del más nuevo al más viejo, de alimit(hasta 100). Sihas_moreestrue, pasanext_beforecomobeforepara la página siguiente.GET /v1/charts/{id}: un gráfico, con sus datos, su plan y sus fuentes.DELETE /v1/charts/{id}: lo borra ({ "id": "chart_…", "object": "chart", "deleted": true }). Su embed, su imagen y su SVG dejan de funcionar.
Todas las keys de tu organización ven los mismos gráficos. Los gráficos guardados vencen a los 90 días con
pago por uso y nunca con el plan mensual de créditos: expires_at dice cuándo, o null. Mira la
referencia.
Mira el plan primero
plan_only: true devuelve sólo el plan: la receta, el tipo de gráfico, sus alternativas y lo que buscaría
(plan.needs: consultas, modo, días, puntos mínimos). No busca ni dibuja, y es gratis. chart e id
vuelven en null.
Sin guardarlo
store: false no guarda nada: no hay id ni direcciones, y el SVG viene en la respuesta, en svg. Cuesta lo
mismo. Para recibir el SVG también con un gráfico guardado, agrega include_svg: true.
Errores y avisos
| Estado | code | Cuándo |
|---|---|---|
| 400 | invalid_request | Ni query ni data, o los dos; un campo fuera de rango; un PATCH sin nada que cambiar. errors lista cada campo. |
| 402 | insufficient_credits, spend_limit_reached | No queda crédito, o la key llegó a su tope del mes. |
| 404 | chart_not_found | No hay un gráfico con ese id para tu organización: nunca existió, se borró o venció. |
| 422 | insufficient_data | La búsqueda no encontró datos suficientes para este gráfico. No se cobra. |
insufficient_data dice cuántos puntos necesitaba y cuántos encontró. Prueba con más días, otro modo o una
consulta más amplia:
{
"type": "urn:typesearch:error:insufficient_data",
"status": 422,
"code": "insufficient_data",
"detail": "Not enough data for this chart: it needs 3 and found 1. Try more days, another mode or a broader query. Not billed.",
"request_id": "req_Vt4mQ8zK1pXa"
}Los avisos no detienen el gráfico. Vienen en warnings, cada uno con un code y un message:
code | Qué pasó |
|---|---|
chart_type_adjusted | Los datos no admiten el tipo que pediste: se dibujó con el más cercano que sí. |
grouped | Una serie diaria larga se agrupó por semana, mes o año. |
indexed | Series de escalas muy distintas se compararon como índice, base 100. |
Precios
Un gráfico desde una consulta cuesta su búsqueda, en el modo que necesitó y por consulta, más $0,50 cada 1.000 gráficos. Con una consulta:
| Modo | Cada 1.000 gráficos | Se usa por defecto para |
|---|---|---|
ultra | $1,50 | Cobertura, cuota de voz, medios. |
fast | $1,90 | Tono, cronologías, cifras, respuestas, índice propio. |
normal | $2,70 | Cifras, cuando los titulares y las bajadas no alcanzan. |
deep | $6,10 | Sólo si lo fijas. |
Un gráfico que compara nombres busca una consulta por nombre: la cuota de voz entre tres nombres en ultra
cuesta tres búsquedas a $1,00 cada 1.000, más un adicional. Desde tus datos, un gráfico cuesta $0,30
cada 1.000. usage.cost_usd dice cuánto costó cada uno.
Gratis:
- Cada vista de un embed, una imagen o un SVG.
GET, listar,PATCHyDELETE.- El mismo pedido dentro de 10 minutos: vuelve el mismo gráfico con
cached: true. Si sólo la búsqueda salió de la caché, pagas sólo el adicional. - Los errores, también
422 insufficient_data. plan_only.
La lista está en el documento OpenAPI, en x-pricing.per_1000_charts:
{ "query_addon": 0.5, "from_data": 0.3 }. Como referencia, la Search de Tako, que
devuelve tarjetas de gráficos, cuesta $7 cada 1.000. Mira Costos y caché.
Desde el servidor MCP
La herramienta create_chart del servidor MCP arma la misma tarjeta desde una
consulta, así un agente puede responder con un gráfico:
{ "query": "cobertura de Milei vs Bullrich vs Kicillof", "theme": "dark" }Recibe query, type, theme, days, compare, countries, languages e index, y devuelve el
title, el subtitle, image_url (para mostrar), embed_url, key_figures, los valores dibujados en
data, events, sources y cost_usd. La misma key, los mismos precios.