1. U4 ERPx
  2. API Reference
  3. Accounting
  4. Supplier CIS Details

Supplier CIS Details

The Supplier CIS Details API in Unit4 ERPx manages CIS (Construction Industry Scheme) details for suppliers, including business type, verification records, and tax treatment. It supports creating and updating CIS records via a single PATCH endpoint.

Purpose:
This API is used to create and update CIS (Construction Industry Scheme) details for suppliers registered in Unit4 ERPx. The CIS is a UK tax scheme that applies to contractors and subcontractors in the construction industry.

Base URL:
/v1/supplier-cis-details

Authentication:
All APIs require a Client ID and Client Secret.
Refer to the global authentication documentation for details.

System Parameters:
System parameters for this API are available in Online Help → System and common parameters → System parameters and values → System parameters → Common and System administration → Financials → Accounts Payable (SU, CS).
The following system parameters must be active and configured: CIS_GROSS_RATE, CIS_NET_RATE, CIS_UNMATCHED_RATE, CIS_TAX_SYSTEM_1.    

Supported Methods

HTTP MethodEndpointDescriptionLimits & Notes
PATCH/v1/supplier-cis-details/{supplierId}Create or update CIS details for a supplierOne supplier per call. Creates a new CIS record if none exists; otherwise updates the existing one. Supports nested verification records.
GET/v1/objects/supplier-cisdetailsRetrieve existing CIS supplier details.

   

Swagger / Schema

Version v1

Version v1

   

Method Details

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

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

TransitionFields Cleared
From partnership to any other typepartnershipName, partnershipUtr
From soletrader or partnership to company or trustniNumber
From company or trust to soletradercompanyRegistrationNumber

   

Verification Tax Rate Mapping

The taxRate field on verifications is read-only and autodetermined:

Tax TreatmentSystem Parameter Used
GrossCIS_GROSS_RATE
NetCIS_NET_RATE
UnmatchedCIS_UNMATCHED_RATE

   

Validation Rules for PATCH Method

PATCH_001 - Invalid authorisation
ElementDetails
Scenario IDPATCH_001
Scenario NameInvalid authorisation
HTTP Code401
GIVENThe token provided does not pass authorisation
WHENThe API request is sent
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_002
Scenario NameUser is not authorised to access API
HTTP Code403
GIVENThe user is not authorised to access the API
WHENThe API request is sent
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_003
Scenario NameRequired system parameters are missing or inactive
HTTP Code400
GIVENThe 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
WHENThe user sends a PATCH request
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_004
Scenario NameSupplier does not exist
HTTP Code404
GIVENThe supplierId specified in the URL does not correspond to any supplier in the current company
WHENThe user sends a PATCH request
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_005
Scenario NameMissing mandatory fields for soletrader business type
HTTP Code422
GIVENThe business type is soletrader
WHENThe user sends a PATCH request missing any of: UTR, NI Number, name identifier, contract, or employmentStatusCheck
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_006
Scenario NameMissing mandatory fields for partnership business type
HTTP Code422
GIVENThe business type is partnership
WHENThe user sends a PATCH request missing any of: UTR, NI Number, Partnership Name, Partnership UTR, name identifier, contract, or employmentStatusCheck
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_007
Scenario NameMissing mandatory fields for company or trust business type
HTTP Code422
GIVENThe business type is company or trust
WHENThe user sends a PATCH request missing any of: UTR, name identifier, contract, or employmentStatusCheck
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_008
Scenario NameEmployment status check is not ticked
HTTP Code422
GIVENThe employmentStatusCheck field is false
WHENThe user sends a PATCH request
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_009
Scenario NameContract is not ticked
HTTP Code422
GIVENThe contract field is false
WHENThe user sends a PATCH request
BUT
THENThe API returns a validation error
Example Error Message"'Contract' must be ticked to confirm that a contract exists."
PATCH_010 - Missing name identifier
ElementDetails
Scenario IDPATCH_010
Scenario NameMissing name identifier
HTTP Code422
GIVENNeither tradingName is provided, nor both firstName and surname are provided
WHENThe user sends a PATCH request
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_011
Scenario NameNI Number contains lowercase letters
HTTP Code422
GIVENThe niNumber field contains lowercase letters
WHENThe user sends a PATCH request
BUT
THENThe API returns a validation error
Example Error Message"'NI Number' must use uppercase letters"
PATCH_012 - Company Registration Number contains lowercase letters
ElementDetails
Scenario IDPATCH_012
Scenario NameCompany Registration Number contains lowercase letters
HTTP Code422
GIVENThe companyRegistrationNumber field contains lowercase letters
WHENThe user sends a PATCH request
BUT
THENThe API returns a validation error
Example Error Message"'Company Registration Number' must use uppercase letters"
PATCH_013 - Verification DateFrom is in the future
ElementDetails
Scenario IDPATCH_013
Scenario NameVerification DateFrom is in the future
HTTP Code422
GIVENThe dateFrom value in a verification patch operation is a future date
WHENThe user sends a PATCH request with verification data
BUT
THENThe API returns an error
Example Error Message"Verification DateFrom cannot be in the future."
PATCH_014 - Verification DateFrom is before last verification DateFrom
ElementDetails
Scenario IDPATCH_014
Scenario NameVerification DateFrom is before last verification DateFrom
HTTP Code422
GIVENThe supplier has existing verification records and the dateFrom in the patch is on or before the last verification’s dateFrom (and is not today)
WHENThe user sends a PATCH request with verification data
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_015
Scenario NameTax rate cannot be retrieved from system parameters
HTTP Code422
GIVENThe tax treatment is set in a verification record but the corresponding system parameter value cannot be parsed as a number
WHENThe user sends a PATCH request with verification data
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_016
Scenario NameInvalid inactivity value on new record
HTTP Code422
GIVENNo CIS record exists for the supplier (new record creation) and the inactive field contains an invalid value
WHENThe user sends a PATCH request
BUT
THENThe API returns a validation error
Example Error Message"Invalid inactivity value"
PATCH_017 - Verification row missing mandatory fields
ElementDetails
Scenario IDPATCH_017
Scenario NameVerification row missing mandatory fields
HTTP Code422
GIVENA verification row is included in the patch and one or more of the mandatory fields (matchStatus, verificationNo, taxTreatment) are missing or empty
WHENThe user sends a PATCH request with verification data
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_018
Scenario NameInvalid match status on verification row
HTTP Code422
GIVENA verification row’s matchStatus is set to a value other than Matched or Unmatched
WHENThe user sends a PATCH request with verification data
BUT
THENThe API returns a validation error
Example Error Message"Verification status must be either 'Matched' or 'Unmatched'"
PATCH_019 - Invalid tax treatment on verification row
ElementDetails
Scenario IDPATCH_019
Scenario NameInvalid tax treatment on verification row
HTTP Code422
GIVENA verification row’s taxTreatment is set to a value other than Gross, Net, or Unmatched
WHENThe user sends a PATCH request with verification data
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_020
Scenario NameInvalid verification number format for Matched status
HTTP Code422
GIVENA verification row has matchStatus set to Matched and the verificationNo does not match the format V followed by exactly 10 digits (e.g., V1234567890)
WHENThe user sends a PATCH request with verification data
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_021
Scenario NameInvalid verification number format for Unmatched status
HTTP Code422
GIVENA 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)
WHENThe user sends a PATCH request with verification data
BUT
THENThe 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
ElementDetails
Scenario IDPATCH_022
Scenario NameInvalid business type
HTTP Code422
GIVENThe businessType field is set to a value other than soletrader, partnership, company, or trust
WHENThe user sends a PATCH request
BUT
THENThe API returns a validation error
Example Error Message"Business type must be either 'soletrader', 'partnership', 'company' or 'trust'."

Best Practices

  • Understand business type requirements before patching — each business type (soletrader, partnership, company, trust) has different mandatory fields. Review the mandatory fields table above to ensure your request includes all required data.
  • Business type transitions clear fields automatically — when changing business type, fields that are no longer applicable are cleared by the API regardless of what values you send. Plan your integration accordingly.
  • Verification records are timeline-managed — the API automatically sets dateTo on previous verifications and defaults dateFrom to today when omitted. Do not attempt to manually manage these fields.
  • The taxRate field is read-only — it is automatically determined from system parameters based on the taxTreatment value. Do not include it in patch operations.
  • Use uppercase for niNumber and companyRegistrationNumber — the API validates that these fields contain only uppercase letters.
  • Ensure system parameters are configured — the four CIS system parameters must be active before using this API.
  • Use Swagger UI for testing and schema validation before production calls.
  • Handle error codes gracefully - implement retry/backoff logic in line with global rate limits.
  • Always check for deprecation alerts on the endpoint version in use.    

Action APIs


Query APIs (Read-Only)