API centralizada

CONEXA API

API para apps y sistemas externos. Todas las integraciones consumen una única URL base: https://conexa.la.

Antes de empezar

Datos necesarios

  • company_slug: identificador de la empresa, por ejemplo empresa.
  • email o username y password: usuario activo dentro de esa empresa.
  • Authorization: Bearer TOKEN para las consultas protegidas.

Regla multiempresa

El cliente externo no debe enviar company_id. La API toma la empresa desde el usuario autenticado y filtra los datos automáticamente.

En local los ejemplos usan la URL donde estás probando el sistema. En producción la base será https://api.conexa.la.

Autenticación

El login recibe company_slug, password y un identificador de usuario: email o username. Después del login no se envía company_id: el backend resuelve la empresa desde el token autenticado.

POST https://conexa.la/auth/login
Content-Type: application/json

{
  "company_slug": "empresa",
  "username": "tecnico",
  "password": "clave"
}
Authorization: Bearer TOKEN

Ejemplos rápidos

Flujo básico para consumir la API desde una app, Postman, Insomnia o una integración externa.

1. Obtener token

curl -X POST https://conexa.la/auth/login \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "company_slug": "empresa",
    "email": "admin@empresa.com",
    "password": "clave"
  }'

Respuesta esperada

{
  "success": true,
  "token": "TOKEN",
  "token_type": "Bearer",
  "company": {
    "id": 1,
    "name": "Empresa Internet",
    "slug": "empresa"
  },
  "user": {
    "id": 1,
    "name": "Gustavo",
    "email": "admin@empresa.com",
    "role": "admin"
  }
}

2. Ver usuario autenticado

curl https://conexa.la/auth/me \
  -H "Accept: application/json" \
  -H "Authorization: Bearer TOKEN"

3. Listar clientes

curl https://conexa.la/clients \
  -H "Accept: application/json" \
  -H "Authorization: Bearer TOKEN"
Reemplazá TOKEN por el valor devuelto en el login. Ese token representa al usuario y a su empresa.

Cobros externos

Para cajas, billeteras o sistemas externos de cobranza, se puede buscar el cliente por DNI, ver saldo y facturas pendientes, y registrar el pago. El pago se imputa automáticamente a las facturas abiertas más antiguas, o primero a invoice_id si se envía.

GET https://conexa.la/collections/client?dni=30111222
Authorization: Bearer TOKEN
{
  "success": true,
  "data": {
    "client": {
      "id": 15,
      "name": "Juan Perez",
      "document_number": "30111222",
      "balance_amount": 12500,
      "saldo": 12500
    },
    "pending_invoices": [
      {
        "id": 44,
        "display_number": "FX-000044",
        "due_date": "2026-06-10",
        "total": 12500,
        "balance_amount": 12500,
        "saldo": 12500
      }
    ],
    "pending_balance_amount": 12500,
    "saldo_pendiente": 12500
  }
}
POST https://conexa.la/collections/payments
Authorization: Bearer TOKEN
Content-Type: application/json

{
  "dni": "30111222",
  "amount": 12500,
  "method": "efectivo",
  "reference": "caja-000123",
  "received_at": "2026-06-01 10:30:00"
}

App de técnico

Un técnico puede entrar con username y clave, leer sus órdenes asignadas por fecha y adjuntar observaciones, firma y fotos desde otra app. Las órdenes se asignan por el nombre del usuario técnico cargado en la visita.

GET https://conexa.la/technician/orders?date=2026-05-16&days_before=1&days_after=3
Authorization: Bearer TOKEN
POST https://conexa.la/technician/orders/{id}/observations
Authorization: Bearer TOKEN
Content-Type: application/json

{
  "body": "Se cambió el conector y quedó operativo."
}
POST https://conexa.la/technician/orders/{id}/signature
Authorization: Bearer TOKEN
Content-Type: multipart/form-data

signature=@firma.png
POST https://conexa.la/technician/orders/{id}/photos
Authorization: Bearer TOKEN
Content-Type: multipart/form-data

photos[]=@foto1.jpg
photos[]=@foto2.jpg

Formato JSON

{
  "success": true,
  "data": {}
}
{
  "success": false,
  "message": "Mensaje claro del error",
  "errors": {}
}

Endpoints

POST /auth/login
POST /auth/logout
GET /auth/me
GET /clients
GET /clients/{id}
POST /clients
PUT /clients/{id}
DELETE /clients/{id}
GET /services
GET /services/{id}
POST /services
PUT /services/{id}
DELETE /services/{id}
GET /technician/orders
GET /technician/orders/{id}
PATCH /technician/orders/{id}
POST /technician/orders/{id}/observations
POST /technician/orders/{id}/signature
GET /technician/orders/{id}/signature
POST /technician/orders/{id}/photos
GET /technician/orders/{id}/photos/{photo}
GET /plans
GET /plans/{id}
POST /plans
PUT /plans/{id}
DELETE /plans/{id}
GET /invoices
GET /invoices/{id}
POST /invoices
PUT /invoices/{id}
DELETE /invoices/{id}
GET /payments
GET /payments/{id}
POST /payments
GET /collections/client
GET /collections/clients/lookup
POST /collections/payments
GET /routers
GET /routers/{id}
GET /routers/{id}/status
GET /acs/devices
GET /acs/devices/{id}
POST /acs/devices/{id}/refresh
POST /acs/devices/{id}/reboot
POST /acs/devices/{id}/wifi
GET /vpn/peers
POST /vpn/peers
GET /vpn/peers/{id}
PUT /vpn/peers/{id}
DELETE /vpn/peers/{id}
GET /vpn/peers/{id}/script
GET /vpn/peers/{id}/device-config
POST /vpn/peers/{id}/apply
POST /vpn/peers/{id}/regenerate-keys
GET /vpn/peers/{id}/status
POST /vpn/peers/{id}/networks
DELETE /vpn/peers/{id}/networks/{network}
GET /vpn/mikrotiks/{id}/detect-lan

Permisos de token

Los tokens pueden limitarse por scopes. Acciones sensibles de routers y ACS quedan protegidas y auditadas.

clients:read clients:write services:read services:write visits:read visits:update visits:write visit_photos:create visit_signature:create visit_observations:create technician_locations:create maps:read invoices:read invoices:write payments:read payments:create payments:write routers:read routers:write acs:read acs:write vpn:read vpn:write admin

Errores comunes

401: falta token Bearer o está revocado. 403: usuario/empresa inactiva o scope insuficiente. 422: validación de datos. 501: endpoint preparado pero pendiente de integración interna.