El recurso estimates te permite gestionar los presupuestos de tu empresa. Puedes crear presupuestos, consultarlos, actualizarlos, eliminarlos y enviarlos por email.
Los presupuestos tienen una estructura muy similar a las facturas de venta, por lo que si ya has trabajado con el recurso invoices, te resultará familiar.
💡 Recomendación: Antes de empezar a desarrollar, te recomendamos crear un entorno de pruebas (sandbox) para hacer tus primeras llamadas sin afectar tus datos reales.
Endpoints disponibles
Método | Endpoint | Descripción |
GET | /{companyId}/estimates | Lista de presupuestos (con filtros y paginación) |
POST | /{companyId}/estimates | Crear un presupuesto |
GET | /{companyId}/estimates/{id} | Obtener un presupuesto por ID |
PUT | /{companyId}/estimates/{id} | Actualizar un presupuesto |
DELETE | /{companyId}/estimates/{id} | Eliminar un presupuesto |
PUT | /{companyId}/estimates/{id}/pdf | Generar PDF del presupuesto |
PUT | /{companyId}/estimates/{id}/send | Enviar presupuesto por email |
PUT | /{companyId}/estimates/{id}/tags | Actualizar etiquetas del presupuesto |
Ejemplos de código
Los siguientes ejemplos muestran cómo crear presupuestos para diferentes casos de uso. Todos los ejemplos usan el método POST a /{companyId}/estimates.
Presupuesto básico
El caso más simple: un presupuesto con una línea y formato estándar.
curl -X POST \
-H "facturadirecta-api-key: TU_CLAVE_API" \
-H "Content-Type: application/json" \
-d '{
"content": {
"type": "estimate",
"main": {
"docNumber": {
"series": "P"
},
"baseState": "pending",
"contact": "con_10000000-0000-4000-8000-000000000000",
"currency": "EUR",
"lines": [
{
"quantity": 1,
"unitPrice": 100,
"tax": ["S_IVA_21"],
"text": "Descripción del servicio"
}
]
}
}
}' \
https://app.facturadirecta.com/api/TU_COMPANY_ID/estimates
Resultado: Un presupuesto de 100€ + 21% IVA = 121€ total, en estado "Pendiente".
Presupuesto con formato simplificado
Útil cuando solo quieres mostrar descripciones sin columnas de cantidad o producto.
{
"content": {
"type": "estimate",
"main": {
"showProductColumn": false,
"showQuantityColumn": false,
"docNumber": {
"series": "P"
},
"baseState": "pending",
"contact": "con_10000000-0000-4000-8000-000000000000",
"currency": "EUR",
"lines": [
{
"quantity": 1,
"unitPrice": 100,
"lineTotal": 100,
"tax": ["S_IVA_21"],
"text": "Descripción del servicio"
}
]
}
}
}
Opciones de visualización:
showProductColumn: falseoculta la columna de producto/referenciashowQuantityColumn: falseoculta la columna de cantidad
Presupuesto con descuento
Aplica un descuento a una línea del presupuesto.
{
"content": {
"type": "estimate",
"main": {
"docNumber": {
"series": "P"
},
"baseState": "pending",
"contact": "con_10000000-0000-4000-8000-000000000000",
"currency": "EUR",
"lines": [
{
"quantity": 1,
"unitPrice": 100,
"discountRate": 10,
"tax": ["S_IVA_21"],
"text": "Servicio de consultoría (10% descuento)"
}
]
}
}
}
Resultado:
Precio: 100€
Descuento 10%: -10€
Base: 90€
IVA 21%: 18,90€
Total: 108,90€
Presupuesto con validez
Indica la fecha de validez del presupuesto.
{
"content": {
"type": "estimate",
"main": {
"docNumber": {
"series": "P"
},
"baseState": "pending",
"contact": "con_10000000-0000-4000-8000-000000000000",
"date": "2026-01-28",
"dueDate": "2026-02-28",
"currency": "EUR",
"lines": [
{
"quantity": 1,
"unitPrice": 500,
"tax": ["S_IVA_21"],
"text": "Desarrollo de aplicación web"
}
]
}
}
}
Nota: El campo dueDate en presupuestos indica la fecha de validez, no la fecha de vencimiento de pago.
Campos importantes
Campos del objeto main
Campo | Tipo | Descripción |
contact | string | ID del cliente (obligatorio) |
currency | string | Código de moneda ISO 4217 (ej: EUR, USD) |
date | string | Fecha de emisión (formato YYYY-MM-DD) |
dueDate | string | Fecha de validez del presupuesto |
docNumber | object | Número de documento: |
baseState | string | Estado del presupuesto (ver sección Estados) |
lines | array | Líneas del presupuesto (obligatorio, mínimo 1) |
showProductColumn | boolean | Mostrar columna de producto en el PDF |
showQuantityColumn | boolean | Mostrar columna de cantidad en el PDF |
emails | string | Emails destinatarios separados por comas |
Campos de cada línea
Campo | Tipo | Descripción |
text | string | Descripción del producto o servicio (obligatorio) |
quantity | number | Cantidad (obligatorio) |
unitPrice | number | Precio unitario (obligatorio) |
tax | array | Array de IDs de impuestos (obligatorio) |
discount | number | Descuento en importe absoluto |
discountRate | number | Descuento en porcentaje (0-100) |
lineTotal | number | Total de la línea (calculado automáticamente si no se indica) |
document | string | ID del producto de referencia |
Estados de un presupuesto
Los presupuestos pueden tener los siguientes estados base:
Estado | Descripción |
pending | Pendiente: enviado al cliente, esperando respuesta |
accepted | Aceptado: el cliente ha aceptado el presupuesto |
rejected | Rechazado: el cliente ha rechazado el presupuesto |
closed | Cerrado: convertido a factura o finalizado |
Nota: El estado final del presupuesto puede variar si existen documentos relacionados (por ejemplo, si se ha generado una factura a partir del presupuesto).
Convertir presupuesto a factura
Cuando un cliente acepta un presupuesto, puedes convertirlo a factura. El flujo típico es:
Actualizar el presupuesto a estado "accepted"
Crear una factura con las mismas líneas y referenciar el presupuesto
Al crear la factura, puedes indicar el origen de cada línea para que queden vinculados:
{
"content": {
"type": "invoice",
"main": {
"contact": "con_xxxxx",
"currency": "EUR",
"lines": [
{
"origin": "est_xxxxx",
"quantity": 1,
"unitPrice": 100,
"tax": ["S_IVA_21"],
"text": "Servicio aprobado en presupuesto"
}
]
}
}
}
Errores comunes
Error: "contact is required"
El campo contact es obligatorio. Asegúrate de incluir el ID de un cliente existente.
Error: "Invalid baseState"
El valor de baseState no es válido. Usa uno de: pending, accepted, rejected, closed.
Error: "lines must have at least 1 item"
Un presupuesto necesita al menos una línea. Verifica que el array lines no está vacío.