BuildNexion

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.

En cada partida, 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

GET/api/v1/budgetsread:budgets

De la más reciente a la más antigua. Sin las partidas: para eso, el detalle.

Parámetros (query)

ParámetroDescripción
status
string
draft (borrador), sent (enviada), accepted (aceptada), rejected (rechazada) o expired (caducada).
estimate_id
uuid
Ofertas de un presupuesto.
project_id
uuid
Ofertas de una obra (las de presupuestos adjudicados).
q
string
Busca en el código, el título y el cliente.
from / to
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"
Respuesta
{
  "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ámetroDescripción
budget_id
uuid | null
Presupuesto del que sale (el id de /estimates).
project_id
uuid | null
Obra, si el presupuesto se adjudicó.
code / title
string
Número de la oferta y título.
client
object
Cliente de la oferta: name, nif, address, email, phone.
tax_pct
number
IVA en %.
overhead_pct / profit_pct
number
Gastos generales y beneficio industrial, en %.
validity_days
integer
Días de validez desde el envío.
sent_at / accepted_at / rejected_at
datetime | null
Cuándo se envió, aceptó o rechazó.
conditions / forma_pago / notes
string | null
Condiciones, forma de pago y notas.

Leer una oferta con sus partidas

GET/api/v1/budgets/{id}read:budgets

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"
Respuesta
{
  "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:

  1. Ejecución material = Σ sale_item.sale_amount
  2. Gastos generales = ejecución material × overhead_pct / 100
  3. Beneficio industrial = ejecución material × profit_pct / 100
  4. Base imponible = ejecución material + gastos generales + beneficio
  5. 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).

Webhooks: budget.created al crear una oferta y budget.accepted al aceptarla (ver eventos).