Revenue interface
Contract notification
SubmitRctRequest carrying one or more rct:Contract records. This is what establishes that an engagement exists. It grants no authority to pay anything.
On this page
Request shape
Elements follow the xsd:sequence of RctContract — 44 of them, in order, with optional ones omitted rather than sent empty. Order is load-bearing: a sequence violation is rejected with a message that names a field but not the reason.
How to read these
- required
- The schema demands it. Omitting it fails validation.
- required in practice
- The schema says it is optional and Revenue rejects the request without it. Learned the hard way, against PIT3.
- optional
- Genuinely optional. Send it when you have it.
- never send
- The schema permits sending it and you must not. These are response-only fields, and populating one asserts something you have no authority to assert.
The parties
Both are the same structure: an optional name block and an optional registration block, nested three levels deep in Revenue’s shared customer schema.
rct:Principal
rev:NumberstringrequiredYour RCT registration number. Revenue matches the filing to you by this.
Drops its leading zero — 02831260F is sent as 2831260F. Revenue echoes it back with the zero, so round-tripping the value it returns will fail on the next request.
rev:TypestringrequiredThe tax head. RCT.
cust:MainNamestringoptionalYour company name, as Revenue holds it.
rct:Subcontractor
rev:Numberstringrequired in practiceThe subcontractor’s tax reference. Optional in the sense that you may instead set NoTaxNumberAvailable — but then Revenue has nobody to look up and every payment authorises at 35%.
This single field is the difference between a subcontractor being paid in full and having a third of every payment withheld. It should be on their invoice.
cust:MainNamestringrequired in practiceTheir name, matched against Revenue’s record. A trading name that differs from the registered name will not match.
cust:FirstNamestringoptionalFor individuals.
About the contract
Contract identity
rct:ContractUpdateTypeNONE | NEW | AMEND | CANCELrequiredWhat you are doing. Words, not initials — N is not a member of the enumeration and is rejected.
NEW for a new engagement. AMEND when scope, value or dates change — quote the existing ContractId. CANCEL if it never went ahead.
rct:ContractIdintegeroptionalRevenue’s identifier for an existing contract. Present only on AMEND and CANCEL. Omit it on NEW — Revenue assigns one.
rct:NoTaxNumberAvailablebooleanoptionalSet when you have no tax reference for the subcontractor. See the 35% consequence above.
rct:ContractDeductionRateintegernever sendNever send this. It is the indicative rate, and Revenue’s schema notes say it “cannot be modified externally”.
Populating it asserts a deduction rate you have no authority to assert. Rates are decided per payment, on the payment notification.
About the subcontractor
These describe the subcontractor rather than the job, so they are the same on every contract you file for them.
Identity
rct:SubContractorTypeintegerrequired in practiceRevenue’s code for sole trader, company or partnership. What follows depends on it: an individual needs a date of birth, a company needs a CRO number, a partnership needs precedent partner details.
rct:SubDateOfBirthros:dateoptionalDD/MM/YYYY. For individuals.
rct:SubCROstringoptionalCompanies Registration Office number, for companies.
rct:PrecedentPartnerNamestringoptionalFor partnerships — the partner who is answerable for the partnership’s tax affairs.
rct:PrecedentPartnerDateOfBirthros:dateoptionalAs above.
rct:SubHasFixedPlaceOfBusinessintegerrequiredWhether they trade from a fixed premises. A numeric code, not a boolean, despite reading like one.
Contact
Where Revenue can reach them. Country is a numeric code.
rct:AddressLine1stringrequired in practiceTheir business address, not the site.
rct:AddressLine2stringoptionalrct:AddressLine3stringoptionalrct:Countryintegerrequired in practiceNumeric country code. Ireland is 1.
rct:EmailAddressstringoptionalrct:PhoneNumberPrefixstringoptionalrct:PhoneNumberMainstringoptionalrct:MobilePhoneNumberstringoptionalrct:ForeignNumberstringoptionalA foreign tax reference, for a non-resident subcontractor.
rct:CountryOfOriginintegeroptionalNumeric country code, where the subcontractor is resident.
The work and the site
What the job is
rct:SubSectorintegerrequiredRevenue’s sector code — which part of construction this is.
rct:SubNatureOfWorkstring(90)requiredA plain description: “Internal plastering and skimming”. 90 characters, and subject to the restricted character set — this is the field most likely to contain a pasted em-dash.
rct:ProjectNamestringoptionalYour name for the job. Revenue stores it; nothing depends on it.
rct:SubLocationOfWorkstringoptionalFree-text location, separate from the structured site address.
rct:EstimatedContractValueintegerrequiredWhole euro, not cent. An estimate, not a cap — payments are notified individually at their actual amounts and are not constrained by this figure.
When scope grows materially, amend the contract rather than leaving a stale number.
rct:SubStartDateros:daterequired in practiceDD/MM/YYYY. When work actually starts.
If you are filing late, put the real date. Revenue has your submission timestamp regardless, so a flattering date creates an inconsistency rather than hiding one.
rct:SubEndDateros:daterequired in practiceExpected completion. Amend if the job runs long.
rct:SiteAddresses
Repeatable. Children sit in the rct/types/ namespace, not rct/ — easy to get wrong, and it produces a schema rejection rather than a useful error.
type:Addr1stringrequired in practiceWhere the work is happening.
type:Addr2stringoptionaltype:Addr3stringoptionaltype:Countyintegerrequired in practiceRevenue’s numeric county code. Not a county name.
type:Eircodestring(8)optionalEight characters, so an Eircode fits only without its usual space.
SiteAddresses is the worst trap in this request
The schema marks it minOccurs="0". Omit it and Revenue returns 112006 — Unable to connect to the required web service, which reads as an outage on Revenue’s side.
We retried three times assuming PIT3 was down before diffing against a payload that had worked. Nothing in the schema, and nothing in the error, points at the missing element.
Employment status
Eleven yes/no indicators, sent as 1 or 0.
These are not a formality
They map onto the factors the Supreme Court set out in Karshan for distinguishing employment from self-employment, and Revenue has increased construction enforcement on misclassification. Each answer is a statement about a real working relationship, on a Revenue record, in your name.
The eleven, in sequence order
All are required unless SubHasNoticeOfExclusion is 1. Omitting them otherwise is rejected field by field with 'This is a required field', with nothing to indicate the condition that made them required.
rct:SubSuppliesMaterials0 | 1required in practiceDo they provide their own materials?
rct:SubProvidesMachinary0 | 1required in practiceDo they provide their own plant and machinery? (Revenue’s spelling of the element name.)
rct:SubEngagesOthers0 | 1required in practiceCan they bring in their own people?
rct:SubReceivesContractPayments0 | 1required in practiceAre they paid per contract rather than by the hour or week?
rct:SubHasPensionExcluded0 | 1required in practiceAre they outside your pension and benefit arrangements?
rct:SubOrganisesTransport0 | 1required in practiceDo they get themselves and their kit to site?
rct:SubAgreesPrices0 | 1required in practiceDo they negotiate the price rather than accept a set rate?
rct:SubProvidesOwnInsurance0 | 1required in practiceDo they carry their own liability insurance?
rct:SubChoosesMethod0 | 1required in practiceDo they decide how the work gets done?
rct:SubHasOwnAccount0 | 1required in practiceDo they run a genuine business of their own?
rct:SubFinanciallyExposed0 | 1required in practiceDo they carry financial risk — do they lose money if the job goes badly?
The condition
rct:SubHasNoticeOfExclusion0 | 1requiredWhether the subcontractor holds a Revenue notice of exclusion. Setting it to 1 suppresses all eleven questions above.
Answer it honestly. It is a convenient-looking shortcut past the awkward part of the form and, if untrue, a false statement to Revenue about the subcontractor’s status. We caught our own filings sending 1 here for subcontractors who held no such notice.
Declaration and identity
Closing elements
rct:SinNumberstringoptionalSite Identifier Number, when quoting an existing site rather than having Revenue assign one.
rct:DeclarationCheckedbooleanrequiredYour declaration that the information is correct. This is the element that makes the submission a formal statement.
rct:ExternalIdstringoptionalSibling of the contract records rather than a child. Your own reference, echoed back in the response — how a record in a hundred-record batch is tied to the row it came from.
What comes back
| Field | Meaning |
|---|---|
ContractId | Revenue's identifier. Quoted on every payment notification against this contract, and on any later amendment. |
SinNumber | Site Identifier Number for the site you described. |
IndicativeDeductionRate | The subcontractor's current standing — 0, 20 or 35. NOT authority to deduct anything. Revenue names relying on it as a common error. |
AcknowledgementNumber | Revenue's receipt for the submission. Matches the prn in your ROS inbox, which is how a filing can be independently confirmed. |
An accepted contract is not immediately usable
Send a payment notification against a freshly created contract and it is rejected with “Cannot find details for contractId” — even though Revenue accepted the contract seconds earlier. The delay is real, variable, and undocumented.
Retry rather than treating the first rejection as final.