Factuarea API
Delivery notes

Sign a delivery note

Record a handwritten signature on a delivery note (typically captured from the recipient on delivery). The signature image must be a base64-encoded **PNG** (≤2 MB) — JPEG/SVG are rejected with 422 `invalid_param_format` (decision D17, PNG-only in v1). On success `signed_at`/`signed_by` are updated; signing records the signature data but does not change the delivery note `status` (it stays `delivered`). The signature audit log retains hashed recipient PII for 5 years to satisfy Spanish LSSI-CE retention obligations; use `POST /v1/delivery_notes/signature-audits/{auditId}/forget` to honor a GDPR Art. 17 erasure request. Supports `Idempotency-Key` for safe retries.

POST
/delivery_notes/{delivery_note}/sign
AuthorizationBearer <token>

In: header

Path Parameters

delivery_note*string

Header Parameters

Idempotency-Key?string

Unique key generated by the client to ensure idempotency on retries. It lets you safely resend the same request: the first response is cached and returned without re-executing the mutation. It is an opaque string to the server; any unique value of up to 64 characters is valid (UUID v7, UUID v4, ULID, nanoid, etc.). UUID v7 is recommended for consistency with the API identifiers. The same key reused with a different body returns 409 idempotency_key_reused.

Length1 <= length <= 64

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

import { Factuarea } from "@factuarea/sdk";const factuarea = new Factuarea({ apiKey: process.env.FACTUAREA_API_KEY! });const result = await factuarea.deliveryNotes.sign("01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01", {    // request body — see the schema below  });
{
  "data": {
    "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a06",
    "object": "delivery_note",
    "number": "A-2026-00031",
    "series": {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0e",
      "code": "F-2026"
    },
    "client": {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
      "name": "Acme Corporation"
    },
    "status": "signed",
    "issued_on": "2026-01-19",
    "delivery_date": "2026-01-21",
    "signed_at": "2026-01-21T14:50:00Z",
    "signed_by": "María García López",
    "signature_image_url": "https://files.factuarea.com/signatures/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a06.png",
    "vehicle_plate": "5678JKL",
    "driver": {
      "name": "Pedro Sánchez Ruiz",
      "tax_id": "12345678Z"
    },
    "tracking": {
      "number": "TRK-2026-0099",
      "carrier": "SEUR"
    },
    "received_by": {
      "name": "María García López",
      "tax_id": "87654321X"
    },
    "billing_emails": [
      "administracion@cliente.com"
    ],
    "subtotal": 800,
    "taxes_total": 168,
    "total": 968,
    "currency": "EUR",
    "notes": "Entregado en almacén central.",
    "external_id": "ERP-ALB-2026-0031",
    "lines": [
      {
        "object": "delivery_note_line",
        "description": "Cajas de material A4 (500u)",
        "product": {
          "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a09",
          "name": "Consultoría hora estándar"
        },
        "quantity": 2,
        "unit_price": 400,
        "tax_rate": 21,
        "retention_rate": 0,
        "surcharge_rate": 0,
        "discount_percent": 0,
        "subtotal": 800,
        "taxes": 168,
        "total": 968
      }
    ],
    "metadata": {
      "erp_code": "IVA-GEN",
      "ledger_account": "477000"
    },
    "tags": [
      "logistica",
      "almacen-central"
    ],
    "custom_fields": [
      {
        "field": "muelle_carga",
        "value": "Muelle 3"
      }
    ],
    "converted_to_id": null,
    "created_at": "2026-01-19T08:00:00Z",
    "updated_at": "2026-01-21T14:50:00Z"
  }
}

{
  "error": {
    "type": "authentication_error",
    "code": "missing_api_key",
    "message": "No se ha proporcionado una API key válida en el header Authorization.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#missing_api_key",
    "request_id": "req_01HKQS5N8VR7QXJ9K3T6BWPMZA"
  }
}

{
  "error": {
    "type": "authorization_error",
    "code": "insufficient_scope",
    "message": "Esta API key no tiene el scope requerido para esta operación.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#insufficient_scope",
    "request_id": "req_01HKQS5NBC3P8M1KX4V7SLNHQD"
  }
}

{
  "error": {
    "type": "not_found_error",
    "code": "resource_not_found",
    "message": "El recurso solicitado no existe o pertenece a otra empresa.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#resource_not_found",
    "request_id": "req_01HKQS5NEQ6X1R4N9B0C5DWTPG"
  }
}

{
  "error": {
    "type": "idempotency_error",
    "code": "idempotency_key_reused",
    "message": "La cabecera `Idempotency-Key` ya se usó con un body distinto. Usa una clave nueva o reenvía exactamente el mismo body.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#idempotency_key_reused",
    "request_id": "req_01HKQS5NHT9A4U7R2E3F8GZWTJ"
  }
}

{
  "error": {
    "type": "invalid_request_error",
    "code": "parameter_invalid",
    "message": "El campo `name` es obligatorio y no puede estar vacío.",
    "param": "name",
    "doc_url": "https://docs.factuarea.com/guides/errors#parameter_invalid",
    "request_id": "req_01HKQS5NGS8Z3T6Q1D2E7FYVSI"
  }
}

{
  "error": {
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "message": "Has excedido el rate limit de 60 peticiones por minuto. Reintenta tras 30 segundos.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#rate_limit_exceeded",
    "request_id": "req_01HKQS5NKW1C6W9T4G5H0JBZVL"
  }
}

{
  "error": {
    "type": "api_error",
    "code": "internal_error",
    "message": "Ha ocurrido un error inesperado. Si persiste, contacta con soporte adjuntando el request_id.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#internal_error",
    "request_id": "req_01HKQS5NLX2D7X0U5H6J1KCAWM"
  }
}