# Data Format for Custom Data Feed

## Overview

The following section details the standard data input format that is expected by the Upload service. It also explains how these files should be transmitted to Fredhopper's Managed Services environment and for the data to be triggered on the instance. Once the additional data has been successfully uploaded and processed, it will be integrated with the next product feed update (full or incremental). The same custom data will be maintained for all subsequent load-data triggers until a new version of the custom data is uploaded using this process.

## Uploading and Triggering the processing of data using Upload <a href="#datauploadprocess-uploadingandtriggeringtheprocessingofdatausingupload" id="datauploadprocess-uploadingandtriggeringtheprocessingofdatausingupload"></a>

Once the custom file(s) is ready in the predefined format, it then needs to be compressed using the zip archive specification (application/zip) before it can be uploaded. An MD5 checksum of the newly created ZIP file also needs to be generated to verify the file.

Fredhopper offers a REST and File (FTP) API. The File (FTP) API is suitable for development purposes, while for production use we strongly recommend the use of the REST API.

<table><thead><tr><th width="155">Region</th><th width="146">Countries</th><th>Data Endpoint</th></tr></thead><tbody><tr><td>EU</td><td>All</td><td><a href="https://my.eu1.fredhopperservices.com/upload">https://my.eu1.fredhopperservices.com/upload</a>:<strong>[service_instance]</strong>/data/input/</td></tr></tbody></table>

The **service\_instance** is either **live1**, test1, test2 or test3, depending on the environments that are available for you.

### **Steps**

1. Compress the data file(s) into one *data.zip* file
2. Create MD5 checksum of *data.zip* file to validate that upload file is not corrupt, e.g.:

{% code overflow="wrap" %}

```
DB211B14E25CFB18792C3B3697CD0394 data.zip
```

{% endcode %}

3. Upload the *data.zip* file and the MD5 checksum to environment

REST URL via HTTP-PUT:

{% code overflow="wrap" %}

```
https://my.eu1.fredhopperservices.com/upload:[service_instance]/data/input/data.zip?checksum=[checksum]
```

{% endcode %}

cURL example:

{% code overflow="wrap" %}

```
curl -D - -u "[cloud_username]":"[cloud_password]" -X PUT -H "Content-Type: application/zip" --data-binary @data.zip https://my.eu1.fredhopperservices.com/upload:live1/data/input/data.zip\?checksum=19afc8c99ec7ea27f0dba8e1c4fcff1f
```

{% endcode %}

4. Save the data-id value from the response body for tracking purposes

{% code overflow="wrap" %}

```
HTTP/1.1 100 Continue
 
HTTP/1.1 201 Created
Date: Fri, 21 Feb 2020 15:31:55 GMT
Server: Jetty(9.4.22.v20191022)
Location: https://my.eu1.fredhopperservices.com/upload:live1/data/input/2020-02-21_15-31-55
Content-Type: text/plain
Content-Length: 28
Connection: close
 
data-id=2020-02-21_15-31-55
```

{% endcode %}

5. Trigger the processing of the newly uploaded data by creating a trigger that included the data-id value that was captured in step 4

REST URL:

{% code overflow="wrap" %}

```
https://my.eu1.fredhopperservices.com/upload:[service_instance]/trigger/finalize
```

{% endcode %}

cURL examples:

{% code overflow="wrap" %}

```
curl -D - -u "[cloud_username]":"[cloud_password]" -X PUT -H "Content-Type: text/plain" --data-binary "data-id=[data-id]" https://my.eu1.fredhopperservices.com/upload:[service_instance]/trigger/finalize

curl -D - -u "[cloud_username]":"[cloud_password]" -X PUT -H "Content-Type: text/plain" --data-binary "data-id=2020-02-21_15-31-55" https://my.eu1.fredhopperservices.com/upload:live1/trigger/finalize
```

{% endcode %}

Example response (note the Location value in the header):

{% code overflow="wrap" %}

```
HTTP/1.1 201 Created
Date: Fri, 21 Feb 2020 15:47:17 GMT
Server: Jetty(9.4.22.v20191022)
Location: https://my.eu1.fredhopperservices.com/upload:live1/trigger/finalize/2020-02-21_15-47-17
Content-Length: 0
Connection: close
```

{% endcode %}

6. Monitor the process by using the value of the 'Location' in the previous step and viewing the newly-created status file until the content is either SUCCESS or FAILURE.

REST URL:

{% code overflow="wrap" %}

```
https://my.eu1.fredhopperservices.com/upload:[service_instance]/trigger/finalize/[trigger-id]/status
```

{% endcode %}

cURL example:

{% code overflow="wrap" %}

```
curl -s -D - -u "[cloud_username]":"[cloud_password]" https://my.eu1.fredhopperservices.com/upload:[service_instance]/trigger/finalize/[trigger-id]/status

curl -s -D - -u "[cloud_username]":"[cloud_password]" https://my.eu1.fredhopperservices.com/upload:live1/trigger/finalize/2020-02-21_15-47-17/status
```

{% endcode %}

Example response:

{% code overflow="wrap" %}

```
HTTP/1.1 200 OK
Date: Fri, 21 Feb 2020 15:49:09 GMT
Server: Jetty(9.4.22.v20191022)
Content-Type: text/plain
Content-Length: 57
Connection: close
 
RUNNING
Started execution at Fri Feb 21 15:47:17 UTC 2020
```

{% endcode %}

When successfully completed, the response should appear as follows:

{% code overflow="wrap" %}

```
HTTP/1.1 200 OK
Date: Fri, 21 Feb 2020 15:51:15 GMT
Server: Jetty(9.4.22.v20191022)
Content-Type: text/plain
Content-Length: 8
Connection: close
 
SUCCESS
```

{% endcode %}

### **Process diagram**

<figure><img src="/files/weqniGiTtOKdYCQaNoM8" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://crownpeak.gitbook.io/product-discovery/sending-and-managing-product-data/flatfiles/custom-datafeed/custom-data-format.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
