BrickiePricingDocs
All documentation

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:Numberstringrequired

Your 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:Typestringrequired

The tax head. RCT.

cust:MainNamestringoptional

Your company name, as Revenue holds it.

rct:Subcontractor

rev:Numberstringrequired in practice

The 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 practice

Their name, matched against Revenue’s record. A trading name that differs from the registered name will not match.

cust:FirstNamestringoptional

For individuals.

About the contract

Contract identity

rct:ContractUpdateTypeNONE | NEW | AMEND | CANCELrequired

What 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:ContractIdintegeroptional

Revenue’s identifier for an existing contract. Present only on AMEND and CANCEL. Omit it on NEW — Revenue assigns one.

rct:NoTaxNumberAvailablebooleanoptional

Set when you have no tax reference for the subcontractor. See the 35% consequence above.

rct:ContractDeductionRateintegernever send

Never 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 practice

Revenue’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:dateoptional

DD/MM/YYYY. For individuals.

rct:SubCROstringoptional

Companies Registration Office number, for companies.

rct:PrecedentPartnerNamestringoptional

For partnerships — the partner who is answerable for the partnership’s tax affairs.

rct:PrecedentPartnerDateOfBirthros:dateoptional

As above.

rct:SubHasFixedPlaceOfBusinessintegerrequired

Whether 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 practice

Their business address, not the site.

rct:AddressLine2stringoptional
rct:AddressLine3stringoptional
rct:Countryintegerrequired in practice

Numeric country code. Ireland is 1.

rct:EmailAddressstringoptional
rct:PhoneNumberPrefixstringoptional
rct:PhoneNumberMainstringoptional
rct:MobilePhoneNumberstringoptional
rct:ForeignNumberstringoptional

A foreign tax reference, for a non-resident subcontractor.

rct:CountryOfOriginintegeroptional

Numeric country code, where the subcontractor is resident.

The work and the site

What the job is

rct:SubSectorintegerrequired

Revenue’s sector code — which part of construction this is.

rct:SubNatureOfWorkstring(90)required

A 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:ProjectNamestringoptional

Your name for the job. Revenue stores it; nothing depends on it.

rct:SubLocationOfWorkstringoptional

Free-text location, separate from the structured site address.

rct:EstimatedContractValueintegerrequired

Whole 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 practice

DD/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 practice

Expected 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 practice

Where the work is happening.

type:Addr2stringoptional
type:Addr3stringoptional
type:Countyintegerrequired in practice

Revenue’s numeric county code. Not a county name.

type:Eircodestring(8)optional

Eight 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 practice

Do they provide their own materials?

rct:SubProvidesMachinary0 | 1required in practice

Do they provide their own plant and machinery? (Revenue’s spelling of the element name.)

rct:SubEngagesOthers0 | 1required in practice

Can they bring in their own people?

rct:SubReceivesContractPayments0 | 1required in practice

Are they paid per contract rather than by the hour or week?

rct:SubHasPensionExcluded0 | 1required in practice

Are they outside your pension and benefit arrangements?

rct:SubOrganisesTransport0 | 1required in practice

Do they get themselves and their kit to site?

rct:SubAgreesPrices0 | 1required in practice

Do they negotiate the price rather than accept a set rate?

rct:SubProvidesOwnInsurance0 | 1required in practice

Do they carry their own liability insurance?

rct:SubChoosesMethod0 | 1required in practice

Do they decide how the work gets done?

rct:SubHasOwnAccount0 | 1required in practice

Do they run a genuine business of their own?

rct:SubFinanciallyExposed0 | 1required in practice

Do they carry financial risk — do they lose money if the job goes badly?

The condition

rct:SubHasNoticeOfExclusion0 | 1required

Whether 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:SinNumberstringoptional

Site Identifier Number, when quoting an existing site rather than having Revenue assign one.

rct:DeclarationCheckedbooleanrequired

Your declaration that the information is correct. This is the element that makes the submission a formal statement.

rct:ExternalIdstringoptional

Sibling 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

FieldMeaning
ContractIdRevenue's identifier. Quoted on every payment notification against this contract, and on any later amendment.
SinNumberSite Identifier Number for the site you described.
IndicativeDeductionRateThe subcontractor's current standing — 0, 20 or 35. NOT authority to deduct anything. Revenue names relying on it as a common error.
AcknowledgementNumberRevenue'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.