This guide walks through the complete process of creating a job in the Supplier Data Manager (SDM) REST API: uploading a product data file, creating the job, and optionally attaching media files. Use this workflow to automate how product data is imported and processed in SDM.
The SDM REST API is available exclusively to Supplier Data Manager customers. Contact your Customer Success Manager (CSM) if you need access. For the full API reference, see the SDM API documentation.
Before you start
To create a job via the SDM REST API, you need:
- An active user account on the Supplier Data Manager platform
- A valid API token (obtained via the authentication endpoint — see Getting started with the API)
- The ID of the project you want to process data for
- At least one output format defined for that project
All requests must include the following header:
Authorization: Token <YOUR_TOKEN>
Step 1: Upload your product data file
SDM jobs require a source file containing product data. You can provide this file in two ways: as a flat file upload (CSV, Excel, or XML) or as a JSON payload.
Option A: Upload a flat file (CSV, Excel, or XML)
Send a multipart/form-data request to upload a CSV, Excel (.xlsx), or XML file.
Supported formats:
-
Excel (
.xlsx): Data must be in the first tab, encoded in UTF-8 -
CSV: Accepts
,,;, or|as separators; encoding must be UTF-8 or ISO 8859-1 / Latin-1 - XML: Requires an XML input format to be configured for your project in SDM
The file must have a header row as its first line and include all columns defined in the project template.
Request: To upload the file, you need to make the following request in multipart/form-data format:
POST https://sdm.akeneo.cloud/api/v1/files/
Headers:
Authorization: Token <YOUR_TOKEN>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Body:
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="products.csv"
Content-Type: text/csv
[INSERT_BINARY_FILE_CONTENT_HERE]
----WebKitFormBoundary7MA4YWxkTrZu0gW--
Optional body parameters:
| Parameter | Type | Description |
|---|---|---|
skiprows |
integer | Number of rows to skip at the start of the file (before the header). Minimum value: 0. |
encoding |
string | Force a specific encoding, e.g., "utf-8" or "iso-8859-1". Auto-detected if omitted. |
separator |
string | Force a specific column separator for CSV files (single character). Auto-detected if omitted. |
input_format |
integer | Force a specific input format ID (required for XML files; optional for CSV and Excel). |
read_rich_text_formatting |
boolean | For Excel files: convert bold and italic text in cells to HTML. |
root_paths |
array | For XML files: list of tag paths to locate product listings in the document. |
Response:
File parsing is asynchronous. The response contains the file's id, which you use in the next step, along with the current parsing status (parsing, ready, or error).
{
"id": 17,
"status": "parsing",
...
}
Do not create a job until the file status is ready. If the status is error, check the parsing_error field in the response and correct the file before retrying. You can poll GET https://sdm.akeneo.cloud/api/v1/files/{id}/ to check the current status.
For full file endpoint details, see the API reference.
Option B: Send a JSON payload
Use Content-Type: application/json to send product data directly as a list of objects. Each object represents one product row.
Request:
POST https://sdm.akeneo.cloud/api/v1/files/
Headers:
Authorization: Token <YOUR_TOKEN>
Content-Type: application/json
Body:
{
"data": [
{"col1": "val1_1", "col2": "val1_2"},
{"col1": "val2_1", "col2": "val2_2"}
]
}
Each object in data must use column names as keys and column values as values. All columns defined in the project template must be present. Empty values can be omitted or set to null.
You must provide either file (for multipart upload) or data (for JSON upload) — not both.
Response:
{
"id": 17,
"status": "ready",
...
}
The response id is the file ID to use when creating the job.
Step 2: Create a job
Once your file is uploaded and its status is ready, create a job to start processing. The job links your uploaded file to a project in SDM and begins the processing pipeline.
You need the following before calling this endpoint:
-
file_id: Theidreturned from Step 1 -
project: The integer ID of the SDM project (retrieve project IDs fromGET https://sdm.akeneo.cloud/api/v1/projects/— see the API reference) -
model_version: The version of the project configuration to use. Use0to target the initial configuration. This value must not exceed the project's currentmodel_version.
Request:
POST https://sdm.akeneo.cloud/api/v1/jobs/
Headers:
Authorization: Token <YOUR_TOKEN>
Content-Type: application/json
Body:
{
"file_id": 17,
"name": "Spring 2025 catalog import",
"project": 42,
"model_version": 0
}
Request body fields:
| Field | Type | Required | Description |
|---|---|---|---|
file_id |
integer | Yes | The id of the file uploaded in Step 1. The file must belong to your organization and have status: ready. |
name |
string | Yes | A human-readable label for this job. |
project |
integer | Yes | The ID of the SDM project to run this job against. |
model_version |
integer | Yes | The project model version to use. Must not exceed the project's current model_version. Use 0 for the initial version. |
additional_info |
object | No | Optional key-value metadata, e.g., {"external_id": "5"}. Values must be strings with a maximum length of 256 characters. |
Response:
{
"id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"status": "running",
...
}
The id in the response is the job's UUID. Save it — you will need it to monitor progress and optionally attach media files.
SDM begins processing your data immediately after the job is created. To monitor job progress, see Monitoring SDM jobs.
Step 3: Attach media files (optional)
You can attach media files to a job at any time during processing. SDM automatically links each media file to the matching product using the filename: if a product row contains a field value (for example, "main_image": "image_show_1.png") and a media file with that exact name is attached to the job, the link is established automatically.
Each media filename must be unique within a given job.
Request:
POST https://sdm.akeneo.cloud/api/v1/media/
Headers:
Authorization: Token <YOUR_TOKEN>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Body:
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="media_file"; filename="image_show_1.png"
Content-Type: image/png
[INSERT_BINARY_FILE_CONTENT_HERE]
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="uploaded_for_job"
Content-Type: text/plain
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
----WebKitFormBoundary7MA4YWxkTrZu0gW--
Required body fields:
| Field | Description |
|---|---|
media_file |
The binary content of the media file. |
uploaded_for_job |
The UUID of the job to attach this file to (the id returned in Step 2). |
The MIME type declared in the Content-Type header of the media file part must match the file's actual format. Mismatches are rejected with a validation error. If a media field is configured in your project and the filename matches a value in your product data, the link is established automatically. If no match is found, a user must manually link the file during job execution in the SDM interface.
Summary
The full job creation flow in the SDM REST API is:
-
Upload product data —
POST /api/v1/files/with a flat file or JSON payload. Capture the returnedid. -
Wait for parsing — Poll
GET /api/v1/files/{id}/untilstatusisready. -
Create the job —
POST /api/v1/jobs/with thefile_id,project,name, andmodel_version. Capture the returned jobid. -
Attach media (optional) —
POST /api/v1/media/withmedia_fileanduploaded_for_jobfor each media file. -
Monitor the job — Use
GET /api/v1/jobs/{id}/to track job progress. See Monitoring SDM jobs.
Related articles
- Getting started with the API — Authentication and prerequisites
- Monitoring SDM jobs — Track job status and retrieve output data
- Managing option collections — Manage select field options via the API
- SDM API reference — Full endpoint documentation