Autenticación
Dirección base: https://tamizia.com/api/v1 (o la vuestra, si tenéis Tamizia instalado en vuestros servidores). Todo va por HTTPS, en JSON, y cada respuesta trae "ok".
Cada petición lleva la clave en la cabecera Authorization: Bearer …. Hay dos claves, para dos usos distintos:
| Clave | Para | Dónde se genera |
|---|---|---|
| tzc_… | El chat por API (CRM, intranet, bots). Gasta la cuenta de IA de la empresa. | Panel → Chat → Proveedores |
| tz_… | La extensión, el hook de Claude Code y las apps que solo leen la política y mandan eventos. | Panel → Instalación |
Authorization: Bearer tzc_3f9a…{ "ok": false, "error": "clave no válida" }Qué pasa con el texto
Con la extensión, el texto se tapa en el navegador de cada persona y a Tamizia no llega nunca. Con la API no hay navegador: el texto llega a nuestro servidor, se tapa en memoria, sale tapado hacia vuestra IA y la respuesta se destapa antes de devolvértela.
No se guarda ni el texto ni la respuesta. Lo único que queda es lo mismo que con la extensión: qué tipo de dato se tapó o se paró, cuándo y, si lo mandas, quién. Lo veis en el panel, en Actividad, como «Aplicación propia».
Enviar un mensaje
Manda la conversación con el texto en claro. Tamizia tapa lo sensible según las reglas de vuestra empresa, pregunta a vuestra IA y te devuelve la respuesta con los datos reales ya puestos.
Cuerpo
- mensajeslistaobligatorio
La conversación, de la más antigua a la más reciente (hasta 60). Empieza y acaba con un mensaje de
user.rol:useroassistanttexto: el texto tal cual, sin tapar
- modelotexto
Proveedor y modelo, por ejemplo
anthropic|claude-opus-5-5oazure|gpt-4o-empresa. Si no lo mandas, se usa el que la empresa tiene por defecto. - usuariocorreo
Quién pregunta. Solo sirve para que en Actividad se vea quién fue.
Respuesta
- respuestatexto
Lo que contestó la IA, con los datos reales en su sitio.
- modelotexto
El modelo que ha contestado.
- tapadoslista
Qué se tapó:
tipoycantidad. - avisoslista
Lo que la regla solo avisa: salió tal cual, pero conviene saberlo.
- fintexto
Por qué terminó la respuesta (
end_turn,stop,max_tokens…).
curl https://tamizia.com/api/v1/chat \
-H "Authorization: Bearer $TAMIZIA_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"mensajes": [
{"rol": "user", "texto": "Resume la ficha del cliente Juan Pérez Gil, DNI 12345678Z"}
],
"usuario": "ana@tuempresa.es"
}'
import os, requests
r = requests.post(
"https://tamizia.com/api/v1/chat",
headers={"Authorization": f"Bearer {os.environ['TAMIZIA_CLAVE']}"},
json={
"mensajes": [{"rol": "user", "texto": "Resume la ficha del cliente Juan Pérez Gil, DNI 12345678Z"}],
"usuario": "ana@tuempresa.es",
},
timeout=300,
)
datos = r.json()
if datos["ok"]:
print(datos["respuesta"])
else:
print("No se envió:", datos["error"])
const r = await fetch("https://tamizia.com/api/v1/chat", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.TAMIZIA_CLAVE}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
mensajes: [{ rol: "user", texto: "Resume la ficha del cliente Juan Pérez Gil, DNI 12345678Z" }],
usuario: "ana@tuempresa.es",
}),
});
const datos = await r.json();
console.log(datos.ok ? datos.respuesta : datos.error);
$c = curl_init('https://tamizia.com/api/v1/chat');
curl_setopt_array($c, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 300,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('TAMIZIA_CLAVE'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'mensajes' => [['rol' => 'user', 'texto' => 'Resume la ficha del cliente Juan Pérez Gil, DNI 12345678Z']],
'usuario' => 'ana@tuempresa.es',
]),
]);
$datos = json_decode(curl_exec($c), true);
echo $datos['ok'] ? $datos['respuesta'] : $datos['error'];
{
"ok": true,
"respuesta": "Juan Pérez Gil (DNI 12345678Z) es cliente desde 2019…",
"modelo": "anthropic|claude-opus-5-5",
"fin": "end_turn",
"tapados": [
{ "tipo": "PERSONA", "cantidad": 1 },
{ "tipo": "DNI", "cantidad": 1 }
],
"avisos": []
}Resume la ficha del cliente [PERSONA_1], DNI [DNI_1]Cuando algo se bloquea
Si el texto lleva algo que la regla de la empresa manda bloquear (una tarjeta, una clave de acceso, una palabra propia…), no sale nada hacia la IA. La API responde 422 y dice qué tipo de dato era en bloqueado, para que tu aplicación pueda explicárselo a la persona.
El intento queda en Actividad como bloqueado, igual que con la extensión.
{
"ok": false,
"error": "el mensaje lleva tarjetas y las reglas de la empresa no dejan que salga",
"bloqueado": "TARJETA"
}Política de la empresa
Las reglas que aplica la extensión: qué hacer con cada tipo de dato y las palabras propias. Con la clave tz_. La extensión la pide cada 15 minutos; si haces tu propia integración, guárdala y pídela de vez en cuando, no en cada mensaje.
Respuesta
- reglasobjeto
Para cada tipo de dato, la acción:
permitir,avisar,tapar,motivoobloquear. - palabraslista
Palabras propias de la empresa con su acción (
texto,accion). - fallo_cerradosí / no
Si la revisión falla, ¿se para el envío? Lo decide la empresa en Ajustes.
- departamentoslista
Los departamentos, para atribuir los eventos.
curl https://tamizia.com/api/v1/politica \
-H "Authorization: Bearer $TAMIZIA_CLAVE_EXTENSION"{
"ok": true,
"empresa": "Asesoría Norte",
"reglas": { "DNI": "tapar", "TARJETA": "bloquear", "EMAIL": "avisar", … },
"palabras": [{ "texto": "Proyecto Faro", "accion": "bloquear" }],
"fallo_cerrado": true,
"departamentos": ["Contabilidad", "Laboral"]
}Registrar eventos
Para que lo que tapa tu propia aplicación aparezca en el panel de la empresa. Hasta 100 eventos por llamada. Nunca mandes el dato: solo qué tipo era y qué se hizo; lo que no encaja se descarta.
Cada evento
- tipotextoobligatorio
Uno de los tipos de dato.
- acciontextoobligatorio
avisar,tapar,motivoobloquear. - sitiotextoobligatorio
Dónde:
apipara tu aplicación; tambiénchatgpt,copilot,gemini,claude… - cantidadnúmero
Cuántos datos de ese tipo (1 si no se manda).
- usuario, departamentotexto
Quién y de qué departamento (debe llamarse igual que en el panel).
- motivotexto
Solo con
motivo: lo que escribió la persona para poder enviar.
curl https://tamizia.com/api/v1/eventos \
-H "Authorization: Bearer $TAMIZIA_CLAVE_EXTENSION" \
-H "Content-Type: application/json" \
-d '{"eventos": [
{"tipo": "DNI", "accion": "tapar", "sitio": "api", "usuario": "ana@tuempresa.es"}
]}'{ "ok": true, "recibidos": 1, "descartados": 0 }Tipos de dato
Lo que detecta Tamizia. Los números se comprueban de verdad (la letra del DNI, los dígitos de control del IBAN, el algoritmo de la tarjeta): uno inventado no se tapa.
| Tipo | Qué es | Marcador |
|---|---|---|
| DNI | DNI español, con letra de control | [DNI_1] |
| NIE | NIE, con letra de control | [NIE_1] |
| IBAN | Cuenta bancaria, con dígitos de control | [IBAN_1] |
| TARJETA | Tarjeta de pago (Luhn y prefijo) | [TARJETA_1] |
| CIF | CIF de empresa | [CIF_1] |
| NSS | Número de la Seguridad Social | [NSS_1] |
| CLAVE | Claves de API (OpenAI, AWS, GitHub, Slack…) | [CLAVE_1] |
| CONTRASENA | Contraseñas escritas tras «password:», «clave:»… | [CONTRASENA_1] |
| Correos electrónicos | [EMAIL_1] | |
| TELEFONO | Teléfonos españoles | [TELEFONO_1] |
| PERSONA | Nombres, por el contexto («cliente», «paciente», «para…») | [PERSONA_1] |
| PROPIA | Palabras propias de la empresa | [PROPIA_1] |
Errores
Siempre con "ok": false y un "error" escrito para una persona.
| Código | Cuándo |
|---|---|
| 400 | La petición está mal formada (falta mensajes, un rol no vale…). |
| 401 | Falta la clave o no es válida (o se ha anulado). |
| 405 | Método equivocado: /chat y /eventos van con POST. |
| 409 | La empresa no tiene ninguna IA conectada, o no se puede leer su clave. |
| 422 | El mensaje lleva algo que se bloquea. Mira bloqueado. |
| 429 | Demasiadas peticiones. Espera y vuelve a intentarlo. |
| 502 | El proveedor de IA ha fallado o ha rechazado la petición; el error dice por qué. |
Límites
| Qué | Límite |
|---|---|
| /v1/chat | 120 peticiones cada 10 minutos por empresa · hasta 60 mensajes · unos 250 KB por petición |
| /v1/politica, /v1/eventos | 600 peticiones por minuto por empresa · 100 eventos por llamada |
| Claves mal puestas | 30 intentos fallidos cada 10 minutos desde la misma IP |
¿Necesitáis más? En la instalación en vuestros servidores los límites los ponéis vosotros.