# Start Import Job

To start importing a file into a storage, use the following request.


POST https://api.corporate-data-league.ch/data-exchange/rest/jobs/importjobs
  ?file=@{YOUR FILE}
  ?storageId={YOUR STORAGE ID}
  ?dataSource={YOUR DATASOURCE ID}


Fields (cells) in a file, that contain a special character (comma, semicolon, CR, LF, or double quote), must be "escaped" by enclosing them in double quotes. Header names can not contain any dot.

In order to successfully perform file upload use file upload for files up to 10MB or Upload via Upload Request approach for files larger than 10MB. file and url are not allowed to be present together.

Use one of the below instructions for your case:
1) File size  10MB : Request Upload

Including this sample CSV file in the default configuration.


Customer Number;City
123;St. Gallen


Supported columns (matched by ignoring letter case) with their mappings are the following:

| Column Name | Target Path in the latest Business Partner Model | Wiki Page of Attribute in CDQ Data Model |
| ------- | -------- | -------- |
| CUSTOMER NUMBER | $.externalId | Business Partner External ID |
| VENDOR NUMBER | $.externalId when CUSTOMER NUMBER is not available | Business Partner External ID |
| NAME | $.names\[0\].value, $.names\[0\].type.technicalKey = Business Partner External ID | Business Partner Name Value |
| TAX NUMBER 1 | $.identifiers\[identifierId\].value in identifierId of TAX NUMBER 1 TYPE if exists, otherwise, new identifier of STCD1 type mapping, applied for COUNTRY | Business Partner Identifier Value |
| TAX NUMBER 1 TYPE | $.identifiers\[identifierId\].type | Identifier type |
| TAX NUMBER 2 | $.identifiers\[identifierId\].value in identifierId of TAX NUMBER 2 TYPE if exists, otherwise, new identifier of STCD2 type mapping, applied for COUNTRY | Business Partner Identifier Value |
| TAX NUMBER 2 TYPE | $.identifiers\[identifierId\].type | Identifier type |
| TAX NUMBER 3 | $.identifiers\[identifierId\].value in identifierId of TAX NUMBER 3 TYPE if exists, otherwise, new identifier of STCD3 type mapping, applied for COUNTRY | Business Partner Identifier Value |
| TAX NUMBER 3 TYPE | $.identifiers\[identifierId\].type | Identifier type |
| TAX NUMBER 4 | $.identifiers\[identifierId\].value in identifierId of TAX NUMBER 4 TYPE if exists, otherwise, new identifier of STCD4 type mapping, applied for COUNTRY | Business Partner Identifier Value |
| TAX NUMBER 4 TYPE | $.identifiers\[identifierId\].type | Identifier type |
| TAX NUMBER 5 | $.identifiers\[identifierId\].value in identifierId of TAX NUMBER 5 TYPE if exists, otherwise, new identifier of STCD5 type mapping, applied for COUNTRY | Business Partner Identifier Value |
| TAX NUMBER 5 TYPE | $.identifiers\[identifierId\].type | Identifier type |
| VAT NUMBER | $.identifiers\[identifierId\].value in identifierId of VAT NUMBER TYPE if exists, otherwise, new identifier of STCEG type mapping, applied for COUNTRY | Business Partner Identifier Value |
| VAT NUMBER TYPE | $.identifiers\[identifierId\].type | Identifier type |
| COUNTRY | address.country.(value, shortName) in $.addresses\[0\] (+ in $.addresses\[1\] when PO BOX exists for non-France) | Country |
| REGION | address.administrativeAreas\[0\].value in $.addresses\[0\] (+ in $.addresses\[1\] when PO BOX exists for non-France) | Administrative Area Value|
| POSTAL CODE | address.postCodes\[0\].value in $.addresses\[0\] (+ in $.addresses\[1\] when PO BOX exists for non-France) | Business Partner Post Code Value |
| CITY | address.localities\[0\].value in $.addresses\[0\] (+ in $.addresses\[1\] when PO BOX exists for non-France) | Locality Value |
| STREET | address.thoroughfares\[0\].value | Thoroughfare Value |
| HOUSE NUMBER | address.thoroughfares\[0\].number | Thoroughfare Number |
| PO BOX | address.postalDeliveryPoints\[0\].value, address.postalDeliveryPoints\[0\].type.technicalKey = PO BOX in $.addresses\[0\] in France, in $.addresses\[1\] for non-France | Business Partner External ID |


Alternatively, CUSTOM_DATA_MAPPER feature can be used to enable record transformation based on the Data Mapper Definition
provided either via a dataMapperDefinitionId field or assigned to provided data source.

Input file could contain customized columns naming effectively mapped to the Business Partner model via data mapper, shown in this sample CSV.


MyId;Country;City;Name
123;CH;St. Gallen;
124;CH;;Quote "Example"
"125";"CH";"";"""Quote """"Example""""  """


Input file for CUSTOM_DATA_MAPPER feature can also contain only one Record column with a stringified JSON representation of a record.
Based on the Data Mapper Definition, data is transformed to the Business Partner model.
In case UPSERT_BY_EXTERNAL_ID feature is used, external ID value needs to be included:
* in a column which name is provided via a extenalIdColumn request property
* in the JSON representation in the attribute mapped to externalId via data mapper

Below is the sample CSV file for Record-based configuration containing external ID column named MyId.


MyId,Record
123,"{""MyId"": ""123"", ""Country"": ""CH"", ""City"": ""St. Gallen""}"
124,"{""MyId"": ""124"", ""Country"": ""CH"", ""Name"": ""Quote \""Example\""""}"
125,"{""MyId"": ""125"", ""Country"": ""CH"", ""Name"": ""\""Quote \""\""Example\""\""  \""""}"


The maximum number of columns is 512

The response is shown below. Use the returned id to poll the import job status.


{
    "id" : "{YOUR IMPORT JOB ID}"
    ...
}


These imports, in default import samples, lead to the following Business Partners in the storage. The imported rows are represented as stringifies JSONs.


{
   "id" : "{AUTO GENERATED}",
   "externalId" : "123",
   "dataSource": "{YOUR DATASOURCE ID}",
   "record" : "{ \"MyId\" : \"123\", \"Country\" : \"CH\", \"City\" : \"St. Gallen\" }",
   "addresses": [{
      "country": {
         "shortName": "CH"
      },
      "localities": [{
         "value": "St. Gallen"
      }]
   }],
   ...
},
{
   "id" : "{AUTO GENERATED}",
   "externalId" : "124",
   "dataSource": "{YOUR DATASOURCE ID}",
   "record" : "{ \"MyId\" : \"124\", \"Country\" : \"CH\", \"Name\" : \"Quote \\\"Example\\\"\" }",
   "names": [{
      "value": "Quote \"Example\""
      ...
   }],
   "addresses": [{
      "country": {
         "shortName": "CH"
      }
   }],
   ...
},
{
   "id" : "{AUTO GENERATED}",
   "externalId" : "125",
   "dataSource": "{YOUR DATASOURCE ID}",
   "record" : "{ \"MyId\" : \"125\", \"Country\" : \"CH\", \"Name\" : \"\\\"Quote \\\"\\\"Example\\\"\\\"  \\\"\" }",
   "names": [{
      "value": "\"Quote \"\"Example\"\"  \""
      ...
   }],
   "addresses": [{
      "country": {
         "shortName": "CH"
      }
   }],
   ...
}


Input file which first 100 data lines except header are corrupted is canceled without further processing.

Importing data to Data Mirror requires using "UPSERT_BY_EXTERNAL_ID" feature. Otherwise, Bad Request is reported.

Endpoint: POST /jobs/importjobs
Version: 5
Security: apiKey

## Request fields (multipart/form-data):

  - `file` (string)
    XLSX or CSV file to be uploaded (SOAP currently only supports CSV). Supports up to 10MB of file size. For the file size greater than 10MB use Upload via Upload Request approach.
    Example: "CH-import.csv"

  - `url` (string)
    Url to file which will be used to import data from. Recommended. The file can be uploaded via [File Upload](https://developer.cdq.com/documentation/instructions/uploading-cvs-xls-data) passing through url from the result object.
    Example: "customer-uploads/CH-import.csv"

  - `storageId` (string, required)
    Target storage ID for this import.
    Example: "72d6900fce6b326088f5d9d91049e3e6"

  - `dataSource` (string)
    Unique identifier for a Data Source of the Storage.
    Example: "648824a691d8d2503d65103e"

  - `externalIdColumn` (string)
    The name of the column which will be mapped to external ID. This is required if feature UPSERT_BY_EXTERNAL_ID is activated.
    Example: "BP_EXTERNAL_ID"

  - `dataMapperDefinitionId` (string)
    The ID of data mapper to be used to transform the data before importing it. This or a data source is required if feature CUSTOM_DATA_MAPPER is activated. Disabled when CUSTOM_DATA_MAPPER feature is not provided in a request.
    Example: "6400955811c68a034bcef311"

  - `dataTransformationDefinitionId` (string)
    [Private Content](# "cdq-badge private-content") The ID of data transformation definition to be used to transform the data before importing it. This or a data source is required if feature CUSTOM_DATA_MAPPER is activated. Disabled when CUSTOM_DATA_MAPPER feature is not provided in a request. Takes priority over dataMapperDefinitionId when both are provided.
    Example: "6400955811c68a034bcef311"

  - `featuresOn` (array)
    List of features to be activated.
    Enum: "ACCEPT_EMPTY_VALUES", "UPSERT_BY_EXTERNAL_ID", "CUSTOM_DATA_MAPPER", "FULL_UPDATE", "LAB_USE_QUEUES", "LAB_USE_BACKPRESSURE"

  - `batchSize` (integer)
    [Private Content](# "cdq-badge private-content") Defines the number of records that are processed at once.
    Example: "500"

  - `tags` (array)
    [Private Content](# "cdq-badge private-content") List of tags.
    Example: ["tag1"]

## Response 200 fields (application/json):

  - `id` (string)
    Unique identifier of a job.
    Example: "35f23c03-1c22-45fe-9484-3ffe769325de"

  - `name` (string)
    Name of a Job.
    Example: "Process vendor data."

  - `description` (string)
    Detailed description of a Job.
    Example: "I started this job to improve quality of our data."

  - `createdBy` (string)
    Creator of a resource.
    Example: "76248934691294444"

  - `createdAt` (string)
    Date of creation (ISO 8601-compliant).
    Example: "2026-06-03T12:58:32Z"

  - `modifiedAt` (string)
    Date of modification (ISO 8601-compliant).
    Example: "2026-06-03T12:58:32Z"

  - `progress` (integer)
    Progress (%) of the job.
    Example: "77"

  - `status` (string)
    Job execution status.
    Enum: "ARCHIVED", "UNKNOWN", "CREATED", "PERSISTED", "SCHEDULED", "WAITING", "COULDNT_START", "RUNNING", "FINISHED", "DIED", "CANCELED", "FAILED"

  - `statusMessage` (string)
    Additional information to explain the status.
    Example: "The job failed because storage is empty."

  - `storageId` (string)
    Unique identifier of the Storage.
    Example: "72d6900fce6b326088f5d9d91049e3e6"

  - `dataSource` (string)
    Unique identifier for a Data Source of the Storage.
    Example: "648824a691d8d2503d65103e"

  - `dataMapperDefinitionId` (string)
    ID of related Data Mapper Definition that is used for mapping data of this Business Partner Storage.
    Example: "6440dba32b30176c5917b1b7"

  - `dataTransformationDefinitionId` (string)
    Unique identifier for a data transformation definition.
    Example: "SAP.ODM"

  - `externalIdColumn` (string)
    The name of the column which will be mapped to external ID. This is required if feature UPSERT_BY_EXTERNAL_ID is activated.
    Example: "BP_EXTERNAL_ID"

  - `featureOn` (array)
    List of features which are activated for the Import Job.
    Example: ["UPSERT_BY_EXTERNAL_ID"]

  - `result` (object)
    The result of the Import Job.

  - `result.statistics` (object)
    The statistics of the Import Job.

  - `result.statistics.numberOfInserts` (integer)
    Number of inserted Business Partners.
    Example: "10"

  - `result.statistics.numberOfUpdates` (integer)
    Number of updated Business Partners.
    Example: "10"

  - `result.statistics.numberOfFailed` (integer)
    Number of failed Business Partners.
    Example: "10"

  - `result.statistics.skipped` (array)
    List of skipped lines.

  - `result.statistics.skipped.line` (integer)
    The line number of the corrupted line.
    Example: "10"

  - `result.statistics.skipped.column` (integer)
    The column number of the corrupted line.
    Example: "10"

  - `result.statistics.skippedStartAfter` (string)
    The line number of the first skipped line.
    Example: "10"

  - `result.statistics.skippedNextStartAfter` (string)
    The line number of the next skipped line.
    Example: "20"

  - `domain` (string)
    Domain of a Business Partner Storage.
    Example: "BusinessPartner"

## Response 400 fields (application/json):

  - `status` (object)
    Details about status or error of a service

  - `status.code` (integer)
    RFC 7231 status code for this error.
    Example: "200"

  - `status.technicalKey` (string)
    Technical key describing the status or error
    Example: "OK"

  - `status.details` (array)

  - `status.details.id` (integer, required)
    9-digit code which is uniquely identifying a message
    Example: 200000004

  - `status.details.message` (string, required)
    Human-readable message which may also be presented in user interface.
    Example: "The job came to an end and finished successfully."

  - `status.details.technicalKey` (string)
    Technical key to uniquely identify a message.
    Example: "JOB_FINISHED"

  - `status.details.jsonPath` (string)
    JSONPath as specified by the IETF standard
    Example: "$.businessPartner.names[0].value"

  - `status.details.jsonRecord` (string)
    Object provided in plain JSON format.
    Example: "{ \"key\" : \"value\"}"

  - `status.path` (string)
    Requested path which caused this error.
    Example: "/v2/businesspartners/lookup"

  - `status.timestamp` (string)
    ISO 8601 representation of the timestamp.
    Example: "2026-06-03T12:58:32Z"


