curl --request POST \
--url https://api.openfiskal.com/v1/exports/dsfinvk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-OpenFiskal-Merchant: <x-openfiskal-merchant>' \
--data '
{
"from": "2026-03-01T00:00:00.000Z",
"to": "2026-03-31T23:59:59.000Z",
"register_id": "reg_01HABC"
}
'import requests
url = "https://api.openfiskal.com/v1/exports/dsfinvk"
payload = {
"from": "2026-03-01T00:00:00.000Z",
"to": "2026-03-31T23:59:59.000Z",
"register_id": "reg_01HABC"
}
headers = {
"X-OpenFiskal-Merchant": "<x-openfiskal-merchant>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-OpenFiskal-Merchant': '<x-openfiskal-merchant>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
from: '2026-03-01T00:00:00.000Z',
to: '2026-03-31T23:59:59.000Z',
register_id: 'reg_01HABC'
})
};
fetch('https://api.openfiskal.com/v1/exports/dsfinvk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.openfiskal.com/v1/exports/dsfinvk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => '2026-03-01T00:00:00.000Z',
'to' => '2026-03-31T23:59:59.000Z',
'register_id' => 'reg_01HABC'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-OpenFiskal-Merchant: <x-openfiskal-merchant>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.openfiskal.com/v1/exports/dsfinvk"
payload := strings.NewReader("{\n \"from\": \"2026-03-01T00:00:00.000Z\",\n \"to\": \"2026-03-31T23:59:59.000Z\",\n \"register_id\": \"reg_01HABC\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-OpenFiskal-Merchant", "<x-openfiskal-merchant>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.openfiskal.com/v1/exports/dsfinvk")
.header("X-OpenFiskal-Merchant", "<x-openfiskal-merchant>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": \"2026-03-01T00:00:00.000Z\",\n \"to\": \"2026-03-31T23:59:59.000Z\",\n \"register_id\": \"reg_01HABC\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openfiskal.com/v1/exports/dsfinvk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-OpenFiskal-Merchant"] = '<x-openfiskal-merchant>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": \"2026-03-01T00:00:00.000Z\",\n \"to\": \"2026-03-31T23:59:59.000Z\",\n \"register_id\": \"reg_01HABC\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"type": "dsfinvk",
"status": "pending",
"from": "2023-11-07T05:31:56Z",
"to": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"register_id": "<string>",
"download_url": "<string>",
"error": {
"message": "<string>",
"details": {}
},
"coverage": {
"tse_serial_numbers": [
"<string>"
],
"log_message_count": 123,
"covers_requested_window": true,
"fresh_drain": "not_needed",
"gapless": true,
"signature_counter_first": 123,
"signature_counter_last": 123,
"covered_from": "2023-11-07T05:31:56Z",
"covered_to": "2023-11-07T05:31:56Z",
"last_drained_at": "2023-11-07T05:31:56Z"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"code": "invalid_request",
"message": "The request body is malformed.",
"retryable": false
}{
"code": "unauthorized",
"message": "Authentication failed.",
"retryable": false
}{
"code": "forbidden",
"message": "The authenticated caller cannot access this resource.",
"retryable": false
}{
"code": "not_found",
"message": "The requested resource does not exist.",
"retryable": false
}{
"code": "regime_validation_failed",
"message": "The payload violates regime-specific validation rules.",
"retryable": false
}Create a DSFinV-K export
Germany (KassenSichV). Produces the DSFinV-K archive: the mandated CSV files, index.xml and the GDPdU DTD for one register over a time window.
Asynchronous: returns 202 Accepted with status: pending. Poll GET /exports/{exportId} until status is completed (then download_url is set) or failed.
The window is silently clamped to the period the register was live. Sessions still open in the window are skipped; a closed session whose DSFinV-K closing has not been built yet is rejected rather than omitted.
curl --request POST \
--url https://api.openfiskal.com/v1/exports/dsfinvk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-OpenFiskal-Merchant: <x-openfiskal-merchant>' \
--data '
{
"from": "2026-03-01T00:00:00.000Z",
"to": "2026-03-31T23:59:59.000Z",
"register_id": "reg_01HABC"
}
'import requests
url = "https://api.openfiskal.com/v1/exports/dsfinvk"
payload = {
"from": "2026-03-01T00:00:00.000Z",
"to": "2026-03-31T23:59:59.000Z",
"register_id": "reg_01HABC"
}
headers = {
"X-OpenFiskal-Merchant": "<x-openfiskal-merchant>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-OpenFiskal-Merchant': '<x-openfiskal-merchant>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
from: '2026-03-01T00:00:00.000Z',
to: '2026-03-31T23:59:59.000Z',
register_id: 'reg_01HABC'
})
};
fetch('https://api.openfiskal.com/v1/exports/dsfinvk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.openfiskal.com/v1/exports/dsfinvk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => '2026-03-01T00:00:00.000Z',
'to' => '2026-03-31T23:59:59.000Z',
'register_id' => 'reg_01HABC'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-OpenFiskal-Merchant: <x-openfiskal-merchant>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.openfiskal.com/v1/exports/dsfinvk"
payload := strings.NewReader("{\n \"from\": \"2026-03-01T00:00:00.000Z\",\n \"to\": \"2026-03-31T23:59:59.000Z\",\n \"register_id\": \"reg_01HABC\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-OpenFiskal-Merchant", "<x-openfiskal-merchant>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.openfiskal.com/v1/exports/dsfinvk")
.header("X-OpenFiskal-Merchant", "<x-openfiskal-merchant>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": \"2026-03-01T00:00:00.000Z\",\n \"to\": \"2026-03-31T23:59:59.000Z\",\n \"register_id\": \"reg_01HABC\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openfiskal.com/v1/exports/dsfinvk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-OpenFiskal-Merchant"] = '<x-openfiskal-merchant>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": \"2026-03-01T00:00:00.000Z\",\n \"to\": \"2026-03-31T23:59:59.000Z\",\n \"register_id\": \"reg_01HABC\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"type": "dsfinvk",
"status": "pending",
"from": "2023-11-07T05:31:56Z",
"to": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"register_id": "<string>",
"download_url": "<string>",
"error": {
"message": "<string>",
"details": {}
},
"coverage": {
"tse_serial_numbers": [
"<string>"
],
"log_message_count": 123,
"covers_requested_window": true,
"fresh_drain": "not_needed",
"gapless": true,
"signature_counter_first": 123,
"signature_counter_last": 123,
"covered_from": "2023-11-07T05:31:56Z",
"covered_to": "2023-11-07T05:31:56Z",
"last_drained_at": "2023-11-07T05:31:56Z"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"code": "invalid_request",
"message": "The request body is malformed.",
"retryable": false
}{
"code": "unauthorized",
"message": "Authentication failed.",
"retryable": false
}{
"code": "forbidden",
"message": "The authenticated caller cannot access this resource.",
"retryable": false
}{
"code": "not_found",
"message": "The requested resource does not exist.",
"retryable": false
}{
"code": "regime_validation_failed",
"message": "The payload violates regime-specific validation rules.",
"retryable": false
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Merchant identifier returned by the merchants resource.
Body
"2026-03-01T00:00:00.000Z"
"2026-03-31T23:59:59.000Z"
Register to export. DSFinV-K is per-register: the archive covers exactly this register, and it must be on the KassenSichV regime. The window is silently clamped to the period the register was live.
"reg_01HABC"
Response
Export job enqueued
dsfinvk, tse pending, completed, failed Signed URL to download the export artifact. Present only when status is completed.
Failure information. Present only when status is failed.
Show child attributes
Show child attributes
What the artifact covers. TSE exports only, and only once completed. Absent for other export types and while the export is still pending.
Show child attributes
Show child attributes
Was this page helpful?