Saltar al contenido

API e integraciones con CRM, Make y n8n

Conecta tu CRM o tu ERP con Sattotal usando claves de API: sincroniza clientes y proveedores de manera automática y segura

La API de Sattotal permite que otro programa —tu CRM, tu ERP, Make, n8n, Zapier o un script propio— lea y cree clientes y proveedores en tu organización sin que nadie tenga que importar un CSV manualmente. Se controla con claves de API que el administrador crea en Configuración → API, cada una con su propio nombre y con permisos por recurso, y que se pueden revocar en cualquier momento. Aquí encontrarás qué hace, cómo crear la clave, cómo llamar a la API y cómo armar una sincronización con Make paso a paso.

Integra tu CRM y tus automatizaciones

Cualquier herramienta que pueda hacer una solicitud HTTP (Make, n8n, Zapier, tu propio CRM o ERP) puede leer, crear y actualizar clientes y proveedores.

Claves con nombre propio y permisos

Una clave para cada integración y, dentro de cada clave, un permiso por recurso: puedes otorgar lectura de proveedores sin otorgar escritura de clientes. Puedes tener hasta 10 claves activas por organización.

Sincronización solo de lo que cambió

Con el parámetro actualizadoDesde solo se descargan los clientes o proveedores que cambiaron desde la última ejecución: ideal para un escenario que corre cada pocos minutos.

Segura desde el diseño

La clave se muestra una sola vez y se guarda cifrada de manera irreversible. Cada clave accede únicamente a los datos de su organización y se puede revocar al instante.

Quiénes pueden usarla

Las claves las crean y revocan los administradores de la organización. La API está incluida en los planes de pago (Basic, Pro y Enterprise) y durante el periodo de prueba; en el plan gratuito la pantalla muestra un candado con la opción de cambiar de plan. Una clave siempre actúa a nombre de la organización, no de una persona: no hereda los permisos de ningún técnico ni aparece como usuario dentro del equipo.

Cómo crear una clave de API

1

Ingresa a Configuración → API

Desde el menú lateral, entra a Configuración y abre la tarjeta «API». Verás la lista de claves de tu organización (activas y revocadas) y una tarjeta «Cómo conectar» con la URL base y un ejemplo.

2

Haz clic en «Nueva clave»

Asígnale un nombre que identifique la integración («CRM de la tienda», «Make», «n8n»). Así, si algún día tienes que revocarla, sabrás cuál es.

3

Selecciona los permisos

Marca los recursos que necesite la integración —Clientes, Proveedores o ambos— y para cada uno selecciona «Solo lectura» (consultar) o «Lectura y escritura» (consultar, crear, actualizar y archivar). Un recurso sin marcar es un recurso al que la clave no llega. Selecciona el mínimo que la integración necesite.

4

Copia la clave y resguárdala en tu herramienta

La clave completa (empieza con sat_) se muestra una sola vez. Cópiala con el botón y pégala en Make, n8n o tu CRM. Si la pierdes no hay forma de recuperarla: se revoca y se crea una nueva.

Configuración → API: listado de claves y una clave recién creada

CRM Make

sat_Ab3k…x9Zq

Revocar

n8n

sat_Qm7t…p2Lk

Revocada

Clave creada

sat_Ab3k9Zq2Xv8Lp1Mn4Rt7Wy0Cd5Fg6Hj3Kl8Sx9ZqCopiar

Esta es la única vez que verás la clave completa. Si la pierdes, revócala y crea una nueva.

Qué permisos tiene una clave

Solo lectura

Puede listar y consultar ese recurso. Si intenta crear, modificar o archivar, recibe un error 403 con el código PERMISO_DENEGADO y el permiso que le hace falta.

Lectura y escritura

Además de consultar, puede crear, actualizar y archivar dentro de ese recurso. Es el permiso que requiere una sincronización en ambos sentidos.

Los permisos se otorgan por recurso

Los permisos son por recurso, y ya se notó: al agregar los proveedores, las claves que ya existían —todas de clientes— NO obtuvieron acceso a ellos. Hubo que marcarlo. Lo mismo va a pasar con cualquier recurso que se agregue después: una integración nunca ve más de lo que le otorgaste.

Cómo autenticarte

Envía la clave en cada solicitud, de servidor a servidor, en el encabezado Authorization: Bearer sat_…. Si tu herramienta no permite encabezados de autorización, también se acepta en el encabezado x-api-key. La URL base es la de tu Sattotal seguida de /api/v1 (la tienes lista para copiar en la pantalla de Configuración → API).

GET /api/v1/me
Authorization: Bearer sat_Ab3k9…x9Zq

La API no tiene CORS a propósito: está pensada para servidores y herramientas de automatización, no para sitios web ni apps que corran en el navegador de tus clientes. Una clave nunca debe llegar a un navegador.

Qué puedes hacer (endpoints)

Todas las respuestas tienen la forma success + data (y pagination en las listas). A un cliente puedes pedirlo por su id o por su código (CLI-0007); a un proveedor, únicamente por su id.

MétodoRutaPara qué sirvePermiso requerido
GET/meDevuelve tu organización y la clave con la que estás llamando. Úsalo para «probar la conexión» en Make o n8n.Cualquier permiso
GET/clientesLista paginada de clientes. Filtros: busqueda, tipo, activo y actualizadoDesde. Si no envías activo, devuelve también los archivados.Lectura
POST/clientesCrea un cliente con las mismas reglas que el formulario (identificación fiscal según tu país, sin duplicados de identificación fiscal ni de email).Escritura
GET/clientes/{id}Devuelve un cliente por su id o por su código.Lectura
PATCH/clientes/{id}Actualiza únicamente los campos enviados. PUT se acepta como sinónimo.Escritura
DELETE/clientes/{id}Archiva el cliente (activo = false). No borra nada y puede repetirse sin error.Escritura
GET/proveedoresLista paginada de proveedores. Filtros: busqueda, activo, tipoProveedor, codigo y actualizadoDesde. Si no envías activo, devuelve también los archivados.Lectura
POST/proveedoresCrea un proveedor. Únicamente el nombre es obligatorio. Si ya hay otro con la misma identificación fiscal o el mismo nombre, responde 409 e incluye el id del existente.Escritura
GET/proveedores/{id}Devuelve un proveedor a partir de su id. Aquí el código NO sirve: revisa el aviso que viene más abajo.Lectura
PATCH/proveedores/{id}Actualiza únicamente los campos enviados. La lista de contactos se reemplaza completa. PUT se acepta como sinónimo.Escritura
DELETE/proveedores/{id}Archiva el proveedor (activo = false). No borra nada y puede repetirse sin error.Escritura
GET/reparacionesLista paginada de órdenes, de la entrada más reciente a la más antigua. Filtros: cliente, estado, entradaDesde, entradaHasta y actualizadoDesde.Lectura
GET/reparaciones/{id}Devuelve una orden por su id o por su número de orden.Lectura
GET/clientes/{id}/reparacionesLas órdenes de un cliente (por su id o su código), con los mismos filtros.Lectura
GET/clientes/{id}/resumenResumen de actividad del cliente: cuántas reparaciones tiene (en total, abiertas y por estado), cuánto se le ha cotizado y cuándo vino por última vez.Lectura

Campos de un cliente

Los campos son los mismos que en la ficha del cliente: nombre y tipo (particular o empresa) son obligatorios; nif_cif, apellidos, razonSocial, email, telefono, telefonoSecundario, direccion (calle, numero, piso, codigoPostal, localidad, provincia, pais) y notas son opcionales. La identificación fiscal se guarda en mayúsculas y el email en minúsculas. En la respuesta todas las claves están siempre presentes, con null cuando no hay valor, para que el mapeo de campos en tu herramienta no falle. Atención con el nombre: nombre es el nombre de pila (o el nombre comercial si es una empresa) y el apellido va por separado, en apellidos, en plural.

Campos que la API no reconoce

Si el cuerpo incluye una clave que no existe (por ejemplo firstName en lugar de nombre, o apellido en singular en lugar de apellidos), la solicitud no se rechaza, pero ese dato no se guarda. Para que no pase inadvertido, la respuesta al crear y editar clientes incluye avisos.camposIgnorados con la lista de esas claves; las de la dirección llevan su ruta, como direccion.ciudad. Si aparece, revisa el mapeo de campos de tu integración. Los campos que devuelve la propia API (id, codigo, createdAt…) no generan aviso, así que puedes leer un cliente, modificarlo y enviarlo completo de vuelta.

POST /api/v1/clientes
{ "firstName": "Daniel", "nombre": "Florea", "tipo": "particular" }

201 Created
{
  "success": true,
  "data": { "nombre": "Florea", "apellidos": null, … },
  "avisos": { "camposIgnorados": ["firstName"] }
}

Ejemplo: cómo crear un cliente

Solicitud

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" }
}

Respuesta (código 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"
  }
}

Proveedores

La API no se limita a los clientes: también expone el catálogo de proveedores, con los mismos cinco endpoints, los mismos códigos de error y la misma sincronización incremental. Se trata únicamente del catálogo: las compras y las facturas de proveedor permanecen donde estén hoy, en tu ERP o en Sattotal.

Campos de un proveedor

Solo nombre es obligatorio. Son opcionales codigo, cif, email, telefono, telefonoSecundario, web, direccion (en una sola línea; aquí no es un objeto como en clientes), ciudad, provincia, codigoPostal, pais, contactos, tipoProveedor (general, producto, servicio, logistica u otro), formaPago, plazoPago (en días; 0 significa de contado), cuentaCliente y notas. Cada contacto lleva nombre —obligatorio—, cargo, telefono, email y notas; los contactos no tienen identificador propio.

Cómo se actualiza la lista de contactos

La lista que mandas REEMPLAZA a la anterior. Si mandas una lista vacía, se eliminan todos los contactos; si no mandas la clave (o mandas null), quedan tal como estaban. Gracias a eso puedes leer un proveedor, cambiarle un campo y devolverlo completo sin efectos inesperados.

Solicitud

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" }
  ]
}

Respuesta (código 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"
  }
}

Los datos bancarios no se exponen en la API

El IBAN y las cuentas bancarias del proveedor no se devuelven ni se aceptan, y es a propósito: si alguna clave se filtrara, no serviría para el fraude de cambio de cuenta, el más habitual con proveedores. Lo que sí se devuelve es cuentaCliente, que es TU número de cliente ante ese proveedor y con el que un ERP concilia sus compras.

El recargo de equivalencia solo se puede leer

El campo excluidoRecargoEquivalencia se devuelve y puedes reenviarlo con el mismo valor (para que puedas mandar el objeto completo), pero modificarlo por API responde 400: define si a tus compras con ese proveedor se les aplica el recargo, es decir, mueve la base imponible de tus facturas de compra. Se ajusta desde la ficha del proveedor. Fuera de España no produce ningún efecto.

El código de proveedor no sirve para localizarlo

A diferencia del código de cliente, el del proveedor (PROV-004) no es único: puede repetirse incluso dentro de tu propio taller. Por eso GET /proveedores/{id} acepta únicamente el id. Si tu ERP solo guarda el código, apóyate en el filtro de la lista: GET /proveedores?codigo=PROV-004 devuelve todos los que coincidan y tú decides cuál es.

Órdenes de reparación (solo lectura)

La API también permite consultar las órdenes de reparación: número de orden, estado, fechas, el equipo (tipo, marca, modelo, número de serie, IMEI) y la cotización. Es solo lectura: las órdenes se siguen creando y cambiando de estado desde Sattotal, que es donde se firman el comprobante de recepción y la entrega. La clave necesita el recurso Reparaciones marcado; las claves de clientes o proveedores no tienen acceso a ellas.

Campos de la orden

Cada orden trae numeroFicha, estado, prioridad, ubicacion, averiaDeclarada, diagnostico, las fechas del ciclo (entrada, inicio y fin del diagnóstico y de la reparación, aviso al cliente, entrega y ultimoCambioEstado, cuándo pasó a su estado actual), un resumen del cliente (id, codigo, codigoVisible, nombre, apellidos, razonSocial), el equipo (id, codigo, tipo, marca, modelo, numeroSerie, imei, color), la cotización (numero, total, estado, fechaEnvio y fechaRespuesta, o null si no tiene), el técnico asignado (solo su nombre) y plazoEntregaEstimado, el plazo que se le indicó al cliente en el comprobante de recepción. Nunca se exponen las notas internas, las firmas, las fotos, los documentos ni las contraseñas del equipo.

Solicitud

GET /api/v1/clientes/CLI-0042/reparaciones?estado=reparado
Authorization: Bearer sat_Ab3k9…x9Zq

Respuesta (código 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 }
}

Encuentra al cliente por el teléfono desde el que llama

Si tu CRM o tu conmutador abre la ficha del cliente al entrar una llamada, usa GET /clientes?telefono=<número>. Busca en el teléfono principal y en el secundario, sin importar cómo esté escrito: ignora espacios, guiones y el prefijo internacional de tu país (+52 o 0052). Así «55 1234 5678» encuentra a un cliente guardado como «+52 55-1234-5678». Se necesitan al menos 6 dígitos.

Resumen del cliente para tu CRM

GET /clientes/{id}/resumen devuelve en una sola llamada lo que suele mostrar un CRM en la ficha del cliente: totalReparaciones, reparacionesAbiertas (el equipo sigue en el taller), porEstado, totalPresupuestado y totalPresupuestosAprobados (en la moneda del taller, que viene en moneda), primeraReparacion, ultimaReparacion y ultimaActividad (el último cambio en cualquiera de sus órdenes). Necesita el recurso Reparaciones, igual que las órdenes.

Solicitud

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",
    …
  }
}

Sincroniza solo lo que cambió

No es necesario descargar todo en cada ejecución. Guarda en tu herramienta la fecha y hora de la última corrida y solicita únicamente los clientes o proveedores modificados desde entonces con el parámetro actualizadoDesde. La respuesta viene ordenada por fecha de modificación ascendente y con un criterio de desempate estable, así que puedes paginarla sin saltarte registros. Los archivados también aparecen (con activo = false), para que tu CRM pueda reflejar el archivado.

GET /api/v1/clientes?actualizadoDesde=2026-09-18T10:00:00Z&limit=100&page=1
Authorization: Bearer sat_Ab3k9…x9Zq
1

Primera ejecución

Recorre GET /clientes con limit=100 y page=1, 2, 3… hasta agotar totalPages. Guarda la hora de inicio.

2

Ejecuciones siguientes

Solicita GET /clientes?actualizadoDesde=<hora guardada> y procesa solo lo que llegue. Vuelve a guardar la hora de inicio de esta ejecución.

3

Vincula, no dupliques

Guarda el id de Sattotal junto al registro de tu CRM. Si al crear recibes un 409 DUPLICADO, la respuesta incluye existenteId: vincula ese registro en lugar de crear otro.

Paginación y filtros de búsqueda

Las listas aceptan page (desde 1) y limit (25 de forma predeterminada, 100 como máximo; si pides más se recorta a 100). El campo busqueda busca en nombre, apellidos, razón social, identificación fiscal, email, código y teléfono.

Códigos de error y cómo resolverlos

Todas las respuestas de error incluyen success: false, un texto orientativo y un code estable pensado para tomar decisiones por programa. Estos son los que puedes recibir:

NO_AUTORIZADO

Falta la clave, tiene un formato que no es el nuestro o no existe. Revisa el encabezado Authorization.

CLAVE_REVOCADA

La clave era válida, pero un administrador la revocó. Genera una nueva en Configuración → API y reemplázala en tu herramienta.

PLAN_REQUERIDO

La organización está en el plan gratuito. La API vuelve a funcionar en cuanto cambias a un plan de pago.

PERMISO_DENEGADO

La clave no cuenta con el permiso necesario para esa operación. La respuesta indica en ambitoRequerido cuál le falta: crea una clave que lo tenga.

NO_ENCONTRADO

No existe ningún cliente ni proveedor con ese id en tu organización. Los de otras organizaciones nunca son visibles, y no se distingue «no existe» de «no es tuyo».

DUPLICADO

Ya existe un registro con ese dato: identificación fiscal o email en clientes; identificación fiscal, nombre o código en proveedores. La respuesta incluye campo y existenteId para que puedas vincularlo en lugar de crear otro.

VALIDACION

Algún campo no pasa la validación (o el JSON está mal formado). En details viene el campo y el motivo, igual que en el formulario.

IDENTIFICADOR_FISCAL_REQUERIDO

Ese cliente necesita identificación fiscal: en tu país es obligatoria para el tipo de cliente enviado (por ejemplo, siempre para empresas).

RATE_LIMIT

Demasiadas solicitudes. Espera los segundos que indique el encabezado Retry-After y vuelve a intentar.

API_DESACTIVADA

La API está desactivada temporalmente por mantenimiento. Vuelve a intentar más tarde.

Límites de uso

120 solicitudes por minuto por clave (más que suficiente para una sincronización periódica; frena un bucle accidental). 10 claves activas por organización. Las listas devuelven como máximo 100 registros por página. Si la organización está en el plan gratuito con el cupo mensual agotado, la creación de clientes se bloquea igual que en la aplicación.

Paso a paso: cómo sincronizar clientes con Make

Un escenario típico: cada 15 minutos, llevar a tu CRM los clientes y proveedores nuevos o modificados en Sattotal. En n8n es equivalente con el nodo HTTP Request y un nodo Schedule.

1

Genera la clave en Sattotal

Ve a Configuración → API → Nueva clave. Elige «Solo lectura» si únicamente vas a leer, o «Lectura y escritura» si también vas a crear clientes desde el CRM. Copia la clave.

2

Módulo HTTP «Make a request»

URL: tu URL base + /clientes. Método GET. Encabezado Authorization con el valor Bearer y tu clave. Marca «Parse response» para trabajar con el JSON.

3

Verifica la conexión

Antes que nada, ejecuta una vez una solicitud a /me: si devuelve tu organización y el nombre de la clave, la autenticación está correcta.

4

Agrega el filtro incremental

Guarda la fecha de la última ejecución en un Data store o en una variable y pásala como actualizadoDesde en la URL. Programa el escenario para que corra cada 15 minutos.

5

Mapea los campos a tu CRM

Itera data[] y mapea id, codigo, nombre, apellidos, email, telefono, nif_cif y direccion. Guarda el id de Sattotal en tu CRM para actualizar en lugar de duplicar.

Para crear clientes desde el CRM, agrega otro módulo HTTP con método POST a /clientes y el cuerpo JSON del cliente. Si recibes 409, usa existenteId para vincularlo.

Recomendaciones de seguridad

Una clave para cada integración

Así puedes revocar una sin afectar a las demás, y en la lista ves cuándo se usó cada una por última vez.

Jamás en el navegador ni en un repositorio público

Guárdala en el almacén de credenciales de tu herramienta (conexiones de Make, credenciales de n8n, variables de entorno). Si la subes a un repositorio o a un sitio web, considérala filtrada.

Si se filtra, revócala y crea otra

La revocación es inmediata: la clave anterior empieza a recibir 401 CLAVE_REVOCADA. Actualiza la nueva en tu herramienta y listo.

Especificación técnica (API)

La referencia técnica completa (rutas, parámetros, esquemas y códigos de error) está publicada en formato abierto en /api/v1/openapi.json, sin necesidad de clave. De forma predeterminada se muestra en español de España; agrega ?lang= con tu idioma para verla adaptada (por ejemplo /api/v1/openapi.json?lang=es-LA, o ?lang=en para tenerla en inglés). Puedes importarla en Postman, Insomnia, Make o n8n para tener todas las llamadas listas.

Preguntas frecuentes

Perdí la clave, ¿puedo volver a verla?

No. Solo se muestra al crearla y después se guarda de manera irreversible. Revócala en Configuración → API y crea una nueva.

¿Hay webhooks para que Sattotal le avise a mi CRM cuando algo cambia?

Todavía no. La forma recomendada es consultar periódicamente con el parámetro actualizadoDesde, que devuelve solo lo que cambió.

¿A qué datos da acceso la API?

Clientes y proveedores: listar, crear, consultar, actualizar y archivar. Los permisos son por recurso, así que una clave creada antes de que existieran los proveedores no llega a ellos hasta que un administrador se los marque. Además, las órdenes de reparación en solo lectura (estado, fechas, equipo y cotización), con su propio permiso.

¿Puedo eliminar un cliente por API?

No, únicamente archivarlo (activo = false), igual que en la aplicación. Aplica tanto a clientes como a proveedores. Un registro archivado sigue apareciendo en la sincronización para que tu CRM lo pueda reflejar.

¿La API está incluida en el plan gratuito?

No. Está incluida en Basic, Pro y Enterprise y durante el periodo de prueba. En el plan gratuito puedes seguir viendo y revocando las claves que ya creaste.

Solo me llega el apellido del cliente, ¿por qué no se guarda el nombre?

Casi siempre es el mapeo de campos: el nombre de pila debe ir en nombre y el apellido en apellidos. Si tu herramienta envía el nombre con otra clave (firstName, name, apellido…), la API la descarta y te lo indica en avisos.camposIgnorados de la respuesta. Corrige el mapeo y vuelve a enviar el cliente con un PATCH.

¿Puedo encontrar al cliente con el número desde el que me está llamando?

Sí. Solicita GET /api/v1/clientes?telefono= con el número tal como te llega: no importa que traiga prefijo internacional, espacios o guiones, y también busca en el teléfono secundario. Con su id puedes solicitar después sus órdenes (/clientes/{id}/reparaciones) y su resumen (/clientes/{id}/resumen).

¿Quieres probarlo tú mismo?

Prueba Sattotal gratis con datos de ejemplo, sin tarjeta de crédito.