List a job's payment history
curl --request GET \
--url https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history \
--header 'X-Session-Token: <api-key>'import requests
url = "https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history"
headers = {"X-Session-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Session-Token': '<api-key>'}};
fetch('https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history', 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.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Session-Token: <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"
"net/http"
"io"
)
func main() {
url := "https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Session-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history")
.header("X-Session-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Session-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "standard-payment-history",
"attributes": {
"standard_mapping_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"submission_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation": "created",
"status": "paid",
"author": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>"
},
"created_at": "2026-11-03T12:42:44.000Z",
"paid_on": "2026-10-30",
"amount": {
"amount": 9250,
"currency": "GBP"
},
"reason": "<string>",
"note": "<string>"
}
}
],
"meta": {
"pagination": {
"counts": {
"pages": 1,
"resources": 1
},
"current_page": 1,
"offsets": {
"next": null,
"previous": null
},
"requested": {
"limit": 10,
"offset": 0
}
},
"features": {
"include": {
"options": [
"related.resource"
]
}
}
},
"jsonapi": {
"version": "1.0"
}
}{
"id": "05fc9c8d-73b9-4697-9337-57f7a567a48f",
"status": "401",
"title": "You are not authorised to access this resource",
"detail": "In order to access this resource, you need the 'admin' role.",
"code": "AUTH.001"
}{
"id": "7b4c8f12-3e9a-4d5b-8c6f-1a2b3c4d5e6f",
"status": "404",
"title": "Resource not found",
"detail": "The requested resource could not be found or does not exist.",
"code": "NOT_FOUND.001"
}{
"id": "fe9d9a69-f0a7-4fdc-bb2c-176027f316c5",
"status": "500",
"title": "Internal Server Error",
"detail": "An unexpected error occurred on the server."
}Standards
List a job's payment history
List every change made to one job’s payment record under a standard mapping, newest first. Each entry holds the record’s fields as the change left them, who made it and when. A job whose record was never changed has an empty list. The caller needs to view standards across the organisation, as for the payment record itself. The list is not paginated, and has no included.
GET
/
v3
/
orgs
/
{org_id}
/
standard-mappings
/
{standard_mapping_id}
/
payments
/
{submission_id}
/
history
List a job's payment history
curl --request GET \
--url https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history \
--header 'X-Session-Token: <api-key>'import requests
url = "https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history"
headers = {"X-Session-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Session-Token': '<api-key>'}};
fetch('https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history', 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.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Session-Token: <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"
"net/http"
"io"
)
func main() {
url := "https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Session-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history")
.header("X-Session-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ctrl-hub.com/v3/orgs/{org_id}/standard-mappings/{standard_mapping_id}/payments/{submission_id}/history")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Session-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "standard-payment-history",
"attributes": {
"standard_mapping_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"submission_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"payment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operation": "created",
"status": "paid",
"author": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>"
},
"created_at": "2026-11-03T12:42:44.000Z",
"paid_on": "2026-10-30",
"amount": {
"amount": 9250,
"currency": "GBP"
},
"reason": "<string>",
"note": "<string>"
}
}
],
"meta": {
"pagination": {
"counts": {
"pages": 1,
"resources": 1
},
"current_page": 1,
"offsets": {
"next": null,
"previous": null
},
"requested": {
"limit": 10,
"offset": 0
}
},
"features": {
"include": {
"options": [
"related.resource"
]
}
}
},
"jsonapi": {
"version": "1.0"
}
}{
"id": "05fc9c8d-73b9-4697-9337-57f7a567a48f",
"status": "401",
"title": "You are not authorised to access this resource",
"detail": "In order to access this resource, you need the 'admin' role.",
"code": "AUTH.001"
}{
"id": "7b4c8f12-3e9a-4d5b-8c6f-1a2b3c4d5e6f",
"status": "404",
"title": "Resource not found",
"detail": "The requested resource could not be found or does not exist.",
"code": "NOT_FOUND.001"
}{
"id": "fe9d9a69-f0a7-4fdc-bb2c-176027f316c5",
"status": "500",
"title": "Internal Server Error",
"detail": "An unexpected error occurred on the server."
}Authorizations
SessionOAuth2Cookie
Session token for authentication.
Path Parameters
The unique identifier for the organisation.
The unique identifier for the standard mapping.
The unique identifier for the submission.