GET
projects:read/api/public/v1/projectsParámetros
limitNúmero máximo de elementos por página. Por defecto 50, máximo 200.
cursorCursor opaco para continuar desde la respuesta anterior.
modifiedSinceIncluye registros creados o modificados después de esta fecha, interpretada en el timezone del tenant.
sortOrden de los resultados. Antepón - para orden descendente.
code-codename-nameclientName-clientNameprojectStateName-projectStateNamecreatedAt-createdAtmodifiedAt-modifiedAtcodeCódigo exacto.
nameNombre.
clientIdCliente.
projectStateIdEstado.
activeEstado activo.
searchBúsqueda por código, nombre o cliente.
Respuesta
200Página de proyectos.
PublicProjectListItem
Proyecto en listado
Vista simple usada por el listado de mantenimiento.
PropiedadTipoDescripción
idobligatoriouuidIdentificador del proyecto.codeobligatoriostringCódigo.nameobligatoriostringNombre.clientIduuid | nullCliente.clientNamestring | nullNombre del cliente.projectStateIduuid | nullEstado.projectStateNamestring | nullNombre del estado.projectStateColorstring | nullColor del estado.activeobligatoriobooleanEstado activo.closedobligatoriobooleanEstado cerrado.cloneStateIdobligatoriointegerEstado del clonado.createdAtobligatoriodate-timeFecha de creación.modifiedAtobligatoriodate-timeÚltima modificación.Ejemplo JSON
{
"id": "0d3fa80a-d8aa-4a95-84b7-8f6a157005ea",
"code": "OBR-2026-0042",
"name": "Reforma Gran Vía",
"clientId": "a4c7603a-8c87-46c8-a3f5-09fbbe79f82e",
"clientName": "Cliente SL",
"projectStateName": "En curso",
"projectStateColor": "#3498db",
"active": true,
"closed": false,
"cloneStateId": 0,
"createdAt": "2026-10-10T12:00:00",
"modifiedAt": "2026-10-10T12:00:00"
}Ejemplo de respuesta
{
"items": [
{
"id": "0d3fa80a-d8aa-4a95-84b7-8f6a157005ea",
"code": "OBR-2026-0042",
"name": "Reforma Gran Vía",
"clientId": "a4c7603a-8c87-46c8-a3f5-09fbbe79f82e",
"clientName": "Cliente SL",
"projectStateName": "En curso",
"projectStateColor": "#3498db",
"active": true,
"closed": false,
"cloneStateId": 0,
"createdAt": "2026-10-10T12:00:00",
"modifiedAt": "2026-10-10T12:00:00"
}
],
"nextCursor": "eyJ2ZXJzaW9uIjoxLCJvZmZzZXQiOjUwfQ",
"hasMore": true
}Errores
400Solicitud incorrectaapplication/json401Autenticación inválida o no proporcionadaapplication/json403Permisos insuficientesapplication/json404Recurso no encontradoapplication/json409Conflicto con el estado actualapplication/json410Recurso ya no disponibleapplication/json422Error de validaciónapplication/json429Límite de solicitudes excedidoapplication/jsonVer modelo de error
PublicApiError
Error de API
Formato estable de los errores públicos.
PropiedadTipoDescripción
statusobligatoriointegerCódigo HTTP.codeobligatoriostringCódigo estable para tratamiento automático.messageobligatoriostringMensaje legible.correlationIdobligatoriostringIdentificador para soporte y trazabilidad.currentConcurrencyTokenstring | nullToken actual cuando existe un conflicto.validationErrorsobject<string,string[]>Errores agrupados por campo.Ejemplo JSON
{
"status": 422,
"code": "validation_error",
"message": "The request is invalid.",
"correlationId": "01J9EXAMPLE",
"validationErrors": {
"unitCode": [
"The unit does not exist."
]
}
}