API

Documentación para desarrolladores

Recursos: Operaciones

Operaciones

Referencia detallada de los recursos de Operaciones de la API: turnos y citas, contratos, métodos de pago y envíos.

Los recursos de Operaciones cubren la gestión del día a día del negocio. Todos los endpoints están bajo https://api.yo-facturo.com y se autentican con el header X-API-Key. Cada recurso indica su endpoint base y los scopes necesarios para leer y escribir.


Turnos y citas

Las citas representan sesiones agendadas de un servicio o alquiler con un cliente. Soportan ubicación flexible, recordatorios automáticos por varios canales y servicios recurrentes.

Endpoint base: /api/v1/appointments

Scopes: appointments:read, appointments:write

Campos

CampoTipoRequeridoNotas
scheduled_datetimestring (date-time)Fecha y hora de la cita en formato ISO 8601.
service_idstring (24)NoID del servicio. Requerido si no se envía rental_id.
rental_idstring (24)NoID del alquiler. Requerido si no se envía service_id.
customer_idstring (24) | nullNoID del cliente registrado al que se vincula la cita.
duration_minutesintegerNoDuración en minutos (entre 5 y 525600). Por defecto se toma del servicio.
location_typestringNoTipo de ubicación: service_location, customer_address o custom.
custom_locationobjectNoUbicación personalizada (name, address, city, state, country, postal_code, instructions, coordinates).
service_location_indexintegerNoÍndice de la ubicación del servicio cuando hay varias.
reminder_enabledbooleanNoActiva el envío de recordatorios automáticos.
reminder_hoursarray<integer>NoHoras antes de la cita en que se envían recordatorios (1 a 168).
reminder_channelsarray<string>NoCanales de recordatorio: email, push, sms o whatsapp.
session_numberintegerNoNúmero de sesión para servicios recurrentes.
entity_typestringNoTipo de entidad asociada: service o rental.
guest_namestringNoNombre del invitado para citas sin cliente registrado (máx. 200).
guest_emailstring (email)NoEmail del invitado (máx. 254).
guest_phonestringNoTeléfono del invitado (máx. 50).
notesstringNoNotas de la cita (máx. 1000).
sale_statusstringNoEstado de la venta asociada: pending o completed. Por defecto pending.
rewards_appliedarray<string>NoRecompensas o puntos canjeados aplicados a la cita.

Debe enviarse al menos uno de service_id o rental_id; scheduled_datetime es siempre obligatorio.

Endpoints

MétodoEndpointDescripción
GET/list/Listar registros (con filtros y paginación)
GET/{id}/Obtener un registro por su ID
POST/Crear un registro
PUT/{id}/Actualizar un registro
DELETE/{id}/Eliminar un registro
POST/bulk/create/Crear varios registros en una sola petición
PUT/bulk/update/Actualizar varios registros en una sola petición
POST/bulk/delete/Eliminar varios registros en una sola petición

Ejemplo — Petición

POST /api/v1/appointments/ — agendar una cita a un servicio:

{
  "service_id": "66f1a2b3c4d5e6f7a8b9c0d1",
  "customer_id": "66f1a2b3c4d5e6f7a8b9c0d2",
  "scheduled_datetime": "2026-06-10T15:00:00Z",
  "duration_minutes": 60,
  "location_type": "service_location",
  "reminder_enabled": true,
  "reminder_hours": [24, 2],
  "reminder_channels": ["email", "push"],
  "notes": "Primera sesión de consultoría"
}

Ejemplo — Respuesta

{
  "success": true,
  "data": {
    "_id": "66f1a2b3c4d5e6f7a8b9c0d3",
    "service": { "service": "66f1a2b3c4d5e6f7a8b9c0d1", "name": "Consultoría" },
    "customer": { "customer": "66f1a2b3c4d5e6f7a8b9c0d2", "name": "Juan Pérez" },
    "scheduled_datetime": "2026-06-10T15:00:00Z",
    "duration_minutes": 60,
    "status": "scheduled",
    "location_type": "service_location",
    "notes": "Primera sesión de consultoría"
  }
}

Contratos

Los contratos gestionan alquileres permanentes: inquilino, garantes, cláusulas, ajustes periódicos del alquiler (ICL, IPC, porcentaje fijo) y facturación mensual automática.

Endpoint base: /api/v1/contracts

Scopes: contracts:read, contracts:write

Campos

CampoTipoRequeridoNotas
rental_idstringID del alquiler permanente al que pertenece el contrato.
start_datestring (date-time)Fecha de inicio del contrato en formato ISO 8601.
end_datestring (date-time)Fecha de fin del contrato en formato ISO 8601.
initial_rentnumberAlquiler inicial del contrato.
tenantobjectDatos del inquilino (full_name y document_number requeridos; también document_type, email, phone, address).
security_depositnumberNoDepósito de garantía.
billing_dayintegerNoDía del mes en que se factura (1 a 28).
adjustment_typestringNoTipo de ajuste: none, icl, ipc, fixed_percentage, cpi o custom.
adjustment_frequency_monthsintegerNoFrecuencia del ajuste en meses (1 a 12).
adjustment_percentagenumberNoPorcentaje de ajuste cuando el tipo es fijo (0 a 100).
guarantorsarray<object>NoGarantes del contrato (full_name, document_type, document_number, guarantee_type).
clausesarray<object>NoCláusulas del contrato (title, content, is_mandatory).
additional_chargesarray<object>NoCargos adicionales (description, amount, frequency, is_recurring).
notesstringNoNotas del contrato.

Endpoints

MétodoEndpointDescripción
GET/list/Listar registros (con filtros y paginación)
GET/{id}/Obtener un registro por su ID
POST/Crear un registro
PUT/{id}/Actualizar un registro
DELETE/{id}/Eliminar un registro
POST/bulk/create/Crear varios registros en una sola petición
PUT/bulk/update/Actualizar varios registros en una sola petición
POST/bulk/delete/Eliminar varios registros en una sola petición

Además del CRUD estándar, los contratos exponen endpoints de ciclo de vida y facturación:

MétodoEndpointDescripción
POST/{id}/signFirmar y activar el contrato.
POST/{id}/terminateTerminar un contrato activo.
POST/{id}/renewRenovar un contrato por vencer o vencido.
POST/{id}/adjustAplicar un ajuste de alquiler.
POST/{id}/generate-invoiceGenerar la factura mensual del contrato.
GET/expiringListar contratos por vencer.
GET/summaryResumen estadístico de los contratos.

Ejemplo — Petición

POST /api/v1/contracts/ — crear un contrato de alquiler:

{
  "rental_id": "66f1a2b3c4d5e6f7a8b9c0e1",
  "start_date": "2026-06-01T00:00:00Z",
  "end_date": "2029-06-01T00:00:00Z",
  "initial_rent": 150000,
  "security_deposit": 150000,
  "billing_day": 10,
  "adjustment_type": "icl",
  "adjustment_frequency_months": 12,
  "tenant": {
    "full_name": "Juan Pérez",
    "document_type": "DNI",
    "document_number": "30123456",
    "email": "[email protected]",
    "phone": "+5491122334455"
  },
  "notes": "Contrato de alquiler de vivienda"
}

Ejemplo — Respuesta

{
  "success": true,
  "data": {
    "_id": "66f1a2b3c4d5e6f7a8b9c0e2",
    "rental_id": "66f1a2b3c4d5e6f7a8b9c0e1",
    "contract_number": "CTR-0042",
    "start_date": "2026-06-01T00:00:00Z",
    "end_date": "2029-06-01T00:00:00Z",
    "initial_rent": 150000,
    "current_rent": 150000,
    "billing_day": 10,
    "status": "draft",
    "tenant": { "full_name": "Juan Pérez", "document_number": "30123456" }
  }
}

Métodos de pago

Los métodos de pago definen las formas de cobro disponibles en ventas y puntos de venta. Soportan jerarquía (métodos padre e hijos), orden personalizado y un porcentaje de impacto sobre el precio.

Endpoint base: /api/v1/payment_methods

Scopes: payment_methods:read, payment_methods:write

Este recurso usa un controlador propio (no el CRUD estándar). Los campos completos de cada método de pago se obtienen con un GET; abajo se documentan los campos aceptados al crear uno.

Campos

CampoTipoRequeridoNotas
codestringCódigo interno único del método de pago.
namestringNombre del método de pago.
typestringNoTipo de método (por ejemplo other).
name_enstringNoNombre del método en inglés.
iconstringNoIdentificador del ícono del método.
descriptionstringNoDescripción del método de pago.

Endpoints

MétodoEndpointDescripción
GET/Punto de entrada HATEOAS del recurso.
GET/list/Listar métodos de pago (page, per_page, status, sort, sort_dir).
GET/active/Listar solo los métodos activos (para selectores).
GET/{id}/Obtener un método de pago por su ID.
POST/Crear un método de pago.
PUT/{id}/Actualizar un método de pago.
DELETE/{id}/Eliminar un método de pago (no se pueden eliminar los predeterminados).
POST/{id}/toggle-status/Activar o desactivar un método de pago.
POST/reorder/Reordenar los métodos de pago.
GET/hierarchy/Obtener los métodos de pago en árbol jerárquico.

Ejemplo — Petición

POST /api/v1/payment_methods/ — crear un método de pago personalizado:

{
  "code": "transferencia_propia",
  "name": "Transferencia a mi banco",
  "name_en": "Bank transfer",
  "type": "other",
  "icon": "wallet",
  "description": "Transferencia bancaria a cuenta propia"
}

Ejemplo — Respuesta

{
  "success": true,
  "data": {
    "_id": "66f1a2b3c4d5e6f7a8b9c0f1",
    "code": "transferencia_propia",
    "name": "Transferencia a mi banco",
    "type": "other",
    "icon": "wallet",
    "status": "active",
    "sort_order": 7
  }
}

Envíos

El módulo de envíos integra varios proveedores (OCA, Andreani, Correo Argentino, Mercado Envíos) y un sistema de delivery propio. Permite cotizar, crear y rastrear envíos, gestionar repartidores y dispositivos de flota con seguimiento GPS.

Endpoint base: /api/v1/shipping — repartidores en /api/v1/drivers, flota en /api/v1/fleet

Scopes: shipping:read, shipping:write

Los envíos usan controladores propios (no el CRUD estándar). El cuerpo de creación de un envío depende del proveedor configurado; los campos completos de un envío se obtienen con un GET sobre el detalle.

Endpoints de envíos

MétodoEndpointDescripción
GET/api/v1/shipping/shipments/Listar envíos del tenant.
POST/api/v1/shipping/shipments/Crear un envío.
GET/api/v1/shipping/shipments/{id}/Obtener el detalle de un envío.
PATCH/api/v1/shipping/shipments/{id}/Actualizar campos de un envío.
DELETE/api/v1/shipping/shipments/{id}/Eliminar un envío.
POST/api/v1/shipping/shipments/{id}/cancelCancelar un envío.
POST/api/v1/shipping/shipments/{id}/labelGenerar la etiqueta del envío.
GET/api/v1/shipping/track/{tracking_number}/Rastrear un envío por su número de seguimiento.
POST/api/v1/shipping/quotes/Cotizar un envío entre proveedores.
GET/api/v1/shipping/providers/Listar los proveedores de envío configurados.

Repartidores

Los repartidores son entidades propias del tenant para el delivery en campo. Al crearlos se genera un código de 8 caracteres que el repartidor usa como credencial de acceso.

CampoTipoRequeridoNotas
namestringNombre del repartidor (2 a 100 caracteres).
phonestring | nullNoTeléfono del repartidor (máx. 40 caracteres).
MétodoEndpointDescripción
GET/api/v1/drivers/Listar los repartidores del tenant.
POST/api/v1/drivers/Registrar un repartidor (genera un código de 8 caracteres).
GET/api/v1/drivers/{id}/Obtener un repartidor por su ID.
PATCH/api/v1/drivers/{id}/Actualizar un repartidor.
DELETE/api/v1/drivers/{id}/Eliminar un repartidor.
POST/api/v1/drivers/{id}/regenerate-codeRegenerar el código de acceso del repartidor.
GET/api/v1/drivers/tier-infoTier actual del widget y cantidad de repartidores registrados.

Flota

Los dispositivos de flota representan vehículos con seguimiento GPS por polling. Pueden vincularse opcionalmente a un repartidor. Al crearlos se genera un código de 8 caracteres que el dispositivo usa para reportar su geolocalización.

CampoTipoRequeridoNotas
namestringNombre del vehículo o dispositivo (2 a 100 caracteres).
platestring | nullNoPatente del vehículo (máx. 20 caracteres).
linked_driver_idstring | nullNoID del repartidor vinculado al dispositivo (opcional).
MétodoEndpointDescripción
GET/api/v1/fleet/devices/Listar los dispositivos de flota del tenant.
POST/api/v1/fleet/devices/Registrar un dispositivo (genera un código de 8 caracteres).
GET/api/v1/fleet/devices/{id}/Obtener un dispositivo por su ID.
PATCH/api/v1/fleet/devices/{id}/Actualizar un dispositivo.
DELETE/api/v1/fleet/devices/{id}/Eliminar un dispositivo.
POST/api/v1/fleet/devices/{id}/regenerate-codeRegenerar el código de acceso del dispositivo.
GET/api/v1/fleet/devices/{id}/trailObtener el recorrido GPS registrado del dispositivo.

Ejemplo — Petición

POST /api/v1/fleet/devices/ — registrar un dispositivo de flota:

{
  "name": "Camión 1",
  "plate": "AB123CD",
  "linked_driver_id": null
}

Ejemplo — Respuesta

{
  "success": true,
  "data": {
    "_id": "66f1a2b3c4d5e6f7a8b9c0d1",
    "name": "Camión 1",
    "plate": "AB123CD",
    "device_code": "K7M2X9P4",
    "linked_driver_id": null,
    "status": "active"
  }
}