A CARF report is one XML file with a fixed shape. Here's what each part carries, from the message header to the per-user transaction records.
When people say they have to "file CARF," what they actually have to produce is a single XML file that follows a fixed schema published by the OECD. If you've never seen one, the structure is less intimidating than it sounds: a header that describes the message, a block that identifies you, and then a record for each reportable user and their activity. Understanding the shape makes it much easier to see where your data has to come from.
It is a single XML file that follows a schema published by the OECD. The file has a message header, a block identifying the reporting provider, and one record per reportable user with their identity, tax residence, and transaction data.
User identity and tax residence collected at onboarding, the taxpayer identification number, controlling persons for entity accounts, and the user's reportable transactions for the period, aggregated and valued on the correct cost basis in the required currency.
The OECD publishes the CARF XML schema and its user guide as part of the Crypto-Asset Reporting Framework. Individual jurisdictions may require their own national variations on top of the OECD baseline.
Austrian providers must withhold 27.5% KESt on crypto gains. Here's what triggers it, how the moving-average basis works, and how to automate the filing.
Withhold KESt at source and your users' crypto tax is final, no return needed. Use a foreign provider and they self-declare. Here's why the difference matters.
Austria requires the gleitender Durchschnittspreis for crypto, not FIFO. Here's how the moving-average basis works and why it complicates withholding.
Generate an audit-ready report aligned to your jurisdiction. No credit card required.
Every CARF file opens with a header that says what this message is: who is sending it, which tax period it covers, and whether it's a new submission, a correction, or a nil return. This is also where the message carries its unique reference. Get the header wrong, and validators reject the file before they even look at the data, which is why we treat it as its own checkpoint in the piece on the errors that get filings rejected.
Next comes the block that identifies the reporting crypto-asset service provider: your legal identity and tax details as the entity on the hook. It's small, but it anchors the whole file, because everything downstream is reported as coming from you.
The bulk of the file is one record per reportable user. Each carries the identity and tax-residence data you collected at onboarding, the taxpayer identification number, and, for entities, the controlling persons. This is exactly the payload the self-certification and TIN validation workflow exists to produce, and it's why due diligence is an onboarding task, not a year-end scramble.
Attached to each user is their reportable activity for the period: disposals, and in some cases transfers and retail payments above the threshold, aggregated the way the schema expects rather than listed raw. The values have to be computed on the right cost basis and expressed in the right currency before they ever reach the file.
Reading the schema top to bottom is really a map of where your data has to come from: identity from onboarding, tax residence from self-certification, amounts from a reconciled transaction ledger. Our CARF and DAC8 reporting platform assembles all of it into a valid file and validates before submission, and for the jurisdiction-by-jurisdiction differences in that file, see CARF vs DAC8 XML. The OECD exchange-of-information hub publishes the schema and its user guide.