Programme Contracts
Read a Customer’s report-logo choices
/a/ContractProgramme_branding
List existing Customer Files and the selected Programme report logo.
When to use this endpoint
Upload a logo into the Customer/Site Files first, then read this list and save a selected file_id. Read the parent separately to edit fallback branding.
Send operation fields inside one JSON-encoded data object. When data is present it replaces top-level operation fields; otherwise the handler accepts the top-level request. String data is limited to 2 MB. Reserved transport/internal keys are removed. Malformed or non-array JSON becomes an empty input, so validate JSON before sending.
Authentication and permissions
Authenticate with a signed API key or logged-in CRM session; session requests follow dispatcher CSRF checks. API-key requests use the key owner’s identity and permissions.
Requires the Contracts entitlement (features & 64), features2.contractProgrammes and Contracts View. Also requires features2.contractProgrammeQI.
All storage belongs to the authenticated tenant. Contract operations follow the actor’s recursive HR manager/team scope, or the configured TeamAccess Contract/Department policy. Client administrators have broad Contract scope; private Programme and route ownership still applies. Active assignees must be within the permitted team.
The tenant must have the Programme storage upgrade (foundation 803; independent route ownership 804 before planning). Requests never create or repair tables. A missing/incompatible storage failure can return an initialization/storage error or Contracts operation failed. Check the saved state before retrying.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
customer_id | Positive integer or digit string | Yes | Non-deleted Customer/Site linked to an in-scope Programme Contract, or the direct parent of a linked Customer. TeamAccess Customer scope also applies. |
Example request
$result = FM_api('ContractProgramme_branding', [
'data' => json_encode([
'customer_id' => 1043,
]),
]);
Example response
{
"ok": 1,
"customer": {
"id": "1043",
"name": "Riverside Site",
"parent_id": "1042"
},
"file_id": 0,
"files": []
}
Errors and unusual responses
| Response | Condition |
|---|---|
{"error":"not logged in"} | No authenticated tenant context is available. Invalid signed credentials can be rejected by the dispatcher before the handler runs. |
{"error":"Programme Contracts is not enabled"} | Workspace flag or Contracts entitlement is disabled. |
{"error":"Permission denied"} | Contracts View or the required action permission is unavailable. |
{"error":"This Contracts capability is not enabled"} | The operation’s additional feature flag is disabled. |
{"error":"Customer is unavailable or outside your Contracts"} | Customer deleted/missing or not linked to scoped work. |
Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.
Behaviour and edge cases
- Returns customer identity, integer file_id (0 if no explicit logo) and active Customer-owned Files sorted by filename, each {id,name}. Database identity scalar types may depend on driver.
- Lists all non-deleted Files for this exact Customer, not only supported images;
ContractProgramme_saveBrandingvalidates ownership and actual image bytes. - No pagination or parent-logo resolution in this response. The report renderers prefer Site branding, then parent branding.
See it in Fieldmotion
CRM1
No direct caller was found in CRM1 source. This workflow is implemented by the opted-in CRM2 Programme Contracts workspace.
CRM2
Open a Programme Contract → Sites → Report Logo. Filter for ContractProgramme_branding. Files opens the existing upload screen; Parent Customer Logo opens the parent selection separately.
Related endpoints
ContractProgramme_saveBranding— Validate and select/clear the logo.