Skip to content

Fiscalize an invoice

The canonical invoice

Every connector maps its document into one canonical schema. The TaxCore-specific shaping happens once, inside the Bridge.

{
  "shop_id": "shp_123",
  "external_ref": "SO-1042",
  "invoice_type": "NORMAL",       // NORMAL | PROFORMA | COPY | TRAINING | ADVANCE
  "transaction_type": "SALE",     // SALE | REFUND
  "datetime_iso": "2026-06-10T03:00:00Z",
  "cashier": "Jane",
  "buyer_tin": "1000234",
  "currency": "VUV",
  "items": [
    {
      "name": "Premium Kava 500g",
      "gtin": "9415xxxxxxxxx",
      "quantity": 1,
      "unit_price_incl": 1725.00,
      "total_incl": 1725.00,
      "tax_labels": ["D"]
    }
  ],
  "payments": [{ "type": "CASH", "amount": 1725.00 }]
}
Field Notes
external_ref Your stable document id. Drives idempotency — must be unique per shop.
unit_price_incl / total_incl Tax-inclusive. The SDC derives tax from the label.
tax_labels Validated against the shop's SDC-synced rates; unknown labels are rejected.
payments[].type CASH \| CARD \| CHECK \| WIRE \| VOUCHER \| MOBILE \| OTHER

The response

POST /v1/fiscalize signs the invoice synchronously and returns 200 OK with the full result. Internally Tax-Bridge absorbs the V-SDC's transient failures with a two-tier retry, so the call returns either a signed document or a clear failure:

{
  "request_id": "84cdb2803703ceb1f5b29392b6f594e0",
  "status": "FISCALIZED",
  "external_ref": "SO-1042",
  "invoice_number": "DX73WJZV-KMVACKO0-7877",
  "verification_url": "https://sandbox.taxcore.online/v/?vl=…",
  "qr_gif_base64": "R0lGODlh…",
  "journal": "============ FISCAL INVOICE ============ …"
}

status is FISCALIZED or FAILED (with an error). Render the verbatim journal, the QR (base64 GIF) and the verification URL to produce a compliant fiscal receipt. Look an invoice up again at any time with GET /v1/invoices/{request_id}.

Idempotent retries

Safe to retry on a network error — the deterministic request id means a repeat of the same (shop_id, external_ref) returns the existing fiscalization rather than signing twice.

Roadmap — fully async

A queue-backed mode (202 Accepted + interim non-fiscal slip → signed webhook callback) is on the roadmap for high-volume / offline POS, mirroring the interim-slip→fiscal-receipt UX in the connectors. The synchronous response above is the current contract.