# Общий принцип экспортов

## Общий контракт постановки задачи экспорта

Получить неизменяемые данные можно через постановку задач экспорта.\
Поставить задачу можно:

1. С помощью программного запроса в операцию, которую необходимо добавить в интерфейсе
2. С помощью задачи периодического экспорта на FTP/SFTP. Подробней можно прочитать [здесь](https://developers.mindbox.ru/docs/%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82-%D0%BD%D0%B0-ftpsftp).

Общая схема запросов для постановки задачи экспорта:

1. Запрос экспорта с передачей условий выборки экспорта и получение ID задачи экспорта.
2. Запрос статуса поставленной задачи экспорта. Получение статуса или ссылки на результат, в случае готовности.
3. Скачивание файлов с результатами экспорта. Обработка данных

## Первый запрос на поставку задачи экспорта

Во входных условиях может быть:

* Id сегмента
* временной период, за который необходимо выгрузить данные
* данные подключения к внешнему хранилищу, для выгрузки результатов
* либо может быть пустое тело запроса

Описание всех входных параметров операции смотрите в описании конкретной операции.

```xml title="Text"
POST https://api.mindbox.ru/v3/operations/sync?endpointId={endpointId}&operation={operation}
Accept: application/json
Content-Type: application/json
Authorization: SecretKey {Секретный ключ}

{
    <Тело запроса описано в описании конкретной операции экспорта>
}
```

### Ответ об успешной постановке задачи экспорта

```json
Content-Type: application/json

{
  "status": "Success",
  "exportId": "<ID экспорта, который нужно передать в следующем запросе>"
}
```

На данном этапе может быть возвращена ошибка валидации, если были переданны некорректные условия для постановки задачи экспорта.

### Ответ при повторном запросе

Параметр `isDuplicate` в ответе указывает, что аналогичный экспорт уже выполняется. Воспользуйтесь [запросом для проверки статуса](https://developers.mindbox.ru/docs/exports-overview#%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81-%D0%BE-%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D0%B5-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8-%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B0).

```json
Content-Type: application/json

{
  "status": "Success",
  "exportId": "<ID экспорта, который нужно передать в следующем запросе>",
  "isDuplicate": "<Вызван повторный запрос экспорта. Экспорт с аналогичными настройками уже формируется>",
}
```

## Запрос о статусе задачи экспорта

```xml title="Text"
POST https://api.mindbox.ru/v3/operations/sync?endpointId={endpointId}&operation={operation}
Accept: application/json
Content-Type: application/json
Authorization: SecretKey {Секретный ключ}

{  
    "exportId": "<ID экспорта>"
}
```

### Ответ о статусе готовности файла (в случае неготовности)

```xml title="Text"
Content-Type: application/json; charset=utf-8

{
    "status": "Success",
    "exportResult": {
        "processingStatus": "NotReady"
    }
}
```

Одновременно может работать не больше двух задач экспорта.

### Ответ о статусе готовности файла (в случае готовности)

```xml title="Text"
Content-Type: application/json; charset=utf-8

{
    "status": "Success",
    "exportResult": {
        "processingStatus": "Ready",
        "urls": [
        	"<Ссылка на файл с результатом>",
        	"<Ссылка на файл с результатом>",
        	....
        ]
    }
}
```

* файлы с результатами экспорта хранятся 180 дней
* нет ограничений на объем запрашиваемой информации
* файлы разбиваются по количеству строк, которое стремится к 1 млн., но возможны файлы как большего, так и меньшего объема
* нет пагинации, все данные выгружаются в набор файлов
* данные по ссылкам передаются gzip методом 
* формат файла выбирается в настройках шага экспорта и может быть xml/json/csv
* кодировка файлов UTF-8

### Ответ о статусе готовности файла (в случае отмены)

Возможны ситуации, когда экспорт был отменен по какой либо причине, в таком случае будет возвращен соответствующий статус, а задача остановлена.

```xml title="Text"
Content-Type: application/json; charset=utf-8

{
    "status": "Success",
    "exportResult": {
        "processingStatus": "Cancelled",
        "cancellationReason": “<причина отмены>”
    }
}
```

Задача может быть отменена:

* из интерфейса административной панели
* из за внутренней ошибки
* из за превышения внутренних лимитов потребления ресурсов. В таком случае следует упростить фильтр сегмента, который используется для экспорта или поставить задачу с меньшим запрашиваемым периодом
