API i integracions (CRM, Make, n8n)
Connecta el teu CRM o el teu ERP amb Sattotal mitjançant claus d'API: sincronitza clients i proveïdors de manera automàtica i segura
L'API de Sattotal permet que un altre programa —el teu CRM, el teu ERP, Make, n8n, Zapier o un script propi— llegeixi i creï clients i proveïdors a la teva organització sense que ningú hagi d'importar un CSV a mà. Es controla amb claus d'API que l'administrador crea a Configuració → API, cadascuna amb un nom propi i amb permisos per recurs, i que es poden revocar en qualsevol moment. Aquí tens què fa, com crear la clau, com cridar l'API i com muntar una sincronització amb Make pas a pas.
Connecta el teu CRM i les teves automatitzacions
Qualsevol eina capaç de fer una petició HTTP (Make, n8n, Zapier, el teu propi CRM o ERP) pot llegir, crear i actualitzar clients i proveïdors.
Claus amb nom i permisos
Una clau per integració, i dins de cada clau un permís per recurs: pots donar lectura de proveïdors sense donar escriptura de clients. Fins a 10 claus actives per organització.
Sincronització incremental
Amb el paràmetre actualizadoDesde només es porten els clients o proveïdors que han canviat des de l'última passada: ideal per a un escenari que s'executa cada pocs minuts.
Segura per disseny
La clau es mostra una sola vegada i es desa xifrada de manera irreversible. Cada clau només accedeix a les dades de la seva organització i es revoca a l'instant.
Qui la pot fer servir
Les claus les creen i revoquen els administradors de l'organització. L'API està inclosa en els plans de pagament (Basic, Pro i Enterprise) i durant el període de prova; al pla gratuït la pantalla mostra un cadenat amb l'opció de canviar de pla. Una clau sempre actua en nom de l'organització, no d'una persona: no hereta els permisos de cap tècnic ni apareix com a usuari a l'equip.
Com crear una clau
Entra a Configuració → API
Des del menú lateral, Configuració, targeta «API». Veuràs la llista de claus de la teva organització (actives i revocades) i una targeta «Com connectar» amb l'URL base i un exemple.
Prem «Nova clau»
Posa-li un nom que identifiqui la integració («CRM de la botiga», «Make», «n8n»). Així, si algun dia l'has de revocar, sabràs quina és.
Tria els permisos
Marca els recursos que necessiti la integració —Clients, Proveïdors o tots dos— i per a cadascun tria «Només lectura» (consultar) o «Lectura i escriptura» (consultar, crear, actualitzar i arxivar). Un recurs sense marcar és un recurs al qual la clau no arriba. Tria el mínim que necessiti.
Copia la clau i desa-la a la teva eina
La clau completa (comença per sat_) es mostra una sola vegada. Copia-la amb el botó i enganxa-la a Make, n8n o el teu CRM. Si la perds no es pot recuperar: es revoca i se'n crea una altra.
Configuració → API: llista de claus i clau acabada de crear
CRM Make
sat_Ab3k…x9Zq
n8n
sat_Qm7t…p2Lk
Clau creada
sat_Ab3k9Zq2Xv8Lp1Mn4Rt7Wy0Cd5Fg6Hj3Kl8Sx9ZqCopiaAquesta és l'única vegada que veuràs la clau completa. Si la perds, revoca-la i crea'n una altra.
Permisos d'una clau
Només lectura
Pot llistar i consultar aquell recurs. Qualsevol intent de crear, modificar o arxivar rep un error 403 amb el codi PERMISO_DENEGADO i el permís que li falta.
Lectura i escriptura
A més de consultar, pot crear, actualitzar i arxivar en aquell recurs. És el permís que necessita una sincronització bidireccional.
Els permisos són per recurs
Els permisos són per recurs, i això ja s'ha notat: quan es van afegir els proveïdors, les claus que existien —totes de clients— NO hi van guanyar accés. Va caldre marcar-ho. El mateix valdrà per a qualsevol recurs que s'afegeixi més endavant: una integració mai no veu més del que li vas concedir.
Com autenticar-se
Envia la clau a cada petició, de servidor a servidor, a la capçalera Authorization: Bearer sat_…. Si la teva eina no permet capçaleres d'autorització, també s'accepta a la capçalera x-api-key. L'URL base és la del teu Sattotal seguida de /api/v1 (la tens copiada a la pantalla de Configuració → API).
GET /api/v1/me Authorization: Bearer sat_Ab3k9…x9Zq
L'API no té CORS expressament: està pensada per a servidors i eines d'automatització, no per a pàgines web ni apps que s'executin al navegador dels teus clients. Una clau no ha d'arribar mai a un navegador.
Què es pot fer (endpoints)
Totes les respostes tenen la forma success + data (i pagination als llistats). Un client el pots demanar pel seu id o pel seu codi (CLI-0007); un proveïdor, només pel seu id.
| Mètode | Ruta | Què fa | Permís |
|---|---|---|---|
| GET | /me | Retorna la teva organització i la clau amb què crides. Fes-lo servir per «provar la connexió» a Make o n8n. | Qualsevol |
| GET | /clientes | Llista paginada de clients. Filtres: busqueda, tipo, activo i actualizadoDesde. Sense activo retorna també els arxivats. | Lectura |
| POST | /clientes | Crea un client amb les mateixes regles que el formulari (identificador fiscal segons el teu país, sense duplicats de NIF ni de correu). | Escriptura |
| GET | /clientes/{id} | Retorna un client per id o per codi. | Lectura |
| PATCH | /clientes/{id} | Actualitza només els camps enviats. PUT s'accepta com a sinònim. | Escriptura |
| DELETE | /clientes/{id} | Arxiva el client (activo = false). No esborra res i es pot repetir sense error. | Escriptura |
| GET | /proveedores | Llista paginada de proveïdors. Filtres: busqueda, activo, tipoProveedor, codigo i actualizadoDesde. Sense activo retorna també els arxivats. | Lectura |
| POST | /proveedores | Crea un proveïdor. Només el nom és obligatori. Si ja n'hi ha un amb el mateix identificador fiscal o el mateix nom, respon 409 amb l'id de l'existent. | Escriptura |
| GET | /proveedores/{id} | Retorna un proveïdor pel seu id. Aquí el codi NO serveix: mira l'avís de més avall. | Lectura |
| PATCH | /proveedores/{id} | Actualitza només els camps enviats. La llista de contactes se substitueix sencera. PUT s'accepta com a sinònim. | Escriptura |
| DELETE | /proveedores/{id} | Arxiva el proveïdor (activo = false). No esborra res i es pot repetir sense error. | Escriptura |
| GET | /reparaciones | Llista paginada de fitxes, de l'entrada més recent a la més antiga. Filtres: cliente, estado, entradaDesde, entradaHasta i actualizadoDesde. | Lectura |
| GET | /reparaciones/{id} | Retorna una fitxa pel seu id o pel seu número de fitxa. | Lectura |
| GET | /clientes/{id}/reparaciones | Les fitxes d'un client (pel seu id o el seu codi), amb els mateixos filtres. | Lectura |
| GET | /clientes/{id}/resumen | Resum d'activitat del client: quantes reparacions té (en total, obertes i per estat), quant se li ha pressupostat i quan va venir per última vegada. | Lectura |
Camps del client
Els camps són els mateixos que a la fitxa del client: nombre i tipo (particular o empresa) són obligatoris; nif_cif, apellidos, razonSocial, email, telefono, telefonoSecundario, direccion (calle, numero, piso, codigoPostal, localidad, provincia, pais) i notas són opcionals. L'identificador fiscal es desa en majúscules i el correu en minúscules. A la resposta totes les claus hi són sempre, amb null quan no hi ha valor, perquè el mapatge de camps a la teva eina no es trenqui. Compte amb el nom: nombre és el nom de pila (o el nom comercial si és una empresa) i el cognom va a part, a apellidos, en plural.
Camps que l'API no reconeix
Si el cos porta una clau que no existeix (per exemple firstName en lloc de nombre, o apellido en singular en lloc de apellidos), la petició no es rebutja, però aquella dada no es desa. Perquè no passi desapercebut, la resposta d'alta i d'edició de clients inclou avisos.camposIgnorados amb la llista d'aquestes claus; les de l'adreça porten la seva ruta, com direccion.ciudad. Si t'apareix, revisa el mapatge de camps de la teva integració. Els camps que retorna la mateixa API (id, codigo, createdAt…) no generen avís, així que pots llegir un client, canviar-lo i tornar-lo sencer.
POST /api/v1/clientes
{ "firstName": "Daniel", "nombre": "Florea", "tipo": "particular" }
201 Created
{
"success": true,
"data": { "nombre": "Florea", "apellidos": null, … },
"avisos": { "camposIgnorados": ["firstName"] }
}Exemple: crear un client
Petició
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"
}
}Proveïdors
A més dels clients, l'API exposa el catàleg de proveïdors: els mateixos cinc endpoints, els mateixos codis d'error i la mateixa sincronització incremental. És només el catàleg: les compres i les factures de proveïdor es queden on ja siguin, al teu ERP o a Sattotal.
Camps del proveïdor
Només nombre és obligatori. Opcionals: codigo, cif, email, telefono, telefonoSecundario, web, direccion (en una sola línia, no és un objecte com en clients), ciudad, provincia, codigoPostal, pais, contactos, tipoProveedor (general, producto, servicio, logistica o otro), formaPago, plazoPago (en dies; 0 és al comptat), cuentaCliente i notas. Cada contacte porta nombre —obligatori—, cargo, telefono, email i notas; els contactes no tenen identificador propi.
Com s'actualitzen els contactes
La llista que envies SUBSTITUEIX la que hi havia. Si envies una llista buida, s'esborren tots els contactes; si no envies la clau (o envies null), es queden com estaven. Això és el que fa que puguis llegir un proveïdor, canviar-li un camp i tornar-lo sencer sense efectes estranys.
Petició
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"
}
}Les dades bancàries no surten per l'API
L'IBAN i els comptes bancaris del proveïdor no es retornen ni s'accepten, expressament: si una clau es filtrés, no serviria per al frau de canvi de compte, que és el més comú amb proveïdors. Sí que surt cuentaCliente, que és el TEU número de client en aquell proveïdor i amb el qual un ERP concilia les seves compres.
El recàrrec d'equivalència és de només lectura
El camp excluidoRecargoEquivalencia es retorna i el pots reenviar amb el mateix valor (per poder tornar l'objecte sencer), però canviar-lo per API respon 400: decideix si a les teves compres a aquell proveïdor se'ls aplica el recàrrec, és a dir, mou la base imposable de les teves factures de compra. Es canvia des de la fitxa del proveïdor. Fora d'Espanya no té cap efecte.
El codi de proveïdor no localitza
A diferència del de client, el codi del proveïdor (PROV-004) no és únic: es pot repetir fins i tot dins del teu propi taller. Per això GET /proveedores/{id} només accepta l'id. Si el teu ERP només desa el codi, fes servir el filtre del llistat: GET /proveedores?codigo=PROV-004, que retorna tots els que hi coincideixin i decideixes tu.
Fitxes de reparació (només lectura)
L'API també permet consultar les fitxes de reparació: número de fitxa, estat, dates, l'aparell (tipus, marca, model, número de sèrie, IMEI) i el pressupost. És només lectura: les fitxes es continuen creant i canviant d'estat des de Sattotal, que és on se signen el resguard i el lliurament. La clau necessita el recurs Reparacions marcat; les claus de clients o proveïdors no hi arriben.
Camps de la fitxa
Cada fitxa porta numeroFicha, estado, prioridad, ubicacion, averiaDeclarada, diagnostico, les dates del cicle (entrada, inici i fi del diagnòstic i de la reparació, avís al client, lliurament i ultimoCambioEstado, quan va passar al seu estat actual), un resum del client (id, codigo, codigoVisible, nombre, apellidos, razonSocial), l'aparell (id, codigo, tipo, marca, modelo, numeroSerie, imei, color), el pressupost (numero, total, estado, fechaEnvio i fechaRespuesta, o null si no en té), el tècnic assignat (només el seu nom) i plazoEntregaEstimado, el termini que es va indicar al client al resguard. No surten mai les notes internes, les signatures, les fotos, els documents ni les contrasenyes de l'aparell.
Petició
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 }
}Localitzar el client pel telèfon que truca
Si el teu CRM o la teva centraleta obre la fitxa del client quan entra una trucada, fes servir GET /clientes?telefono=<número>. Busca al telèfon principal i al secundari i ignora com estigui escrit: espais, guions, el prefix internacional del teu país (+34 o 0034) i el 0 inicial. Així «612 345 678» troba un client desat com a «+34 612-345-678». Calen com a mínim 6 dígits.
Resum del client per al teu CRM
GET /clientes/{id}/resumen retorna en una sola crida el que sol mostrar un CRM a la fitxa del client: totalReparaciones, reparacionesAbiertas (l'aparell continua al taller), porEstado, totalPresupuestado i totalPresupuestosAprobados (en la moneda del taller, que arriba a moneda), primeraReparacion, ultimaReparacion i ultimaActividad (l'últim canvi en qualsevol de les seves fitxes). Necessita el recurs Reparacions, igual que les fitxes.
Petició
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",
…
}
}Sincronitzar només el que ha canviat
No cal portar-ho tot a cada passada. Desa a la teva eina la data i l'hora de l'última execució i demana només els clients o proveïdors modificats des d'aleshores amb el paràmetre actualizadoDesde. La resposta arriba ordenada per data de modificació ascendent i amb un desempat estable, així que la pots paginar sense saltar-te registres. Els arxivats també hi apareixen (amb activo = false), perquè el teu CRM pugui reflectir l'arxivament.
GET /api/v1/clientes?actualizadoDesde=2026-09-18T10:00:00Z&limit=100&page=1 Authorization: Bearer sat_Ab3k9…x9Zq
Primera passada
Recorre GET /clientes amb limit=100 i page=1, 2, 3… fins que s'esgoti totalPages. Desa l'hora d'inici.
Passades següents
Demana GET /clientes?actualizadoDesde=<hora desada> i processa només el que arribi. Torna a desar l'hora d'inici d'aquesta passada.
Enllaça, no dupliquis
Desa l'id de Sattotal al costat del registre del teu CRM. Si en crear reps un 409 DUPLICADO, la resposta porta existenteId: enllaça aquest en lloc de crear-ne un altre.
Paginació i cerca
Els llistats accepten page (des de 1) i limit (25 per defecte, 100 com a màxim; si en demanes més es retalla a 100). El camp busqueda busca al nom, cognoms, raó social, identificador fiscal, correu, codi i telèfon.
Codis d'error i què fer
Totes les respostes d'error porten success: false, un text orientatiu i un code estable pensat per decidir per programa. Aquests són els que pots rebre:
NO_AUTORIZADOFalta la clau, té un format que no és nostre o no existeix. Revisa la capçalera Authorization.
CLAVE_REVOCADALa clau era vàlida però un administrador la va revocar. Crea'n una de nova a Configuració → API i actualitza-la a la teva eina.
PLAN_REQUERIDOL'organització és al pla gratuït. L'API torna a funcionar quan canvies a un pla de pagament.
PERMISO_DENEGADOLa clau no té el permís necessari per a aquella operació. La resposta indica a ambitoRequerido quin falta: crea una clau amb aquest permís.
NO_ENCONTRADONo hi ha cap client o proveïdor amb aquest id a la teva organització. Els d'altres organitzacions no són mai visibles, i no es distingeix «no existeix» de «no és teu».
DUPLICADOJa existeix un registre amb aquesta dada: identificador fiscal o correu en clients; identificador fiscal, nom o codi en proveïdors. La resposta porta campo i existenteId perquè el puguis enllaçar en lloc de crear-ne un altre.
VALIDACIONAlgun camp no passa la validació (o el JSON està mal format). A details hi ha el camp i el motiu, igual que al formulari.
IDENTIFICADOR_FISCAL_REQUERIDOAquest client necessita identificador fiscal: al teu país és obligatori per al tipus de client enviat (per exemple, sempre per a empreses).
RATE_LIMITMassa peticions. Espera els segons que indiqui la capçalera Retry-After i torna-ho a provar.
API_DESACTIVADAL'API està desactivada temporalment per manteniment. Torna-ho a provar més tard.
Límits
120 peticions per minut i clau (de sobres per a una sincronització periòdica; frena un bucle accidental). 10 claus actives per organització. Els llistats retornen com a màxim 100 registres per pàgina. Si l'organització és al pla gratuït amb la quota mensual exhaurida, l'alta de clients es talla igual que a l'aplicació.
Pas a pas: sincronitzar clients amb Make
Un escenari típic: cada 15 minuts, portar al teu CRM els clients i proveïdors nous o modificats a Sattotal. A n8n és equivalent amb el node HTTP Request i un node Schedule.
Crea la clau a Sattotal
Configuració → API → Nova clau, permís «Només lectura» si només llegiràs, «Lectura i escriptura» si també crearàs clients des del CRM. Copia la clau.
Mòdul HTTP «Make a request»
URL: la teva URL base + /clientes. Mètode GET. Capçalera Authorization amb el valor Bearer i la teva clau. Marca «Parse response» per treballar amb el JSON.
Prova la connexió
Abans de res, executa una vegada una petició a /me: si retorna la teva organització i el nom de la clau, l'autenticació és correcta.
Afegeix el filtre incremental
Desa la data de l'última execució en un Data store o una variable i passa-la com a actualizadoDesde a l'URL. Programa l'escenari cada 15 minuts.
Mapeja els camps cap al teu CRM
Itera data[] i mapeja id, codigo, nombre, apellidos, email, telefono, nif_cif i direccion. Desa l'id de Sattotal al teu CRM per actualitzar en lloc de duplicar.
Per crear clients des del CRM, un altre mòdul HTTP amb el mètode POST a /clientes i el cos JSON del client. Si reps un 409, fes servir existenteId per enllaçar.
Bones pràctiques de seguretat
Una clau per integració
Així en pots revocar una sense trencar les altres, i a la llista veus quan es va fer servir cadascuna per última vegada.
Mai al navegador ni en un repositori públic
Desa-la al magatzem de credencials de la teva eina (connexions de Make, credencials de n8n, variables d'entorn). Si la puges a un repositori o a una web, considera-la filtrada.
Si es filtra, revoca-la i crea'n una altra
La revocació és immediata: la clau antiga comença a rebre 401 CLAVE_REVOCADA. Actualitza la nova a la teva eina i llestos.
Especificació de l'API
La referència tècnica completa (rutes, paràmetres, esquemes i codis d'error) està publicada en format obert a /api/v1/openapi.json, sense necessitat de clau. Per defecte surt en castellà; afegeix ?lang= amb el teu idioma per tenir-la traduïda (per exemple /api/v1/openapi.json?lang=en o ?lang=ro). La pots importar a Postman, Insomnia, Make o n8n per tenir totes les crides preparades.
Preguntes freqüents
He perdut la clau, la puc tornar a veure?
No. Només es mostra quan es crea i després es desa de manera irreversible. Revoca-la a Configuració → API i crea'n una altra.
Hi ha webhooks perquè Sattotal avisi el meu CRM quan canvia alguna cosa?
Encara no. La manera recomanada és consultar periòdicament amb el paràmetre actualizadoDesde, que només retorna el que ha canviat.
Quines dades exposa l'API?
Clients i proveïdors: llistar, crear, consultar, actualitzar i arxivar. Els permisos són per recurs, així que una clau creada abans que existissin els proveïdors no hi accedeix fins que un administrador li ho marqui. A més, les fitxes de reparació en només lectura (estat, dates, aparell i pressupost), amb el seu propi permís.
Puc esborrar un client per API?
No, només arxivar-lo (activo = false), igual que a l'aplicació. Val tant per a clients com per a proveïdors. Un registre arxivat continua apareixent a la sincronització perquè el teu CRM el reflecteixi.
L'API és al pla gratuït?
No. Està inclosa a Basic, Pro i Enterprise i durant el període de prova. Al pla gratuït pots continuar veient i revocant les claus que vas crear.
Només m'arriba el cognom del client, per què no es desa el nom?
Gairebé sempre és el mapatge de camps: el nom de pila ha d'anar a nombre i el cognom a apellidos. Si la teva eina envia el nom amb una altra clau (firstName, name, apellido…), l'API la descarta i t'ho indica a avisos.camposIgnorados de la resposta. Corregeix el mapatge i torna a enviar el client amb un PATCH.
Puc trobar el client amb el número que m'està trucant?
Sí. Demana GET /api/v1/clientes?telefono= amb el número tal com t'arriba: tant és que porti prefix internacional, espais o guions, i busca també al telèfon secundari. Amb el seu id pots demanar després les seves fitxes (/clientes/{id}/reparaciones) i el seu resum (/clientes/{id}/resumen).
