Salta al contingut

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

1

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.

2

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.

3

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.

4

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

Revoca

n8n

sat_Qm7t…p2Lk

Revocada

Clau creada

sat_Ab3k9Zq2Xv8Lp1Mn4Rt7Wy0Cd5Fg6Hj3Kl8Sx9ZqCopia

Aquesta é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ètodeRutaQuè faPermís
GET/meRetorna la teva organització i la clau amb què crides. Fes-lo servir per «provar la connexió» a Make o n8n.Qualsevol
GET/clientesLlista paginada de clients. Filtres: busqueda, tipo, activo i actualizadoDesde. Sense activo retorna també els arxivats.Lectura
POST/clientesCrea 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/proveedoresLlista paginada de proveïdors. Filtres: busqueda, activo, tipoProveedor, codigo i actualizadoDesde. Sense activo retorna també els arxivats.Lectura
POST/proveedoresCrea 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/reparacionesLlista 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}/reparacionesLes fitxes d'un client (pel seu id o el seu codi), amb els mateixos filtres.Lectura
GET/clientes/{id}/resumenResum 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
1

Primera passada

Recorre GET /clientes amb limit=100 i page=1, 2, 3… fins que s'esgoti totalPages. Desa l'hora d'inici.

2

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.

3

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_AUTORIZADO

Falta la clau, té un format que no és nostre o no existeix. Revisa la capçalera Authorization.

CLAVE_REVOCADA

La 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_REQUERIDO

L'organització és al pla gratuït. L'API torna a funcionar quan canvies a un pla de pagament.

PERMISO_DENEGADO

La 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_ENCONTRADO

No 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».

DUPLICADO

Ja 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.

VALIDACION

Algun 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_REQUERIDO

Aquest client necessita identificador fiscal: al teu país és obligatori per al tipus de client enviat (per exemple, sempre per a empreses).

RATE_LIMIT

Massa peticions. Espera els segons que indiqui la capçalera Retry-After i torna-ho a provar.

API_DESACTIVADA

L'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.

1

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.

2

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.

3

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.

4

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.

5

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).

Vols provar-ho tu mateix?

Prova Sattotal gratis amb dades d'exemple, sense targeta de crèdit.