The IRS IRIS system accepts XML submissions through two channels: the Taxpayer Portal (manual, browser-based) and the A2A (Application-to-Application) API (programmatic). Both channels use the same underlying XML schema, but the A2A channel is the one developers care about when building integrations.
The XML schema is published by the IRS in Publication 5717 and accompanying XSD (XML Schema Definition) files. The schema defines every element, attribute, data type, and constraint for each supported form type. Your XML must validate against these XSD files before the IRS will accept the submission.
Unlike FIRE's flat, position-based format, IRIS XML is hierarchical. Data is organized into nested elements with explicit names, making it self-describing and easier to validate — but also more verbose and more complex to generate correctly.
An IRIS XML submission consists of several core element groups. Here is the high-level structure:
<?xml version="1.0" encoding="UTF-8"?>
<IRISSubmission xmlns="urn:us:gov:treasury:irs:iris">
<!-- 1. Manifest: Submission metadata -->
<Manifest>
<SubmissionId>uuid-format-unique-id</SubmissionId>
<ElectronicPostmark>2026-01-15T10:30:00Z</ElectronicPostmark>
<TaxYear>2025</TaxYear>
<Transmitter>
<TIN>123456789</TIN>
<TCC>ABCDE</TCC>
<TransmitterName>Filing Service Corp</TransmitterName>
</Transmitter>
<OriginalSubmissionId /> <!-- For corrections only -->
</Manifest>
<!-- 2. FormData: One or more form groups -->
<FormData>
<!-- 3. Payer block (one per payer per form type) -->
<Form1099NEC>
<Payer>
<PayerTIN>987654321</PayerTIN>
<PayerName>
<BusinessName>Acme Corporation</BusinessName>
</PayerName>
<PayerAddress>
<Address1>123 Main Street</Address1>
<Address2 />
<City>Springfield</City>
<State>IL</State>
<ZipCode>62704</ZipCode>
</PayerAddress>
<PayerPhone>2175551234</PayerPhone>
</Payer>
<!-- 4. Payee records (one per recipient) -->
<Payee>
<PayeeTIN>111223333</PayeeTIN>
<TINType>SSN</TINType>
<PayeeName>
<FirstName>Jane</FirstName>
<MiddleName>M</MiddleName>
<LastName>Doe</LastName>
</PayeeName>
<PayeeAddress>
<Address1>456 Oak Avenue</Address1>
<City>Chicago</City>
<State>IL</State>
<ZipCode>60601</ZipCode>
</PayeeAddress>
<PayerAccountNumber>ACCT-12345</PayerAccountNumber>
<NonemployeeCompensation>50000.00</NonemployeeCompensation>
<FederalIncomeTaxWithheld>0.00</FederalIncomeTaxWithheld>
<StateTaxInfo>
<StateCode>IL</StateCode>
<StateIdNumber>12345678</StateIdNumber>
<StateIncome>50000.00</StateIncome>
<StateTaxWithheld>0.00</StateTaxWithheld>
</StateTaxInfo>
</Payee>
<!-- Additional Payee elements for more recipients... -->
</Form1099NEC>
</FormData>
</IRISSubmission>
The Manifest is the envelope for every submission. It contains:
Contains one or more form-type elements (e.g., <Form1099NEC>, <Form1099MISC>). Each form-type element groups a payer with its payees. A single submission can contain multiple form types, and each form type can contain multiple payer-payee groups.
Identifies the entity issuing the information returns. This maps to the A record in FIRE flat files. Key fields:
<BusinessName> for entities or <FirstName>/<LastName> for individuals.<ForeignAddress>).One per recipient. This is the core data element — equivalent to the B record in FIRE files. Contains:
<FirstName>, <MiddleName>, <LastName>, <Suffix>, or <BusinessName>.<NonemployeeCompensation>, <FederalIncomeTaxWithheld>. For 1099-MISC: <Rents>, <Royalties>, <OtherIncome>, etc.The IRIS XML schema supports all information return form types that were previously filed through FIRE, plus additional forms being migrated before the December 31, 2026 deadline. Each form type has its own XML element with form-specific amount fields:
| XML Element | Form | Key Amount Fields |
|---|---|---|
<Form1099NEC> |
1099-NEC | NonemployeeCompensation, FederalIncomeTaxWithheld |
<Form1099MISC> |
1099-MISC | Rents, Royalties, OtherIncome, FishingBoatProceeds, MedicalPayments, SubstitutePayments, CropInsurance, AttorneyFees, FishPurchased, Section409ADeferrals, NonqualifiedDeferredCompensation |
<Form1099INT> |
1099-INT | InterestIncome, EarlySavingsWithdrawalPenalty, USBondInterest, FederalIncomeTaxWithheld, InvestmentExpenses, ForeignTaxPaid, TaxExemptInterest, PrivateActivityBondInterest, MarketDiscount, BondPremium |
<Form1099DIV> |
1099-DIV | OrdinaryDividends, QualifiedDividends, CapitalGainDistributions, UnrecapturedSection1250Gain, Section1202Gain, CollectiblesGain, NondividendDistributions, FederalIncomeTaxWithheld, ForeignTaxPaid |
<Form1099R> |
1099-R | GrossDistribution, TaxableAmount, CapitalGain, FederalIncomeTaxWithheld, EmployeeContributions, NetUnrealizedAppreciation, DistributionCodes |
<Form1099K> |
1099-K | GrossAmount, CardNotPresent, MonthlyAmounts (Jan-Dec), FederalIncomeTaxWithheld, NumberOfPaymentTransactions |
<Form1099B> |
1099-B | Proceeds, CostBasis, MarketDiscount, WashSaleLossDisallowed, FederalIncomeTaxWithheld, GainLossIndicator |
<Form1099S> |
1099-S | GrossProceeds, BuyerPartOfRealEstateTax |
<Form1099C> |
1099-C | AmountOfDebtDischarged, InterestIncluded, DebtDescription, IdentifiableEventCode |
<Form1099SA> |
1099-SA | GrossDistribution, Earnings, DistributionCode |
<Form1098> |
1098 | MortgageInterest, PointsPaid, RefundOfOverpaidInterest, MortgageInsurancePremiums, OutstandingMortgagePrincipal |
<FormW2G> |
W-2G | GrossWinnings, FederalIncomeTaxWithheld, TypeOfWager, DateWon |
The full list of elements and their data types is defined in the IRS XSD files. Always use the latest published schema for the tax year you are filing.
IRIS applies multi-layer validation to every XML submission. Understanding these rules is critical for building a reliable integration:
The first layer is XML schema validation. Your submission must conform to the published XSD. Common failures:
| Error | Cause | Fix |
|---|---|---|
| Missing required element | Element like <PayerTIN> or <TaxYear> omitted |
Include all required elements even if value is zero |
| Invalid element order | Child elements out of sequence | Follow exact element order specified in XSD |
| Invalid data type | Amount field contains non-numeric characters | Use xs:decimal format: 50000.00 |
| Unexpected element | Using an element that does not exist in the schema | Check element names against the current-year XSD |
| Namespace mismatch | Root element does not declare the correct namespace | Use the IRS-published namespace URI exactly |
After schema validation passes, IRIS applies IRS business rules:
<!-- WRONG: Amount as integer (FIRE style) -->
<NonemployeeCompensation>5000000</NonemployeeCompensation>
<!-- CORRECT: Amount as decimal -->
<NonemployeeCompensation>50000.00</NonemployeeCompensation>
<!-- WRONG: TIN with hyphens -->
<PayerTIN>98-7654321</PayerTIN>
<!-- CORRECT: TIN as 9 digits, no formatting -->
<PayerTIN>987654321</PayerTIN>
<!-- WRONG: Empty element when field is required -->
<PayeeName></PayeeName>
<!-- CORRECT: Structured name with required sub-elements -->
<PayeeName>
<FirstName>Jane</FirstName>
<LastName>Doe</LastName>
</PayeeName>
<!-- WRONG: Unescaped special characters -->
<BusinessName>Smith & Jones LLC</BusinessName>
<!-- (the & above IS correct XML entity encoding) -->
<!-- WRONG: Literal ampersand -->
<BusinessName>Smith & Jones LLC</BusinessName>
<!-- This will cause an XML parse error -->
Our compliance experts can walk you through a customized solution for your organization.
The IRS provides a testing (sandbox) environment for A2A integrations. You should test every submission scenario before going to production. Key points:
Test the following scenarios at minimum:
The IRS offers two ways to submit through IRIS. Understanding the differences helps you choose the right approach:
| Feature | A2A (Application-to-Application) | Taxpayer Portal |
|---|---|---|
| Input method | XML via REST API | Browser-based UI (manual entry or CSV upload) |
| Authentication | OAuth 2.0 with client credentials | IRS ID.me identity verification |
| Volume capacity | Designed for high volume (thousands of forms) | Practical for smaller volumes |
| TCC requirement | Required (A2A-specific TCC type) | Not required for portal-only users |
| Automation | Fully automated, no human interaction | Manual process, requires browser session |
| XML knowledge | Required — you build and submit XML directly | Not required — the portal generates XML behind the scenes |
| Error handling | Programmatic XML responses for automated processing | On-screen error messages |
| Best for | Software companies, service bureaus, enterprise IT | Small businesses, occasional filers |
For a detailed guide on setting up A2A integration, including OAuth authentication and endpoint configuration, see our IRIS API integration guide.
If you are building your own IRIS XML generation, here are approaches by language:
// Using XmlSerializer with classes generated from IRS XSD
// 1. Download IRS XSD files
// 2. Generate classes: xsd.exe IRISSchema.xsd /classes /namespace:IRS.IRIS
// 3. Populate and serialize
var submission = new IRISSubmission
{
Manifest = new Manifest
{
SubmissionId = Guid.NewGuid().ToString(),
TaxYear = "2025",
Transmitter = new Transmitter { TIN = "123456789", TCC = "ABCDE" }
},
FormData = new FormData
{
Form1099NEC = new Form1099NEC
{
Payer = new Payer { PayerTIN = "987654321", ... },
Payees = new List<Payee> { ... }
}
}
};
var serializer = new XmlSerializer(typeof(IRISSubmission));
using var writer = new StringWriter();
serializer.Serialize(writer, submission);
string xml = writer.ToString();
import xml.etree.ElementTree as ET
from lxml import etree # For XSD validation
# Build XML tree
root = ET.Element("IRISSubmission",
xmlns="urn:us:gov:treasury:irs:iris")
manifest = ET.SubElement(root, "Manifest")
ET.SubElement(manifest, "SubmissionId").text = "unique-uuid"
ET.SubElement(manifest, "TaxYear").text = "2025"
transmitter = ET.SubElement(manifest, "Transmitter")
ET.SubElement(transmitter, "TIN").text = "123456789"
ET.SubElement(transmitter, "TCC").text = "ABCDE"
form_data = ET.SubElement(root, "FormData")
form_1099_nec = ET.SubElement(form_data, "Form1099NEC")
# ... build payer and payee elements
# Validate against XSD before submitting
schema = etree.XMLSchema(etree.parse("IRISSchema.xsd"))
doc = etree.fromstring(ET.tostring(root))
is_valid = schema.validate(doc)
if not is_valid:
print(schema.error_log)
// Using JAXB with classes generated from IRS XSD
// xjc -d src -p gov.irs.iris IRISSchema.xsd
JAXBContext context = JAXBContext.newInstance(IRISSubmission.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
IRISSubmission submission = new IRISSubmission();
submission.getManifest().setSubmissionId(UUID.randomUUID().toString());
submission.getManifest().setTaxYear("2025");
// ... populate payer and payee data
StringWriter writer = new StringWriter();
marshaller.marshal(submission, writer);
String xml = writer.toString();
// Validate against XSD
SchemaFactory factory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File("IRISSchema.xsd"));
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xml)));
Regardless of language, the workflow is the same: generate a class model from the IRS XSD, populate it with your data, serialize to XML, validate against the schema, then submit via the A2A REST API.
Building and maintaining an IRIS XML generator is a significant engineering investment. The IRS updates schemas annually, form types change, validation rules evolve, and edge cases multiply. If you do not want to maintain this infrastructure, the BoomTax API provides an alternative:
If you already have FIRE-format files, you can also upload them directly to BoomTax without any conversion — we parse the FIRE format and handle everything downstream.
For organizations evaluating build vs. buy: building your own IRIS XML generation requires 4-12 weeks of development, ongoing maintenance for annual schema updates, and a dedicated testing process against the IRIS sandbox. The BoomTax API or file upload eliminates all of this.
<IRISSubmission> can contain multiple form-type elements within the <FormData> block — for example, both <Form1099NEC> and <Form1099MISC> payee groups. Each form-type element has its own payer and payee records. However, check the IRS batch size limits: very large submissions may need to be split across multiple files.
<OriginalSubmissionId> element in the Manifest referencing the submission being corrected. The corrected payee records include updated data. The correction type (equivalent to FIRE's Type 1 and Type 2 corrections) is indicated through specific XML elements. Always include the complete corrected record, not just the changed fields.
<?xml version="1.0" encoding="UTF-8"?>. All special characters must be properly escaped using XML entities: & for ampersands, < for less-than, > for greater-than, " for double quotes, and ' for apostrophes. This is a change from FIRE's ASCII-only format.
Passionate about making tax compliance simple so businesses can focus on what matters.
BoomTax and its affiliates do not provide tax, legal, or accounting advice. This material has been prepared for informational purposes only, and is not intended to provide, and should not be relied on for, tax, legal, or accounting advice. You should consult your own tax, legal, and accounting advisors prior to engaging in any transaction.