Sample Request
GET https://eu01.erpx-api.unit4rd.com/v1/objects/supplier-cisdetails
Usage Notes
This endpoint returns existing CIS Subcontractor and Verification Details on Suppliers.
It supports standard Object API query capabilities (filtering, sorting, pagination and selected fields).
For the data model details, see SupplierCISDetail Enterprise Document.
Sample Payloads
[
{
"path": "/businessType",
"op": "Replace",
"value": "soletrader"
},
{
"path": "/utr",
"op": "Replace",
"value": "1234567890"
},
{
"path": "/niNumber",
"op": "Replace",
"value": "AB123456C"
},
{
"path": "/firstName",
"op": "Replace",
"value": "John"
},
{
"path": "/surname",
"op": "Replace",
"value": "Smith"
},
{
"path": "/contract",
"op": "Replace",
"value": true
},
{
"path": "/employmentStatusCheck",
"op": "Replace",
"value": true
}
]
[
{
"path": "/businessType",
"op": "Replace",
"value": "partnership"
},
{
"path": "/utr",
"op": "Replace",
"value": "1234567890"
},
{
"path": "/niNumber",
"op": "Replace",
"value": "AB123456C"
},
{
"path": "/partnershipName",
"op": "Replace",
"value": "Smith & Sons"
},
{
"path": "/partnershipUtr",
"op": "Replace",
"value": "9876543210"
},
{
"path": "/tradingName",
"op": "Replace",
"value": "Smith Construction"
},
{
"path": "/contract",
"op": "Replace",
"value": true
},
{
"path": "/employmentStatusCheck",
"op": "Replace",
"value": true
}
]
[
{
"path": "/verifications/0/matchStatus",
"op": "Replace",
"value": "Matched",
"supportNestedCollections": true
},
{
"path": "/verifications/0/verificationNo",
"op": "Replace",
"value": "V1234567890",
"supportNestedCollections": true
},
{
"path": "/verifications/0/taxTreatment",
"op": "Replace",
"value": "Net",
"supportNestedCollections": true
}
]
[
{
"path": "/businessType",
"op": "Replace",
"value": "company"
},
{
"path": "/utr",
"op": "Replace",
"value": "1234567890"
},
{
"path": "/companyRegistrationNumber",
"op": "Replace",
"value": "AB123456"
},
{
"path": "/tradingName",
"op": "Replace",
"value": "Acme Construction Ltd"
},
{
"path": "/contract",
"op": "Replace",
"value": true
},
{
"path": "/employmentStatusCheck",
"op": "Replace",
"value": true
}
]
Limits & Notes
- One supplier per call.
- Upsert behavior: If no CIS record exists for the supplier, the API creates a new one.
If a record already exists, it updates the existing fields. - Patch operators available:
Replace, Add - Key fields (read-only):
companyId, supplierId - Automanaged fields:
taxRate on verifications is read-only (automatically set from system parameters based on taxTreatment).
When a new verification is created, dateTo is autoset to 2099-12-31 and the previous verification’s dateTo is updated to the new dateFrom minus one day. - Default values: If
dateFrom is omitted from a verification patch, it defaults to today’s date.
dateTo is by default 2099-12-31 for new verification details values. - Business type field filtering: The API automatically removes irrelevant patch operations based on the selected
businessType.
When businessType changes, fields that belonged to the previous type are actively cleared. - Nested collections: Set
"supportNestedCollections": true when patching verification records. - New CIS supplier (no existing CIS details): You cannot patch Verification details without providing Subcontractor details.
Subcontractor details mandatory elements must be provided, Verification details are optional.
If no Verification details are provided, a dummy row is created with dateFrom as today’s date and Message status as N (New). This supplier’s Verification details can be added later on via application or another PATCH operation. - Existing CIS supplier (CIS details already exist): You can provide either Subcontractor details, or Verification details, or both.
Subcontractor details will be updated.
Verification details will be added in a new row and previous Verification details date range will be updated. - Required system parameters:
CIS_GROSS_RATE, CIS_NET_RATE, CIS_UNMATCHED_RATE, CIS_TAX_SYSTEM_1 must be active and configured.
Mandatory Fields by Business Type
| Field | soletrader | partnership | company | trust |
|---|
utr | ✔ | ✔ | ✔ | ✔ |
contract (must be true) | ✔ | ✔ | ✔ | ✔ |
employmentStatusCheck (must be true) | ✔ | ✔ | ✔ | ✔ |
Name identifier (tradingName or firstName + surname) | ✔ | ✔ | ✔ | ✔ |
niNumber | ✔ | ✔ | — | — |
partnershipName | — | ✔ | — | — |
partnershipUtr | — | ✔ | — | — |
Business Type Field Filtering
When the businessType is changed, the API clears fields that are no longer applicable:
| Transition | Fields Cleared |
|---|
From partnership to any other type | partnershipName, partnershipUtr |
From soletrader or partnership to company or trust | niNumber |
From company or trust to soletrader | companyRegistrationNumber |
Verification Tax Rate Mapping
The taxRate field on verifications is read-only and autodetermined:
| Tax Treatment | System Parameter Used |
|---|
Gross | CIS_GROSS_RATE |
Net | CIS_NET_RATE |
Unmatched | CIS_UNMATCHED_RATE |
Validation Rules for PATCH Method
PATCH_001 - Invalid authorisation
| Element | Details |
|---|
| Scenario ID | PATCH_001 |
| Scenario Name | Invalid authorisation |
| HTTP Code | 401 |
| GIVEN | The token provided does not pass authorisation |
| WHEN | The API request is sent |
| BUT | — |
| THEN | The API stops with a 401 error and a message |
| Example Error Message | {"statusCode": 401, "message": "Invalid JWT."} |
PATCH_002 - User is not authorised to access API
| Element | Details |
|---|
| Scenario ID | PATCH_002 |
| Scenario Name | User is not authorised to access API |
| HTTP Code | 403 |
| GIVEN | The user is not authorised to access the API |
| WHEN | The API request is sent |
| BUT | — |
| THEN | The API stops with a 403 error and a message |
| Example Error Message | {"code": 2030, "message": "User is not authorized"} |
PATCH_003 - Required system parameters are missing or inactive
| Element | Details |
|---|
| Scenario ID | PATCH_003 |
| Scenario Name | Required system parameters are missing or inactive |
| HTTP Code | 400 |
| GIVEN | The system parameters CIS_GROSS_RATE, CIS_NET_RATE, CIS_UNMATCHED_RATE, or CIS_TAX_SYSTEM_1 are not active or do not have a value assigned |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns an error before processing the request |
| Example Error Message | "The following system parameters must be active and have a value assigned: <parameter list>" |
PATCH_004 - Supplier does not exist
| Element | Details |
|---|
| Scenario ID | PATCH_004 |
| Scenario Name | Supplier does not exist |
| HTTP Code | 404 |
| GIVEN | The supplierId specified in the URL does not correspond to any supplier in the current company |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a not found error |
| Example Error Message | "Supplier with Id <supplierId> was not found within company <companyId>" |
PATCH_005 - Missing mandatory fields for soletrader business type
| Element | Details |
|---|
| Scenario ID | PATCH_005 |
| Scenario Name | Missing mandatory fields for soletrader business type |
| HTTP Code | 422 |
| GIVEN | The business type is soletrader |
| WHEN | The user sends a PATCH request missing any of: UTR, NI Number, name identifier, contract, or employmentStatusCheck |
| BUT | — |
| THEN | The API returns validation errors for each missing mandatory field |
| Example Error Message | "Missing mandatory Ni Number for soletrader Business type" / "Missing mandatory UTR for soletrader Business type" |
PATCH_006 - Missing mandatory fields for partnership business type
| Element | Details |
|---|
| Scenario ID | PATCH_006 |
| Scenario Name | Missing mandatory fields for partnership business type |
| HTTP Code | 422 |
| GIVEN | The business type is partnership |
| WHEN | The user sends a PATCH request missing any of: UTR, NI Number, Partnership Name, Partnership UTR, name identifier, contract, or employmentStatusCheck |
| BUT | — |
| THEN | The API returns validation errors for each missing mandatory field |
| Example Error Message | "Missing mandatory Ni Number for partnership Business type" / "Missing mandatory Partnership Name for partnership Business type" / "Missing mandatory Partnership UTR for partnership Business type" |
PATCH_007 - Missing mandatory fields for company or trust business type
| Element | Details |
|---|
| Scenario ID | PATCH_007 |
| Scenario Name | Missing mandatory fields for company or trust business type |
| HTTP Code | 422 |
| GIVEN | The business type is company or trust |
| WHEN | The user sends a PATCH request missing any of: UTR, name identifier, contract, or employmentStatusCheck |
| BUT | — |
| THEN | The API returns validation errors for each missing mandatory field |
| Example Error Message | "Missing mandatory UTR for company Business type" |
PATCH_008 - Employment status check is not ticked
| Element | Details |
|---|
| Scenario ID | PATCH_008 |
| Scenario Name | Employment status check is not ticked |
| HTTP Code | 422 |
| GIVEN | The employmentStatusCheck field is false |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "'Employment status checked' must be ticked to confirm that the employment status has been checked." |
PATCH_009 - Contract is not ticked
| Element | Details |
|---|
| Scenario ID | PATCH_009 |
| Scenario Name | Contract is not ticked |
| HTTP Code | 422 |
| GIVEN | The contract field is false |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "'Contract' must be ticked to confirm that a contract exists." |
PATCH_010 - Missing name identifier
| Element | Details |
|---|
| Scenario ID | PATCH_010 |
| Scenario Name | Missing name identifier |
| HTTP Code | 422 |
| GIVEN | Neither tradingName is provided, nor both firstName and surname are provided |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "Missing mandatory trading name or individual name for <businessType> Business type" |
PATCH_011 - NI Number contains lowercase letters
| Element | Details |
|---|
| Scenario ID | PATCH_011 |
| Scenario Name | NI Number contains lowercase letters |
| HTTP Code | 422 |
| GIVEN | The niNumber field contains lowercase letters |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "'NI Number' must use uppercase letters" |
PATCH_012 - Company Registration Number contains lowercase letters
| Element | Details |
|---|
| Scenario ID | PATCH_012 |
| Scenario Name | Company Registration Number contains lowercase letters |
| HTTP Code | 422 |
| GIVEN | The companyRegistrationNumber field contains lowercase letters |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "'Company Registration Number' must use uppercase letters" |
PATCH_013 - Verification DateFrom is in the future
| Element | Details |
|---|
| Scenario ID | PATCH_013 |
| Scenario Name | Verification DateFrom is in the future |
| HTTP Code | 422 |
| GIVEN | The dateFrom value in a verification patch operation is a future date |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns an error |
| Example Error Message | "Verification DateFrom cannot be in the future." |
PATCH_014 - Verification DateFrom is before last verification DateFrom
| Element | Details |
|---|
| Scenario ID | PATCH_014 |
| Scenario Name | Verification DateFrom is before last verification DateFrom |
| HTTP Code | 422 |
| GIVEN | The supplier has existing verification records and the dateFrom in the patch is on or before the last verification’s dateFrom (and is not today) |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns an error |
| Example Error Message | "New verification DateFrom must be after the last verification DateFrom." |
PATCH_015 - Tax rate cannot be retrieved from system parameters
| Element | Details |
|---|
| Scenario ID | PATCH_015 |
| Scenario Name | Tax rate cannot be retrieved from system parameters |
| HTTP Code | 422 |
| GIVEN | The tax treatment is set in a verification record but the corresponding system parameter value cannot be parsed as a number |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns an error |
| Example Error Message | "Failed to retrieve tax rate from system parameters for the specified tax treatment." |
PATCH_016 - Invalid inactivity value on new record
| Element | Details |
|---|
| Scenario ID | PATCH_016 |
| Scenario Name | Invalid inactivity value on new record |
| HTTP Code | 422 |
| GIVEN | No CIS record exists for the supplier (new record creation) and the inactive field contains an invalid value |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "Invalid inactivity value" |
PATCH_017 - Verification row missing mandatory fields
| Element | Details |
|---|
| Scenario ID | PATCH_017 |
| Scenario Name | Verification row missing mandatory fields |
| HTTP Code | 422 |
| GIVEN | A verification row is included in the patch and one or more of the mandatory fields (matchStatus, verificationNo, taxTreatment) are missing or empty |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns a validation error for the first missing field |
| Example Error Message | "MatchStatus is required for all verification rows" / "VerificationNo is required for all verification rows" / "TaxTreatment is required for all verification rows" |
PATCH_018 - Invalid match status on verification row
| Element | Details |
|---|
| Scenario ID | PATCH_018 |
| Scenario Name | Invalid match status on verification row |
| HTTP Code | 422 |
| GIVEN | A verification row’s matchStatus is set to a value other than Matched or Unmatched |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "Verification status must be either 'Matched' or 'Unmatched'" |
PATCH_019 - Invalid tax treatment on verification row
| Element | Details |
|---|
| Scenario ID | PATCH_019 |
| Scenario Name | Invalid tax treatment on verification row |
| HTTP Code | 422 |
| GIVEN | A verification row’s taxTreatment is set to a value other than Gross, Net, or Unmatched |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "TaxTreatment must be either 'Gross', 'Net' or 'Unmatched'" |
PATCH_020 - Invalid verification number format for Matched status
| Element | Details |
|---|
| Scenario ID | PATCH_020 |
| Scenario Name | Invalid verification number format for Matched status |
| HTTP Code | 422 |
| GIVEN | A verification row has matchStatus set to Matched and the verificationNo does not match the format V followed by exactly 10 digits (e.g., V1234567890) |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "Validation number for a matched subcontractor should be 'V' followed by 10 digits." |
PATCH_021 - Invalid verification number format for Unmatched status
| Element | Details |
|---|
| Scenario ID | PATCH_021 |
| Scenario Name | Invalid verification number format for Unmatched status |
| HTTP Code | 422 |
| GIVEN | A verification row has matchStatus set to Unmatched and the verificationNo does not match the format V followed by 10 digits then 1 or 2 uppercase letters excluding I and O (e.g., V1234567890AB) |
| WHEN | The user sends a PATCH request with verification data |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "Validation number for an unmatched subcontractor should be 'V' followed by 10 digits then 1 or 2 letters (except I or O)." |
PATCH_022 - Invalid business type
| Element | Details |
|---|
| Scenario ID | PATCH_022 |
| Scenario Name | Invalid business type |
| HTTP Code | 422 |
| GIVEN | The businessType field is set to a value other than soletrader, partnership, company, or trust |
| WHEN | The user sends a PATCH request |
| BUT | — |
| THEN | The API returns a validation error |
| Example Error Message | "Business type must be either 'soletrader', 'partnership', 'company' or 'trust'." |