OpenAPI 3.1

Referencia

Servidor: https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica. El entorno sale de la clave: c5_test_ → sandbox, c5_live_ → real. Descarga el openapi.json.

Procesamiento en la UE: llama siempre con ?forceFunctionRegion=eu-central-1 (la región UE del proyecto), por ejemplo https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/empresas?forceFunctionRegion=eu-central-1. Sin ese parámetro, la petición se procesa en la región más cercana a tu servidor, que puede estar fuera de la UE. La cabecera x-sb-edge-region de la respuesta confirma dónde se ha procesado.

Empresas

GET/v1/empresasEmpresas de la claveempresas:leer

Una si la clave es de empresa; las autorizadas si es de asesoría.

curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/empresas?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
{
  "datos": [
    {
      "id": "8f1c…",
      "nombre": "Transportes Valdeoca SL",
      "nif": "B09000000"
    }
  ]
}

Facturas

GET/v1/facturasFacturas emitidasfacturas:leer

Importes en céntimos. Filtros por fecha, estado de cobro y NIF del cliente.

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
desdequeryAAAA-MM-DD
hastaqueryAAAA-MM-DD
estado_cobroquerycobrada · pendiente · vencida
cliente_nifqueryNIF del cliente
limitequeryEntre 1 y 100 (por defecto 50).
cursorqueryCursor opaco de la página siguiente (`siguiente` de la respuesta anterior).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/facturas?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
{
  "datos": [
    {
      "id": "b2e1…",
      "numero": "F-2026-0142",
      "fecha": "2026-10-14",
      "cliente": {
        "nombre": "Logística del Duero SL",
        "nif": "B09111111"
      },
      "base_centimos": 65000,
      "iva_centimos": 13650,
      "retencion_centimos": 0,
      "total_centimos": 78650,
      "moneda": "EUR",
      "estado_cobro": "pendiente"
    }
  ],
  "siguiente": null
}
GET/v1/facturas/{id}Una facturafacturas:leer

Con sus importes y estado de cobro.

idrutaId de la factura
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/facturas/<id>?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
GET/v1/facturas/{id}/pdfPDF de una facturafacturas:leer

Devuelve una URL firmada que caduca en 5 minutos.

idrutaId de la factura
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/facturas/<id>/pdf?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
{
  "url": "https://…",
  "caduca_s": 300
}
POST/v1/facturasNo existe: la emisión es del titular

Siempre `405 emision_requiere_titular`. Para pedir una factura usa `POST /v1/pedidos`.

curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/facturas?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…'
{
  "error": {
    "codigo": "emision_requiere_titular",
    "mensaje": "ConfIA5 no emite una factura sin que su titular la confirme. Usa POST /v1/pedidos.",
    "doc_url": "…",
    "peticion_id": "req_…"
  }
}

Presupuestos y albaranes

GET/v1/presupuestosPresupuestospresupuestos:leer

Lectura.

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
limitequeryEntre 1 y 100 (por defecto 50).
cursorqueryCursor opaco de la página siguiente (`siguiente` de la respuesta anterior).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/presupuestos?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
GET/v1/albaranesAlbaranespresupuestos:leer

Lectura.

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
limitequeryEntre 1 y 100 (por defecto 50).
cursorqueryCursor opaco de la página siguiente (`siguiente` de la respuesta anterior).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/albaranes?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'

Gastos

GET/v1/gastosGastosgastos:leer

Gastos registrados con su categoría (provisional hasta que la valida la asesoría).

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
desdequeryAAAA-MM-DD
hastaqueryAAAA-MM-DD
limitequeryEntre 1 y 100 (por defecto 50).
cursorqueryCursor opaco de la página siguiente (`siguiente` de la respuesta anterior).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/gastos?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'

DeCA

GET/v1/decaDeCA emitidosdeca:leer

Metadatos.

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
limitequeryEntre 1 y 100 (por defecto 50).
cursorqueryCursor opaco de la página siguiente (`siguiente` de la respuesta anterior).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/deca?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'

Cobros

GET/v1/cobrosPendiente de cobrocobros:leer

Facturas con saldo pendiente.

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/cobros?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
POST/v1/facturas/{id}/cobrosRegistrar un cobrocobros:escribir

Sin importe salda lo pendiente. Nunca emite nada. Auditado.

idrutaId de la factura
Idempotency-KeycabeceraObligatoria. Misma clave y mismo cuerpo → misma respuesta; otro cuerpo → 409.
curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/facturas/<id>/cobros?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…' \
  -H 'Content-Type: application/json' \
  -d '{ "fecha": "2026-10-15" }'
Esquema del cuerpo (JSON Schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "fecha": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "importe_centimos": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "fecha"
  ],
  "additionalProperties": false
}

Contactos

GET/v1/contactosClientes y proveedorescontactos:leer

Lectura.

empresa_idqueryCon claves de asesoría: la empresa (si la clave ve varias).
limitequeryEntre 1 y 100 (por defecto 50).
cursorqueryCursor opaco de la página siguiente (`siguiente` de la respuesta anterior).
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/contactos?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
POST/v1/contactosAlta de un contactocontactos:escribir

Auditado. No toca el IBAN ni nada de un pedido pendiente.

curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/contactos?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…' \
  -H 'Content-Type: application/json' \
  -d '{ "nombre": "Logística del Duero SL", "nif": "B09111111", "email": "admin@logistica.example" }'
Esquema del cuerpo (JSON Schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "nombre": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "nif": {
      "type": "string",
      "pattern": "^[A-Z0-9]{8,12}$"
    },
    "email": {
      "type": "string",
      "maxLength": 200,
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "tipo": {
      "default": "cliente",
      "type": "string",
      "enum": [
        "cliente",
        "proveedor"
      ]
    }
  },
  "required": [
    "nombre"
  ],
  "additionalProperties": false
}

Pedidos

POST/v1/pedidosPedir una facturapedidos:escribir

`202` con `estado: pendiente_confirmacion`. ConfIA5 prepara el borrador y Lola pide la confirmación al titular por WhatsApp. Solo entonces se emite y recibes `factura.emitida`.

curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/pedidos?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…' \
  -H 'Content-Type: application/json' \
  -d '{ "contacto": { "nombre": "Logística del Duero SL", "nif": "B09111111" }, "lineas": [ { "concepto": "Porte Burgos-Valladolid", "cantidad": 3, "precio_unitario_centimos": 45000, "tipo_iva": 21 } ] }'
Esquema del cuerpo (JSON Schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "empresa_id": {
      "description": "Solo con claves de asesoría: la empresa del pedido.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "tipo": {
      "default": "factura",
      "type": "string",
      "const": "factura"
    },
    "contacto_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "contacto": {
      "type": "object",
      "properties": {
        "nombre": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "nif": {
          "type": "string",
          "pattern": "^[A-Z0-9]{8,12}$"
        },
        "email": {
          "type": "string",
          "maxLength": 200,
          "format": "email",
          "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
        },
        "tipo": {
          "default": "cliente",
          "type": "string",
          "enum": [
            "cliente",
            "proveedor"
          ]
        }
      },
      "required": [
        "nombre"
      ],
      "additionalProperties": false
    },
    "lineas": {
      "minItems": 1,
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "concepto": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "cantidad": {
            "default": 1,
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1000000
          },
          "precio_unitario_centimos": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000000
          },
          "tipo_iva": {
            "default": 21,
            "anyOf": [
              {
                "type": "number",
                "const": 0
              },
              {
                "type": "number",
                "const": 4
              },
              {
                "type": "number",
                "const": 10
              },
              {
                "type": "number",
                "const": 21
              }
            ]
          }
        },
        "required": [
          "concepto",
          "precio_unitario_centimos"
        ],
        "additionalProperties": false
      }
    },
    "retencion_irpf": {
      "default": 0,
      "anyOf": [
        {
          "type": "number",
          "const": 0
        },
        {
          "type": "number",
          "const": 1
        },
        {
          "type": "number",
          "const": 2
        },
        {
          "type": "number",
          "const": 7
        },
        {
          "type": "number",
          "const": 15
        },
        {
          "type": "number",
          "const": 19
        }
      ]
    },
    "observaciones": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "referencia_externa": {
      "type": "string",
      "maxLength": 80
    }
  },
  "required": [
    "lineas"
  ],
  "additionalProperties": false
}
{
  "id": "6d0a…",
  "estado": "pendiente_confirmacion",
  "caduca_en": "2026-10-18T10:00:00Z"
}
GET/v1/pedidos/{id}Estado de un pedidopedidos:escribir

recibido → validando → necesita_datos | pendiente_confirmacion → confirmado → emitido | rechazado | caducado | error.

idrutaId del pedido
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/pedidos/<id>?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'

Exportaciones

POST/v1/exportacionesExportar a tu contabilidadexportaciones:crear

Formato `universal` (PDF + libros en CSV). Los formatos de programa solo cuando existan.

curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/exportaciones?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…' \
  -H 'Content-Type: application/json' \
  -d '{ "formato": "universal", "desde": "2026-07-01", "hasta": "2026-09-30" }'
Esquema del cuerpo (JSON Schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "empresa_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "formato": {
      "default": "universal",
      "type": "string",
      "const": "universal"
    },
    "desde": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "hasta": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    }
  },
  "required": [
    "desde",
    "hasta"
  ],
  "additionalProperties": false
}
GET/v1/exportaciones/{id}Descargar una exportaciónexportaciones:crear

URL firmada de 5 minutos.

idrutaId de la exportación
curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/exportaciones/<id>?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'

Webhooks

GET/v1/webhooksDestinoswebhooks:gestionar

Lista de destinos de la clave.

curl -X GET 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/webhooks?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'
POST/v1/webhooksCrear un destinowebhooks:gestionar

Solo https, puerto 443 y dominio público. Devuelve el secreto de firma UNA vez. Con clave live, solo desde el portal (pide confirmación).

curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/webhooks?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…' \
  -H 'Content-Type: application/json' \
  -d '{ "url": "https://erp.ejemplo.es/confia5", "eventos": [ "factura.emitida" ] }'
Esquema del cuerpo (JSON Schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 500,
      "format": "uri"
    },
    "eventos": {
      "minItems": 1,
      "maxItems": 16,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "factura.emitida",
          "factura.cobrada",
          "factura.vencida",
          "pedido.necesita_datos",
          "pedido.rechazado",
          "pedido.caducado",
          "presupuesto.aceptado",
          "gasto.registrado",
          "gasto.validado",
          "deca.emitido",
          "paquete.listo",
          "exportacion.lista",
          "autorizacion.concedida",
          "autorizacion.revocada",
          "empresa.baja",
          "clave.caduca_pronto"
        ]
      }
    }
  },
  "required": [
    "url",
    "eventos"
  ],
  "additionalProperties": false
}
DELETE/v1/webhooks/{id}Borrar un destinowebhooks:gestionar
idrutaId del destino
curl -X DELETE 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/webhooks/<id>?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…'

Sandbox

POST/v1/sandbox/pedidos/{id}/simularSimular la respuesta del titularpedidos:escribir

Solo con claves c5_test_ (con una live: 404).

idrutaId del pedido
Idempotency-KeycabeceraObligatoria. Misma clave y mismo cuerpo → misma respuesta; otro cuerpo → 409.
curl -X POST 'https://qrdeuihavrwyxutyuejo.supabase.co/functions/v1/api-publica/v1/sandbox/pedidos/<id>/simular?forceFunctionRegion=eu-central-1' \
  -H 'Authorization: Bearer c5_test_…' \
  -H 'Idempotency-Key: 6f1d2c…' \
  -H 'Content-Type: application/json' \
  -d '{ "decision": "confirmar" }'
Esquema del cuerpo (JSON Schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "decision": {
      "type": "string",
      "enum": [
        "confirmar",
        "rechazar",
        "cambiar"
      ]
    }
  },
  "required": [
    "decision"
  ],
  "additionalProperties": false
}