SmartQuery
Índice
Ver el producto
B-01 Rol y flujo

Documentación técnica de integración

Esta guía es para el proveedor de software que integra la aplicación de un cliente con su ERP a través de SmartQuery. Da por hecho que el cliente ya tiene su instancia desplegada y le entregó a usted una API key con su alcance.

Última actualización

Camino de una petición: su aplicación llama a la ruta de ejecución con su API key; SmartQuery autentica, autoriza, verifica el gobierno de lectura, ejecuta contra el ERP y normaliza la respuesta; el ERP responde y la respuesta vuelve a su aplicación.
Su aplicación
Cliente HTTPcualquier lenguaje
SmartQuery
  1. 01AutenticaX-API-KEY
  2. 02Autorizaconexión · endpoint · estado
  3. 03Verificagobierno de lectura
  4. 04Ejecutacontra el ERP
  5. 05Normalizaenvolvente única
ERP
SIESA UnoEEERP
Siigo NubeContable
respuesta normalizada · {"data": …}
Ruta única de ejecución/api/v1/proxy/execute/{connection_slug}/{endpoint_slug}

Todo el catálogo se invoca por aquí. El verbo lo define el endpoint almacenado: si no coincide con el suyo, la respuesta es 405.

B-02 Autenticación

Una llave, tres puertas

La credencial del integrador es una API key en su propio encabezado, no un token Bearer. Es la única credencial con la que se integra contra esta ruta.

EncabezadoX-API-KEY
FormatoAPI key con prefijo sk_

AtenciónAnte una credencial ausente o inválida el 401 dice «Authentication required», no «llave inválida». No lo interprete como que la llave existe y está mal: trate cualquier 401 como falta de credencial válida.

Qué se verifica en cada petición

  1. 01La conexión: la llave debe tener esa conexión en su lista permitida.
  2. 02El endpoint: su llave solo ejecuta los endpoints que su cliente le autorizó.
  3. 03El estado del endpoint: solo los endpoints aprobados o activos ejecutan; en cualquier otro estado la respuesta es 403.

Encabezados

EncabezadoObligatorioComportamiento
X-API-KEYCredencial del integrador, con prefijo sk_. Determina qué conexiones y qué endpoints puede ejecutar.
Idempotency-KeyCondicionalSolo en operaciones REST que lo declaran, y solo en POST. Obligatorio si la operación lo declara; rechazado con 400 si no. Cadena alfanumérica corta. En endpoints SQL y de blueprint no tiene efecto.
Content-TypeNoEnvíe application/json en POST y PUT.
Retry-AfterRespuestaPuede venir en respuestas de error. Respete el valor antes de reintentar.
B-03 Lectura

Un endpoint de consulta nunca escribe sobre su ERP

Usted nunca envía SQL. Llama a un endpoint publicado por su slug, y lo que ese endpoint puede hacer quedó fijado cuando se publicó, no por su petición.

Árbol de decisión del análisis: si la sentencia escribe sobre una tabla temporal o una variable de tabla, pasa; si escribe sobre una tabla del ERP, se detiene.
Decisión

¿Qué puede hacer un endpoint de consulta sobre su ERP?

Leer y devolverle el resultadoSiempre

Incluye el trabajo intermedio que un informe necesita: tablas temporales (#t), variables de tabla (@t) y varias sentencias.

Escribir sobre una tabla del ERPNunca

Sin excepción de verbo, de parámetro ni de perfil. La ejecución se detiene antes de salir hacia el ERP.

Por eso un endpoint de consulta admite el script completo que un informe necesita, con SET NOCOUNT ON, DECLARE, CTE y varias sentencias, sin dejar de ser de solo lectura.

Prohibido en cualquier endpoint

  • Administración del motor
  • SQL dinámico
  • Sistema de archivos
  • Consultas entre servidores
  • Procedimientos del sistema

Sus parámetros son valores, nunca SQL. Un parámetro que intente alterar la sentencia publicada se rechaza con HTTP 400 antes de ejecutar, y las construcciones administrativas, de SQL dinámico, de sistema de archivos y entre servidores se rechazan en todo endpoint, sin excepción de perfil.

B-04 Escritura

La escritura ya viene resuelta

Usted no escribe SQL de registro. La escritura ya está resuelta: se escoge el blueprint o la operación del conector que corresponde, se le fijan las variables y los valores constantes, y eso genera el endpoint POST con el que su aplicación registra en el ERP.

  1. 01Escoja el blueprint o la operaciónDel catálogo del conector que corresponda a lo que va a registrar.
  2. 02Fije variables y valores constantesLo que cambia en cada llamada queda como parámetro; lo que no, queda fijo en el endpoint.
  3. 03Reciba su endpoint POSTSe publica bajo la misma ruta de ejecución y ya solo se consume.
BlueprintSIESA UnoEE

El formato que exige el ERP, declarado una sola vez al publicar el endpoint. Usted envía JSON y recibe la envolvente única, con el origen del rechazo identificado cuando lo hay.

Es la única envolvente donde el origen de un rechazo es legible por máquina.

Operación del conectorSiigo Nube

La operación REST del proveedor ya declarada y publicada como endpoint suyo. Sin SQL de por medio.

El cuerpo del proveedor se devuelve tal cual bajo data.

B-05 Respuestas

Lo que devuelve, exactamente

Lea esto primeroPara una llamada con X-API-KEY el cuerpo raíz es exactamente {"data": …} — una sola clave. No hay success, ni meta, ni source, ni tiempo de ejecución en la raíz. Equivocarse aquí rompe la integración el primer día.

Consulta SQL sobre SIESA

Endpoint SQL cuyo método almacenado es GET. HTTP 200.
{"data":{"codigo":200,"mensaje":"Success","data":[
  {"codigo":"1","descripcion":"ACTIVO","nivel":1},
  {"codigo":"11","descripcion":"DISPONIBLE","nivel":2}
]}}

Las claves dentro de cada fila salen en orden alfabético, no en el orden de columnas del SELECT.

Consulta sin resultados

Mismo endpoint, criterios sin coincidencias. HTTP 200 — no 204.
{"data":{"codigo":204,"mensaje":"No content / No se encontraron registros","data":[]}}

En la ruta de éxito, codigo NO es el estado HTTP. Un codigo 204 llega dentro de un HTTP 200.

Operación REST (Siigo Nube)

Endpoint REST_OPERATION. HTTP 200.
{"data":{"codigo":200,"mensaje":"OK","data":{"results":[
  {"id":"123","name":"ACME S.A.S."}
]}}}

Aquí codigo sí es el estado HTTP crudo del proveedor, y data es su cuerpo tal cual.

Importación por blueprint

Endpoint BLUEPRINT, siempre POST. HTTP igual a data.statusCode.
{"data":{"success":true,"statusCode":200,"code":"0",
  "message":"The file was imported successfully.",
  "details":[],
  "source":{"system":"SIESA","operation":"Importar"}}}

code es siempre una cadena, nunca un número. details nunca es null: como mínimo es [].

B-06 Errores

De dónde viene la falla

Saber de dónde viene una falla es la pregunta más cara de una integración. Esta es la respuesta honesta, hoy:

Mapa de fallos por etapa: qué estado HTTP puede emitir cada etapa de la pasarela y de quién es el fallo. Solo la envolvente de importación declara el origen de forma legible por máquina.
  1. 01Autentica401SmartQuery
  2. 02Autoriza403405SmartQuery
  3. 03Analiza400SmartQuery
  4. 04Ejecuta422502503504ERP o proveedor
  5. 05Normaliza500Indeterminado

Legible por máquina — solo la envolvente de importación: data.source.system vale "SMARTQUERY" o "SIESA".

No determinable — en endpoints SQL y REST no hay campo de origen. El 500 comodín colapsa un fallo del ERP y uno de la pasarela en el mismo cuerpo.

400Faltan variables de plantilla

SmartQuery
{"error":"Variables faltantes en el payload","faltantes":["nit","fecha_inicio"]}

La clave faltantes está en español y no se traduce.

401Sin credencial válida

SmartQuery
{"success":false,"error":"Authentication required",
 "message":"Please provide either X-API-KEY header or Authorization: Bearer <token> header"}

Su forma es distinta a la de los demás errores de esta página: parséelo aparte.

403La llave no alcanza esa conexión

SmartQuery
{"error":"access denied to this connection"}

Mensajes hermanos: «connection is not active», «endpoint is disabled for this connection», «no tienes acceso a esta consulta».

405Verbo distinto al del endpoint

SmartQuery
{"success":false,"message":"Method not allowed for this query","error":"method not allowed for this query"}

Cada endpoint declara su verbo al publicarse; usar otro devuelve 405.

422SIESA rechazó líneas del plano

ERP
{"data":{"success":false,"statusCode":422,"code":"1",
  "message":"The file could not be imported because it contains validation errors.",
  "details":[{"linea":"3",
    "detalle":"El grupo entidad no está autorizado para moverse por: [Documento]"}],
  "source":{"system":"SIESA","operation":"Importar"}}}

details[] trae una entrada por registro rechazado, con el motivo tal como lo redactó el ERP. Muéstrelo a su usuario: es la única descripción fiel del rechazo.

422SmartQuery detuvo el archivo antes de SIESA

SmartQuery
{"data":{"success":false,"statusCode":422,"code":"FIELD_VALIDATION",
  "message":"validacion fallida: la variable 'NIT' en la linea 'Documento contable' es obligatoria y no puede estar vacia",
  "details":[],
  "source":{"system":"SMARTQUERY","operation":"Importar"}}}

Mismo estado que el anterior, origen distinto. Es exactamente por esto que source.system existe.

502El proveedor REST rechazó la petición

Proveedor
{"data":{"codigo":502,"mensaje":"Siigo rechazó las credenciales de la conexión",
  "data":null,
  "errors":[{"code":"unauthorized","message":"token invalido"}]}}

errors[] solo aparece en endpoints REST. Se descarta en las respuestas de SIESA. Los 429 y 503 llegan con Retry-After.

500Fallo sin clasificar

Indeterminado
{"error":"Error procesando la solicitud en el ERP"}

El texto dice ERP, pero este error es el comodín para cualquier falla sin clasificar. No lo interprete como origen del ERP.

B-07 Advertencias

Lo que cuesta un día de depuración

  • codigo no es el estado HTTPEn la ruta de éxito no lo es. Un codigo 204 viaja dentro de un HTTP 200.
  • code es siempre una cadenaEn la envolvente de importación: "0", "1", "99", "-1", "FIELD_VALIDATION". Nunca un número.
  • details nunca es nullComo mínimo llega un arreglo vacío. No hace falta comprobar el nulo.
  • Idempotency-Key se descarta en silencioLa idempotencia solo se honra en las operaciones REST que la declaran. En endpoints SQL y de registro no tiene efecto: dé por posible que una importación con 504 sí se aplicó y concílielo antes de repetirla.
  • Los mensajes mezclan idiomasLos mensajes de validación llegan en español y los de la envolvente de importación en inglés. No programe contra el texto.
  • errors[] solo existe en RESTLas respuestas de SIESA no lo traen. Compruebe su presencia antes de leerlo.
  • Un slug está reservadoEl slug suggested-payload está reservado por la plataforma y no puede usarse como nombre de un endpoint propio.
  • El estado del endpoint mandaSolo los endpoints aprobados o activos responden. Un endpoint retirado viaja antes con encabezados RFC 8594 y el enlace a su sucesor.

¿Algo no coincide con lo que está viendo? Escríbanos y lo corregimos aquí.