/api/v1/businesses/:businessId/fiscalisation-jobs
auth: jwt (administrator | submit_invoices)Trigger fiscalisation for a batch of payments. Pre-flight eligibility validator re-reads persisted EligibleForFiscalisation / FiscalisationBlockReasons + checks the business's TaxCore config, then partitions the batch into dispatched and blocked. Blocked payments come back with per-payment reason codes so operators can fix the root cause and retry. Batch size capped at MAX_PAYMENTS_PER_FISCALISATION_JOB (currently 10).
handlers: FiscalisationJobsController.trigger
Request body type: TriggerFiscalisationBody
| name | required | default | description |
|---|---|---|---|
businessId pathuuid | yes | — | Target business UUID. |
paymentIds bodyuuid[] | yes | — | 1..MAX_PAYMENTS_PER_FISCALISATION_JOB payment UUIDs to dispatch. |
options.omitTextualRepresentation body0 | 1 | no | 0 | 0 = include textual representation (default); 1 = omit. |
options.omitQRCodeGen body0 | 1 | no | 0 | 0 = generate QR code (default); 1 = skip. |
tillId bodyuuid | null | no | — | Optional till to print receipts to after fiscalisation completes. |
APIResponseDataObject<{ message: string; skippedIds: string[] }>APIResponseDataObject<{ jobId: string; skippedIds?: string[]; blocked?: TriggerBlockedPayment[]; warning?: string }>APIErrorAPIResponseDataObject<{ message: string; blocked: TriggerBlockedPayment[] }> | APIError/api/v1/businesses/:businessId/fiscalisation-jobs/by-invoice
auth: jwt (administrator | submit_invoices)Invoice-level fiscalisation trigger for PROFORMA (quote) rows. Accepts invoiceIds[]; the service translates each to a synthetic payment (idempotent) before delegating to the standard per-payment dispatch. Same partitioned-response contract as POST /fiscalisation-jobs.
handlers: FiscalisationJobsController.triggerByInvoice
Request body type: TriggerFiscalisationByInvoiceBody
| name | required | default | description |
|---|---|---|---|
businessId pathuuid | yes | — | Target business UUID. |
invoiceIds bodyuuid[] | yes | — | 1..MAX_PAYMENTS_PER_FISCALISATION_JOB invoice UUIDs. Each is translated to a synthetic payment idempotently. |
options.omitTextualRepresentation body0 | 1 | no | 0 | 0 = include textual representation (default); 1 = omit. |
options.omitQRCodeGen body0 | 1 | no | 0 | 0 = generate QR code (default); 1 = skip. |
APIResponseDataObject<{ message: string; skippedIds: string[] }>APIResponseDataObject<{ jobId: string; skippedIds?: string[]; blocked?: TriggerBlockedPayment[]; warning?: string }>APIErrorAPIResponseDataObject<{ message: string; blocked: TriggerBlockedPayment[] }> | APIError/api/v1/businesses/:businessId/fiscalisation-jobs/:jobId
auth: jwt (administrator | view_invoices | submit_invoices)Poll fiscalisation job status and per-payment results. The Results array carries per-payment fiscal data (FiscalInvoiceNumber, FiscalTimestamp, FiscalVerificationUrl, errorMessage, attempts). IDOR-guarded — a job belonging to another business returns 404. Add ?lite=true to omit the Results array — returns counts + status only, reducing repeated-poll payload from MB → ~200 bytes for large jobs.
handlers: FiscalisationJobsController.getById
| name | required | default | description |
|---|---|---|---|
businessId pathuuid | yes | — | Target business UUID. |
jobId pathuuid | yes | — | FiscalisationJob UUID. Must belong to businessId. |
lite query'true' | 'false' | no | — | When 'true', omits the per-invoice Results array from the response. Useful for high-frequency polling. Schema (GetFiscalisationJobQuerySchema) is defined but the controller reads the raw query value directly — only the literal string 'true' triggers lite mode. |
APIResponseDataObject<FiscalisationJobDTO>APIError