Inicio rápido de Austria
Este inicio rápido te guía por los pasos esenciales para firmar tu primer recibo conforme a RKSV con fiskaly SIGN AT.
Requisitos previos
Sección titulada «Requisitos previos»- Una cuenta fiskaly con una organización austriaca (regístrate en HUB)
- Una clave de API y un secreto generados en el entorno de PRUEBA
- Credenciales de “Usuario del servicio web de cajas registradoras” de FinanzOnline del contribuyente
Tu secreto de API se muestra solo una vez. Guárdalo inmediatamente en un lugar seguro.
Autenticar
curl -X POST https://rksv.fiskaly.com/api/v1/auth \ -H "Content-Type: application/json" \ -d '{ "api_key": "YOUR_API_KEY", "api_secret": "YOUR_API_SECRET" }'const response = await fetch("https://rksv.fiskaly.com/api/v1/auth", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ api_key: "YOUR_API_KEY", api_secret: "YOUR_API_SECRET", }), }); const { access_token } = await response.json();import requests response = requests.post( "https://rksv.fiskaly.com/api/v1/auth", json={"api_key": "YOUR_API_KEY", "api_secret": "YOUR_API_SECRET"}, ) access_token = response.json()["access_token"]HttpClient client = HttpClient.newHttpClient(); String body = """{"api_key":"YOUR_API_KEY","api_secret":"YOUR_API_SECRET"}"""; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://rksv.fiskaly.com/api/v1/auth")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());using var client = new HttpClient(); var response = await client.PostAsJsonAsync( "https://rksv.fiskaly.com/api/v1/auth", new { api_key = "YOUR_API_KEY", api_secret = "YOUR_API_SECRET" }); var result = await response.Content.ReadFromJsonAsync<JsonElement>(); var accessToken = result.GetProperty("access_token").GetString();Autenticar con FinanzOnline
Antes de crear recursos, autentica las credenciales de FinanzOnline del contribuyente:
curl -X POST https://rksv.fiskaly.com/api/v1/fon/auth \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "fon_participant_id": "YOUR_FON_PARTICIPANT_ID", "fon_user_id": "YOUR_FON_USER_ID", "fon_user_pin": "YOUR_FON_USER_PIN" }'await fetch("https://rksv.fiskaly.com/api/v1/fon/auth", { method: "POST", headers: { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ fon_participant_id: "YOUR_FON_PARTICIPANT_ID", fon_user_id: "YOUR_FON_USER_ID", fon_user_pin: "YOUR_FON_USER_PIN", }), });requests.post( "https://rksv.fiskaly.com/api/v1/fon/auth", headers={"Authorization": f"Bearer {access_token}"}, json={ "fon_participant_id": "YOUR_FON_PARTICIPANT_ID", "fon_user_id": "YOUR_FON_USER_ID", "fon_user_pin": "YOUR_FON_USER_PIN", }, )// POST /api/v1/fon/auth // Body: {"fon_participant_id":"...","fon_user_id":"...","fon_user_pin":"..."} // Header: Authorization: Bearer <access_token>client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); await client.PostAsJsonAsync( "https://rksv.fiskaly.com/api/v1/fon/auth", new { fon_participant_id = "YOUR_FON_PARTICIPANT_ID", fon_user_id = "YOUR_FON_USER_ID", fon_user_pin = "YOUR_FON_USER_PIN", });📘NoteEstas son las credenciales del “Usuario del servicio web de cajas registradoras” dedicado creado por el contribuyente en FinanzOnline — no las credenciales generales de FinanzOnline.
Crear e inicializar una SCU
SCU_ID=$(uuidgen) # Crear SCU curl -X PUT "https://rksv.fiskaly.com/api/v1/signature-creation-unit/${SCU_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"legal_entity_id": {"vat_id": "ATU12345678"}}' # Inicializar SCU (registra en FinanzOnline) curl -X PATCH "https://rksv.fiskaly.com/api/v1/signature-creation-unit/${SCU_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"state": "INITIALIZED"}'const scuId = crypto.randomUUID(); const BASE = "https://rksv.fiskaly.com/api/v1"; const headers = { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", }; // Crear SCU await fetch(`${BASE}/signature-creation-unit/${scuId}`, { method: "PUT", headers, body: JSON.stringify({ legal_entity_id: { vat_id: "ATU12345678" }, }), }); // Inicializar SCU await fetch(`${BASE}/signature-creation-unit/${scuId}`, { method: "PATCH", headers, body: JSON.stringify({ state: "INITIALIZED" }), });import uuid scu_id = str(uuid.uuid4()) BASE = "https://rksv.fiskaly.com/api/v1" hdrs = {"Authorization": f"Bearer {access_token}"} # Crear SCU requests.put(f"{BASE}/signature-creation-unit/{scu_id}", headers=hdrs, json={"legal_entity_id": {"vat_id": "ATU12345678"}}) # Inicializar SCU requests.patch(f"{BASE}/signature-creation-unit/{scu_id}", headers=hdrs, json={"state": "INITIALIZED"})// PUT /signature-creation-unit/{scuId} // Body: {"legal_entity_id":{"vat_id":"ATU12345678"}} // PATCH /signature-creation-unit/{scuId} // Body: {"state":"INITIALIZED"}var scuId = Guid.NewGuid().ToString(); await client.PutAsJsonAsync( $"https://rksv.fiskaly.com/api/v1/signature-creation-unit/{scuId}", new { legal_entity_id = new { vat_id = "ATU12345678" } }); await client.PatchAsJsonAsync( $"https://rksv.fiskaly.com/api/v1/signature-creation-unit/{scuId}", new { state = "INITIALIZED" });La inicialización de la SCU la registra automáticamente en FinanzOnline.
Crear e inicializar una caja registradora
CR_ID=$(uuidgen) # Crear caja registradora curl -X PUT "https://rksv.fiskaly.com/api/v1/cash-register/${CR_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"description": "POS Terminal 1"}' # Registrar en FinanzOnline curl -X PATCH "https://rksv.fiskaly.com/api/v1/cash-register/${CR_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"state": "REGISTERED"}' # Inicializar (crea y valida el recibo inicial) curl -X PATCH "https://rksv.fiskaly.com/api/v1/cash-register/${CR_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{"state": "INITIALIZED"}'const crId = crypto.randomUUID(); // Crear caja registradora await fetch(`${BASE}/cash-register/${crId}`, { method: "PUT", headers, body: JSON.stringify({ description: "POS Terminal 1" }), }); // Registrar en FinanzOnline await fetch(`${BASE}/cash-register/${crId}`, { method: "PATCH", headers, body: JSON.stringify({ state: "REGISTERED" }), }); // Inicializar await fetch(`${BASE}/cash-register/${crId}`, { method: "PATCH", headers, body: JSON.stringify({ state: "INITIALIZED" }), });cr_id = str(uuid.uuid4()) requests.put(f"{BASE}/cash-register/{cr_id}", headers=hdrs, json={"description": "POS Terminal 1"}) requests.patch(f"{BASE}/cash-register/{cr_id}", headers=hdrs, json={"state": "REGISTERED"}) requests.patch(f"{BASE}/cash-register/{cr_id}", headers=hdrs, json={"state": "INITIALIZED"})// PUT /cash-register/{crId} → {"description":"POS Terminal 1"} // PATCH /cash-register/{crId} → {"state":"REGISTERED"} // PATCH /cash-register/{crId} → {"state":"INITIALIZED"}var crId = Guid.NewGuid().ToString(); await client.PutAsJsonAsync( $"{BASE}/cash-register/{crId}", new { description = "POS Terminal 1" }); await client.PatchAsJsonAsync( $"{BASE}/cash-register/{crId}", new { state = "REGISTERED" }); await client.PatchAsJsonAsync( $"{BASE}/cash-register/{crId}", new { state = "INITIALIZED" });📘NoteLas cajas registradoras requieren dos transiciones de estado: primero a
REGISTERED(que registra en FinanzOnline), luego aINITIALIZED(que crea y valida el recibo inicial).Firmar tu primer recibo
RECEIPT_ID=$(uuidgen) curl -X PUT "https://rksv.fiskaly.com/api/v1/cash-register/${CR_ID}/receipt/${RECEIPT_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "receipt_type": "NORMAL", "schema": { "standard_v1": { "receipt": { "amounts_per_vat_rate": [ {"vat_rate": "STANDARD", "amount": "12.00"} ], "amounts_per_payment_type": [ {"payment_type": "CASH", "amount": "12.00"} ] } } } }'const receiptId = crypto.randomUUID(); const receipt = await fetch( `${BASE}/cash-register/${crId}/receipt/${receiptId}`, { method: "PUT", headers, body: JSON.stringify({ receipt_type: "NORMAL", schema: { standard_v1: { receipt: { amounts_per_vat_rate: [ { vat_rate: "STANDARD", amount: "12.00" }, ], amounts_per_payment_type: [ { payment_type: "CASH", amount: "12.00" }, ], }, }, }, }), } ).then(r => r.json()); console.log("QR Code Data:", receipt.qr_code_data); console.log("Receipt Number:", receipt.receipt_number);receipt_id = str(uuid.uuid4()) receipt = requests.put( f"{BASE}/cash-register/{cr_id}/receipt/{receipt_id}", headers=hdrs, json={ "receipt_type": "NORMAL", "schema": { "standard_v1": { "receipt": { "amounts_per_vat_rate": [ {"vat_rate": "STANDARD", "amount": "12.00"} ], "amounts_per_payment_type": [ {"payment_type": "CASH", "amount": "12.00"} ], } } }, }, ).json() print("QR Code:", receipt["qr_code_data"])// PUT /cash-register/{crId}/receipt/{receiptId} // Body: {"receipt_type":"NORMAL","schema":{"standard_v1":{...}}} // La respuesta contiene qr_code_data, receipt_number, time_signaturevar receiptId = Guid.NewGuid().ToString(); var receiptResp = await client.PutAsJsonAsync( $"{BASE}/cash-register/{crId}/receipt/{receiptId}", new { receipt_type = "NORMAL", schema = new { standard_v1 = new { receipt = new { amounts_per_vat_rate = new[] { new { vat_rate = "STANDARD", amount = "12.00" } }, amounts_per_payment_type = new[] { new { payment_type = "CASH", amount = "12.00" } }, }}}});La respuesta contiene todo lo necesario para un recibo conforme a RKSV:
qr_code_data(datos para el código QR RKSV obligatorio),receipt_number,time_signatureycash_register_serial_number(campos de texto requeridos).
Ejecutar el script
Sección titulada «Ejecutar el script»¿Quieres ejecutar todos los pasos automáticamente? Descarga y ejecuta nuestro script de inicio rápido:
# Descargar y ejecutar
curl -O https://workspace.fiskaly.com/scripts/sign-at-quickstart.sh
export API_KEY="your_api_key"
export API_SECRET="your_api_secret"
export FON_PARTICIPANT_ID="your_fon_participant_id"
export FON_USER_ID="your_fon_user_id"
export FON_USER_PIN="your_fon_user_pin"
export VAT_ID="ATU12345678"
bash sign-at-quickstart.sh# Descargar y ejecutar
curl -O https://workspace.fiskaly.com/scripts/sign-at-quickstart.mjs
API_KEY="your_key" API_SECRET="your_secret" FON_PARTICIPANT_ID="id" FON_USER_ID="id" FON_USER_PIN="pin" VAT_ID="ATU12345678" node sign-at-quickstart.mjsPróximos pasos
Sección titulada «Próximos pasos»Was this page helpful?