API e integracións (CRM, Make, n8n)
Conecta o teu CRM ou o teu ERP con Sattotal mediante chaves de API: sincroniza clientes e provedores de forma automática e segura
A API de Sattotal permite que outro programa —o teu CRM, o teu ERP, Make, n8n, Zapier ou un script propio— lea e cree clientes e provedores na túa organización sen que ninguén teña que importar un CSV a man. Contrólase con chaves de API que o administrador crea en Configuración → API, cada unha co seu nome e con permisos por recurso, e que se poden revogar en calquera momento. Aquí tes que fai, como crear a chave, como chamar á API e como montar unha sincronización con Make paso a paso.
Conecta o teu CRM e as túas automatizacións
Calquera ferramenta capaz de facer unha petición HTTP (Make, n8n, Zapier, o teu propio CRM ou ERP) pode ler, crear e actualizar clientes e provedores.
Chaves con nome e permisos
Unha chave por integración, e dentro de cada chave un permiso por recurso: podes dar lectura de provedores sen dar escritura de clientes. Ata 10 chaves activas por organización.
Sincronización incremental
Co parámetro actualizadoDesde só se traen os clientes ou provedores que cambiaron desde a última pasada: ideal para un escenario que se executa cada poucos minutos.
Segura por deseño
A chave móstrase unha única vez e gárdase cifrada de forma irreversible. Cada chave só accede aos datos da súa organización e revógase ao instante.
Quen pode usala
As chaves créanas e revógannas os administradores da organización. A API está incluída nos plans de pago (Basic, Pro e Enterprise) e durante o período de proba; no plan gratuíto a pantalla mostra un cadeado coa opción de cambiar de plan. Unha chave sempre actúa en nome da organización, non dunha persoa: non herda os permisos de ningún técnico nin aparece como usuario no equipo.
Como crear unha chave
Entra en Configuración → API
Desde o menú lateral, Configuración, tarxeta «API». Verás a lista de chaves da túa organización (activas e revogadas) e unha tarxeta «Como conectar» co URL base e un exemplo.
Preme «Nova chave»
Ponlle un nome que identifique a integración («CRM da tenda», «Make», «n8n»). Así, se algún día tes que revogala, saberás cal é.
Escolle os permisos
Marca os recursos que precise a integración —Clientes, Provedores ou os dous— e para cada un escolle «Só lectura» (consultar) ou «Lectura e escritura» (consultar, crear, actualizar e arquivar). Un recurso sen marcar é un recurso ao que a chave non chega. Escolle o mínimo que precise.
Copia a chave e gárdaa na túa ferramenta
A chave completa (comeza por sat_) móstrase unha única vez. Cópiaa co botón e pégaa en Make, n8n ou no teu CRM. Se a perdes non se pode recuperar: revógase e créase outra.
Configuración → API: lista de chaves e chave acabada de crear
CRM Make
sat_Ab3k…x9Zq
n8n
sat_Qm7t…p2Lk
Chave creada
sat_Ab3k9Zq2Xv8Lp1Mn4Rt7Wy0Cd5Fg6Hj3Kl8Sx9ZqCopiarEsta é a única vez que verás a chave completa. Se a perdes, revógaa e crea outra.
Permisos dunha chave
Só lectura
Pode listar e consultar ese recurso. Calquera intento de crear, modificar ou arquivar recibe un erro 403 co código PERMISO_DENEGADO e o permiso que lle falta.
Lectura e escritura
Ademais de consultar, pode crear, actualizar e arquivar nese recurso. É o permiso que precisa unha sincronización bidireccional.
Os permisos son por recurso
Os permisos son por recurso, e iso xa se notou: ao engadir os provedores, as chaves que existían —todas de clientes— NON gañaron acceso a eles. Houbo que marcalo. O mesmo valerá para calquera recurso que se engada despois: unha integración nunca ve máis do que lle concediches.
Como autenticarse
Envía a chave en cada petición, de servidor a servidor, na cabeceira Authorization: Bearer sat_…. Se a túa ferramenta non permite cabeceiras de autorización, tamén se acepta na cabeceira x-api-key. O URL base é o do teu Sattotal seguido de /api/v1 (tes copiado na pantalla de Configuración → API).
GET /api/v1/me Authorization: Bearer sat_Ab3k9…x9Zq
A API non ten CORS a propósito: está pensada para servidores e ferramentas de automatización, non para páxinas web nin aplicacións que se executen no navegador dos teus clientes. Unha chave nunca debe chegar a un navegador.
Que se pode facer (endpoints)
Todas as respostas levan a forma success + data (e pagination nas listaxes). Un cliente podes pedilo polo seu id ou polo seu código (CLI-0007); un provedor, só polo seu id.
| Método | Ruta | Que fai | Permiso |
|---|---|---|---|
| GET | /me | Devolve a túa organización e a chave coa que chamas. Úsao para «probar a conexión» en Make ou n8n. | Calquera |
| GET | /clientes | Listaxe paxinada de clientes. Filtros: busqueda, tipo, activo e actualizadoDesde. Sen activo devolve tamén os arquivados. | Lectura |
| POST | /clientes | Crea un cliente coas mesmas regras que o formulario (identificador fiscal segundo o teu país, sen duplicados de NIF nin de email). | Escritura |
| GET | /clientes/{id} | Devolve un cliente por id ou por código. | Lectura |
| PATCH | /clientes/{id} | Actualiza só os campos enviados. PUT acéptase como sinónimo. | Escritura |
| DELETE | /clientes/{id} | Arquiva o cliente (activo = false). Non borra nada e pódese repetir sen erro. | Escritura |
| GET | /proveedores | Listaxe paxinada de provedores. Filtros: busqueda, activo, tipoProveedor, codigo e actualizadoDesde. Sen activo devolve tamén os arquivados. | Lectura |
| POST | /proveedores | Crea un provedor. Só o nome é obrigatorio. Se xa hai un co mesmo identificador fiscal ou o mesmo nome, responde 409 co id do existente. | Escritura |
| GET | /proveedores/{id} | Devolve un provedor polo seu id. Aquí o código NON vale: mira o aviso de máis abaixo. | Lectura |
| PATCH | /proveedores/{id} | Actualiza só os campos enviados. A lista de contactos substitúese enteira. PUT acéptase como sinónimo. | Escritura |
| DELETE | /proveedores/{id} | Arquiva o provedor (activo = false). Non borra nada e pódese repetir sen erro. | Escritura |
| GET | /reparaciones | Listaxe paxinada de fichas, da entrada máis recente á máis antiga. Filtros: cliente, estado, entradaDesde, entradaHasta e actualizadoDesde. | Lectura |
| GET | /reparaciones/{id} | Devolve unha ficha polo seu id ou polo seu número de ficha. | Lectura |
| GET | /clientes/{id}/reparaciones | As fichas dun cliente (polo seu id ou o seu código), cos mesmos filtros. | Lectura |
| GET | /clientes/{id}/resumen | Resumo da actividade do cliente: cantas reparacións ten (en total, abertas e por estado), canto se lle orzamentou e cando veu por última vez. | Lectura |
Campos do cliente
Os campos son os mesmos que na ficha do cliente: nombre e tipo (particular ou empresa) son obrigatorios; nif_cif, apellidos, razonSocial, email, telefono, telefonoSecundario, direccion (calle, numero, piso, codigoPostal, localidad, provincia, pais) e notas son opcionais. O identificador fiscal gárdase en maiúsculas e o email en minúsculas. Na resposta todas as claves están sempre presentes, con null cando non hai valor, para que o mapeamento de campos na túa ferramenta non se rompa. Ollo co nome: nombre é o nome de pía (ou o nome comercial se é unha empresa) e o apelido vai á parte, en apellidos, en plural.
Campos que a API non recoñece
Se o corpo trae unha clave que non existe (por exemplo firstName en vez de nombre, ou apellido en singular en vez de apellidos), a petición non se rexeita, pero ese dato non se garda. Para que non pase desapercibido, a resposta de alta e de edición de clientes inclúe avisos.camposIgnorados coa lista desas claves; as do enderezo levan a súa ruta, como direccion.ciudad. Se che aparece, revisa o mapeamento de campos da túa integración. Os campos que devolve a propia API (id, codigo, createdAt…) non xeran aviso, así que podes ler un cliente, cambialo e devolvelo enteiro.
POST /api/v1/clientes
{ "firstName": "Daniel", "nombre": "Florea", "tipo": "particular" }
201 Created
{
"success": true,
"data": { "nombre": "Florea", "apellidos": null, … },
"avisos": { "camposIgnorados": ["firstName"] }
}Exemplo: crear un cliente
Petición
POST /api/v1/clientes
Authorization: Bearer sat_Ab3k9…x9Zq
Content-Type: application/json
{
"nombre": "Daniel",
"apellidos": "Florea",
"tipo": "empresa",
"razonSocial": "Assista Tech SRL",
"nif_cif": "RO12345678",
"codigoPersonalizado": "801",
"email": "daniel@example.com",
"telefono": "+40 700 000 000",
"direccion": { "localidad": "București", "pais": "RO" }
}Resposta (201)
{
"success": true,
"data": {
"id": "64b0…0001",
"codigo": "CLI-0042",
"codigoPersonalizado": "801",
"codigoVisible": "801",
"tipo": "empresa",
"nombre": "Daniel",
"apellidos": "Florea",
"razonSocial": "Assista Tech SRL",
"nif_cif": "RO12345678",
"email": "daniel@example.com",
"activo": true,
"createdAt": "2026-09-18T10:00:00.000Z",
"updatedAt": "2026-09-18T10:00:00.000Z"
}
}Provedores
Ademais dos clientes, a API expón o catálogo de provedores: os mesmos cinco endpoints, os mesmos códigos de erro e a mesma sincronización incremental. É só o catálogo: as compras e as facturas de provedor quedan onde xa estean, no teu ERP ou en Sattotal.
Campos do provedor
Só nombre é obrigatorio. Opcionais: codigo, cif, email, telefono, telefonoSecundario, web, direccion (nunha soa liña, non é un obxecto como en clientes), ciudad, provincia, codigoPostal, pais, contactos, tipoProveedor (general, producto, servicio, logistica ou otro), formaPago, plazoPago (en días; 0 é ao contado), cuentaCliente e notas. Cada contacto leva nombre —obrigatorio—, cargo, telefono, email e notas; os contactos non teñen identificador propio.
Como se actualizan os contactos
A lista que envías SUBSTITÚE a que había. Se envías unha lista baleira, bórranse todos os contactos; se non envías a clave (ou envías null), quedan como estaban. É o que fai que poidas ler un provedor, cambiarlle un campo e devolvelo enteiro sen efectos raros.
Petición
POST /api/v1/proveedores
Authorization: Bearer sat_Ab3k9…x9Zq
Content-Type: application/json
{
"nombre": "Distribuciones Norte",
"cif": "B12345678",
"tipoProveedor": "producto",
"plazoPago": 30,
"cuentaCliente": "C-4471",
"contactos": [
{ "nombre": "Ana Ruiz", "cargo": "Ventas", "email": "ana@norte.es" }
]
}Resposta (201)
{
"success": true,
"data": {
"id": "64b0…0009",
"codigo": "PROV-004",
"nombre": "Distribuciones Norte",
"cif": "B12345678",
"tipoProveedor": "producto",
"plazoPago": 30,
"cuentaCliente": "C-4471",
"contactos": [
{ "nombre": "Ana Ruiz", "cargo": "Ventas",
"telefono": null, "email": "ana@norte.es", "notas": null }
],
"excluidoRecargoEquivalencia": false,
"activo": true,
"createdAt": "2026-09-19T08:00:00.000Z",
"updatedAt": "2026-09-19T08:00:00.000Z"
}
}Os datos bancarios non saen pola API
O IBAN e as contas bancarias do provedor non se devolven nin se aceptan, a propósito: se unha chave se filtrase, non serviría para a fraude de cambio de conta, que é a máis común con provedores. Si sae cuentaCliente, que é O TEU número de cliente nese provedor e co que un ERP concilia as súas compras.
O recargo de equivalencia é de só lectura
O campo excluidoRecargoEquivalencia devólvese e podes reenvialo co mesmo valor (para poder devolver o obxecto enteiro), pero cambialo pola API responde 400: decide se ás túas compras a ese provedor se lles aplica o recargo, ou sexa, que move a base impoñible das túas facturas de compra. Cámbiase desde a ficha do provedor. Fóra de España non ten ningún efecto.
O código de provedor non localiza
A diferenza do de cliente, o código do provedor (PROV-004) non é único: pode repetirse mesmo dentro do teu propio taller. Por iso GET /proveedores/{id} só acepta o id. Se o teu ERP só garda o código, usa o filtro da listaxe: GET /proveedores?codigo=PROV-004, que devolve todos os que coincidan e decides ti.
Fichas de reparación (só lectura)
A API tamén permite consultar as fichas de reparación: número de ficha, estado, datas, o aparello (tipo, marca, modelo, número de serie, IMEI) e o orzamento. É só lectura: as fichas séguense creando e cambiando de estado desde Sattotal, que é onde se asinan o resgardo e a entrega. A chave precisa o recurso Reparacións marcado; as chaves de clientes ou provedores non chegan a elas.
Campos da ficha
Cada ficha trae numeroFicha, estado, prioridad, ubicacion, averiaDeclarada, diagnostico, as datas do ciclo (entrada, inicio e fin da diagnose e da reparación, aviso ao cliente, entrega e ultimoCambioEstado, cando pasou ao seu estado actual), un resumo do cliente (id, codigo, codigoVisible, nombre, apellidos, razonSocial), o aparello (id, codigo, tipo, marca, modelo, numeroSerie, imei, color), o orzamento (numero, total, estado, fechaEnvio e fechaRespuesta, ou null se non ten), o técnico asignado (só o seu nome) e plazoEntregaEstimado, o prazo que se lle indicou ao cliente no resgardo. Nunca saen as notas internas, as sinaturas, as fotos, os documentos nin os contrasinais do aparello.
Petición
GET /api/v1/clientes/CLI-0042/reparaciones?estado=reparado Authorization: Bearer sat_Ab3k9…x9Zq
Resposta (201)
{
"success": true,
"data": [{
"id": "64b0…0042",
"numeroFicha": "ORD-2026-0042",
"estado": "reparado",
"prioridad": "normal",
"averiaDeclarada": "No carga",
"diagnostico": "Conector de carga dañado",
"fechas": {
"entrada": "2026-09-20T09:00:00.000Z",
"finReparacion": "2026-09-22T17:30:00.000Z",
"entrega": null
},
"cliente": { "id": "64b0…0001", "codigoVisible": "801", "nombre": "Daniel" },
"dispositivo": {
"tipo": "movil", "marca": "Apple", "modelo": "iPhone 13",
"numeroSerie": "F2LXX0000", "imei": "356789012345678"
},
"presupuesto": { "numero": "PRES-2026-0010", "total": 89.9, "estado": "aprobado" },
"tecnico": { "nombre": "Andrei Popescu" },
"plazoEntregaEstimado": "3 días laborables"
}],
"pagination": { "total": 1, "page": 1, "limit": 25, "totalPages": 1 }
}Localizar o cliente polo teléfono que chama
Se o teu CRM ou a túa centraliña abre a ficha do cliente ao entrar unha chamada, usa GET /clientes?telefono=<número>. Busca no teléfono principal e no secundario e ignora como estea escrito: espazos, guións, o prefixo internacional do teu país (+34 ou 0034) e o 0 inicial. Así «612 345 678» atopa un cliente gardado como «+34 612-345-678». Fan falta polo menos 6 díxitos.
Resumo do cliente para o teu CRM
GET /clientes/{id}/resumen devolve nunha soa chamada o que adoita mostrar un CRM na ficha do cliente: totalReparaciones, reparacionesAbiertas (o aparello segue no taller), porEstado, totalPresupuestado e totalPresupuestosAprobados (na moeda do taller, que chega en moneda), primeraReparacion, ultimaReparacion e ultimaActividad (o último cambio en calquera das súas fichas). Precisa o recurso Reparacións, igual que as fichas.
Petición
GET /api/v1/clientes?telefono=0722 123 456
→ { "data": [{ "id": "64b0…0001", "codigoVisible": "801", "telefono": "+40 722 123 456", … }] }
GET /api/v1/clientes/801/resumen
{
"success": true,
"data": {
"cliente": { "id": "64b0…0001", "codigoVisible": "801" },
"moneda": "RON",
"totalReparaciones": 7,
"reparacionesAbiertas": 1,
"porEstado": { "entregado": 6, "en_reparacion": 1 },
"totalPresupuestosAprobados": 1240.5,
"ultimaReparacion": "2026-10-02T09:15:00.000Z",
"ultimaActividad": "2026-10-06T16:40:00.000Z",
…
}
}Sincronizar só o que cambiou
Non fai falta traer todo en cada pasada. Garda na túa ferramenta a data e hora da última execución e pide unicamente os clientes ou provedores modificados desde entón co parámetro actualizadoDesde. A resposta vén ordenada por data de modificación ascendente e cun desempate estable, así que podes paxinala sen saltar rexistros. Os arquivados tamén aparecen (con activo = false), para que o teu CRM poida reflectir o arquivo.
GET /api/v1/clientes?actualizadoDesde=2026-09-18T10:00:00Z&limit=100&page=1 Authorization: Bearer sat_Ab3k9…x9Zq
Primeira pasada
Percorre GET /clientes con limit=100 e page=1, 2, 3… ata esgotar totalPages. Garda a hora de inicio.
Pasadas seguintes
Pide GET /clientes?actualizadoDesde=<hora gardada> e procesa só o que chegue. Volve gardar a hora de inicio desta pasada.
Enlaza, non dupliques
Garda o id de Sattotal xunto ao rexistro do teu CRM. Se ao crear recibes un 409 DUPLICADO, a resposta trae existenteId: enlaza ese en vez de crear outro.
Paxinación e busca
As listaxes aceptan page (desde 1) e limit (25 por defecto, 100 como máximo; se pides máis recórtase a 100). O campo busqueda busca no nome, apelidos, razón social, identificador fiscal, email, código e teléfono.
Códigos de erro e que facer
Todas as respostas de erro levan success: false, un texto orientativo e un code estable pensado para decidir por programa. Estes son os que podes recibir:
NO_AUTORIZADOFalta a chave, ten un formato que non é o noso ou non existe. Revisa a cabeceira Authorization.
CLAVE_REVOCADAA chave era válida pero un administrador revogouna. Crea unha nova en Configuración → API e actualízaa na túa ferramenta.
PLAN_REQUERIDOA organización está no plan gratuíto. A API volve funcionar ao cambiar a un plan de pago.
PERMISO_DENEGADOA chave non ten o permiso necesario para esa operación. A resposta indica en ambitoRequerido cal falta: crea unha chave con ese permiso.
NO_ENCONTRADONon hai ningún cliente ou provedor con ese id na túa organización. Os doutras organizacións nunca son visibles, e non se distingue «non existe» de «non é teu».
DUPLICADOXa existe un rexistro con ese dato: identificador fiscal ou email en clientes; identificador fiscal, nome ou código en provedores. A resposta trae campo e existenteId para que poidas enlazalo en vez de crear outro.
VALIDACIONAlgún campo non pasa a validación (ou o JSON está mal formado). En details vai o campo e o motivo, igual que no formulario.
IDENTIFICADOR_FISCAL_REQUERIDOEse cliente precisa identificador fiscal: no teu país é obrigatorio para o tipo de cliente enviado (por exemplo, sempre para empresas).
RATE_LIMITDemasiadas peticións. Agarda os segundos que indique a cabeceira Retry-After e volve tentalo.
API_DESACTIVADAA API está desactivada temporalmente por mantemento. Téntao máis tarde.
Límites
120 peticións por minuto e chave (de sobra para unha sincronización periódica; frea un bucle accidental). 10 chaves activas por organización. As listaxes devolven como máximo 100 rexistros por páxina. Se a organización está no plan gratuíto coa cota mensual esgotada, a alta de clientes córtase igual que na aplicación.
Paso a paso: sincronizar clientes con Make
Un escenario típico: cada 15 minutos, traer ao teu CRM os clientes e provedores novos ou modificados en Sattotal. En n8n é equivalente co nodo HTTP Request e un nodo Schedule.
Crea a chave en Sattotal
Configuración → API → Nova chave, permiso «Só lectura» se só vas ler, «Lectura e escritura» se tamén vas crear clientes desde o CRM. Copia a chave.
Módulo HTTP «Make a request»
URL: o teu URL base + /clientes. Método GET. Cabeceira Authorization co valor Bearer e a túa chave. Marca «Parse response» para traballar co JSON.
Proba a conexión
Antes de nada, executa unha vez unha petición a /me: se devolve a túa organización e o nome da chave, a autenticación está ben.
Engade o filtro incremental
Garda a data da última execución nun Data store ou nunha variable e pásaa como actualizadoDesde no URL. Programa o escenario cada 15 minutos.
Mapea os campos cara ao teu CRM
Itera data[] e mapea id, codigo, nombre, apellidos, email, telefono, nif_cif e direccion. Garda o id de Sattotal no teu CRM para actualizar en vez de duplicar.
Para crear clientes desde o CRM, outro módulo HTTP co método POST a /clientes e o corpo JSON do cliente. Se recibes 409, usa existenteId para enlazar.
Boas prácticas de seguridade
Unha chave por integración
Así podes revogar unha sen romper as demais, e na lista ves cando se usou cada unha por última vez.
Nunca no navegador nin nun repositorio público
Gárdaa no almacén de credenciais da túa ferramenta (conexións de Make, credenciais de n8n, variables de contorno). Se a subes a un repositorio ou a unha web, considéraa filtrada.
Se se filtra, revógaa e crea outra
A revogación é inmediata: a chave antiga comeza a recibir 401 CLAVE_REVOCADA. Pon a nova na túa ferramenta e listo.
Especificación da API
A referencia técnica completa (rutas, parámetros, esquemas e códigos de erro) está publicada en formato aberto en /api/v1/openapi.json, sen necesidade de chave. Sen máis, sae en castelán; engade ?lang= co teu idioma para tela traducida (por exemplo /api/v1/openapi.json?lang=en ou ?lang=ro). Podes importala en Postman, Insomnia, Make ou n8n para ter todas as chamadas preparadas.
Preguntas frecuentes
Perdín a chave, podo volver vela?
Non. Só se mostra ao creala e despois gárdase de forma irreversible. Revógaa en Configuración → API e crea outra.
Hai webhooks para que Sattotal avise o meu CRM cando cambia algo?
Aínda non. A forma recomendada é consultar periodicamente co parámetro actualizadoDesde, que só devolve o que cambiou.
Que datos expón a API?
Clientes e provedores: listar, crear, consultar, actualizar e arquivar. Os permisos son por recurso, así que unha chave creada antes de que existisen os provedores non accede a eles ata que un administrador llo marque. Ademais, as fichas de reparación en só lectura (estado, datas, aparello e orzamento), co seu propio permiso.
Podo borrar un cliente pola API?
Non, só arquivalo (activo = false), igual que na aplicación. Vale tanto para clientes como para provedores. Un rexistro arquivado segue aparecendo na sincronización para que o teu CRM o reflicta.
A API está no plan gratuíto?
Non. Está incluída en Basic, Pro e Enterprise e durante o período de proba. No plan gratuíto podes seguir vendo e revogando as chaves que creaches.
Só me chega o apelido do cliente, por que non se garda o nome?
Case sempre é o mapeamento de campos: o nome de pía ten que ir en nombre e o apelido en apellidos. Se a túa ferramenta manda o nome con outra clave (firstName, name, apellido…), a API descártaa e indícacho en avisos.camposIgnorados da resposta. Corrixe o mapeamento e volve enviar o cliente cun PATCH.
Podo atopar o cliente co número que me está chamando?
Si. Pide GET /api/v1/clientes?telefono= co número tal como che chega: dá igual que traia prefixo internacional, espazos ou guións, e busca tamén no teléfono secundario. Co seu id podes pedir despois as súas fichas (/clientes/{id}/reparaciones) e o seu resumo (/clientes/{id}/resumen).
