Salta al contingut

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

1

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.

2

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.

3

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.

4

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

Revoca

n8n

sat_Qm7t…p2Lk

Revocada

Clau creada

sat_Ab3k9Zq2Xv8Lp1Mn4Rt7Wy0Cd5Fg6Hj3Kl8Sx9ZqCopia

Esta é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ètodeRutaQuè faPermís
GET/meRetorna la teua organització i la clau amb què crides. Utilitza-ho per a «provar la connexió» en 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. 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/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 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
1

Primera passada

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

2

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.

3

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_AUTORIZADO

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

CLAVE_REVOCADA

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

L'organització està en el 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 eixa operació. La resposta indica en ambitoRequerido quin falta: crea una clau amb eixe permís.

NO_ENCONTRADO

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

DUPLICADO

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

VALIDACION

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

Eixe client necessita identificador fiscal: en el 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 indique 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 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.

1

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.

2

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.

3

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.

4

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.

5

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

Vols provar-ho tu mateix?

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