Skip to content

Error Codes Reference

This page is the centralized reference for error responses across all fiskaly APIs. Use the interactive explorer below to search and filter errors, or scroll down for the static reference tables.

36 errors found


Start with the troubleshooting decision tree if you have an error and need a quick answer, or browse the product-specific tables below for detailed error codes.

All fiskaly APIs return errors in a consistent JSON format:

{
"status_code": 400,
"error": "Bad Request",
"code": "E_SOME_ERROR",
"message": "A human-readable description of what went wrong"
}
FieldTypeDescription
status_codeintegerHTTP status code
errorstringHTTP status text
codestringfiskaly-specific error code (prefixed with E_)
messagestringHuman-readable error description
CodeMeaningWhen You See It
200OKRequest succeeded, response body contains the result
201CreatedResource created successfully
204No ContentRequest succeeded, no response body (e.g., DELETE operations)

These indicate a problem with your request. Do not retry with the same payload — fix the issue first.

CodeMeaningCommon Causes
400Bad RequestMalformed JSON, missing required fields, invalid field values
401UnauthorizedExpired or missing access token, invalid API credentials
403ForbiddenInsufficient permissions for the requested resource
404Not FoundResource does not exist, or incorrect URL path
409ConflictResource already exists (duplicate creation attempt)
422Unprocessable EntityValid JSON but semantically incorrect (e.g., invalid state transition)
423LockedResource is currently locked by another operation
429Too Many RequestsRate limit exceeded — back off and retry with exponential delay

These indicate a temporary problem on fiskaly’s side. Safe to retry with exponential backoff.

CodeMeaningAction
500Internal Server ErrorRetry after a brief delay; if persistent, check status.fiskaly.com
502Bad GatewayUpstream service temporarily unavailable; retry
503Service UnavailableService is temporarily down for maintenance; retry
504Gateway TimeoutRequest timed out upstream; retry with longer timeout

These are the most common errors developers encounter during integration.

Error CodeHTTP StatusCauseFix
E_UNAUTHORIZED_ACCESS401Access token expired or not providedRe-authenticate using your API key and secret
E_INVALID_CREDENTIALS401API key or secret is incorrectVerify credentials in the HUB
E_TOKEN_EXPIRED401JWT access token has expiredUse the refresh token, or re-authenticate
E_ACCESS_FORBIDDEN403Your API key does not have permission for this resourceCheck API key scopes in the HUB
API Key + Secret → POST /auth → access_token (24h) + refresh_token (48h)
├── Use for all API calls
└── On 401 → re-authenticate (not on every request)
Error CodeHTTP StatusCauseFix
E_TSS_NOT_FOUND404TSS ID does not existVerify the TSS ID; list all TSS via GET /tss
E_TSS_NOT_INITIALIZED400TSS has not been initialized yetFollow all necessary steps: create TSS, update it to UNINITIALIZED, set Admin PIN, login as Admin and set TSS to INITIALIZED
E_TSS_DISABLED400TSS has been disabledTSS can no longer sign transactions, create a new TSS
E_TSS_IN_USE409TSS is being modified by another requestWait and retry
E_CLIENT_NOT_FOUND404Client ID does not exist for this TSSCreate a client via PUT /tss/{tss_id}/client/{client_id}
E_CLIENT_NOT_REGISTERED400Client exists but is not registeredRegister the client before creating transactions
E_TX_NOT_FOUND404Transaction ID does not existVerify the transaction ID and TSS context
E_TX_INVALID_STATE422Transaction is in a state that does not allow this operationCheck the current transaction state; follow the state machine
E_EXPORT_NOT_FOUND404Export ID does not existVerify export ID; exports may take time to process
E_EXPORT_IN_PROGRESS409Export is still being generatedPoll the export status until state: COMPLETED
Error CodeHTTP StatusCauseFix
E_ESTABLISHMENT_NOT_FOUND404Establishment ID not foundVerify the establishment exists for your organization
E_TAXPAYER_NOT_FOUND404Taxpayer record not foundCreate the taxpayer resource first
E_TAXPAYER_ADDRESS_NOT_FOUND404Taxpayer address not configuredAdd address data to the taxpayer resource
E_TAXPAYER_PERSON_NOT_FOUND404Taxpayer person record missingAdd person data to the taxpayer resource
E_SUBMISSION_NOT_FOUND404Submission ID not foundVerify submission ID; check that the submission was created
E_CLIENT_ADDITIONAL_DATA_NOT_FOUND404Client additional data missingProvide the required additional data for the client
E_LOCKED_RESOURCE423Resource is locked by an ongoing operationWait for the current operation to complete, then retry
Error CodeHTTP StatusCauseFix
E_CASH_REGISTER_NOT_FOUND404Cash register not foundCreate the cash register first via the DSFinV-K API
E_CASH_POINT_CLOSING_NOT_FOUND404Cash point closing not foundVerify the closing ID
E_VAT_DEFINITION_NOT_FOUND404VAT definition not configuredCreate VAT definitions before inserting closings
E_INVALID_CLOSING_DATA400Closing payload does not match expected schemaValidate your payload against the DSFinV-K specification

These errors are shared across all Unified API products (SIGN FR, SIGN IT, SIGN ES). All three APIs use the same authentication, organization, and resource-management layer.

Error CodeHTTP StatusCauseFix
E_ORGANIZATION_NOT_FOUND404Organization ID does not existVerify org ID; ensure it was created under the correct GROUP
E_TAXPAYER_NOT_COMMISSIONED400Taxpayer exists but state is not COMMISSIONEDUpdate taxpayer state to COMMISSIONED before operations
E_IDEMPOTENCY_KEY_REUSED409Idempotency key was already used for a different requestGenerate a fresh UUID for each new request
E_API_VERSION_NOT_SUPPORTED400X-Api-Version header contains unsupported dateUse the latest supported version (e.g. 2026-02-03)
E_SCOPE_IDENTIFIER_MISSING400X-Scope-Identifier header not providedInclude the organization ID in X-Scope-Identifier
E_SUBJECT_NOT_FOUND404Subject (API key) not foundVerify subject was created under the correct organization
E_TOKEN_INVALID401Token is malformed or expiredRe-authenticate via POST /api/v1/auth/token
E_LOCATION_NOT_COMMISSIONED400Location exists but not commissionedUpdate location state to COMMISSIONED
E_SYSTEM_NOT_COMMISSIONED400System exists but not commissionedUpdate system state to COMMISSIONED
Error CodeHTTP StatusCauseFix
E_RECORD_INVALID_OPERATION422Record operation type not valid for current stateCheck the Intention → Transaction flow; ensure correct sequence
E_RECORD_INTENTION_REQUIRED400Transaction record created without prior IntentionCreate an Intention record first, then reference its ID
E_TAXPAYER_CREDENTIALS_INVALID400French fiscalization credentials (NF 525) are invalidVerify tax_id_number (SIREN) and credentials
E_CLOSURE_IN_PROGRESS409A fiscal closure is already runningWait for current closure to complete
Error CodeHTTP StatusCauseFix
E_RT_DEVICE_NOT_FOUND404Registratore Telematico device not foundVerify the RT device was created and commissioned
E_RT_SUBMISSION_FAILED502Submission to Agenzia delle Entrate failedRetry; check AdE service status if persistent
E_LOTTERY_CODE_INVALID400Receipt lottery code format is invalidEnsure lottery code is 8 alphanumeric characters
E_FISCAL_CODE_INVALID400Italian codice fiscale format is incorrectVerify the 16-character fiscal code format

SIGN ES returns validation errors in a validations array on the response, each with a code and description. These are specific to TicketBAI / Verifactu / SII transmissions.

Validation CodeCause
V_TICKETBAIUnknown or unhandled error from TicketBAI
V_XSD_SCHEMA_NOT_COMPLYXML file does not comply with the XML schema
V_INVOICE_WITHOUT_LINESXML file does not include detail lines
V_REQUIRED_FIELD_MISSING_OR_INCORRECTCompulsory data is missing or incorrect
V_INVOICE_ALREADY_REGISTEREDInvoice with the same number/series/year was already registered
V_SERVICE_NOT_AVAILABLEThe reception service is not available
V_INCORRECT_SENDER_CERTIFICATEThe sender certificate is unknown
V_INVALID_SENDER_CERTIFICATEThe sender certificate is not valid
V_WRONG_SIGNATURESignature validation failed
V_INCORRECT_INVOICE_CHAININGInvoice chaining was incorrect
V_INVALID_TBAI_LICENSETicketBAI licence not registered or not valid
V_DEVICE_NOT_REGISTEREDDevice certificate used for sending is pending registration
V_EXPIRED_SIGNATURE_CERTIFICATECertificate used to sign the TicketBAI file has expired
V_EXPIRED_SENDER_CERTIFICATESender certificate is not valid or has expired
V_EXPIRED_SIGNER_CERTIFICATECertificate used for signing is not valid or has expired
V_FULL_AMOUNT_MISMATCHSum of line full_amount entries does not equal invoice full_amount
V_ISSUE_DATE_OUT_OF_RANGEIssue date is older than 20 years or in the future
V_INVALID_VAT_RATEVAT rate is not a valid value for the taxpayer’s region
V_INVOICE_ALREADY_CANCELLEDInvoice was already cancelled
V_INVOICE_ALREADY_CORRECTEDInvoice was already corrected
V_INCOMPATIBLE_VAT_SYSTEMSProvided invoice systems are not compatible with each other
V_INCORRECT_ITEM_VAT_CALCULATIONAn invoice item has an incorrectly applied VAT calculation

Different operations have different expected durations. Configure your timeouts accordingly:

OperationRecommended TimeoutNotes
Authentication (POST /auth)3-4 secondsFast operation; do not block checkout
Transaction signing (PUT /tx)3-5 secondsShould never block the POS
TSS creation / initialization30 secondsOne-time setup; heavier processing
DSFinV-K cash point closingsUp to 10 minutesHeavy processing with large datasets
Export generationPoll-basedUse async polling, not synchronous wait

For transient errors (5xx, timeouts, rate limits), use exponential backoff:

async function callWithRetry(fn, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
return await fn();
} catch (error) {
if (attempt === maxRetries) throw error;
const isRetryable =
error.status >= 500 ||
error.status === 429 ||
error.code === "ETIMEDOUT";
if (!isRetryable) throw error;
const delay = Math.min(1000 * 2 ** attempt, 30000);
await new Promise((r) => setTimeout(r, delay));
}
}
}
Got an error?
├── 401 Unauthorized
│ └── Is your token expired?
│ ├── Yes → Re-authenticate with API key + secret
│ └── No → Check credentials in the HUB
├── 400 Bad Request
│ └── Check the `message` field for which field is invalid
│ └── Validate your JSON payload against the API schema
├── 404 Not Found
│ └── Does the resource exist?
│ ├── Check the ID is correct (UUIDv4 format)
│ └── Ensure the resource was created in the correct environment (TEST vs LIVE)
├── 409 Conflict
│ └── Resource already exists or is being modified
│ └── Use GET to check current state before retrying
├── 429 Rate Limited
│ └── Back off with exponential delay
│ └── Check if you are re-authenticating on every request (don't)
└── 5xx Server Error
└── Check status.fiskaly.com
├── Known incident → Wait for resolution
└── No incident → Retry with exponential backoff; contact support if persistent

Monitor fiskaly service health at status.fiskaly.com.

These are the errors fiskaly support sees most often from teams during their first integration. Avoiding them saves significant debugging time.

MistakeWhat happensHow to avoid it
Re-authenticating on every request429 rate limit errors; unnecessary latency on every checkoutCache the access token (24h TTL). Only re-authenticate on 401.
Not saving the admin_pukCannot set the Admin PIN on the TSS; stuck in UNINITIALIZED stateStore the admin_puk from the TSS creation response immediately.
Reusing UUIDs409 Conflict errors when creating TSS, clients, or transactionsGenerate a fresh UUIDv4 for every resource creation call.
Blocking checkout on signing failureCustomers wait indefinitely if the TSS is slow or unavailableSet a 3-5 second timeout on signing. Issue the receipt with “TSS not available” and retry later.
Using TEST credentials in LIVE (or vice versa)401 Unauthorized — credentials are environment-scopedVerify the base URL matches the API key’s environment. TEST and LIVE are completely separate.
Skipping TSS initialization400 E_TSS_NOT_INITIALIZED when creating clients or transactionsFollow all necessary steps: create TSS, update it to UNINITIALIZED, set Admin PIN, login as Admin and set TSS to INITIALIZED.
Not handling tx_revision correctly422 E_TX_INVALID_STATE or duplicate transaction errorsStart with tx_revision=1 (ACTIVE), finish with tx_revision=2 (FINISHED). Always increment.
Synchronous export pollingTimeouts on DSFinV-K export generation (can take up to 10 minutes)Use async polling: trigger export, then poll status endpoint until state: COMPLETED.
Hardcoding timeoutsDevelopment team cannot adjust without a code releaseMake timeouts configurable (e.g., 1.5-5 seconds for transactions). Admin-adjustable is ideal.

Was this page helpful?