Trigger send HMRC RTI FPS for payroll run
Triggers the sending of HMRC RTI FPS (Full Payment Submission) for a specific payroll run
curl --request POST \
--url https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period} \
--header 'Content-Type: application/json' \
--header 'X-Auth-Token: <api-key>' \
--header 'X-Org-Id: <api-key>' \
--data '
{
"finalSubmissionDetails": {
"becauseSchemeCeased": true,
"dateSchemeCeased": "2024-04-05",
"forYear": true
},
"lateReason": "ReasonableExcuse"
}
'import requests
url = "https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}"
payload = {
"finalSubmissionDetails": {
"becauseSchemeCeased": True,
"dateSchemeCeased": "2024-04-05",
"forYear": True
},
"lateReason": "ReasonableExcuse"
}
headers = {
"X-Auth-Token": "<api-key>",
"X-Org-Id": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Auth-Token': '<api-key>',
'X-Org-Id': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
finalSubmissionDetails: {becauseSchemeCeased: true, dateSchemeCeased: '2024-04-05', forYear: true},
lateReason: 'ReasonableExcuse'
})
};
fetch('https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'finalSubmissionDetails' => [
'becauseSchemeCeased' => true,
'dateSchemeCeased' => '2024-04-05',
'forYear' => true
],
'lateReason' => 'ReasonableExcuse'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Auth-Token: <api-key>",
"X-Org-Id: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}"
payload := strings.NewReader("{\n \"finalSubmissionDetails\": {\n \"becauseSchemeCeased\": true,\n \"dateSchemeCeased\": \"2024-04-05\",\n \"forYear\": true\n },\n \"lateReason\": \"ReasonableExcuse\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Auth-Token", "<api-key>")
req.Header.Add("X-Org-Id", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}")
.header("X-Auth-Token", "<api-key>")
.header("X-Org-Id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"finalSubmissionDetails\": {\n \"becauseSchemeCeased\": true,\n \"dateSchemeCeased\": \"2024-04-05\",\n \"forYear\": true\n },\n \"lateReason\": \"ReasonableExcuse\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Auth-Token"] = '<api-key>'
request["X-Org-Id"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"finalSubmissionDetails\": {\n \"becauseSchemeCeased\": true,\n \"dateSchemeCeased\": \"2024-04-05\",\n \"forYear\": true\n },\n \"lateReason\": \"ReasonableExcuse\"\n}"
response = http.request(request)
puts response.read_body{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {
"example": {
"field1": "value1",
"field2": "value2"
},
"description": "Final submission details are required for the last period of the tax year 2025-2026. Please provide the details in the request body using the example format above.",
"type": "FinalSubmissionDetailsY2025To26",
"taxYear": "2025-2026"
},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}Authorizations
Access token obtained from OAuth2 client credentials flow
Organisation to scope the request to. Required when the principal can access more than one organisation; optional for single-organisation principals (the authorizer resolves it automatically).
Path Parameters
The payroll configuration ID
^[a-zA-Z0-9_-]+$The tax year
^[0-9]{4}$The payroll period
^[0-9]+$Query Parameters
Whether to generate a preview without submitting to HMRC
Body
Optional. Carries the final submission details (required for the last period of the tax year) and the HMRC late reporting reason. The body may be omitted when neither applies. Sending the bare final submission details object as the body (the shape before finalSubmissionDetails and lateReason existed) is deprecated as input since 5 October 2026 and stops being accepted on 15 January 2027; until then it is read as finalSubmissionDetails with no late reason, and behaves exactly as it did before. Wrap the details in finalSubmissionDetails instead.
Body of the FPS submit and preview request. Both members are optional.
Final submission details. Required for the last pay period of the tax year, otherwise omit it.
Show child attributes
Show child attributes
HMRC late reporting reason, when this FPS is sent after the employees' payment date. It is reported on every payment in the submission (HMRC's Payment/LateReason) and recorded on the pay run. Omit it when reporting on time. The values map to HMRC's codes: NotionalPaymentToExpartByThirdPartyOrOverseasEmployer (A), NotionalPaymentEmploymentRelatedSecurity (B), NotionalPaymentOther (C), PaymentSubjectToClass1NicButP11dP9dForTax (D), NoRequirementToMaintainADeductionsWorkingSheetOrImpossibleToReportWorkDoneOnTheDay (F), ReasonableExcuse (G), CorrectionToEarlierSubmission (H). The single code letter is also accepted. Code E (micro employer "on or before" relaxation) was withdrawn by HMRC on 6 April 2016 and is rejected with 400 hmrcRtiFpsInvalidLateReason, as is any other value.
NotionalPaymentToExpartByThirdPartyOrOverseasEmployer, NotionalPaymentEmploymentRelatedSecurity, NotionalPaymentOther, PaymentSubjectToClass1NicButP11dP9dForTax, NoRequirementToMaintainADeductionsWorkingSheetOrImpossibleToReportWorkDoneOnTheDay, ReasonableExcuse, CorrectionToEarlierSubmission "ReasonableExcuse"
Was this page helpful?
curl --request POST \
--url https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period} \
--header 'Content-Type: application/json' \
--header 'X-Auth-Token: <api-key>' \
--header 'X-Org-Id: <api-key>' \
--data '
{
"finalSubmissionDetails": {
"becauseSchemeCeased": true,
"dateSchemeCeased": "2024-04-05",
"forYear": true
},
"lateReason": "ReasonableExcuse"
}
'import requests
url = "https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}"
payload = {
"finalSubmissionDetails": {
"becauseSchemeCeased": True,
"dateSchemeCeased": "2024-04-05",
"forYear": True
},
"lateReason": "ReasonableExcuse"
}
headers = {
"X-Auth-Token": "<api-key>",
"X-Org-Id": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Auth-Token': '<api-key>',
'X-Org-Id': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
finalSubmissionDetails: {becauseSchemeCeased: true, dateSchemeCeased: '2024-04-05', forYear: true},
lateReason: 'ReasonableExcuse'
})
};
fetch('https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'finalSubmissionDetails' => [
'becauseSchemeCeased' => true,
'dateSchemeCeased' => '2024-04-05',
'forYear' => true
],
'lateReason' => 'ReasonableExcuse'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Auth-Token: <api-key>",
"X-Org-Id: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}"
payload := strings.NewReader("{\n \"finalSubmissionDetails\": {\n \"becauseSchemeCeased\": true,\n \"dateSchemeCeased\": \"2024-04-05\",\n \"forYear\": true\n },\n \"lateReason\": \"ReasonableExcuse\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Auth-Token", "<api-key>")
req.Header.Add("X-Org-Id", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}")
.header("X-Auth-Token", "<api-key>")
.header("X-Org-Id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"finalSubmissionDetails\": {\n \"becauseSchemeCeased\": true,\n \"dateSchemeCeased\": \"2024-04-05\",\n \"forYear\": true\n },\n \"lateReason\": \"ReasonableExcuse\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.flowpayroll.ai/v1/rti/fps/{payrollConfigId}/{taxYear}/{period}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Auth-Token"] = '<api-key>'
request["X-Org-Id"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"finalSubmissionDetails\": {\n \"becauseSchemeCeased\": true,\n \"dateSchemeCeased\": \"2024-04-05\",\n \"forYear\": true\n },\n \"lateReason\": \"ReasonableExcuse\"\n}"
response = http.request(request)
puts response.read_body{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {
"example": {
"field1": "value1",
"field2": "value2"
},
"description": "Final submission details are required for the last period of the tax year 2025-2026. Please provide the details in the request body using the example format above.",
"type": "FinalSubmissionDetailsY2025To26",
"taxYear": "2025-2026"
},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}{
"message": {
"text": "<string>",
"token": "<string>",
"tokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
},
"content": {
"data": {},
"metadata": {
"dateFormat": "yyyy-MM-dd",
"dateTimeFormat": "yyyy-MM-ddTHH:mm:ss.fffZ",
"paginationToken": "<string>"
}
},
"validationIssues": [
{
"field": "<string>",
"reason": "<string>",
"reasonToken": "<string>",
"reasonTokenArguments": [
{
"name": "<string>",
"value": "<string>"
}
]
}
]
}