Pipeline de API: enviar tus grupos de Telegram, buscar grupos por palabra clave, lugar o rúbrica, evaluarlos y conectarlos a una campaña

Índice: Pipelines de API — índice

Objetivo: elegir los grupos de Telegram en los que trabaja una campaña: enviar tus propios grupos por nombre de usuario, encontrar más en el índice abierto por palabra clave, lugar o rúbrica, evaluarlos, conectar grupos o presets de grupos a una campaña y excluir grupos de ella.

Modelo

A. Enviar tus propios grupos

1. Envía los nombres de usuario. Una llamada crea un preset nuevo y registra cada nombre.

POST /v0/my/telegram_groups
Idempotency-Key: groups-phuket-1
{"title": "Phuket expats", "project": "<project nonce>",
 "telegram_group_handles": ["@example_expats", "https://t.me/example_market", "t.me/+AbCdEf"]}
→ {"workspace": {"nonce": "470350000000000001", "card_type": "workspace", "visibility": "Private", …},
   "handles": [
     {"handle": "t.me/+AbCdEf", "state": "rejected"},
     {"handle": "example_expats", "state": "contained", "nonce": "470350000000000002"},
     {"handle": "example_market", "state": "proposed", "nonce": "470350000000000003"}],
   "proposals_workspace": "470350000000000005"}

2. En segundo plano: revisión (asíncrona). Cabi.Chat revisa cada nombre propuesto: debe ser un grupo público (no un canal de difusión) y no estar marcado como scam. Los que pasan se añaden al índice y a tu preset; los demás no.

3. Mira el resultado.

GET /v0/my/workspaces/470350000000000001?contained_limit=200
→ {"contained": [{"card_type": "telegram_group", "nonce": "…", "title": "Example market", …}], "contained_next_offset": null}

Un nombre: GET /v0/graph/resolve/@tgg.example_market responde en cuanto el grupo está en el índice. Los grupos que pasan la revisión aparecen en tu preset.

Añadir un grupo conocido a cualquiera de tus presets: POST /v0/my/workspaces/{ws}/{group nonce} → 204; quitarlo: DELETE en la misma ruta.

B. Buscar grupos en el índice

Palabra clave:

POST /v0/search/graph
{"query": "phuket", "card_type": "telegram_group", "limit": 20, "page": 1}
→ {"hits": [{"card_type": "telegram_group", "nonce": "…", "handle": "tgg.example_phuket",
            "title": "…", "item_count": 13934, "location": {…}, …}],
   "total_hits": 115, "page": 1, "total_pages": 6}

/v0/search/graph combina palabras clave y significado; /keyword y /vector usan solo una de las dos. query se corta a 200 caracteres.

Lugar. Los filtros aceptan nonces de lugar (tarjetas de rúbrica de tipo place), no geonameids ni códigos ISO:

  1. GET /v0/search/geo/cities?q=phuket → {"geonameid": 1151254, "name": "Phuket", "country_iso": "TH", …}
  2. GET /v0/graph/resolve/@rub.geo-1151254 → {"card_type": "rubric", "nonce": "<place nonce>", "kind": "place"}. Un país es @rub.geo-<iso lowercase> (código ISO en minúsculas), p. ej. @rub.geo-th.
  3. {"query": "", "card_type": "telegram_group", "filters": {"locations": ["<place nonce>"], "exclude_terms": ["rent"]}}

locations y places_in coinciden con el lugar y todo lo que contiene. Los nonces de lugar van solo ahí; dentro de rubrics no coinciden con nada.

Rúbrica: "filters": {"rubrics": [["<rubric nonce>"]]}; los arrays internos son OR, el externo AND; rubrics_not excluye. Buscar una rúbrica: {"query": "dating", "card_type": "rubric", "filters": {"kind": "tag"}}.

Dentro de un preset: añade "workspace": "<preset nonce>".

Claves de filtro permitidas: rubrics, rubrics_not, rubrics_in, locations, places_in, tags_in, project, preference_countries, preference_city {nonce, lat, lon}, radius_km, roots_only, kind, card_type, exclude_terms; cualquier otra → 400 unknown filter: <key>.

El número de miembros y las valoraciones están en la vista general de cada grupo (abajo). Los grupos añadidos hace poco se encuentran mejor por palabra clave.

Evaluar un grupo:

GET /v0/graph/telegram_groups/@tgg.example_phuket/overview
→ {"tile": {…}, "username": "example_phuket", "members_count": 13934,
   "stats": {"spam": 10.4, "density": 13.8, "openness": 60.9, "moderation": 17.0,
             "audience": 58.1, "pace": 34.0, "msgs_per_day": 221.5, "sample": 200, "rated_at": "…"},
   "mine": {"totals": {"sent": 0, "deleted": 0, "replied": 0, "joined": 0, …}, "timeline": […], "campaigns": […], "replies": […]}}

Las valoraciones van de 0 a 100; stats es null hasta que el grupo se valora. mine es tu propio historial en ese grupo. La página del grupo sin estadísticas: GET /v0/graph/telegram_groups/{nonce | @tgg.<username>}.

Presets listos (GET /v0/graph/workspaces/{ident}?contained_limit=&contained_offset=): @ws.tgg.geo-<geonameid>.2026-09-12 (p. ej. @ws.tgg.geo-1151254.2026-09-12, Phuket) y @ws.tgg.iab-<topic>.2026-09-12 (p. ej. @ws.tgg.iab-travel.2026-09-12): instantáneas del 2026-09-12.

Listas que se actualizan solas. Algunas listas públicas de grupos las mantiene Cabi.Chat de forma automática y cambian por sí solas, por ejemplo grupos con mucho spam o grupos donde se borran muchos mensajes. Llevan la rúbrica «Auto-maintained» (encuéntrala con {"query": "Auto-maintained", "card_type": "rubric"} y luego busca espacios con esa rúbrica). Úsalas como presets, por ejemplo en not_tg_groups para que una campaña no entre en esos grupos.

C. Poner grupos en una campaña

PATCH /v0/my/campaigns/<campaign nonce>
{"tg_groups": ["<preset nonce>", "<group nonce>"]}

Excluir grupos. not_tg_groups lista los grupos que la campaña omite; acepta las mismas entradas que tg_groups. Sirve para quitar algunos grupos de un preset listo:

PATCH /v0/my/campaigns/<campaign nonce>
{"tg_groups": ["<preset nonce>"], "not_tg_groups": ["<group nonce>", "<other preset nonce>"]}

Superficie de la API

Endpoint Para qué FE IA / oráculo
POST /v0/my/telegram_groups Enviar nombres como un preset nuevo sí (Enviar grupos de Telegram) sí, la forma de traer grupos propios
GET /v0/my/workspaces/{ws} Leer un preset; ver qué grupos llegaron sí sí
POST / DELETE /v0/my/workspaces/{ws}/{group} Añadir / quitar un grupo conocido sí sí
GET /v0/graph/resolve/{@handle} @tgg.<username> → grupo; @rub.geo-<id> → lugar sí sí
POST /v0/search/graph (/keyword, /vector) Buscar grupos por palabra, lugar, rúbrica, dentro de un preset sí sí, búsqueda principal
GET /v0/search/geo/cities, /countries Buscar ciudad o país sí sí, y luego resolve
GET /v0/graph/telegram_groups/{ident}, /overview Página del grupo; miembros, valoraciones, tu historial sí sí, evaluación
GET /v0/graph/workspaces/{ident} Presets listos sí sí
POST / PATCH /v0/my/campaigns… tg_groups, not_tg_groups Conectar o excluir grupos o presets sí sí

Mentioned