> For the complete documentation index, see [llms.txt](https://docs.iexexchanger.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.iexexchanger.com/razrabotchikam/razrabotka-modulei/parser-kursov.md).

# Парсер курсов

Плагин курсов — это внешний модуль iEXExchanger, который добавляет в систему новый источник курсов.

После установки через раздел «Установка плагинов» такой модуль может создать группу в системе «Курсы из источников», загрузить валютные пары и использоваться в направлениях обмена как обычный источник курса.

Этот документ предназначен для разработчиков и описывает создание плагина курсов: структуру файлов, файл `iex-plugin.json`, PHP-класс парсера, настройки, секреты, пары, health-check, миграции и сборку ZIP-архива.

## Общий принцип работы

Плагин не изменяет ядро iEXExchanger и не устанавливается в папку `packages`.

Он поставляется как отдельный ZIP-архив, проходит проверку через админку и сохраняется в системе внешних плагинов.

Общая схема работы:

1. Разработчик создаёт папку плагина.
2. Внутри добавляет файл `iex-plugin.json`.
3. Создаёт PHP-класс парсера.
4. PHP-класс получает курсы из API, файла или другого источника.
5. Плагин упаковывается в ZIP.
6. Администратор загружает ZIP через «Утилиты» — «Установка плагинов».
7. Система проверяет пакет.
8. После установки создаётся источник курсов.
9. Пары курсов импортируются в раздел источников.
10. Оператор включает нужные пары и использует их в направлениях обмена.

## Основной стандарт плагина

Для плагинов курсов используется тип:

```
parser-rate
```

Основная возможность плагина:

```
rates.source
```

Стандарт совместимости:

```
iex.parser-rate.v1
```

Рекомендуемый runtime:

```
php
```

Runtime `js` сохранён только для совместимости со старыми parser-rate модулями. Для новых плагинов рекомендуется использовать PHP.

***

## Быстрый старт

Для создания шаблона плагина используйте команду:

```bash
php artisan iex:plugin-make test-rates --type=parser-rate --runtime=php --title="Test Rates"
```

После выполнения будет создана папка:

```
storage/app/iex-plugin-templates/test-rates/
```

Структура шаблона:

```
test-rates/
├── iex-plugin.json
├── README.md
└── src/
    └── Parser.php
```

Чтобы сразу собрать ZIP-архив, используйте:

```bash
php artisan iex:plugin-make test-rates --type=parser-rate --runtime=php --title="Test Rates" --zip --force
```

Если нужно, чтобы плагин при установке попробовал получить пары из источника:

```bash
php artisan iex:plugin-make test-rates --type=parser-rate --runtime=php --title="Test Rates" --discover-on-install --zip --force
```

***

## Структура плагина

Минимальная структура PHP-плагина курсов:

```
test-rates/
├── iex-plugin.json
└── src/
    └── Parser.php
```

Расширенная структура:

```
test-rates/
├── iex-plugin.json
├── icon.png
├── README.md
└── src/
    └── Parser.php
```

### Иконка плагина

Иконку можно добавить в корень плагина.

Поддерживаемые имена:

```
icon.svg
icon.png
icon.webp
icon.jpg
icon.jpeg
```

Для SVG система выполняет дополнительную проверку безопасности. Нельзя использовать скрипты, активные события и внешние ссылки внутри SVG.

### Примеры

{% file src="/files/ONnVNHUSJuFxhFn5Snxx" %}

{% file src="/files/BfDmYXeKPNVHX1FuKPTk" %}

***

## Файл iex-plugin.json

`iex-plugin.json` — главный файл описания плагина.

Через него система понимает:

* какой это тип плагина;
* как он называется;
* какая у него версия;
* какой runtime используется;
* с какими версиями iEXExchanger он совместим;
* какие настройки нужно показать в админке;
* какие секреты нужно запросить;
* какие пары курсов можно создать;
* какой PHP-класс нужно запустить.

## Полный пример iex-plugin.json

```json
{
  "type": "parser-rate",
  "runtime": "php",
  "standard": "iex.parser-rate.v1",
  "name": "example-rates",
  "title": "Example Rates",
  "description": "Источник курсов Example API.",
  "version": "1.0.0",
  "activeByDefault": false,
  "compatibility": {
    "core_min": "11.1.8",
    "core_max": null,
    "php": "^8.2|^8.3|^8.4",
    "extensions": ["json", "curl"]
  },
  "modules": [
    {
      "capability": "rates.source",
      "type": "parser-rate",
      "title": "Example Rates",
      "description": "Источник курсов Example API.",
      "standard": "iex.parser-rate.v1",
      "settings": [
        {
          "key": "api_key",
          "label": "API key",
          "type": "secret",
          "required": true
        }
      ],
      "config_schema": [
        {
          "key": "base_url",
          "label": "Base URL",
          "type": "url",
          "required": true,
          "default": "https://api.example.com"
        },
        {
          "key": "timeout",
          "label": "Timeout",
          "type": "integer",
          "required": false,
          "default": 10
        }
      ],
      "migrations": [],
      "health": {}
    }
  ],
  "rateParser": {
    "discoverOnInstall": true,
    "pairs": [
      {
        "from": "USD",
        "to": "RUB",
        "amount": "91.25",
        "number_format": 10,
        "status": false
      }
    ]
  }
}
```

***

## Основные поля iex-plugin.json

{% stepper %}
{% step %}

### type

Тип плагина.

Для парсера курсов всегда используется:

```json
"type": "parser-rate"
```

{% endstep %}

{% step %}

### runtime

Среда выполнения плагина.

Для новых плагинов рекомендуется:

```json
"runtime": "php"
```

{% endstep %}

{% step %}

### standard

Стандарт совместимости.

Для парсера курсов:

```json
"standard": "iex.parser-rate.v1"
```

{% endstep %}

{% step %}

### name

Системное имя плагина.

```json
"name": "example-rates"
```

Требования:

* только латиница;
* можно использовать цифры;
* можно использовать `-` и `_`;
* нельзя использовать пробелы;
* нельзя использовать кириллицу;
* нельзя использовать `/`, `\`, `..`.

`name` используется как системный slug плагина и alias источника курсов.
{% endstep %}

{% step %}

### title

Название плагина в админке.

```json
"title": "Example Rates"
```

{% endstep %}

{% step %}

### description

Краткое описание плагина.

```json
"description": "Источник курсов Example API."
```

{% endstep %}

{% step %}

### version

Версия плагина.

```json
"version": "1.0.0"
```

{% endstep %}

{% step %}

### activeByDefault

Определяет, будет ли плагин активен сразу после установки.

```json
"activeByDefault": false
```

Рекомендуется оставлять `false`, чтобы администратор сначала проверил настройки и health-check.
{% endstep %}
{% endstepper %}

***

## Совместимость

Блок `compatibility` помогает системе заранее понять, подходит ли плагин для текущей версии продукта.

```json
"compatibility": {
  "core_min": "11.1.8",
  "core_max": null,
  "php": "^8.2|^8.3|^8.4",
  "extensions": ["json", "curl"]
}
```

<table><thead><tr><th width="227.7109375">Поле</th><th>Назначение</th></tr></thead><tbody><tr><td><code>core_min</code></td><td>Минимальная версия iEXExchanger</td></tr><tr><td><code>core_max</code></td><td>Максимальная версия iEXExchanger</td></tr><tr><td><code>php</code></td><td>Поддерживаемые версии PHP</td></tr><tr><td><code>extensions</code></td><td>Обязательные PHP-расширения</td></tr></tbody></table>

Если верхнее ограничение по версии продукта не требуется, используйте:

```json
"core_max": null
```

## entry и class

`entry` и `class` можно не указывать, если используется стандартная структура.

Для PHP-плагина курсов система по умолчанию ожидает файл:

```
src/Parser.php
```

И класс:

```
iEXPlugins\ExampleRates\Parser
```

Например, если указано:

```json
"name": "example-rates"
```

ожидаемый PHP-класс:

```php
namespace iEXPlugins\ExampleRates;

final class Parser
```

### Когда entry и class нужно указывать

Если файл или класс называются нестандартно, укажите их явно:

```json
"entry": "src/CustomParser.php",
"class": "iEXPlugins\\ExampleRates\\CustomParser"
```

Тогда в PHP-файле должен быть такой класс:

```php
namespace iEXPlugins\ExampleRates;

final class CustomParser
```

## Блок modules

`modules` описывает возможности плагина.

Для плагина курсов рекомендуется явно указывать:

```
rates.source
```

Пример:

```json
"modules": [
  {
    "capability": "rates.source",
    "type": "parser-rate",
    "title": "Example Rates",
    "description": "Источник курсов Example API.",
    "standard": "iex.parser-rate.v1",
    "settings": [],
    "config_schema": [],
    "migrations": [],
    "health": {}
  }
]
```

Если `modules` не указан, система для `parser-rate` может создать `rates.source` по умолчанию. Но для новых плагинов лучше указывать `modules` явно, чтобы структура была понятной и предсказуемой.

## PHP-класс Parser.php

Основной файл плагина:

```
src/Parser.php
```

Минимальный пример:

```php
<?php

declare(strict_types=1);

namespace iEXPlugins\ExampleRates;

use iEXPackages\PluginManager\Contracts\RateParserPluginInterface;
use iEXPackages\PluginManager\DTO\RateParserContext;

final class Parser implements RateParserPluginInterface
{
    public function rates(RateParserContext $context): iterable
    {
        return [
            [
                'from' => 'USD',
                'to' => 'RUB',
                'buy' => '91.25',
            ],
            [
                'from' => 'EUR',
                'to' => 'RUB',
                'buy' => '98.10',
            ],
        ];
    }
}
```

Класс должен реализовать интерфейс:

```php
RateParserPluginInterface
```

И содержать метод:

```php
public function rates(RateParserContext $context): iterable
```

Если класс не реализует интерфейс, система не сможет запустить плагин.

## Формат возвращаемого курса

Основной формат курса:

```php
[
    'from' => 'USD',
    'to' => 'RUB',
    'buy' => '91.25',
]
```

Можно дополнительно вернуть `sell`:

```php
[
    'from' => 'USD',
    'to' => 'RUB',
    'buy' => '91.25',
    'sell' => '91.80',
]
```

Значения курсов лучше возвращать строками, чтобы не терять точность на float.

### Поддерживаемые alias-поля

Рекомендуемый формат:

```
from / to / buy / sell
```

Система также понимает alias-ключи:

<table><thead><tr><th width="211.83984375">Основное поле</th><th>Alias</th></tr></thead><tbody><tr><td><code>from</code></td><td><code>base</code>, <code>currency_from</code>, <code>code_in</code></td></tr><tr><td><code>to</code></td><td><code>quote</code>, <code>currency_to</code>, <code>code_out</code></td></tr><tr><td><code>buy</code></td><td><code>rate</code>, <code>default</code>, <code>value</code>, <code>bid</code></td></tr><tr><td><code>sell</code></td><td><code>ask</code></td></tr></tbody></table>

Пример:

```php
[
    'base' => 'USD',
    'quote' => 'RUB',
    'rate' => '91.25',
]
```

***

## Пример парсера с HTTP API

```php
<?php

declare(strict_types=1);

namespace iEXPlugins\ExampleRates;

use Illuminate\Support\Facades\Http;
use iEXPackages\PluginManager\Contracts\RateParserPluginInterface;
use iEXPackages\PluginManager\DTO\RateParserContext;

final class Parser implements RateParserPluginInterface
{
    public function rates(RateParserContext $context): iterable
    {
        $config = $context->config['rates.source'] ?? [];

        $baseUrl = rtrim((string) ($config['base_url'] ?? 'https://api.example.com'), '/');
        $timeout = (int) ($config['timeout'] ?? 10);

        $secret = $context->plugin
            ->secrets()
            ->where('capability', 'rates.source')
            ->where('key', 'api_key')
            ->where('is_active', true)
            ->first();

        $apiKey = $secret?->encrypted_value;

        $request = Http::timeout($timeout)->acceptJson();

        if ($apiKey) {
            $request = $request->withToken($apiKey);
        }

        $payload = $request
            ->get($baseUrl . '/rates')
            ->throw()
            ->json();

        foreach ((array) data_get($payload, 'data', []) as $row) {
            $from = trim((string) ($row['base'] ?? ''));
            $to = trim((string) ($row['quote'] ?? ''));
            $buy = trim((string) ($row['buy'] ?? $row['rate'] ?? ''));

            if ($from === '' || $to === '' || $buy === '') {
                continue;
            }

            yield [
                'from' => $from,
                'to' => $to,
                'buy' => $buy,
                'sell' => isset($row['sell']) ? (string) $row['sell'] : null,
            ];
        }
    }
}
```

***

## RateParserContext

В метод `rates()` передаётся объект:

```php
RateParserContext $context
```

Он содержит данные текущего запуска.

<table><thead><tr><th width="260.83984375">Поле</th><th>Что содержит</th></tr></thead><tbody><tr><td><code>$context->plugin</code></td><td>Модель установленного плагина</td></tr><tr><td><code>$context->manifest</code></td><td>Manifest текущего плагина</td></tr><tr><td><code>$context->options</code></td><td>Опции конкретного запуска</td></tr><tr><td><code>$context->extra</code></td><td>Дополнительные данные</td></tr><tr><td><code>$context->config</code></td><td>Обычные настройки из <code>config_schema</code></td></tr><tr><td><code>$context->pluginPath()</code></td><td>Путь к файлу внутри установленного плагина</td></tr></tbody></table>

Пример проверки health-check:

```php
$isHealthCheck = (bool) ($context->options['health_check'] ?? false);
```

Пример пути к файлу внутри плагина:

```php
$path = $context->pluginPath('data/rates.json');
```

***

## Настройки плагина

Обычные настройки описываются в `config_schema`.

Они подходят для значений, которые не являются секретными:

* базовый URL API;
* таймаут;
* режим рынка;
* страна;
* валюта;
* флаг включения функции.

Пример:

```json
"config_schema": [
  {
    "key": "base_url",
    "label": "Base URL",
    "type": "url",
    "required": true,
    "default": "https://api.example.com"
  },
  {
    "key": "timeout",
    "label": "Timeout",
    "type": "integer",
    "required": false,
    "default": 10
  },
  {
    "key": "market",
    "label": "Market",
    "type": "select",
    "default": "spot",
    "options": [
      { "value": "spot", "label": "Spot" },
      { "value": "futures", "label": "Futures" }
    ]
  }
]
```

Использование в PHP:

```php
$config = $context->config['rates.source'] ?? [];

$baseUrl = $config['base_url'] ?? 'https://api.example.com';
$timeout = (int) ($config['timeout'] ?? 10);
$market = $config['market'] ?? 'spot';
```

Поддерживаемые типы настроек:

```
text
textarea
url
email
integer
number
boolean
select
json
```

## Секреты плагина

Секретные поля описываются в `settings`.

Пример:

```json
"settings": [
  {
    "key": "api_key",
    "label": "API key",
    "type": "secret",
    "required": true
  }
]
```

В `iex-plugin.json` хранится только схема секретов. Значения секретов в ZIP не хранятся.

Значения секретов:

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

Получение секрета в PHP:

```php
$secret = $context->plugin
    ->secrets()
    ->where('capability', 'rates.source')
    ->where('key', 'api_key')
    ->where('is_active', true)
    ->first();

$apiKey = $secret?->encrypted_value;
```

`encrypted_value` возвращается уже расшифрованным через Laravel encrypted cast. Дополнительно расшифровывать значение вручную не нужно.

Использование секрета в запросе:

```php
$response = Http::withToken($apiKey)
    ->timeout(10)
    ->get('https://api.example.com/rates')
    ->throw()
    ->json();
```

## Блок rateParser

`rateParser` управляет поведением курсового плагина.

```json
"rateParser": {
  "discoverOnInstall": true,
  "pairs": []
}
```

### discoverOnInstall

Если значение `true`, система может запустить плагин при проверке или установке и получить пары из runtime-ответа.

```json
"discoverOnInstall": true
```

Если значение `false`, система не будет запускать плагин для первичного поиска пар.

```json
"discoverOnInstall": false
```

В админке оператор всё равно может выбрать режим установки:

* «По настройке плагина»;
* «Проверить и загрузить пары»;
* «Не загружать при установке».

***

## Пары курсов

Есть два способа передать пары курсов системе.

<table><thead><tr><th width="275.3828125">Способ</th><th>Когда использовать</th></tr></thead><tbody><tr><td><code>rateParser.pairs</code></td><td>Если пары известны заранее</td></tr><tr><td><code>discoverOnInstall</code> + <code>rates()</code></td><td>Если пары нужно получить из API</td></tr></tbody></table>

### pairs

`rateParser.pairs` нужен для первичного создания строк в источниках курсов.

Пример:

```json
"rateParser": {
  "discoverOnInstall": false,
  "pairs": [
    {
      "from": "USD",
      "to": "RUB",
      "amount": "91.25",
      "number_format": 10,
      "status": false
    },
    {
      "from": "EUR",
      "to": "RUB",
      "amount": "98.10",
      "number_format": 10,
      "status": false
    }
  ]
}
```

Поля пары:

<table><thead><tr><th width="205.68359375">Поле</th><th>Назначение</th></tr></thead><tbody><tr><td><code>from</code></td><td>Исходная валюта</td></tr><tr><td><code>to</code></td><td>Целевая валюта</td></tr><tr><td><code>amount</code></td><td>Первичное значение курса</td></tr><tr><td><code>type</code></td><td>Тип пары, по умолчанию <code>0</code></td></tr><tr><td><code>type_price</code></td><td>Дополнительный тип цены, например <code>buy</code> или <code>sell</code></td></tr><tr><td><code>number_format</code></td><td>Количество знаков форматирования, от <code>0</code> до <code>18</code></td></tr><tr><td><code>status</code></td><td>Активность пары</td></tr></tbody></table>

Рекомендуется добавлять новые пары выключенными:

```json
"status": false
```

Так оператор сможет проверить их перед включением.

## Runtime-курсы и pairs

Важно различать `pairs` и `rates()`.

`rateParser.pairs` описывает пары, которые можно создать при установке.

Метод `rates()` возвращает актуальные значения курсов при проверке, health-check и обновлении.

Правильная схема:

```
rateParser.pairs
└── создаёт список пар

rates()
└── возвращает актуальные значения курсов
```

## Health-check

Health-check запускается из админки кнопкой «Проверить состояние».

Для `rates.source` система вызывает метод `rates()` и проверяет, что плагин вернул хотя бы один курс.

В manifest лучше указывать:

```json
"health": {}
```

Пример обработки health-check:

```php
public function rates(RateParserContext $context): iterable
{
    $isHealthCheck = (bool) ($context->options['health_check'] ?? false);

    if ($isHealthCheck) {
        return [
            ['from' => 'USD', 'to' => 'RUB', 'buy' => '91.25'],
        ];
    }

    return [
        ['from' => 'USD', 'to' => 'RUB', 'buy' => '91.25'],
        ['from' => 'EUR', 'to' => 'RUB', 'buy' => '98.10'],
    ];
}
```

## Миграции плагина

Если плагину нужны свои таблицы, можно добавить миграции.

Описание миграции в manifest:

```json
"migrations": [
  "database/migrations/2026_01_01_000000_create_example_rates_cache.php"
]
```

Пример файла миграции:

```php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class {
    public function up(): void
    {
        Schema::create('example_rates_cache', static function (Blueprint $table): void {
            $table->id();
            $table->string('symbol')->index();
            $table->decimal('bid', 32, 16);
            $table->decimal('ask', 32, 16)->nullable();
            $table->timestamps();
        });
    }
};
```

Миграции регистрируются при установке, но запускаются отдельно из админки.

## JS runtime

Runtime `js` поддерживается только для совместимости со старыми parser-rate модулями.

Минимальный пример:

```js
module.exports = class Parser {
  async updateRate() {
    return [
      { from: 'USD', to: 'RUB', buy: '91.25' },
      { from: 'EUR', to: 'RUB', buy: '98.10' }
    ];
  }
};
```

Для новых плагинов используйте PHP runtime.

***

## Сборка ZIP

{% stepper %}
{% step %}

### Через команду

```bash
php artisan iex:plugin-make example-rates --type=parser-rate --runtime=php --title="Example Rates" --zip --force
```

{% endstep %}

{% step %}

### Вручную

Перейдите в папку плагина:

```bash
cd storage/app/iex-plugin-templates/example-rates
```

Соберите архив:

```bash
zip -r ../example-rates.zip .
```

В архиве должна быть структура:

```
iex-plugin.json
src/Parser.php
```

Допустимо также:

```
example-rates/iex-plugin.json
example-rates/src/Parser.php
```

Система умеет определить одну корневую папку.

Не добавляйте в архив:

* `.env`;
* `.git`;
* `node_modules`;
* `vendor`;
* логи;
* временные файлы;
* личные ключи;
* пароли;
* дампы базы данных.
  {% endstep %}
  {% endstepper %}

***

## Проверка плагина в админке

После сборки ZIP проверьте его через панель управления.

{% content-ref url="/spaces/YuqSN6CIJoIeh8EPb0uE/pages/gafsPx8xZymoPUFsodha" %}
[Установка плагинов](/guide/sait/ustanovka-plaginov.md)
{% endcontent-ref %}

1. Откройте **«Утилиты» — «Установка плагинов».**
2. Нажмите **«Установить».**
3. Выберите тип **«Курсы».**
4. Загрузите ZIP-архив.
5. Нажмите **«Проверить пакет».**
6. Проверьте результат предпросмотра.
7. Если отображается «Пакет можно установить», нажмите «Установить».
8. Если у плагина есть секреты или настройки, заполните их.
9. Нажмите «Проверить состояние».
10. Откройте раздел источников курсов и убедитесь, что группа плагина создана.

## Проверка через консоль

После установки можно проверить совместимость установленных плагинов:

```bash
php artisan iex:plugins-check
```

Для JSON-вывода:

```bash
php artisan iex:plugins-check --json
```

***

## Частые ошибки

<details>

<summary>Не найден основной файл</summary>

Проверьте, что файл существует:

```
src/Parser.php
```

Если файл называется иначе, укажите `entry` явно.

</details>

<details>

<summary>Класс не найден</summary>

Для:

```json
"name": "example-rates"
```

по умолчанию ожидается:

```php
namespace iEXPlugins\ExampleRates;

final class Parser
```

Если namespace или имя класса другие, укажите `class` явно.

</details>

<details>

<summary>Класс не реализует интерфейс</summary>

Класс должен реализовать:

```php
RateParserPluginInterface
```

</details>

<details>

<summary>Метод rates ничего не вернул</summary>

Метод `rates()` должен вернуть хотя бы один корректный курс с полями:

```
from
to
buy
```

</details>

<details>

<summary>Пары не появились в источниках</summary>

Проверьте:

* включён ли `discoverOnInstall`;
* какой режим выбран при установке;
* вернул ли runtime пары;
* запущена ли очередь задач;
* нет ли ошибок импорта на странице установки плагинов.

</details>

<details>

<summary>Ошибка совместимости</summary>

Проверьте:

* `core_min`;
* `core_max`;
* `php`;
* `extensions`.

</details>

***

## Рекомендации

Для новых плагинов используйте PHP runtime.

Не храните значения API-ключей в `iex-plugin.json`.

В `settings` описывайте только поля секретов.

В `config_schema` описывайте обычные настройки.

`entry` и `class` можно не указывать, если используется стандартная структура.

`modules` лучше указывать явно, даже если система умеет создать `rates.source` по умолчанию.

Для `health` используйте объект:

```json
"health": {}
```

Курсы возвращайте строками.

Новые пары после импорта должны проверяться оператором вручную.

Перед передачей клиенту всегда проверяйте ZIP через «Установка плагинов».

***

## Коротко

Плагин курсов добавляет в iEXExchanger новый внешний источник курсов.

Основной тип плагина:

```
parser-rate
```

Основная возможность:

```
rates.source
```

Рекомендуемый runtime:

```
php
```

Минимальная структура плагина:

```
iex-plugin.json
src/Parser.php
```

Главный метод парсера:

```php
public function rates(RateParserContext $context): iterable
```

Пары можно описать заранее через `rateParser.pairs` или получить автоматически через `discoverOnInstall`.

Секреты описываются в `settings`, обычные настройки — в `config_schema`.

Готовый плагин нужно собрать в ZIP и проверить через «Утилиты» — «Установка плагинов».


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.iexexchanger.com/razrabotchikam/razrabotka-modulei/parser-kursov.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
