Ofertas
La oferta es el documento comercial que se envía al cliente: capítulos y partidas con su precio de coste y su precio de venta, más los porcentajes de gastos generales, beneficio e IVA. Sale de un presupuesto y, si se adjudica, queda en la obra.
unit_price y total_price son el coste (lo que te cuesta a ti). El precio al cliente está en sale_item.sale_price y sale_item.sale_amount. No los confundas.Listar ofertas
De la más reciente a la más antigua. Sin las partidas: para eso, el detalle.
Parámetros (query)
| Parámetro | Tipo | Descripción |
|---|---|---|
| status string | string | draft (borrador), sent (enviada), accepted (aceptada), rejected (rechazada) o expired (caducada). |
| estimate_id uuid | uuid | Ofertas de un presupuesto. |
| project_id uuid | uuid | Ofertas de una obra (las de presupuestos adjudicados). |
| q string | string | Busca en el código, el título y el cliente. |
| from / to date | date | Creadas desde / hasta esa fecha (YYYY-MM-DD). |
| limit / cursor — | — | Paginación: de 1 a 200 por página (50 por defecto). |
curl "https://app.buildnexion.com/api/v1/budgets?estimate_id=2b8e4d10-7c3a-4f5e-8d21-0a9b6c3e1f47" \
-H "Authorization: Bearer $BUILDNEXION_API_KEY"{
"data": [
{
"id": "9d3f6a21-4b8c-4e7d-a1f2-5c0e9b8d7a36",
"project_id": "6f1c2a9e-3b7d-4c1e-9a52-1d0e8b7c4a21",
"budget_id": "2b8e4d10-7c3a-4f5e-8d21-0a9b6c3e1f47",
"code": "OFERTA-2026-0031",
"title": "Reforma integral vivienda C/ Mayor 12",
"status": "accepted",
"client": {
"name": "Construcciones Ejemplo SL",
"nif": "B00000000",
"address": "Avenida de Ejemplo 1, Mérida",
"email": "obras@ejemplo.es",
"phone": "600 000 000"
},
"validity_days": 30,
"tax_pct": 21,
"overhead_pct": 13,
"profit_pct": 6,
"sent_at": "2026-07-30T11:45:00.000+00:00",
"accepted_at": "2026-08-19T17:02:13.201+00:00",
"rejected_at": null,
"conditions": "Precios válidos para la medición indicada.",
"forma_pago": "30% a la firma, resto por certificaciones mensuales",
"notes": null,
"created_at": "2026-07-28T08:30:12.904+00:00"
}
],
"pagination": {
"limit": 50,
"next_cursor": null
}
}Campos
| Parámetro | Tipo | Descripción |
|---|---|---|
| budget_id uuid | null | uuid | null | Presupuesto del que sale (el id de /estimates). |
| project_id uuid | null | uuid | null | Obra, si el presupuesto se adjudicó. |
| code / title string | string | Número de la oferta y título. |
| client object | object | Cliente de la oferta: name, nif, address, email, phone. |
| tax_pct number | number | IVA en %. |
| overhead_pct / profit_pct number | number | Gastos generales y beneficio industrial, en %. |
| validity_days integer | integer | Días de validez desde el envío. |
| sent_at / accepted_at / rejected_at datetime | null | datetime | null | Cuándo se envió, aceptó o rechazó. |
| conditions / forma_pago / notes string | null | string | null | Condiciones, forma de pago y notas. |
Leer una oferta con sus partidas
La oferta con project (o null) y chapters: cada capítulo con sus partidas, y cada partida con su sale_item (o null si no tiene precio de venta). No incluye el desglose de mediciones.
curl "https://app.buildnexion.com/api/v1/budgets/9d3f6a21-4b8c-4e7d-a1f2-5c0e9b8d7a36" \
-H "Authorization: Bearer $BUILDNEXION_API_KEY"{
"data": {
"id": "9d3f6a21-4b8c-4e7d-a1f2-5c0e9b8d7a36",
"project_id": "6f1c2a9e-3b7d-4c1e-9a52-1d0e8b7c4a21",
"budget_id": "2b8e4d10-7c3a-4f5e-8d21-0a9b6c3e1f47",
"code": "OFERTA-2026-0031",
"title": "Reforma integral vivienda C/ Mayor 12",
"status": "accepted",
"client": {
"name": "Construcciones Ejemplo SL",
"nif": "B00000000",
"address": "Avenida de Ejemplo 1, Mérida",
"email": "obras@ejemplo.es",
"phone": "600 000 000"
},
"validity_days": 30,
"tax_pct": 21,
"overhead_pct": 13,
"profit_pct": 6,
"sent_at": "2026-07-30T11:45:00.000+00:00",
"accepted_at": "2026-08-19T17:02:13.201+00:00",
"rejected_at": null,
"conditions": "Precios válidos para la medición indicada.",
"forma_pago": "30% a la firma, resto por certificaciones mensuales",
"notes": null,
"created_at": "2026-07-28T08:30:12.904+00:00",
"project": {
"id": "6f1c2a9e-3b7d-4c1e-9a52-1d0e8b7c4a21",
"name": "Reforma integral vivienda C/ Mayor 12",
"code": "2026-014"
},
"chapters": [
{
"id": "1d7c4e2a-9b3f-4a68-8e15-c2f0a7d6b931",
"chapter_number": 1,
"name": "Demoliciones",
"notes": null,
"sort_order": 0,
"items": [
{
"id": "5a2e8c71-0f4d-4b93-a6e2-7d1c9b3f8e04",
"chapter_id": "1d7c4e2a-9b3f-4a68-8e15-c2f0a7d6b931",
"chapter_number": 1,
"chapter_name": "Demoliciones",
"item_number": "01.01",
"name": "Demolición de tabiquería de ladrillo hueco",
"unit": "m2",
"quantity": 42.5,
"unit_price": 9.8,
"total_price": 416.5,
"notes": null,
"sort_order": 0,
"sale_item": {
"id": "b8f3d1e6-2c7a-4e09-9d54-1a6e8c2f7b30",
"budget_item_id": "5a2e8c71-0f4d-4b93-a6e2-7d1c9b3f8e04",
"chapter_id": "1d7c4e2a-9b3f-4a68-8e15-c2f0a7d6b931",
"quantity": 42.5,
"sale_price": 12.6,
"sale_amount": 535.5,
"notes": null
}
}
]
}
],
"manual_lines": []
}
}El total de la oferta
Es el mismo cálculo que el PDF de la app:
- Ejecución material = Σ
sale_item.sale_amount - Gastos generales = ejecución material ×
overhead_pct/ 100 - Beneficio industrial = ejecución material ×
profit_pct/ 100 - Base imponible = ejecución material + gastos generales + beneficio
- Total = base imponible × (1 +
tax_pct/ 100)
Ofertas manuales
Las ofertas de un presupuesto manual no tienen capítulos: sus conceptos van en manual_lines (vacío en las demás), cada uno con concept, description, unit, quantity, unit_price (precio de venta), discount_pct, vat_pct, withholding_pct y amount (base de la línea, sin IVA).