Saltar al contenido

INITE para agentes

El portal, el analizador y el Atlas como herramientas que un agente de IA llama sin cuenta. Cada uno tiene además un carril con sesión para lo que necesita de usted - añadir su herramienta al Atlas, sus auditorías, pagar - que pide iniciar sesión al conectarlo.

INITE / AGENTES

Endpoint MCP

https://inite.ai/api/mcp

Streamable HTTP, sin sesión. Cada carril tiene también su propio endpoint, para una lista de herramientas más corta.

Los carriles

  • Portalhttps://inite.ai/api/mcp/portal

    La propia INITE: qué vendemos y por cuánto, en su moneda, horarios libres para una llamada, reservar una llamada para una persona concreta, escribir al equipo, las guías.

    • inite_servicesabierto
    • inite_slotsabierto
    • inite_book_callabierto
    • inite_contactabierto
    • inite_guidesabierto
    • inite_connectabierto
  • INITE, con cuentahttps://inite.ai/api/mcp/portal-me

    Su cuenta: plan, licencias y auditorías restantes (my_account), y Local Start comprado para usted (inite_buy), pagado desde su monedero INITE, con tarjeta o PIX, o por x402.

    • my_accountcuenta
    • inite_buycuenta
  • Analizadorhttps://inite.ai/api/mcp/analyzer

    Cómo leen un sitio los motores de IA. check_identity es gratis e instantáneo: acceso de los crawlers, archivos de identidad, schema. visibility_fixes da el plan de correcciones por importancia, con archivos listos para pegar; compare_sites lee igual el sitio de un competidor; visibility_history muestra cómo cambió la lectura. analyze_site ejecuta la auditoría y get_analysis lee el resultado.

    • check_identityabierto
    • analyze_siteabierto
    • get_analysisabierto
    • visibility_fixesabierto
    • compare_sitesabierto
    • visibility_historyabierto
  • Analizador, con cuentahttps://inite.ai/api/mcp/analyzer-me

    La auditoría en el nivel de su cuenta (analyze_site, get_analysis), watch_site releyendo un sitio cada semana, sus auditorías (my_reports) y una licencia de 12 meses (visibility_buy_licence).

    • watch_sitecuenta
    • my_reportscuenta
    • visibility_buy_licencecuenta
  • Atlashttps://inite.ai/api/mcp/atlas

    Más de 25.000 herramientas de IA, releídas cada semana. Encuentre herramientas para una tarea descrita con palabras, lea el registro fechado de una herramienta (precio y cómo cambió, API, servidor MCP, estado, lo que declara sobre sus datos), filtre por facetas, vea qué cambió en el mercado.

    • match_toolsabierto
    • match_mcpabierto
    • atlas_lookupabierto
    • atlas_searchabierto
    • atlas_changesabierto
    • get_project_timelineabierto
    • atlas_couponsabierto
    • atlas_compareabierto
    • atlas_dataset_getabierto
    • atlas_dataset_changesabierto
  • Dueños en el Atlashttps://inite.ai/api/mcp/atlas-owners

    atlas_submit añade su herramienta al Atlas por su dirección y empieza la reclamación; las herramientas atlas_owner_* prueban el dominio, llevan la ficha y sus descuentos; atlas_owner_premium paga premium; atlas_dataset_* publican comparaciones Live Data.

    • atlas_my_listingscuenta
    • atlas_submitcuenta
    • atlas_owner_claimcuenta
    • atlas_owner_verifycuenta
    • atlas_owner_cardcuenta
    • atlas_owner_set_read_pagescuenta
    • atlas_owner_remeasurecuenta
    • atlas_owner_statscuenta
    • atlas_owner_propose_editcuenta
    • atlas_owner_couponscuenta
    • atlas_owner_coupon_addcuenta
    • atlas_owner_coupon_setcuenta
    • atlas_owner_premiumcuenta
    • atlas_owner_releasecuenta
    • atlas_dataset_createcuenta
    • atlas_dataset_updatecuenta
    • atlas_dataset_publishcuenta
    • atlas_dataset_archivecuenta
    • atlas_dataset_placementcuenta
  • Directoriohttps://inite.ai/api/mcp/directory

    Empresas que confirmaron sus propios datos en INITE y demostraron su dominio. find_business busca por lo que hace la empresa y dónde está, en español, inglés, ruso o portugués; business abre una por su slug o su dominio. Cada una tiene su propio servidor de datos (MCP y A2A). El orden lo dan la coincidencia y lo completos que están los datos; ningún puesto está a la venta. Las herramientas de IA, que medimos nosotros mismos, están en el Atlas, no aquí.

    • find_businessabierto
    • businessabierto

Abierto, y con cuenta

Una llamada sin token es un invitado. Los invitados reciben las herramientas abiertas del portal, el analizador y el Atlas, con límites por dirección, y la auditoría se ejecuta como encuesta: todo menos sus dos pasos de pago, como en el sitio para quien no tiene cuenta. Los carriles con cuenta no responden nada sin token. Su 401 con WWW-Authenticate apunta a auth.inite.ai, que admite registro dinámico de clientes y PKCE, así que el cliente le pide iniciar sesión (passkey, enlace por correo o contraseña) cuando lo añade. Claude y ChatGPT deciden si un conector pide sesión en el momento de añadirlo; por eso cada producto tiene su propio carril con cuenta.

Conectar

Cualquier cliente que hable MCP remoto: añada el endpoint. No hace falta clave para empezar.

{
  "mcpServers": {
    "inite": {
      "type": "http",
      "url": "https://inite.ai/api/mcp"
    }
  }
}

Un cliente que lanza servidores locales: el paquete npm añade tres comprobaciones que se ejecutan en su equipo y reenvía el resto al endpoint.

{
  "mcpServers": {
    "inite": {
      "command": "npx",
      "args": [
        "-y",
        "@inite/visibility"
      ]
    }
  }
}

Para dueños de herramientas

Tu agente puede poner tu herramienta en el Atlas y llevar su ficha: añadirla por su dirección, probar el dominio, decirle al Atlas dónde están tus páginas de precios, empleo y novedades, publicar descuentos, pedir una nueva lectura y contratar premium.

  1. 01Conecta el carril de dueños del Atlas, https://inite.ai/api/mcp/atlas-owners, e inicia sesión cuando el cliente lo pida.
  2. 02atlas_submit con la dirección de tu sitio lee la página de inicio, envía la solicitud y empieza la reclamación. Devuelve tres formas de probar el dominio: un enlace-insignia, una meta etiqueta o un registro DNS. Pon una en el sitio y llama a atlas_owner_verify. Una herramienta que ya está en el Atlas se reclama con atlas_owner_claim.
  3. 03atlas_owner_card muestra lo que la ficha leyó y lo que no pudo leer: precio, empleo, lanzamientos, empresa.
  4. 04atlas_owner_set_read_pages indica tus páginas de precios, empleo y changelog. Las leemos con las mismas comprobaciones que cualquier página: el precio debe estar impreso en ella, el tablero de empleo debe ser tuyo, las entradas deben llevar fechas.
  5. 05atlas_owner_coupon_add publica un descuento, marcado como declarado por el dueño verificado. atlas_owner_remeasure vuelve a leer el sitio; atlas_owner_stats muestra vistas y clics.
  6. 06atlas_owner_premium abre premium. Si permitiste cargos en tu monedero INITE, se paga al momento; si no, recibes una página con passkey, una página de tarjeta o PIX y x402 para un agente con monedero propio. Vuelve a llamarlo después de pagar y premium se activa.

Un prompt para tu agente

Con el servidor MCP INITE Atlas Owners, añade your-tool.com al Atlas como mi herramienta, pon la meta etiqueta de prueba en nuestra página de inicio y verifícala. Luego muéstrame lo que la ficha no pudo leer e indica nuestras páginas de precios, empleo y changelog.

Nada que declare el dueño cambia un dato medido. Las páginas que indiques se leen, no se creen; las correcciones pasan a revisión humana.

A2A

La auditoría también es un agente A2A v1.0: envíele un dominio y reciba una tarea que termina en alrededor de un minuto, con la puntuación como artefacto. La misma regla: abierto sin token, el nivel de la cuenta con uno.

https://inite.ai/api/a2a

Para máquinas

Todo lo anterior, en los archivos que un agente lee primero.

.well-known

Para los desarrolladores de su sitio

Una empresa que confirmó sus datos en INITE puede servirlos desde su propio dominio y publicar en su sitio los artículos que aprobó. Elija el conector según la plataforma del sitio. Un sitio con cualquier otra tecnología llama a los mismos endpoints y recibe los eventos de webhook de abajo.

Una empresa activa INITE Agents en su panel, confirma allí sus hechos y recibe la clave del sitio que necesitan los conectores de abajo. Abrir INITE Agents

Qué conector para cada plataforma

  • El plugin INITE Agents. Instale el zip en Plugins, Añadir nuevo plugin, Subir plugin, y pegue la clave del sitio en Ajustes, INITE Agents. Sirve los archivos, las etiquetas del head y la línea de robots.txt, y convierte los artículos aprobados en entradas. Las versiones nuevas aparecen en la pantalla de Plugins.

  • Next.js · en GitHubnpm install @inite/site-agents

    El paquete @inite/site-agents: dos archivos de ruta y un componente del head sirven los archivos y las etiquetas; createContentQueue trae los artículos aprobados e informa dónde se publicaron.

  • Cualquier sitio con un campo de código en el head: Tilda, Squarespace, Wix, Webflow, Framer, Ghost, Shopify, Bitrix, Joomla · en GitHub

    El snippet: una etiqueta script en el head de la página, creada en el panel, con el slug público y sin clave. Carga las herramientas WebMCP, añade los enlaces a los archivos de <slug>.inite.ai y el JSON-LD de los datos confirmados. Eso llega a los agentes en un navegador y a los rastreadores que ejecutan JavaScript; para los muchos rastreadores de IA que solo leen el HTML tal cual, el panel da además un bloque estático con las mismas etiquetas de una versión, que hay que volver a copiar tras cada confirmación. Una vez al día leemos la página de inicio para ver qué hay.

  • Ghost · en GitHub

    No hay nada que instalar: pegue en el panel la URL de la Admin API y la clave de una integración personalizada, y INITE publica en Ghost los artículos aprobados. El snippet en Settings, Code injection, se encarga del head.

  • Cualquier otra tecnología · en GitHub

    Los endpoints y el webhook de abajo, con una clave del sitio creada para la plataforma Webhook en el panel.

  • Shopify, Wix, Webflow, HubSpot

    Estas plataformas tendrán su propia app. Mientras tanto, el snippet conecta cualquiera de estos sitios, y un desarrollador puede usar los endpoints y el webhook.

La documentación de cada plataforma, receptores de webhook en Node.js, PHP y Python que verifican la firma, y las incidencias de todos los conectores están en un repositorio público. El código del plugin y del paquete está al lado, en espejos de solo lectura, con un lanzamiento para cada versión. inite-ai/inite-agents en GitHub

Clave y límites

Cada llamada marcada con "clave del sitio" lleva la clave de la pestaña Para agentes del panel, como Authorization: Bearer isk_…. La clave se muestra una sola vez, al crearla. Una clave corresponde a un sitio y a una plataforma; envíela solo a https://inite.ai.

Los endpoints con clave aceptan 60 solicitudes por minuto desde una misma dirección IP; los sitios alojados en un mismo servidor compartido comparten ese margen. Los datos públicos y el snippet aceptan 30 por minuto desde una dirección. Por encima del límite la respuesta es 429 con Retry-After en segundos; si el servicio está ocupado, 503 con Retry-After. El cuerpo indica cuál: {"ok": false, "busy": "rate"}. El script WebMCP no tiene límite y se guarda en caché un día. Los envíos a records aceptan 30 por minuto.

Endpoints

  • GET /api/site/v1/manifestclave del sitio

    Qué archivos servir y en qué rutas, las etiquetas del head, la dirección MCP, la versión de los datos y si los artículos están activados. Envíe el ETag que tiene como If-None-Match: 304 significa que nada cambió. Basta con preguntar cada cinco minutos.

  • GET /api/site/v1/files/{name}clave del sitio

    Un archivo de la versión confirmada, byte a byte, con su tipo de contenido: llms.txt, llms-full.txt, agent-card.json, mcp.json, api-catalog, robots-signal o jsonld. Cada archivo tiene su propio ETag. Cualquier otro nombre da 404. robots-signal es la línea Content-Signal para tu robots.txt (search=yes, ai-input=yes, ai-train=no): una preferencia declarada para quien la respete; no bloquea a ningún robot.

  • POST /api/site/v1/pingclave del sitio

    Opcional, más o menos una vez al día: su plataforma, la versión de su conector, hasta 20 rutas que sirve y cuántas veces las leyeron al día los agentes de IA conocidos en los últimos siete días (hasta 60 filas). Cada cifra es el total del día hasta ese momento, así que un ping repetido escribe el mismo número. No se envían direcciones ni user agents de los visitantes. También puede llevar un campo opcional site con lo que tu plataforma dice del sitio: título, lema, idioma y dirección, y woocommerce.products con el número de productos publicados. INITE sugiere el título y el lema al propietario; no se publica nada a partir de él. Un ping con site y sin paths deja las rutas servidas como estaban. Con los plugins de reservas o de ubicaciones del sitio puede llevar también services, locations y hours con la forma de los datos, y from con los nombres de los plugins; el propietario los ve como sugerencias. Un campo opcional referrals cuenta las visitas que llegaron desde un asistente de IA (chatgpt.com, perplexity.ai, gemini.google.com, copilot.microsoft.com, claude.ai y algunos más): día, ruta, origen y número, hasta 60 filas, con la misma regla del total del día. Solo números: ni dirección, ni cookie, nada sobre la persona.

  • POST /api/site/v1/recordsclave del sitio

    El contenido propio del sitio, un grupo cada vez, enviado solo mientras el propietario lo activó en el conector: content (páginas y entradas publicadas: id, type, title, url, excerpt, modified, language), products (id, name, url, price, regularPrice, salePrice, currency, stock, sku, excerpt, categories, image) o events (id, title, url, excerpt, starts, ends, venue). Hasta 100 elementos por envío, los que cambiaron; removed enumera los id que desaparecieron, present todos los que siguen (el resto se elimina), y clear: true elimina el grupo entero. Las direcciones deben estar en el dominio propio del sitio. INITE guarda hasta 2000 páginas y entradas, 2000 productos y 200 eventos, y la respuesta dice cuántos guarda. Con ellos se preparan en menos de cinco minutos llms.txt, llms-full.txt y los productos del MCP; los productos se publican solo mientras el propietario tiene activado Publicar mi catálogo.

  • GET /api/site/v1/summaryclave del sitio

    Solo lectura, para el panel del propio conector: la puntuación de visibilidad en IA y las comprobaciones fallidas del último análisis, treinta días de lecturas de agentes, llamadas MCP y visitas que llegaron desde asistentes de IA, y cuántas sugerencias y artículos esperan al propietario. INITE lo reescribe cada tres horas; basta con preguntar cada pocas horas. Qué agentes, páginas y asistentes forma parte de INITE Agents Premium; sin él, la respuesta trae los totales.

  • GET /api/site/v1/content/queueclave del sitio

    Los artículos que el propietario aprobó y que este sitio aún no publicó, del más antiguo al más reciente, diez como máximo por respuesta. Vacía, con enabled: false, mientras el propietario tenga los artículos desactivados.

  • POST /api/site/v1/content/{id}/publishedclave del sitio

    Informa que un artículo está publicado, con su dirección. Repetir la misma dirección no causa problemas.

  • POST /api/site/v1/content/{id}/failedclave del sitio

    Informa que un artículo no se pudo publicar, con el motivo. El artículo sale de la cola hasta que el propietario lo envíe de nuevo.

  • GET /api/site/v1/public/{slug}?d={domain}público, sin clave

    Los datos confirmados en JSON. Abiertos a cualquier origen: es lo que lee el script WebMCP en el navegador. En caché cinco minutos, con ETag.

  • GET /api/site/v1/webmcp.js?s={slug}&d={domain}&v={version}público, sin clave

    El script para el head de la página; su dirección, con la versión correcta, está en el manifiesto en head.script.src. Ofrece a un agente de IA en el navegador herramientas de solo lectura sobre los datos confirmados. En un navegador sin WebMCP no hace nada y no crea ninguna cookie.

  • GET /api/site/v1/snippet.js?s={slug}&d={domain}público, sin clave

    El script detrás de la etiqueta del snippet. Se sirve mientras los datos están publicados y el snippet está activo en el panel; si no, un comentario que no hace nada. Registra las herramientas WebMCP y añade los enlaces y el JSON-LD de la versión actual; una página cuyo bloque estático es de esa versión conserva su propio JSON-LD. En caché cinco minutos, con ETag. Cada carga marca el snippet como visto en el panel, solo la hora; no se guarda nada del visitante.

  • GET /api/site/v1/public/{slug}/prices.yml?d={domain}público, sin clave

    La lista de precios como feed YML, para que Yandex Business la lea por enlace. Solo servicios con un precio único en RUB, KZT o BYN; se escribe al confirmar los datos y responde 404 mientras están despublicados. En caché cinco minutos, con ETag.

  • POST /api/site/v1/public/{slug}/requests?d={domain}público, sin clave

    Lo que envían request_contact y request_booking del script WebMCP, abierto a cualquier origen: {"tool", "arguments"} con los mismos argumentos que las herramientas MCP. Responde con el id de la solicitud y los criterios que dicen que se hizo bien; 422 indica el campo a corregir, 409 que el propietario tiene las solicitudes desactivadas, 429 un límite o un duplicado. Tres desde una dirección de golpe, luego seis por hora.

  • GET /api/site/v1/requests?status={status}&page={page}clave del sitio

    Las solicitudes de agentes del sitio, las más recientes primero, 25 por página, con el recuento por estado. Vacío, con enabled: false, salvo que el propietario envíe las solicitudes a este conector.

  • POST /api/site/v1/requests/{id}clave del sitio

    Marca una solicitud como nueva, respondida o spam: {"status": "answered"}. No se envía nada a nadie por ello.

Los endpoints con clave rechazan con un cuerpo JSON {"ok": false, "error", "message"}, y el mensaje se puede mostrar tal cual. 401: no_key, unknown_key o revoked. 403: disabled, la clave está pausada. 409: unproved (el dominio aún no está verificado), unconfirmed (no hay nada confirmado para publicar), unpublished (el propietario retiró los datos en el panel) o company_inactive. En cualquiera de ellos, deje de servir los archivos. Ante un timeout o un 5xx, conserve la última copia que tenga.

Consultar el manifiesto

curl -i https://inite.ai/api/site/v1/manifest \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'If-None-Match: "m4-Qx…"'
{
  "ok": true,
  "site": {
    "slug": "acme",
    "domain": "acme.com",
    "version": 4,
    "confirmedAt": "2026-10-22T10:00:00.000Z"
  },
  "connector": {
    "id": "cm2x8k1qz0001",
    "platform": "next",
    "enabled": true
  },
  "mcp": {
    "url": "https://acme.inite.ai/mcp"
  },
  "files": [
    {
      "name": "llms.txt",
      "path": "/llms.txt",
      "placement": "path",
      "contentType": "text/plain; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/llms.txt",
      "available": true,
      "etag": "\"f4-llms.txt\""
    },
    {
      "name": "agent-card.json",
      "path": "/.well-known/agent-card.json",
      "placement": "path",
      "contentType": "application/json; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/agent-card.json",
      "available": true,
      "etag": "\"f4-agent-card.json\""
    },
    {
      "name": "mcp.json",
      "path": "/.well-known/mcp.json",
      "placement": "path",
      "contentType": "application/json; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/mcp.json",
      "available": true,
      "etag": "\"f4-mcp.json\""
    },
    {
      "name": "api-catalog",
      "path": "/.well-known/api-catalog",
      "placement": "path",
      "contentType": "application/linkset+json; profile=\"https://www.rfc-editor.org/info/rfc9727\"",
      "url": "https://inite.ai/api/site/v1/files/api-catalog",
      "available": true,
      "etag": "\"f4-api-catalog\""
    },
    {
      "name": "robots-signal",
      "path": null,
      "placement": "robots",
      "contentType": "text/plain; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/robots-signal",
      "available": true,
      "etag": "\"f4-robots-signal\""
    },
    {
      "name": "jsonld",
      "path": null,
      "placement": "head",
      "contentType": "application/json; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/jsonld",
      "available": true,
      "etag": "\"f4-jsonld\""
    }
  ],
  "head": {
    "html": "<script src=\"https://inite.ai/api/site/v1/webmcp.js?s=acme&amp;d=acme.com&amp;v=4&amp;r=cb\" async crossorigin=\"anonymous\"></script>\n<link rel=\"mcp\" href=\"https://acme.inite.ai/mcp\">\n<link rel=\"service-doc\" href=\"https://acme.inite.ai/llms.txt\" type=\"text/plain\">\n<link rel=\"describedby\" href=\"https://acme.inite.ai/.well-known/agent-card.json\" type=\"application/json\">\n<link rel=\"api-catalog\" href=\"https://acme.inite.ai/.well-known/api-catalog\" type=\"application/linkset+json\">\n<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"Dentist\",\"name\":\"Acme Dental\",\"url\":\"https://acme.com\"}</script>",
    "script": {
      "src": "https://inite.ai/api/site/v1/webmcp.js?s=acme&d=acme.com&v=4&r=cb",
      "async": true
    },
    "links": [
      {
        "rel": "mcp",
        "href": "https://acme.inite.ai/mcp"
      },
      {
        "rel": "service-doc",
        "href": "https://acme.inite.ai/llms.txt",
        "type": "text/plain"
      },
      {
        "rel": "describedby",
        "href": "https://acme.inite.ai/.well-known/agent-card.json",
        "type": "application/json"
      },
      {
        "rel": "api-catalog",
        "href": "https://acme.inite.ai/.well-known/api-catalog",
        "type": "application/linkset+json"
      }
    ],
    "jsonLd": {
      "@context": "https://schema.org",
      "@type": "Dentist",
      "name": "Acme Dental",
      "url": "https://acme.com"
    }
  },
  "features": {
    "files": true,
    "head": true,
    "webmcp": true,
    "menu": false,
    "content": {
      "enabled": true,
      "queueUrl": "https://inite.ai/api/site/v1/content/queue"
    },
    "requests": {
      "enabled": true,
      "booking": true,
      "url": "https://inite.ai/api/site/v1/public/acme/requests?d=acme.com",
      "listUrl": "https://inite.ai/api/site/v1/requests",
      "toPlugin": true
    }
  },
  "poll": {
    "afterSeconds": 300
  }
}

El ping

curl https://inite.ai/api/site/v1/ping \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "platform": "next", "pluginVersion": "0.2.0", "paths": [ "/llms.txt", "/.well-known/agent-card.json", "/robots.txt" ], "visits": [ { "day": "2026-10-22", "path": "/llms.txt", "agent": "ClaudeBot", "hits": 12 } ], "site": { "title": "Sorriso", "tagline": "Dental clinic in Pinheiros", "language": "pt-BR", "url": "https://sorriso.example/", "woocommerce": { "products": 12 } }, "referrals": [ { "day": "2026-10-22", "path": "/prices/", "source": "chatgpt.com", "hits": 3 } ] }'
{
  "ok": true,
  "visits": 1,
  "referrals": 1,
  "paths": 3,
  "platformMatches": true
}

Enviar el contenido del sitio

curl https://inite.ai/api/site/v1/records \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d @products-page.json
{
  "group": "products",
  "items": [
    {
      "id": "412",
      "name": "Whitening kit",
      "url": "https://sorriso.example/loja/whitening-kit/",
      "price": "149.90",
      "regularPrice": "189.90",
      "salePrice": "149.90",
      "currency": "BRL",
      "stock": "instock",
      "sku": "WK-01",
      "excerpt": "Trays and gel for two weeks at home.",
      "categories": [
        "Care at home"
      ],
      "image": "https://sorriso.example/wp-content/uploads/wk.jpg",
      "modified": "2026-10-22T14:05:00+00:00"
    }
  ],
  "removed": [
    "388"
  ]
}
{
  "ok": true,
  "group": "products",
  "accepted": 1,
  "capped": 0,
  "removed": 1,
  "held": 12,
  "cap": 2000,
  "dropped": 0
}

Artículos

INITE escribe artículos para el sitio de una empresa a partir de lo que la gente realmente busca, y el propietario aprueba cada uno en el panel. Un conector recoge los aprobados e informa dónde se publicó cada uno. Lo que recibe es el texto tal como se aprobó: título, slug, meta descripción, el cuerpo en Markdown y el mismo cuerpo en HTML, y las fuentes que cita.

La cola

curl https://inite.ai/api/site/v1/content/queue \
  -H "Authorization: Bearer $INITE_SITE_KEY"
{
  "ok": true,
  "enabled": true,
  "items": [
    {
      "id": "cm2y0v7ka0004",
      "lang": "en",
      "title": "How much does a dental cleaning cost in Austin?",
      "slug": "dental-cleaning-cost-austin",
      "metaDescription": "What a cleaning costs at Acme Dental, what it includes, and when insurance covers it.",
      "body": "## What a cleaning includes\n\nA cleaning at Acme Dental takes about 45 minutes…",
      "html": "<h2>What a cleaning includes</h2>\n<p>A cleaning at Acme Dental takes about 45 minutes…</p>\n",
      "sources": [
        {
          "url": "https://www.ada.org/resources/research/health-policy-institute",
          "title": "ADA Health Policy Institute"
        }
      ],
      "approvedAt": "2026-10-22T09:30:00.000Z",
      "report": {
        "published": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/published",
        "failed": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/failed"
      }
    }
  ]
}

Consulte con su propio ritmo, por ejemplo cada hora, o cuando llegue el evento content.approved. Las direcciones de report de cada elemento están en inite.ai y aceptan la misma clave del sitio.

Informar el resultado

curl https://inite.ai/api/site/v1/content/cm2y0v7ka0004/published \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "url": "https://acme.com/blog/dental-cleaning-cost-austin/" }'
{
  "ok": true,
  "status": "published",
  "url": "https://acme.com/blog/dental-cleaning-cost-austin/",
  "already": false
}

La dirección debe ser http o https en el dominio del propio sitio o en un subdominio. La misma dirección otra vez recibe already: true, así que reintentar tras perder una respuesta es seguro. Otra dirección para un artículo ya publicado se rechaza con 409 published_elsewhere.

curl https://inite.ai/api/site/v1/content/cm2y0v7ka0004/failed \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "reason": "the blog category is missing" }'
{
  "ok": true,
  "status": "failed",
  "already": false
}

El motivo se guarda hasta 300 caracteres y se muestra al propietario. Un segundo informe de fallo del mismo artículo recibe already: true.

Otras respuestas: 404 not_found (no es un artículo de este sitio), 409 not_approved (no está esperando publicación), 422 invalid_url, 400 bad_json, 413 too_large (cuerpos de hasta 8 KB).

Webhook

Añada una dirección https en la pestaña Para agentes, hasta tres por sitio. Le enviamos un POST firmado para tres eventos: facts.confirmed, cada vez que se confirman los datos, y content.approved, cada vez que el propietario aprueba un artículo. El encabezado INITE-Event y el campo event indican cuál. El secreto de firma se muestra una sola vez, al añadir la dirección. Un tercero, lead.created, se envía por cada solicitud de un agente cuando el propietario envía las solicitudes al webhook.

facts.confirmed

POST /your/endpoint
Content-Type: application/json
User-Agent: INITE-Webhooks/1.0 (+https://inite.ai/en/mcp#site-api)
INITE-Event: facts.confirmed
INITE-Webhook-Id: evt_3hGkV0bq9rS1xYw2LmN4pQ7z
INITE-Signature: t=1792663200,v1=5f2b…

{
  "id": "evt_3hGkV0bq9rS1xYw2LmN4pQ7z",
  "event": "facts.confirmed",
  "site": "acme.com",
  "slug": "acme",
  "version": 4,
  "confirmedAt": "2026-10-22T10:00:00.000Z",
  "manifestUrl": "https://inite.ai/api/site/v1/manifest",
  "factsUrl": "https://inite.ai/api/site/v1/public/acme?d=acme.com"
}

content.approved

POST /your/endpoint
Content-Type: application/json
User-Agent: INITE-Webhooks/1.0 (+https://inite.ai/en/mcp#site-api)
INITE-Event: content.approved
INITE-Webhook-Id: evt_Vb1mR8sQx2LkT0wYh7nP4cZd
INITE-Signature: t=1792663200,v1=5f2b…

{
  "id": "evt_Vb1mR8sQx2LkT0wYh7nP4cZd",
  "event": "content.approved",
  "site": "acme.com",
  "slug": "acme",
  "article": {
    "id": "cm2y0v7ka0004",
    "lang": "en",
    "title": "How much does a dental cleaning cost in Austin?",
    "slug": "dental-cleaning-cost-austin",
    "metaDescription": "What a cleaning costs at Acme Dental, what it includes, and when insurance covers it.",
    "body": "## What a cleaning includes\n\nA cleaning at Acme Dental takes about 45 minutes…",
    "html": "<h2>What a cleaning includes</h2>\n<p>A cleaning at Acme Dental takes about 45 minutes…</p>\n",
    "sources": [
      {
        "url": "https://www.ada.org/resources/research/health-policy-institute",
        "title": "ADA Health Policy Institute"
      }
    ],
    "approvedAt": "2026-10-22T09:30:00.000Z"
  },
  "report": {
    "published": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/published",
    "failed": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/failed"
  }
}

content.approved lleva el mismo artículo que sirve la cola, así que un receptor puede publicarlo sin preguntar. Informe el resultado a las direcciones de report con una clave del sitio, como hace un conector; hasta entonces el artículo también sigue en la cola.

lead.created

POST /your/endpoint
Content-Type: application/json
User-Agent: INITE-Webhooks/1.0 (+https://inite.ai/en/mcp#site-api)
INITE-Event: lead.created
INITE-Webhook-Id: evt_Qe5nB2vXk8LmR1tYz0cH7dWs
INITE-Signature: t=1792663200,v1=5f2b…

{
  "id": "evt_Qe5nB2vXk8LmR1tYz0cH7dWs",
  "event": "lead.created",
  "site": "acme.com",
  "slug": "acme",
  "lead": {
    "id": "cm2z4r9tb0007",
    "kind": "booking",
    "name": "Ana Costa",
    "email": "[email protected]",
    "phone": null,
    "message": "A cleaning, and my gums bleed a little.",
    "service": "Dental cleaning",
    "preferredTime": null,
    "windows": [
      {
        "date": "2026-10-30",
        "from": "10:00",
        "to": "12:00"
      }
    ],
    "partySize": null,
    "via": "mcp",
    "client": "claude-code",
    "factsVersion": 4,
    "createdAt": "2026-10-23T14:02:00.000Z"
  },
  "cabinetUrl": "https://inite.ai/en/acme/profile?tab=agents"
}

lead.created solo se envía si el propietario eligió «A mi webhook» en Solicitudes de agentes. Lleva el nombre, el contacto y el mensaje de la persona para que el negocio responda: trátelos como datos personales. Abajo, la misma solicitud tal como la envía el script WebMCP.

{
  "tool": "request_booking",
  "arguments": {
    "service": "Dental cleaning",
    "preferred_windows": [
      {
        "date": "2026-10-30",
        "from": "10:00",
        "to": "12:00"
      }
    ],
    "name": "Ana Costa",
    "contact": {
      "email": "[email protected]"
    },
    "user_confirmed": true
  }
}

La firma

Compruebe INITE-Signature antes de fiarse del cuerpo. t es el momento de la firma, en segundos Unix; v1 es el HMAC-SHA256 de t, un punto y el cuerpo sin procesar, con su secreto como clave. Rechace un t a más de cinco minutos de la hora actual. INITE-Webhook-Id es el mismo en cada reintento de un evento, así que un duplicado se puede descartar.

Comprobar la firma en Node.js

import { createHmac, timingSafeEqual } from 'node:crypto'

// rawBody: the request body as received, before JSON.parse.
export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')))
  const t = Number(parts.t)
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false
  const want = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex')
  const got = String(parts.v1 ?? '')
  return got.length === want.length && timingSafeEqual(Buffer.from(got), Buffer.from(want))
}

Responda con cualquier 2xx en menos de diez segundos. Cualquier otra respuesta se reintenta a los 1, 5, 30, 120 y 360 minutos; tras el sexto intento la entrega se marca como fallida. No seguimos redirecciones. El panel muestra los últimos diez intentos de cada dirección.