API i integracions (CRM, Make, n8n)
Connecta el teu CRM o el teu ERP amb Sattotal per mitjà de 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— llija i cree clients i proveïdors en la teua organització sense que ningú haja d'importar un CSV a mà. Es controla amb claus d'API que l'administrador crea en Configuració → API, cadascuna amb un nom propi i amb permisos per recurs, i que es poden revocar en qualsevol moment. Ací 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 teues automatitzacions
Qualsevol ferramenta 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 guarda xifrada de manera irreversible. Cada clau només accedix a les dades de la seua organització i es revoca en el moment.
Qui la pot utilitzar
Les claus les creen i les 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; en el 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 en l'equip.
Com crear una clau
Entra en Configuració → API
Des del menú lateral, Configuració, targeta «API». Veuràs la llista de claus de la teua organització (actives i revocades) i una targeta «Com connectar» amb l'URL base i un exemple.
Polsa «Nova clau»
Posa-li un nom que identifique la integració («CRM de la botiga», «Make», «n8n»). Així, si algun dia has de revocar-la, sabràs quina és.
Tria els permisos
Marca els recursos que necessite 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 necessite.
Copia la clau i guarda-la en la teua ferramenta
La clau completa (comença per sat_) es mostra una sola vegada. Copia-la amb el botó i apega-la en 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_Ab3k9Zq2Xv8Lp1Mn4Rt7Wy0Cd5Fg6Hj3Kl8Sx9ZqCopiaEsta é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 eixe 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 eixe 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'afija més avant: una integració mai no veu més del que li vas concedir.
Com autenticar-se
Envia la clau en cada petició, de servidor a servidor, en la capçalera Authorization: Bearer sat_…. Si la teua ferramenta no permet capçaleres d'autorització, també s'accepta en la capçalera x-api-key. L'URL base és la del teu Sattotal seguida de /api/v1 (la tens copiada en la pantalla de Configuració → API).
GET /api/v1/me Authorization: Bearer sat_Ab3k9…x9Zq
L'API no té CORS a propòsit: està pensada per a servidors i ferramentes d'automatització, no per a pàgines web ni apps que s'executen en el 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 en els 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 teua organització i la clau amb què crides. Utilitza-ho per a «provar la connexió» en 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. Ací el codi NO servix: mira l'avís de més avall. | Lectura |
| PATCH | /proveedores/{id} | Actualitza només els camps enviats. La llista de contactes se substituïx 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 vindre per última vegada. | Lectura |
Camps del client
Els camps són els mateixos que en 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 guarda en majúscules i el correu en minúscules. En la resposta totes les claus hi són sempre, amb null quan no hi ha valor, perquè el mapatge de camps en la teua ferramenta no es trenque. Compte amb el nom: nombre és el nom de pila (o el nom comercial si és una empresa) i el cognom va a banda, en apellidos, en plural.
Camps que l'API no reconeix
Si el cos porta una clau que no existix (per exemple firstName en lloc de nombre, o apellido en singular en lloc de apellidos), la petició no es rebutja, però eixa dada no es guarda. Perquè no passe desapercebut, la resposta d'alta i d'edició de clients inclou avisos.camposIgnorados amb la llista d'eixes claus; les de l'adreça porten la seua ruta, com direccion.ciudad. Si t'apareix, revisa el mapatge de camps de la teua 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 estiguen, en el teu ERP o en 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 SUBSTITUÏX 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 pugues 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 ixen per l'API
L'IBAN i els comptes bancaris del proveïdor no es retornen ni s'accepten, a propòsit: si una clau es filtrara, no serviria per al frau de canvi de compte, que és el més comú amb proveïdors. Sí que ix cuentaCliente, que és el TEU número de client en eixe proveïdor i amb el qual un ERP concilia les seues compres.
El recàrrec d'equivalència és de només lectura
El camp excluidoRecargoEquivalencia es retorna i pots reenviar-lo amb el mateix valor (per a poder tornar l'objecte sencer), però canviar-lo per API respon 400: decidix si a les teues compres a eixe proveïdor se'ls aplica el recàrrec, és a dir, mou la base imposable de les teues 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 guarda el codi, utilitza el filtre del llistat: GET /proveedores?codigo=PROV-004, que retorna tots els que hi coincidisquen i decidixes 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 en el resguard. No ixen mai les notes internes, les firmes, 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 des del qual telefona
Si el teu CRM o la teua centraleta obri la fitxa del client quan entra una cridada, utilitza GET /clientes?telefono=<número>. Busca en el telèfon principal i en el secundari i ignora com estiga escrit: espais, guions, el prefix internacional del teu país (+34 o 0034) i el 0 inicial. Així «612 345 678» troba un client guardat 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 en la fitxa del client: totalReparaciones, reparacionesAbiertas (l'aparell continua en el taller), porEstado, totalPresupuestado i totalPresupuestosAprobados (en la moneda del taller, que arriba en moneda), primeraReparacion, ultimaReparacion i ultimaActividad (l'últim canvi en qualsevol de les seues 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 en cada passada. Guarda en la teua ferramenta la data i l'hora de l'última execució i demana només els clients o proveïdors modificats des de llavors amb el paràmetre actualizadoDesde. La resposta arriba ordenada per data de modificació ascendent i amb un desempat estable, així que pots paginar-la sense botar-te registres. Els arxivats també hi apareixen (amb activo = false), perquè el teu CRM puga 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'esgote totalPages. Guarda l'hora d'inici.
Passades següents
Demana GET /clientes?actualizadoDesde=<hora guardada> i processa només el que arribe. Torna a guardar l'hora d'inici d'esta passada.
Enllaça, no dupliques
Guarda l'id de Sattotal al costat del registre del teu CRM. Si en crear reps un 409 DUPLICADO, la resposta porta existenteId: enllaça eixe en lloc de crear-ne un altre.
Paginació i cerca
Els llistats accepten page (des d'1) i limit (25 per defecte, 100 com a màxim; si en demanes més es retalla a 100). El camp busqueda busca en el 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 a decidir per programa. Estos són els que pots rebre:
NO_AUTORIZADOFalta la clau, té un format que no és nostre o no existix. Revisa la capçalera Authorization.
CLAVE_REVOCADALa clau era vàlida però un administrador la va revocar. Crea'n una de nova en Configuració → API i actualitza-la en la teua ferramenta.
PLAN_REQUERIDOL'organització està en el 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 eixa operació. La resposta indica en ambitoRequerido quin falta: crea una clau amb eixe permís.
NO_ENCONTRADONo hi ha cap client o proveïdor amb eixe id en la teua organització. Els d'altres organitzacions no són mai visibles, i no es distingix «no existix» de «no és teu».
DUPLICADOJa existix un registre amb eixa dada: identificador fiscal o correu en clients; identificador fiscal, nom o codi en proveïdors. La resposta porta campo i existenteId perquè pugues enllaçar-lo en lloc de crear-ne un altre.
VALIDACIONAlgun camp no passa la validació (o el JSON està mal format). En details hi ha el camp i el motiu, igual que en el formulari.
IDENTIFICADOR_FISCAL_REQUERIDOEixe client necessita identificador fiscal: en el teu país és obligatori per al tipus de client enviat (per exemple, sempre per a empreses).
RATE_LIMITMassa peticions. Espera els segons que indique 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 sobra 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ó està en el pla gratuït amb la quota mensual exhaurida, l'alta de clients es talla igual que en 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 en Sattotal. En n8n és equivalent amb el node HTTP Request i un node Schedule.
Crea la clau en 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 teua URL base + /clientes. Mètode GET. Capçalera Authorization amb el valor Bearer i la teua clau. Marca «Parse response» per a treballar amb el JSON.
Prova la connexió
Abans de res, executa una vegada una petició a /me: si retorna la teua organització i el nom de la clau, l'autenticació és correcta.
Afig el filtre incremental
Guarda la data de l'última execució en un Data store o una variable i passa-la com a actualizadoDesde en 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. Guarda l'id de Sattotal en el teu CRM per a actualitzar en lloc de duplicar.
Per a 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, utilitza existenteId per a enllaçar.
Bones pràctiques de seguretat
Una clau per integració
Així pots revocar-ne una sense trencar les altres, i en la llista veus quan es va utilitzar cadascuna per última vegada.
Mai en el navegador ni en un repositori públic
Guarda-la en el magatzem de credencials de la teua ferramenta (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 en la teua ferramenta i ja està.
Especificació de l'API
La referència tècnica completa (rutes, paràmetres, esquemes i codis d'error) està publicada en format obert en /api/v1/openapi.json, sense necessitat de clau. Per defecte ix en castellà; afig ?lang= amb el teu idioma per a tindre-la traduïda (per exemple /api/v1/openapi.json?lang=en o ?lang=ro). Pots importar-la en Postman, Insomnia, Make o n8n per a tindre totes les crides preparades.
Preguntes freqüents
He perdut la clau, puc tornar a veure-la?
No. Només es mostra quan es crea i després es guarda de manera irreversible. Revoca-la en Configuració → API i crea'n una altra.
Hi ha webhooks perquè Sattotal avise 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 existiren els proveïdors no hi accedix fins que un administrador li ho marque. 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 en l'aplicació. Val tant per a clients com per a proveïdors. Un registre arxivat continua apareixent en la sincronització perquè el teu CRM el reflectisca.
L'API està en el pla gratuït?
No. Està inclosa en Basic, Pro i Enterprise i durant el període de prova. En el 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 guarda el nom?
Quasi sempre és el mapatge de camps: el nom de pila ha d'anar en nombre i el cognom en apellidos. Si la teua ferramenta envia el nom amb una altra clau (firstName, name, apellido…), l'API la descarta i t'ho indica en avisos.camposIgnorados de la resposta. Corregix el mapatge i torna a enviar el client amb un PATCH.
Puc trobar el client amb el número que m'està telefonant?
Sí. Demana GET /api/v1/clientes?telefono= amb el número tal com t'arriba: és igual que porte prefix internacional, espais o guions, i busca també en el telèfon secundari. Amb el seu id pots demanar després les seues fitxes (/clientes/{id}/reparaciones) i el seu resum (/clientes/{id}/resumen).
