> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Получение результата

> Получение прогресса и результата сгенерированного отчета

## Заголовки запроса

<ParamField header="Authorization" type="string" required>
  API токен сервисного пользователя в формате Bearer. Получите токен в панели администратора школы. Формат: `Bearer YOUR_TOKEN`.
</ParamField>

<ParamField header="Seller-Id" type="string" required>
  Уникальный идентификатор продавца в системе. Используется для разграничения доступа между разными продавцами.
</ParamField>

<ParamField header="School-Id" type="string" required>
  Уникальный идентификатор школы в системе. Определяет контекст выполнения операции.
</ParamField>

## Получение результата отчета

```
GET /saas/v2/workflow-execution/:executionUuid/result
```

Используйте `uuid`, полученный при [создании задачи на генерацию](/ru/exode-api/school/query-export/generate). Отправляйте запрос периодически (polling), пока `status` не станет `Completed`.

### Параметры пути

<ParamField path="executionUuid" type="string" required>
  UUID задачи генерации, полученный из ответа `POST /generate`.
</ParamField>

### Поля ответа

<ResponseField name="success" type="boolean">
  Результат выполнения запроса.
</ResponseField>

<ResponseField name="code" type="number">
  HTTP-код ответа (например, `200`).
</ResponseField>

<ResponseField name="payload" type="object">
  Данные о прогрессе и результате генерации.

  <Expandable title="Свойства payload">
    <ResponseField name="total" type="number">
      Общий прогресс (всегда `100` — режим процентов).
    </ResponseField>

    <ResponseField name="completed" type="number">
      Текущий прогресс от `0` до `100`.
    </ResponseField>

    <ResponseField name="status" type="string">
      Статус выполнения:

      * `Processing` — отчет генерируется
      * `Completed` — отчет готов, поле `result` содержит ссылку на файл
      * `Failed` — ошибка при генерации
      * `Canceled` — задача отменена
    </ResponseField>

    <ResponseField name="result" type="object | null">
      Результат генерации (доступен только при `status: Completed`). `null` во время обработки.

      <Expandable title="Свойства result">
        <ResponseField name="fileUrl" type="string">
          URL для скачивания сгенерированного файла.
        </ResponseField>

        <ResponseField name="fileName" type="string">
          Имя файла (например, `79d46a97-a149-432b-bac7-45f6732b9115.xlsx`).
        </ResponseField>

        <ResponseField name="fileSize" type="number">
          Размер файла в байтах.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<Warning>
  Результат хранится в кеше **24 часа** после генерации. После этого файл и данные о прогрессе становятся недоступны.
</Warning>

<RequestExample>
  ```bash cURL theme={null}
  curl --location 'https://api.exode.biz/saas/v2/workflow-execution/550e8400-e29b-41d4-a716-446655440000/result' \
    --header 'Seller-Id: {{ sellerId }}' \
    --header 'School-Id: {{ schoolId }}' \
    --header 'Authorization: Bearer YOUR_TOKEN'
  ```

  ```javascript Node.js theme={null}
  const axios = require('axios');

  const pollResult = async (executionUuid) => {
    const url = `https://api.exode.biz/saas/v2/workflow-execution/${executionUuid}/result`;

    const headers = {
      'Seller-Id': '{{ sellerId }}',
      'School-Id': '{{ schoolId }}',
      'Authorization': 'Bearer YOUR_TOKEN'
    };

    while (true) {
      const { data } = await axios.get(url, { headers });
      const { payload } = data;

      console.log(`Progress: ${payload.completed}/${payload.total} — ${payload.status}`);

      if (payload.status === 'Completed') {
        console.log('File URL:', payload.result.fileUrl);
        return payload.result;
      }

      if (payload.status === 'Failed' || payload.status === 'Canceled') {
        throw new Error(`Export ${payload.status}`);
      }

      await new Promise((r) => setTimeout(r, 2000));
    }
  };

  pollResult('550e8400-e29b-41d4-a716-446655440000');
  ```

  ```php PHP theme={null}
  <?php

  $executionUuid = '550e8400-e29b-41d4-a716-446655440000';
  $url = "https://api.exode.biz/saas/v2/workflow-execution/$executionUuid/result";

  $headers = [
    'Seller-Id: {{ sellerId }}',
    'School-Id: {{ schoolId }}',
    'Authorization: Bearer YOUR_TOKEN'
  ];

  while (true) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    $payload = $data['payload'];
    echo "Progress: {$payload['completed']}/{$payload['total']} — {$payload['status']}\n";

    if ($payload['status'] === 'Completed') {
      echo "File URL: " . $payload['result']['fileUrl'] . "\n";
      break;
    }

    if (in_array($payload['status'], ['Failed', 'Canceled'])) {
      echo "Error: Export {$payload['status']}\n";
      break;
    }

    sleep(2);
  }
  ?>
  ```

  ```python Python theme={null}
  import requests
  import time

  execution_uuid = '550e8400-e29b-41d4-a716-446655440000'
  url = f'https://api.exode.biz/saas/v2/workflow-execution/{execution_uuid}/result'

  headers = {
    'Seller-Id': '{{ sellerId }}',
    'School-Id': '{{ schoolId }}',
    'Authorization': 'Bearer YOUR_TOKEN'
  }

  while True:
    response = requests.get(url, headers=headers)
    data = response.json()
    payload = data['payload']

    print(f"Progress: {payload['completed']}/{payload['total']} — {payload['status']}")

    if payload['status'] == 'Completed':
      print(f"File URL: {payload['result']['fileUrl']}")
      break

    if payload['status'] in ('Failed', 'Canceled'):
      print(f"Error: Export {payload['status']}")
      break

    time.sleep(2)
  ```

  ```bsl 1С theme={null}
  Соединение = Новый HTTPСоединение("api.exode.biz", 443, , , , 30, Новый OpenSSLSecureConnection);

  Запрос = Новый HTTPЗапрос("/saas/v2/workflow-execution/550e8400-e29b-41d4-a716-446655440000/result");
  Запрос.Заголовки.Вставить("Seller-Id", "{{ sellerId }}");
  Запрос.Заголовки.Вставить("School-Id", "{{ schoolId }}");
  Запрос.Заголовки.Вставить("Authorization", "Bearer YOUR_TOKEN");

  Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);

  Если Ответ.КодСостояния = 200 Тогда
      ЧтениеJSON = Новый ЧтениеJSON;
      ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
      Результат = ПрочитатьJSON(ЧтениеJSON);
      Сообщить("Результат получен");
  Иначе
      Сообщить("Ошибка: HTTP " + Ответ.КодСостояния);
      Сообщить(Ответ.ПолучитьТелоКакСтроку());
  КонецЕсли;
  ```
</RequestExample>

<ResponseExample>
  ```json Processing theme={null}
  {
    "success": true,
    "code": 200,
    "payload": {
      "total": 100,
      "completed": 45,
      "status": "Processing",
      "result": null
    }
  }
  ```

  ```json Completed theme={null}
  {
    "success": true,
    "code": 200,
    "payload": {
      "total": 100,
      "completed": 100,
      "status": "Completed",
      "result": {
        "fileUrl": "https://static.exode.biz/generated/reports/79d46a97-a149-432b-bac7-45f6732b9115.xlsx",
        "fileName": "79d46a97-a149-432b-bac7-45f6732b9115.xlsx",
        "fileSize": 6748
      }
    }
  }
  ```

  ```json Failed theme={null}
  {
    "success": true,
    "code": 200,
    "payload": {
      "total": 100,
      "completed": 30,
      "status": "Failed",
      "result": null
    }
  }
  ```
</ResponseExample>
