La API pública está en https://signalcore.ai/v1: JSON de entrada y salida, y un WebSocket por
conversación para lo que pasa en directo. La app usa la misma API en /api, con su sesión; tu
código usa siempre /v1. Cada endpoint está en la referencia.
Cada llamada lleva Authorization: Bearer con una clave o un token.
Desde Python o TypeScript, los SDK hacen lo mismo con cada llamada tipada: Python y TypeScript.
Claves
Los permisos de una clave secreta:
Crear una clave
Las claves las crea el dueño de la cuenta, con su sesión. Mientras llega su pantalla en la app, créala desde la consola del navegador con signalcore.ai/app abierta y la sesión iniciada:
Una clave publicable nombra su agente y sus webs:
{ kind: "publishable", name: "Web", agent_id: "agt_…", origins: ["https://tuweb.com"] }.
GET /api/keys las lista y DELETE /api/keys/{id} revoca una, y con ella los tokens que creó.
Hablar con un agente
Busca el id del agente en sus equipos, empieza una conversación y escríbele. Con wait: true
la respuesta llega cuando el agente termina (hasta 60 segundos).
status es done, waiting (espera algo: una respuesta a una pregunta, un sí; está en
waiting), failed (con error) o running: aún no ha terminado, lee la conversación después
con GET /v1/conversations/{id}.
El builder también es un agente: con una clave con talk puedes hablarle igual.
En directo
Cada conversación tiene un WebSocket con todo lo que pasa: la respuesta mientras se escribe, lo que hace el agente, lo que enseña.
Desde un servidor también vale la cabecera Authorization. Cada mensaje es JSON con un type. Envías {"type": "say", "text": "..."} y recibes, entre
otros, message (un mensaje guardado), text (un trozo de la respuesta), step (algo que hace
el agente), done (terminó) y error.
Organizaciones de tus clientes
Si eres una agencia o un software que da agentes a sus clientes, crea una organización por
cliente (permiso admin). Cada una nace con su equipo General y su builder, y no comparte nada
con las demás.
Para actuar en ella, añade su id en cada llamada: SignalCore-Org: org_….
Tokens de persona
Para que tus usuarios hablen con un agente desde tu producto, tu servidor crea un token para
cada uno (permiso talk). Dura una hora y solo deja hablar con los agentes que nombres y ver
sus propias conversaciones.
Con una clave publicable, la página manda también SignalCore-Visitor: <id>: un id del
visitante que la página guarda (16 a 128 caracteres de A-Za-z0-9_-). Los componentes de
chat web lo hacen por ti.
Webhooks
Para enterarte de lo que pasa sin preguntar, registra una dirección tuya (permiso admin):
Eventos: message.created, conversation.holder_changed, inbox.item_created,
run.finished, run.failed, call.ended, channel.status_changed, approval.requested.
Cada evento llega como POST con {id, type, created_at, org_id, data} y la cabecera
SignalCore-Signature: t=<segundos>,v1=<firma>. Compruébala sobre el cuerpo tal como llega:
Responde con un 2xx en 10 segundos. Si no, se reintenta (a los 15 s, 30, 60 y 120) y, tras el
quinto intento, se da por perdido. El id es el mismo en cada intento.
Escrituras sin repetir
Un POST, PUT, PATCH o DELETE puede llevar Idempotency-Key: <hasta 255 caracteres>. Si
lo mandas otra vez con la misma clave en las siguientes 24 horas, recibes la primera respuesta
(con Idempotent-Replayed: true) y no se hace dos veces.
Límites
600 llamadas por minuto por clave (o por persona de una clave). Pasado el límite, 429 con
Retry-After.
Errores
Los errores son {code, detail}: code para tu código, detail en palabras.
Si el cuerpo no tiene la forma esperada, el 422 es {"detail": [{"loc": [...], "msg": "..."}]}.