Category: XML Templates Last Updated: 2026-02-12 Applies To: EU DAC8 / OECD CARF XML Schema
---
Overview
After submitting a DAC8/CARF XML report, you may discover errors in the data or receive updated information from users. The OECD CARF framework provides a structured mechanism for submitting corrections and amendments. Understanding how this works is critical -- incorrect correction submissions can create data integrity issues that are difficult to resolve.
This article covers the correction workflow, the XML structure for corrections, and the difference between corrections and void messages.
When Corrections Are Needed
Common scenarios that require a corrected submission:
- A user updates their self-certification with a new TIN or address
- You discover an error in aggregate transaction values
- A user's tax residency was incorrectly assigned
- Transaction data was incomplete or duplicated in the original report
- The tax authority requests a correction after reviewing your submission
Correction vs. Void
The CARF schema supports two types of corrective actions:
Correction (CorrDocRefId)
A correction replaces a previously submitted AccountReport with updated data. The original report is superseded by the corrected version.
Use when: The data for a user needs to be updated but the user should still appear in the report.
Void (CorrDocRefId with empty AccountReport)
A void cancels a previously submitted AccountReport entirely. It indicates that the original report should be treated as if it was never submitted.
Use when: A user was reported in error (e.g., they are not actually tax-resident in the receiving jurisdiction, or they are not a reportable person).
XML Structure for Corrections
Correcting an AccountReport
To correct a previously submitted account report, include the CorrDocRefId element referencing the original DocRefId, and provide a new DocRefId for the correction:
<CARFBody>
<ReportingFI>
<!-- Same reporting entity details -->
</ReportingFI>
<AccountReport>
<!-- New unique DocRefId for this correction -->
<DocRefId>DE2026.CARF.000001.C1</DocRefId>
<!-- Reference to the original DocRefId being corrected -->
<CorrDocRefId>DE2026.CARF.000001</CorrDocRefId>
<!-- Updated account holder information -->
<AccountHolder>
<Individual>
<Name>
<stf:FirstName>Jean</stf:FirstName>
<stf:LastName>Dupont</stf:LastName>
</Name>
<Address>
<stf:CountryCode>FR</stf:CountryCode>
<stf:AddressFree>22 Boulevard Haussmann, 75009 Paris, France</stf:AddressFree>
</Address>
<!-- Corrected TIN -->
<TIN issuedBy="FR">FR9876543210987</TIN>
<BirthInfo>
<BirthDate>1985-07-14</BirthDate>
<City>Lyon</City>
<CountryCode>FR</CountryCode>
</BirthInfo>
</Individual>
</AccountHolder>
<AccountNumber>USR-00042-PLATFORM</AccountNumber>
<!-- Corrected transaction summary -->
<TransactionSummary>
<TransactionType>EXCHANGE</TransactionType>
<NumberOfTransactions>48</NumberOfTransactions>
<AggregateGrossProceeds currCode="EUR">29100.00</AggregateGrossProceeds>
<CryptoAssetDetails>
<AssetCode>BTC</AssetCode>
<TotalUnits>0.87000000</TotalUnits>
</CryptoAssetDetails>
</TransactionSummary>
</AccountReport>
</CARFBody>
Voiding an AccountReport
To void (cancel) a previously submitted report, use CorrDocRefId and provide a minimal or empty AccountReport with an appropriate indicator:
<AccountReport>
<!-- New DocRefId for the void action -->
<DocRefId>DE2026.CARF.000001.V1</DocRefId>
<!-- Reference to the original report being voided -->
<CorrDocRefId>DE2026.CARF.000001</CorrDocRefId>
<!-- DocTypeIndic indicates this is a void/deletion -->
<DocTypeIndic>OECD3</DocTypeIndic>
</AccountReport>
> Note: The exact mechanism for voids (whether a DocTypeIndic element or an attribute is used) depends on the final schema version. The OECD CRS uses DocTypeIndic codes such as OECD1 (new data), OECD2 (corrected data), and OECD3 (deletion/void). The CARF schema is expected to follow a similar pattern, but verify against the published XSD.
Correcting the MessageSpec
When submitting a correction file, the MessageSpec should reference the original message:
<MessageSpec>
<SendingCompanyIN>DE1234567890</SendingCompanyIN>
<TransmittingCountry>DE</TransmittingCountry>
<ReceivingCountry>FR</ReceivingCountry>
<MessageType>CARF</MessageType>
<MessageRefId>DE2026.MSG.FR.00002</MessageRefId>
<!-- Reference to the original message being corrected -->
<CorrMessageRefId>DE2026.MSG.FR.00001</CorrMessageRefId>
<ReportingPeriod>2026-12-31</ReportingPeriod>
<Timestamp>2027-05-20T09:15:00Z</Timestamp>
</MessageSpec>
Key points:
MessageRefIdmust be a new, unique value (not the same as the original)CorrMessageRefIdreferences theMessageRefIdof the original submissionReportingPeriodremains the same as the original (you are correcting data for the same year)Timestampreflects when the correction was generated
Correction Chains
If you need to correct a correction, reference the most recent DocRefId, not the original:
Original: DocRefId = DE2026.CARF.000001
Correction: DocRefId = DE2026.CARF.000001.C1 --> CorrDocRefId = DE2026.CARF.000001
Correction2: DocRefId = DE2026.CARF.000001.C2 --> CorrDocRefId = DE2026.CARF.000001.C1
Always reference the immediately preceding version. Do not skip intermediate corrections.
Timing Requirements
The timing for submitting corrections depends on the jurisdiction, but general principles apply:
- Errors discovered before the filing deadline: Correct and resubmit before the deadline. Some jurisdictions may treat pre-deadline corrections differently from post-deadline amendments.
- Errors discovered after the filing deadline: Submit the correction as soon as reasonably practicable. Most jurisdictions expect corrections within a defined period (often 30 to 90 days of discovering the error).
- Tax authority-requested corrections: Respond within the timeframe specified in the request.
Practical Implementation Guidance
Database Requirements
Your system must permanently store:
- Every
DocRefIdever generated, linked to the user and reporting period - Every
MessageRefIdever generated, linked to the receiving jurisdiction and reporting period - The status of each report (original, corrected, voided)
- The correction chain (which DocRefId corrects which)
Generating Correction Files
A correction file can contain a mix of new reports, corrections, and voids. For example, a single file might contain:
<CARFBody>
<ReportingFI><!-- ... --></ReportingFI>
<!-- Corrected report for User A -->
<AccountReport>
<DocRefId>DE2026.CARF.000001.C1</DocRefId>
<CorrDocRefId>DE2026.CARF.000001</CorrDocRefId>
<!-- ... corrected data ... -->
</AccountReport>
<!-- Voided report for User B (reported in error) -->
<AccountReport>
<DocRefId>DE2026.CARF.000002.V1</DocRefId>
<CorrDocRefId>DE2026.CARF.000002</CorrDocRefId>
<DocTypeIndic>OECD3</DocTypeIndic>
</AccountReport>
<!-- New report for User C (not in original submission) -->
<AccountReport>
<DocRefId>DE2026.CARF.000050</DocRefId>
<!-- No CorrDocRefId -- this is new data -->
<!-- ... user C data ... -->
</AccountReport>
</CARFBody>
Testing Corrections
Before submitting corrections to production:
- Validate the correction file against the XSD schema
- Verify that all
CorrDocRefIdvalues reference valid, previously submittedDocRefIdvalues - Confirm that new
DocRefIdvalues are unique - Test the correction workflow end-to-end in a sandbox environment if your tax authority provides one
Need help with DAC8 reporting?
Our team handles XML generation, TIN validation, and submission for CASPs across all 27 EU Member States.