This section lists the errors produced by the RZ APIs:
- /dataload/project/descriptions
- /dataload/project/projectcomponents
- /dataload/project
The APIs always return an HTTP status of 200.
The success of failure is specified in the status field of the response.
There are no numeric error codes, just error messages.
Errors are returned as follows: {"row": "0", "status": "failure", "error": "<message>"}
Errors happen in two stages:
- Stage 1: Request-level (before any record is touched)
- Stage 2: Per-record (if one row fails validation, others can still succeed).
- Stage 3: DML / System (internal Salesforce errors)
Stage 1: Request-level (whole call rejected)
Internal Identifier Not sent in response | Error message (request level) | How it occurs |
PERMISSION_API | You do not have enough permissions to use this service. Check your profile and ensure you have permission on all fields to load. | DataLoadAPI.innerCheckDataLoadHandlerPermission() runs first and checks object/field-level (FLS) access on every field the DTO touches (e.g. PSProject__c, PSComponent__c, PSDescription__c and their fields). Fails if the running user's profile/permission set is missing read/create/update on any of those fields. |
REQUEST_EMPTY | Your attempt to use the service is not valid. Json is null (and cannot be deserialized). | Request body is blank/null. |
REQUEST_MALFORMED | Your attempt to use the service is not valid. Json is malformed (and cannot be deserialized). | JSON.deserializeStrict throws a JSONException — invalid JSON, wrong data types, or unexpected/missing fields for the DTO shape. |
NOT_AVAILABLE_API_TYPE | The API Type has not been specified in the call or implemented. | This is a defensive fallback error that shouldn't be occurring in practice. |
DEFAULT_PERMISSION_ACTION_ERROR | You do not have the required permissions to perform this action | The user running the API doesn’t have the required permissions |
NO_RECORDS_SPECIFIED | No records has been specified. | The detail list provided in projectDetailList / projectAndComponentDetailList / descriptionDetailList is null or empty. |
TOO_MANY_RECORD | There is a 200 records limits. | More than 200 rows in the detail list (only enforced when not run as a batch job). |
Stage 2: Per-record (that row fails, others in are still imported)
Internal Identifier Not sent in response | Applies to | Error message (request level) | How it occurs |
PROJECTID_IS_REQUIRED | loadProjects loadProjectsAndComponents | The Project ID or External ID is required. | A row has neither projectId nor projectExtSysId set |
PRODUCTID_IS_REQUIRED | loadProjectsAndComponents | The Product ID or External ID is required. | A row has neither productId nor productExtSysId set |
PRODUCT_LONG_OR_SHORT_TITLE_IS_REQUIRED | loadProjects, loadProjectsAndComponents | The Long Title (longTitle) or Short Title (productShortTitle) fields are required. | A row has neither longTitle nor productShortTitle populated. |
DESCRIPTIONID_IS_REQUIRED | loadDescriptions | The Project External ID is required. | A row has a blank projectExtSysId (name is a bit misleading — it's actually checking the linked project's external ID, not a description ID). |
Stage 3: DML / System (internal Salesforce errors)
When a row passes validation and is actually upserted, any Salesforce DML failure (validation rule, required-field-missing, duplicate rule, field-level data error, etc.) can still occur.
When caught these errors are returned as follow:
{
"row": "0",
"status": "failure", //or "Project:failure" for project+component endpoint
"error": "Salesforce error message",
"projectId": "a0X...", //extra field, not present in stage 1/2 errors
"projectExternalId": "EXT-123", //extra field, not present in stage 1/2 errors
"objectList": [
{ "source": "Project Upsert", "sfId": "a0X...", "externalId": "EXT-123" }
]
}