IRIS Technical Guide

IRIS Error Codes: Causes & Fixes

Every IRIS rejection traces back to one of three layers — an ESRV authentication error before you connect, a pre-Receipt 400 before the IRS saves your file, or a business-rule code inside your acknowledgement. This guide walks all three, with the real cause and the exact fix for each.

 Verified against IRIS TY2025 v1.4 & IRS Pub 5717–5719 · June 12, 2026
At a glance

When IRIS rejects a filing, the code is doing more than flagging a failure — it tells you exactly where in the pipeline the problem happened, and that location is what determines the fix. The IRS Information Returns Intake System can report errors at three distinct stages. The first is authentication, where the shared OAuth gateway returns an ESRV code such as ESRV306 for a bad JWT, long before IRIS reads your XML. The second is intake, where a malformed transmission earns an HTTP 400 and no Receipt ID is ever issued. The third is processing, where IRIS validates your data asynchronously and returns business-rule codes like TMFST002 or S1H022 inside your acknowledgement. Knowing which layer fired is the single most useful diagnostic step you can take, because each one points at a completely different fix.

In this story

Read the Layer Before You Read the Code

If you remember only one thing from this guide, make it this: work out which layer produced the error before you try to decode the error itself. A 401 carrying an ESRV body is an authentication problem. A 400 with no Receipt ID is an intake problem. A rule ID like SHAREDIRFORM014 buried inside an <ErrorInformationGrp> is a data problem. Each layer has a different owner and a different fix, and chasing the wrong one is the biggest time sink in IRIS troubleshooting.

Those three layers fire in a strict order, and the order itself is diagnostic. Authentication errors come from the shared e-Services OAuth gateway that fronts IRIS, TIN Matching, and the Secure Object Repository, and they happen before the system has looked at your return at all. Intake errors happen a moment later, when IRIS reads your transmission manifest but refuses the file before it ever assigns a Receipt ID. Processing errors arrive last, inside the asynchronous acknowledgement you poll for, after the return has been accepted into the queue for full validation. Reading the HTTP status and the body shape first tells you which of the three you are actually dealing with.

A few terms recur throughout, so it helps to pin them down once. A2A is the machine-to-machine API channel, as opposed to the web portal. A TCC is your IRS-assigned Transmitter Control Code, the identifier that ties a transmission back to your approved IR Application. And a Receipt ID is the tracking number IRIS returns the instant it accepts and saves a transmission — which is precisely why a rejection that arrives without one means the file was never stored and there is nothing to replace.

LayerCode shapeWhere it firesWhat you fix
AuthenticationESRV###OAuth gateway, before IRIS sees your XMLCertificate, JWT, or scope
IntakeHTTP 400Manifest check, before a Receipt IDManifest, test code, or schema
ProcessingRule IDsAsynchronous acknowledgementThe flagged XML element
Where these codes are defined Pub 5718 §6

The pre-Receipt intake errors live in Pub 5718 Table 6-1, the IRIS A2A specification. The per-rule reject and report codes come from the IRIS Business Rules TY2025 v1.4 catalog. The ESRV authentication codes are documented in the e-Services API Authorization User Guide §4. For the authoritative A2A error model, see IRS Publication 5718.

Layer 1 — ESRV Errors Are About Credentials, Not Your Return

ESRV codes are returned by the shared e-Services OAuth gateway that sits in front of IRIS, and they fire before the system has validated a single byte of your XML. That timing is the whole point: when you see an ESRV code, the fix is always somewhere in your credentials, your certificate, or your token, and never in your return data. The most common ones, drawn from the e-Services API Authorization User Guide §4, fall into a handful of recognizable patterns.

HTTPCodeMeaningMost likely cause & fix
401ESRV201invalid_clientClient credentials not recognized. Confirm the API Client ID is active and matches the JWT sub.
401ESRV202login_requiredResource owner not authenticated. The tax professional must complete e-Services login and consent.
401ESRV205cert not validClient certificate invalid or expired. Renew the certificate and re-sync the JWKS.
401ESRV306invalid_client (JWT)The client-auth JWT is malformed or signed wrong. Check the kid matches the JWKS and alg is RS256.
401ESRV709invalid_scopeThe key lacks a required scope. The token must carry iris (and tinm for TIN Matching).
401ESRV725token disabledValidation error — the token has been disabled. Re-mint a fresh access token.
403ESRV203SSL requiredThe request hit a non-TLS endpoint. Use the HTTPS host only.
403ESRV204mTLS requiredSSL with client authentication required. Present your client certificate, not just server TLS.
429ESRV111rate limitCall limit exceeded; a 10-minute blackout now applies. Back off and retry after the window.
500ESRV711consent errorAccess denied. The tax professional has not granted, or has revoked, consent to your A2A Client ID.

Two of these account for most of the support tickets, and both reward a careful look because the symptoms are easy to misread. The first is ESRV204, which looks like a generic connection failure but is really the gateway insisting on mutual TLS. The second is ESRV306, the catch-all for a client-authentication JWT that the gateway will not accept.

ESRV204 — mutual TLS required 403

Cause: the IRS endpoint demands SSL with client authentication, and your client presented server-side TLS only, so the gateway never authenticated your certificate. Fix: configure mutual TLS and present the same client certificate whose public key sits in your registered JWKS. An empty-bodied 401 or 403 at this stage usually means the request was rejected at the gateway before the API ever saw it, which is also the classic symptom of hitting the wrong host — the TIN Match path, for instance, uses a different host than the IRIS transmission path.

ESRV306 — invalid client JWT 401

Cause: the JWT you sign for client authentication is rejected, almost always because the kid in the header does not match your JWKS (it is case-sensitive), the signing algorithm is wrong, or the token has simply expired — the access token has only a fifteen-minute lifetime. Fix: sign with RS256, set the header kid to the exact value registered in your JWKS, and include every required payload claim: iss, sub, aud, iat, exp, and the mandatory jti that prevents replay. Remember that IRIS expects two distinct JWTs — a Client JWT and a User JWT — so a 306 can also mean you supplied the wrong one.

POST /auth/oauth/v2/token HTTP/1.1 401 Unauthorized { "error": "ESRV306", "error_description": "invalid_client (JWT invalid)" } --- after fixing the kid + algorithm --- POST /auth/oauth/v2/token HTTP/1.1 200 OK { "access_token": "eyJhbGciOiJSUzI1...", "token_type": "Bearer", "expires_in": 900, "scope": "esrv-alt sor tinm iris" }

The contrast above is the whole pattern in miniature: the gateway returns a JSON body naming the ESRV error on failure, and once you correct the underlying credential the very same request returns a bearer token whose scope includes iris. That token is what IRIS will accept on the transmission call — nothing about your return changed.

Layer 2 — A Pre-Receipt 400 Means Nothing Was Saved

Once you are authenticated, you POST your transmission to the intake-acceptance endpoint, and IRIS runs what Pub 5718 calls Phase 1 validation synchronously. This is a fast structural pass: it confirms the manifest is present, checks that the transmission actually contains submissions, and verifies the test-or-production code. If any of those checks fail, you get an HTTP 400 and — this is the part that trips people up — no Receipt ID is issued at all. Because nothing was saved, there is nothing to replace; the corrected file must be resent as an Original. These are the Table 6-1 errors from Pub 5718.

ErrorCauseHTTP body hint
Duplicate UTIDSame UniqueTransmissionId resubmitted"Unable to process request, check for duplicate data"
Test code to PRODTestCd="T" sent to production"Found invalid Test Code, found T, P is required"
Bad test codeTestCd is neither T nor P"Unable to process request, check Test Code"
Missing manifestManifest absent from the transmission"Unable to process request"
No submissionsEmpty transmission, zero submissions"Unable to process request"
Schema validation errorManifest XML structurally invalid"Unable to process request"
The schema-validation exception

There is one wrinkle worth internalizing before you build any retry logic. Per Pub 5718, a transmission that is rejected for an XML Schema Validation Error does receive a Receipt ID, even though every other Phase 1 failure does not — but that Receipt ID cannot be used to file a Replacement. The corrected file still has to be resent as an Original. The safe mental model is to treat a schema-validation failure as never filed, regardless of whether a Receipt ID came back, so your code never tries to attach a Replacement to a transmission the IRS will not let you replace.

An HTTP 429 is a timed lockout, not a retry signal

An HTTP 429, which surfaces as ESRV111 on the authentication side, means you exceeded the gateway's call limit and a ten-minute blackout is now in effect. There is no faster path through it — backing off for the full window is the only fix, and hammering the endpoint only extends the pain. The same anti-abuse posture governs interactive TIN Matching, where four mismatched attempts on the same name-and-TIN pair suspend access for ninety-six hours, so it pays to pre-validate before you call rather than discovering the limit the hard way.

Layer 3 — Business-Rule Codes Carry the Failing Element

If your transmission cleared Phase 1 you received a Receipt ID, and IRIS then runs Phase 2 validation asynchronously against the full business-rule catalog. You poll the status-and-acknowledgement endpoint and parse the result. The valuable thing about a Phase 2 error is that it is never just a code: each failing rule arrives inside an <ErrorInformationGrp> with four fields, and the last of them tells you the exact XML element to fix.

<n1:RecordResultGrp> <n1:RecordId>1</n1:RecordId> <n1:ErrorInformationGrp> <n1:ErrorMessageCd>S1H022</n1:ErrorMessageCd> <n1:ErrorMessageTxt>If FormTypeCd is 1099R, then Form1099RTotalAmtGrp must be present.</n1:ErrorMessageTxt> <n1:ErrorValueTxt>1099R</n1:ErrorValueTxt> <n1:ElementPathTxt>/IRTransmission/.../IRSubmission1Grp/IRSubmission1Header</n1:ElementPathTxt> </n1:ErrorInformationGrp> </n1:RecordResultGrp>

That is the real shape of the TransStatusOrAckResponse from the IRIS Status Library. The ErrorMessageCd carries the rule ID, the ErrorMessageTxt restates the rule in plain language, the ErrorValueTxt echoes the offending value, and the ElementPathTxt points straight at the element that failed. Read the path, fix that element, and refile — you rarely have to guess.

The rule ID itself encodes which level of the document failed, so the prefix alone narrows your search before you even read the message. A TMFST prefix points at the transmission and manifest level — your TCC, SoftwareId, UniqueTransmissionId, and the various counts. An SMF prefix points at the shared submission level, covering tax year, the issuer's TIN and name, and form authorization. An S1H prefix points at the Submission-1 header, where the per-form total-amount groups and the CF/SF election live. And a SHAREDIRFORM prefix points at the record level, where recipient name and TIN matching, addresses, and corrections are checked.

Rule IDWhat it checksSeverityFix
TMFST002_001TransmitterControlCd must match your TCC in the IRS database.RejectSend the exact TCC tied to your IR Application.
TMFST020The first two digits of SoftwareId must match the last two digits of TaxYr.RejectUse the SoftwareId issued for that tax year.
TMFST032The UniqueTransmissionId must carry the A2A channel suffix.RejectBuild the UTID with the ::A channel suffix.
TMFST026TotalIssuerFormCnt must equal the issuer count in the transmission.RejectRecompute the manifest count after assembly.
SMF007The submission TaxYr must match the manifest TaxYr.RejectAlign the tax year across manifest and submissions.
SMF029FormTypeCd must be authorized for your TCC.RejectAdd the form type to your IR Application roles.
S1H022If FormTypeCd is 1099R, Form1099RTotalAmtGrp must be present.RejectEmit the matching total-amount group for the form type.
S1H002If CFSFElectionInd = 1, the TCC must participate in CF/SF.Report ErrorEnroll the TCC in Combined Federal/State Filing first.
SHAREDIRFORM023The TIN in RecipientDetail must have a value.Report ErrorPopulate the recipient TIN before filing.
SHAREDIRFORM014PersonName plus TIN must match the IRS database.Report ErrorRun TIN Matching first; fix the name control.
SHAREDIRFORM021If TestCd = T, the recipient TIN must start with 000.RejectUse 000-prefix fictitious TINs in ATS only.

The severity column is the difference between fix-now and fix-later, and it changes what you owe the IRS. A Reject-severity rule stops the submission cold: nothing is filed until you correct it and resend. A Report Error-severity rule lets the return through as Accepted with Errors, meaning the form is on file but flagged, and you resolve it afterward with a correction. Some rules carry a hybrid posture, "Report Error and Reject if Over Threshold," where too many instances of the same error across one submission escalate the whole thing to a hard reject — which is why a single sloppy data field, repeated across thousands of records, can sink an otherwise clean batch.

Three Rejections That Reward a Closer Look

A handful of rules generate far more confusion than the rest, usually because the fix is not obvious from the message alone. These three are worth understanding in full, because getting them wrong tends to produce a second rejection rather than a fix.

TMFST032 — UTID missing the A2A channel suffix Reject

Cause: the tail of your UniqueTransmissionId does not carry the A2A channel marker, so IRIS cannot route the transmission to the right channel. Fix: build the UTID in the exact form <UUID>:IRIS:<TCC>::A — for example da20a4de-1357-11ed-861d-0242ac120002:IRIS:DH96S::A. The TCC embedded inside the UTID must also equal your TransmitterControlCd, or you will trip a second, separate reject on the cross-check.

Replacement key conflicts Reject

Cause: for a Replacement transmission (TransmissionTypeCd="R") you supplied both an OriginalReceiptId and an OriginalUniqueSubmissionId, or the receipt you pointed at refers to a transmission that was already successfully replaced. Fix: supply exactly one key. Use OriginalReceiptId to replace a whole transmission, or OriginalUniqueSubmissionId in the submission header to replace a single submission — never both. The receipt you reference must be a rejected Original that has not already been replaced; if it has, there is nothing left to replace and you should file fresh.

SHAREDIRFORM014 — recipient name and TIN mismatch Report Error

Cause: the recipient's PersonName (or BusinessName) plus TIN does not match IRS records. This is Report-Error severity, so the form is Accepted with Errors rather than rejected — but it is the leading cause of the CP2100 "B-notice" letters that land months later. Fix: run free IRS TIN Matching before you file, and respect the XML name rule while you are at it: PersonFirstNm, PersonMiddleNm, and PersonLastNm may not contain any special character even when escaped, so O'Malley must be written as OMalley. A # is permitted in BusinessNameLine1Txt but never in a person-name field.

What Each Transmission Status Tells You to Do Next

Every acknowledgement carries an overall status, and that status is your instruction for what to do next. The distinction that matters most in production is between a status that needs a Replacement and one that needs a correction, because confusing the two is how filers accidentally duplicate-file or, worse, leave a flagged return unaddressed until the IRS notices for them.

StatusMeaningYour next move (production)
AcceptedSuccessfully processed, no errorsNothing — you are filed.
Accepted with ErrorsProcessed, Report-Error rules flaggedFile a correction (one-step or two-step).
Partially AcceptedSome submissions accepted, some rejectedReplace only the rejected submissions.
RejectedA Reject-severity rule fired; errors listed in the ackReplace the transmission (or resend an Original if it was a schema error).
ProcessingPhase 2 is not yet completeWait and re-poll the acknowledgement endpoint.
Not FoundReceipt ID or UTID could not be locatedRe-check your search ID; searching by UTID returns the Receipt ID.

Common Rejection Reasons (and How to Avoid Them)

Most production rejections are not exotic. They cluster around a few predictable mistakes that surface the moment a transmission leaves a clean ATS sandbox and hits real data at volume. The four below account for the bulk of avoidable rejects, ordered by how often they bite.

Name and TIN that don't match IRS records most common

Cause: a recipient's name control and TIN disagree with the IRS database, tripping SHAREDIRFORM014. Because it is Report-Error severity the batch is still accepted, so the problem hides until it returns as a CP2100 notice. Fix: run IRS TIN Matching on every recipient before you transmit, and strip apostrophes, hyphens, and other special characters out of person-name fields where the schema forbids them.

A test code or test TIN reaching production schema

Cause: a transmission still carries TestCd="T" when it hits the production endpoint, or a record uses a fictitious 000-prefix TIN outside ATS, tripping the intake 400 or SHAREDIRFORM021. Fix: gate the test flag behind your environment configuration so production builds always send P, and reserve 000-prefix recipient TINs strictly for the Assurance Testing sandbox.

A manifest count or tax year that doesn't line up business rule

Cause: the TotalIssuerFormCnt in the manifest no longer matches the assembled submissions (TMFST026), or a submission's TaxYr disagrees with the manifest's (SMF007). These slip in when records are added or dropped after the manifest is built. Fix: compute the counts and stamp the tax year as the very last step before signing, never before, so the manifest always describes the file you are actually sending.

A UTID or TCC that isn't formatted for A2A business rule

Cause: the UniqueTransmissionId is missing its ::A channel suffix (TMFST032), the TCC embedded in the UTID does not match TransmitterControlCd, or a form type was sent that your TCC is not authorized for (SMF029). Fix: assemble the UTID from a fresh UUID, the literal IRIS token, and your exact TCC with the ::A suffix, and confirm every form type you transmit is enabled on your IR Application roles.

Skip the Decoding Entirely

Tired of decoding rejection codes by hand?

e1099f validates every record against the full IRS business-rule catalog before you transmit, so you get a Receipt ID instead of a rule code to chase.

See how it works

Pre-validated

Records are checked against the rule catalog before submission, so reject-severity rules are caught at your desk, not at the IRS.

Errors by element

The acknowledgement is parsed for you and each error is surfaced by its ElementPathTxt, pointing straight at the field to fix.

Auth handled

The mutual-TLS connection, the signed JWTs, and the token scopes are managed for you, so ESRV codes stop being your problem.

A Receipt ID, not a rejection — across every layer and every form type.

Frequently Asked Questions

I got an ESRV code — is my XML wrong?
No. ESRV codes come from the e-Services OAuth gateway and fire before IRIS reads your XML at all, so the problem is always in your credentials rather than your return. A malformed client JWT shows up as ESRV306, an expired certificate as ESRV205, a missing mutual-TLS handshake as ESRV204, and a token that lacks the right permission as ESRV709. In every case you fix the credential, not the data inside the file.
What's the difference between "Reject" and "Report Error"?
A Reject-severity rule stops the submission — nothing is filed until you fix it and resend. A Report Error-severity rule lets the return through as Accepted with Errors; the form is on file but flagged, and you resolve it with a correction. Some rules are "Report Error and Reject if Over Threshold," meaning too many of the same error across a submission escalates to a hard reject.
I got a 400 with no Receipt ID. Can I replace the file?
No. A pre-Receipt 400 (Pub 5718 Table 6-1) means the transmission was turned away at intake and never saved, so there is nothing to replace — resend it as an Original. The one wrinkle is an XML Schema Validation Error, which does return a Receipt ID but still cannot be replaced; that too must be resent as an Original.
Where do I find the exact element that failed?
In the acknowledgement. Each error sits in an <ErrorInformationGrp> carrying ErrorMessageCd (the rule ID), ErrorMessageTxt (the rule text), ErrorValueTxt (the offending value), and ElementPathTxt (the path to the failing element). Read the path, fix that element, and refile.
Why did my recipient's name get rejected even though it looks right?
Person-name fields (PersonFirstNm, PersonMiddleNm, PersonLastNm) cannot contain any special character, even an escaped one, so an apostrophe in O'Malley must be stripped to OMalley. Separately, a name and TIN that don't match IRS records trip SHAREDIRFORM014; running TIN Matching first avoids it.
What does the rule-ID prefix tell me?
It tells you which level of the document failed before you even read the message. A TMFST prefix points at the transmission and manifest level, where your TCC, SoftwareId, UTID, and the various counts are checked. An SMF prefix points at the shared submission level, covering the tax year, the issuer's TIN and name, and form authorization. An S1H prefix points at the Submission-1 header, where the total-amount groups and the CF/SF election live. And a SHAREDIRFORM prefix points at the record level, where recipient name and TIN, addresses, and corrections are validated.
What does an HTTP 429 mean, and how do I clear it?
A 429 (ESRV111 on the auth side) means you exceeded the gateway's call limit and a ten-minute blackout is now in effect. There is no faster path — back off for the full window. For interactive TIN Matching the related limit is four mismatched attempts on the same name and TIN, which suspends access for ninety-six hours.
What's the difference between a Replacement and a correction?
You file a Replacement when a transmission or submission was Rejected and never accepted — you point at the rejected Original and resend it. You file a correction when a return was Accepted with Errors or accepted and later found wrong — the original stays on file and the correction amends it. Using the wrong one is a common cause of duplicate-filing rejects.
Why did my CF/SF election get flagged?
If you set CFSFElectionInd = 1 but your TCC is not enrolled in the Combined Federal/State Filing program, you trip S1H002. Enroll the TCC in CF/SF first. Note also that CF/SF participation has to be established before you elect it on a submission — the election alone does not enroll you.
Does my whole batch fail if one record is bad?
It depends on the rule's severity. A single record tripping a Report-Error rule leaves the batch Accepted with Errors and only that record flagged. But a Reject-severity rule, or a Report-Error rule that exceeds its over-threshold limit across the submission, can reject the whole submission — which is why one bad field repeated across many records is so dangerous.
Does e1099f require me to understand any of these codes?
No. e1099f validates each record against the IRS business-rule catalog before transmitting and parses the acknowledgement for you, surfacing any remaining error by its element path. You can read this guide to understand what is happening under the hood, but you don't have to decode ESRV or SHAREDIRFORM codes by hand to file.
DM
Dariel Montesino
Founder, e1099f · Reviewed by a licensed CPA

Dariel writes e1099f’s technical coverage of the FIRE→IRIS migration, drawing on IRS Publications 5717–5719, the IRIS Business Rules TY2025 catalog, and hands-on A2A integration work.

Not tax advice. This is general information about IRS IRIS procedures and error handling. The IRS may change IRIS, its schema, and its business rules as the system evolves, and the published IRS publications and the current rule catalog are authoritative. Consult a tax professional for your specific situation.

Stop decoding rejection codes by hand. Start free — no credit card.

e1099f validates every record against the IRS rule catalog before you transmit, then parses the acknowledgement and surfaces each error by element path.

An unhandled error has occurred. Reload ×

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.