POST
projects:write/api/public/v1/projectsBody de entrada
PublicProjectWrite
Crear o actualizar proyecto
Ficha editable de un proyecto. En creación admite código manual, serie explícita o serie predeterminada.
PropiedadTipoDescripción
codestring | nullCódigo manual. Es obligatorio si no se indica una serie y no existe una serie predeterminada.nameobligatoriostringNombre del proyecto.numberingLineIduuid | nullSerie de proyectos usada para generar el código.descriptionstring | nullDescripción general.integrationCodestring | nullCódigo de referencia del sistema externo.colorstring | nullColor identificativo.clientIduuid | nullCliente asociado.projectStateIduuid | nullEstado del proyecto.projectTypeIduuid | nullTipo de proyecto.addressstring | nullDirección de la obra.zipCodestring | nullCódigo postal.countryIdinteger | nullPaís.regionIdinteger | nullRegión o provincia.townstring | nullLocalidad.latitudenumber | nullLatitud GPS.longitudenumber | nullLongitud GPS.gpsPrecisioninteger | nullPrecisión GPS en metros.expectedStartDatedate-time | nullInicio previsto.expectedEndDatedate-time | nullFin previsto.startWorkDatedate-time | nullInicio real de los trabajos.endWorkDatedate-time | nullFin de los trabajos.estimatedEndWorkDatedate-time | nullFin estimado actualizado.contractualEndDatedate-time | nullFin contractual.realEndWorkDatedate-time | nullFin real.executionTimestring | nullPlazo de ejecución.salesBudgetnumberPresupuesto de venta.changeOrdersBudgetnumberPresupuesto de contradictorios.penaltiesstring | nullCondiciones de penalización.clientPaymentFormstring | nullCondiciones de pago del cliente.retentionsstring | nullCondiciones de retenciones.bankGuarantystring | nullCondiciones de aval bancario.paymentFormIduuid | nullForma de pago.vatTypeIduuid | nullTipo de IVA.pitRetentionTypeIduuid | nullTipo de retención IRPF.taxRemarksstring | nullObservaciones fiscales.overheadPercentagenumber | nullPorcentaje de gastos generales.industrialProfitPercentagenumber | nullPorcentaje de beneficio industrial.exportOverheadPercentagenumber | nullPorcentaje de gastos generales usado en exportaciones.exportIndustrialProfitPercentagenumber | nullPorcentaje de beneficio industrial usado en exportaciones.currencystring | nullCódigo de moneda.activebooleanEstado activo.closedbooleanIndica si el proyecto está cerrado.Ejemplo JSON
{
"name": "Reforma Gran Vía",
"numberingLineId": "89f378ce-b1fc-49ef-97f9-0806f32b8438",
"description": "Reforma integral de oficinas",
"clientId": "a4c7603a-8c87-46c8-a3f5-09fbbe79f82e",
"address": "Gran Vía 42",
"zipCode": "28013",
"town": "Madrid",
"latitude": 40.4201,
"longitude": -3.7058,
"gpsPrecision": 5,
"expectedStartDate": "2026-11-02T08:00:00",
"expectedEndDate": "2027-04-30T18:00:00",
"salesBudget": 350000,
"overheadPercentage": 7.5,
"industrialProfitPercentage": 6,
"currency": "EUR",
"active": true,
"closed": false
}Respuesta
201Proyecto creado.
PublicProject
Proyecto
Ficha pública completa del proyecto, con nombres de catálogos y estado del clonado.
PropiedadTipoDescripción
idobligatoriouuidIdentificador estable del proyecto.codestring | nullCódigo manual. Es obligatorio si no se indica una serie y no existe una serie predeterminada.nameobligatoriostringNombre del proyecto.numberingLineIduuid | nullSerie de proyectos usada para generar el código.descriptionstring | nullDescripción general.integrationCodestring | nullCódigo de referencia del sistema externo.colorstring | nullColor identificativo.clientIduuid | nullCliente asociado.projectStateIduuid | nullEstado del proyecto.projectTypeIduuid | nullTipo de proyecto.addressstring | nullDirección de la obra.zipCodestring | nullCódigo postal.countryIdinteger | nullPaís.regionIdinteger | nullRegión o provincia.townstring | nullLocalidad.latitudenumber | nullLatitud GPS.longitudenumber | nullLongitud GPS.gpsPrecisioninteger | nullPrecisión GPS en metros.expectedStartDatedate-time | nullInicio previsto.expectedEndDatedate-time | nullFin previsto.startWorkDatedate-time | nullInicio real de los trabajos.endWorkDatedate-time | nullFin de los trabajos.estimatedEndWorkDatedate-time | nullFin estimado actualizado.contractualEndDatedate-time | nullFin contractual.realEndWorkDatedate-time | nullFin real.executionTimestring | nullPlazo de ejecución.salesBudgetnumberPresupuesto de venta.changeOrdersBudgetnumberPresupuesto de contradictorios.penaltiesstring | nullCondiciones de penalización.clientPaymentFormstring | nullCondiciones de pago del cliente.retentionsstring | nullCondiciones de retenciones.bankGuarantystring | nullCondiciones de aval bancario.paymentFormIduuid | nullForma de pago.vatTypeIduuid | nullTipo de IVA.pitRetentionTypeIduuid | nullTipo de retención IRPF.taxRemarksstring | nullObservaciones fiscales.overheadPercentagenumber | nullPorcentaje de gastos generales.industrialProfitPercentagenumber | nullPorcentaje de beneficio industrial.exportOverheadPercentagenumber | nullPorcentaje de gastos generales usado en exportaciones.exportIndustrialProfitPercentagenumber | nullPorcentaje de beneficio industrial usado en exportaciones.currencystring | nullCódigo de moneda.activebooleanEstado activo.closedbooleanIndica si el proyecto está cerrado.clientNamestring | nullNombre del cliente.projectStateNamestring | nullNombre del estado.projectTypeNamestring | nullNombre del tipo de proyecto.countryNamestring | nullNombre del país.regionNamestring | nullNombre de la región.paymentFormNamestring | nullNombre de la forma de pago.vatTypeNamestring | nullNombre del tipo de IVA.pitRetentionTypeNamestring | nullNombre del tipo de retención.cloneStateIdobligatoriointegerEstado del proceso de clonado: 0 normal, -1 clonando y -2 fallido.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",
"numberingLineId": "89f378ce-b1fc-49ef-97f9-0806f32b8438",
"description": "Reforma integral de oficinas",
"clientId": "a4c7603a-8c87-46c8-a3f5-09fbbe79f82e",
"address": "Gran Vía 42",
"zipCode": "28013",
"town": "Madrid",
"latitude": 40.4201,
"longitude": -3.7058,
"gpsPrecision": 5,
"expectedStartDate": "2026-11-02T08:00:00",
"expectedEndDate": "2027-04-30T18:00:00",
"salesBudget": 350000,
"overheadPercentage": 7.5,
"industrialProfitPercentage": 6,
"currency": "EUR",
"active": true,
"closed": false,
"clientName": "Cliente SL",
"projectStateName": "En curso",
"projectTypeName": "Reforma",
"cloneStateId": 0,
"createdAt": "2026-10-10T12:00:00",
"modifiedAt": "2026-10-10T12:00:00"
}Ejemplo de respuesta
{
"id": "0d3fa80a-d8aa-4a95-84b7-8f6a157005ea",
"code": "OBR-2026-0042",
"name": "Reforma Gran Vía",
"numberingLineId": "89f378ce-b1fc-49ef-97f9-0806f32b8438",
"description": "Reforma integral de oficinas",
"clientId": "a4c7603a-8c87-46c8-a3f5-09fbbe79f82e",
"address": "Gran Vía 42",
"zipCode": "28013",
"town": "Madrid",
"latitude": 40.4201,
"longitude": -3.7058,
"gpsPrecision": 5,
"expectedStartDate": "2026-11-02T08:00:00",
"expectedEndDate": "2027-04-30T18:00:00",
"salesBudget": 350000,
"overheadPercentage": 7.5,
"industrialProfitPercentage": 6,
"currency": "EUR",
"active": true,
"closed": false,
"clientName": "Cliente SL",
"projectStateName": "En curso",
"projectTypeName": "Reforma",
"cloneStateId": 0,
"createdAt": "2026-10-10T12:00:00",
"modifiedAt": "2026-10-10T12:00:00"
}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."
]
}
}