Real Time Information

In April 2012 HM Revenue and Customs (HMRC) introduced Real Time Information (RTI), from April 2014 RTI became mandatory for all employers, running a PAYE scheme, without a specific exemption.

Under RTI, information about tax and other deductions under the PAYE system is transmitted to HMRC by the employer every time an employee is paid.

Employers using RTI are no longer required to provide information to HMRC using Forms P35 and P14 after the end of the tax year, or to send Forms P45 or P46 to HMRC when employees start or leave a job.

The RTI Jobs

The PayRun.io API encapsulates and manages the process of submitting RTI messages to the Government Gateway for you using the job paradigm.

Each enqueued RTI job results in an RTI Tranaction record which contains the full details of the RTI request and subsequent response from the Government Gateway as well as the overall status of the job. The RTI transactions can be queried and used to debug issues or prove the transmission was accepted.

In the event of an HMRC gateway outage the job will automatically be retried 10 times before finally failing the job.

Full Payment Submission

The Full Payment Submission (FPS) is the most common RTI message and details the payments and deductions made to employees in the period.

An FPS should be sent on, or before pay day.

If you submit your FPS late then you will be required to provide a late reason - see HMRC for guidance.

If you make a mistake in the current tax year, you can correct your mistake which will be summarised in the year-to-date figures of your next Full Payment Submission (FPS). Supplementary pay runs will be automactically dectected and the message adjusted accordingly.

Please Note: Unlike an EPS, the FPS contains a link to the PaySchedule and PaymentDate. The employees included in FPS message are those that are resolved from PayRun job(s) that match these criteria.

An example of enqueuing an FPS job.

curl -X POST \
  'https://api.test.payrun.io/jobs/rti' \
  -H 'Accept: application/xml' \
  -H 'Api-Version: default' \
  -H 'Authorization: {OAuthHeader}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-type: application/xml' \
  -d '<?xml version="1.0"?>
<RtiFpsJobInstruction xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <HoldingDate xsi:nil="true" />
  <Generate>true</Generate>
  <Transmit>true</Transmit>
  <TaxYear>2018</TaxYear>
  <Employer href="/Employer/ER001" />
  <Timestamp>2018-04-06T00:00:00</Timestamp>
  <PaySchedule href="/Employer/ER001/PaySchedule/SCH001" />
  <PaymentDate>2018-04-30</PaymentDate>
  <SchemeCeased xsi:nil="true" />
  <FinalSubmissionForYear xsi:nil="true" />
  <LateReason xsi:nil="true" />
</RtiFpsJobInstruction>'
curl -X POST \
  'https://api.test.payrun.io/jobs/rti' \
  -H 'Accept: application/json' \
  -H 'Api-Version: default' \
  -H 'Authorization: {OAuthHeader}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-type: application/json' \
  -d '{
  "RtiFpsJobInstruction": {
    "HoldingDate": null,
    "Generate": "true",
    "Transmit": "true",
    "TaxYear": "2018",
    "Employer": {
      "@href": "/Employer/ER001"
    },
    "Timestamp": "2018-04-06T00:00:00",
    "PaySchedule": {
      "@href": "/Employer/ER001/PaySchedule/SCH001"
    },
    "PaymentDate": "2018-04-30",
    "SchemeCeased": null,
    "FinalSubmissionForYear": null,
    "LateReason": null
  }
}'

Employer Payment Summary

You should send an Employer Payment Summary (EPS), in addition to an FPS, if you claim any of the following:

  • SMP, SPP, SAP or ShPP
  • Employment Allowance
  • Construction Industry Scheme (CIS) deductions as a limited company
  • or if you pay the Apprenticeship Levy

If you did not pay any employees in the period you should send an EPS instead of an FPS. If you will not pay any employees for an extended period you can complete the PeriodOfInactivity from/to fields in the EpsJobPayInstruction.

An EPS should be sent by the 19th of the following tax month.

An example of enqueuing an EPS job.

curl -X POST \
  'https://api.test.payrun.io/jobs/rti' \
  -H 'Accept: application/xml' \
  -H 'Api-Version: default' \
  -H 'Authorization: {OAuthHeader}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-type: application/xml' \
  -d '<?xml version="1.0"?>
<RtiEpsJobInstruction xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <HoldingDate xsi:nil="true" />
  <Generate>true</Generate>
  <Transmit>true</Transmit>
  <TaxYear>2018</TaxYear>
  <Employer href="/Employer/ER001" />
  <Timestamp>2018-04-06T00:00:00</Timestamp>
  <TaxMonth>1</TaxMonth>
  <NoPaymentForPeriodFrom xsi:nil="true" />
  <NoPaymentForPeriodTo xsi:nil="true" />
  <PeriodOfInactivityFrom xsi:nil="true" />
  <PeriodOfInactivityTo xsi:nil="true" />
</RtiEpsJobInstruction>'
curl -X POST \
  'https://api.test.payrun.io/jobs/rti' \
  -H 'Accept: application/json' \
  -H 'Api-Version: default' \
  -H 'Authorization: {OAuthHeader}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-type: application/json' \
  -d '{
  "RtiEpsJobInstruction": {
    "HoldingDate": null,
    "Generate": "true",
    "Transmit": "true",
    "TaxYear": "2018",
    "Employer": {
      "@href": "/Employer/ER001"
    },
    "Timestamp": "2018-04-06T00:00:00",
    "TaxMonth": "1",
    "NoPaymentForPeriodFrom": null,
    "NoPaymentForPeriodTo": null,
    "PeriodOfInactivityFrom": null,
    "PeriodOfInactivityTo": null
  }
}'

NINO Verification Request

A NINO Verification Request (NVR) can be made in order to verify a new employee's National Insurance Number.

The use of an NVR message is not a mandatory.

The submission contains employee data to enable the verification; the HMRC response to an NVR is returned and processed via the Data Provisioning Service.

An example of enqueuing an NVR job.

curl -X POST \
  'https://api.test.payrun.io/jobs/rti' \
  -H 'Accept: application/xml' \
  -H 'Api-Version: default' \
  -H 'Authorization: {OAuthHeader}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-type: application/xml' \
  -d '<?xml version="1.0"?>
<RtiNvrJobInstruction xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <HoldingDate xsi:nil="true" />
  <Generate>true</Generate>
  <Transmit>true</Transmit>
  <TaxYear>2018</TaxYear>
  <Employer href="/Employer/ER001" />
  <Timestamp>2018-04-06T00:00:00</Timestamp>
</RtiNvrJobInstruction>'
curl -X POST \
  'https://api.test.payrun.io/jobs/rti' \
  -H 'Accept: application/json' \
  -H 'Api-Version: default' \
  -H 'Authorization: {OAuthHeader}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-type: application/json' \
  -d '{
  "RtiNvrJobInstruction": {
    "HoldingDate": null,
    "Generate": "true",
    "Transmit": "true",
    "TaxYear": "2018",
    "Employer": {
      "@href": "/Employer/ER001"
    },
    "Timestamp": "2018-04-06T00:00:00"
  }
}'

Other Messages

There are several other RTI message types, namely Employer Alignment Submission and Earlier Year Update. While they are both supported they have now been deprecated by HMRC.

Testing the Service

The PayRun.io API test environment is configured to use the HMRC test gateway endpoint, this allows you to freely test in this environment without effecting real world data.

Each job instruction contains a flag to Generate and Transmit; by setting the Transmit flag to false you can generate the RTI message but not send it which can be useful in some testing scenarios.