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

# ERP- (ERP info data)

> Display data from the merchandise management system in the shop: order list with filters, order details, orders not yet transferred, stock level and general requests.

The ERP info data interface retrieves data directly from the merchant's merchandise management system and displays it in the shop. Two use cases are the focus: the logged-in buyer sees their own orders, and every visitor can query the stock level of a product.

The display takes place in module templates that are pulled into a master template via `WS-ExternInclude`. Which file handles which task is defined in the `wws-online-interface.config` configuration in the `Templates` section. The tags on this page apply exclusively in these module templates.

Guide: Using the ERP info data interface · Reference: wws-online-interface.config configuration

> [!WARNING]
>
> The interface was developed for the V4 merchandise management system from D\&G and can only be used with it. It must also be activated by WEBSALE AG.

> [!WARNING]
>
> Buyer-related queries require that the buyer is logged in and has a customer number, and that this customer number cannot be edited in the shop. Otherwise, anyone could view other customers' orders.

## The six templates

| Parameter in `Templates` | In this reference | Shows |
| - | - | - |
| `ListEntries` | List | the overview list of orders including filters |
| `ShowEntry` | Detail | a single order |
| `PendingEntries` | Pending | orders that the merchandise management system has not yet transferred |
| `StockAmount` | StockAmount | the stock level of a product |
| `CommonRequest` | CommonRequest | the result of a general request |
| `error` | Error | error messages from the interface |

The "Templates" column in the tables on this page names the templates in which a tag is evaluated. "all" means that it applies everywhere.

> [!NOTE]
>
> Always wrap the interface call in `WS-OnlineERPLink` or `WS-OnlineERPStockLevelLink`. The wrapper only takes effect if the interface is available at all, and otherwise keeps the block out of the page.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{WS-OnlineERPLink}
   ~WS-ExternInclude($WS-OnlineERPLink$)~
{/WS-OnlineERPLink}
```

> [!WARNING]
>
> Additionally place the stock level call in a `{!ST-Robot}` wrapper. Without it, every search engine crawler sends a request to the merchandise management system on every product view.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!ST-Robot}
   {WS-OnlineERPStockLevelLink}
      ~WS-ExternInclude($WS-OnlineERPStockLevelLink$&erp_pn=$PR-NumberEnc$)~
   {/WS-OnlineERPStockLevelLink}
{/!ST-Robot}
```

Reference: WS-OnlineERPLink · Reference: WS-OnlineERPStockLevelLink · Reference: WS-ExternInclude()

## The field names from the configuration

Which data fields the merchandise management system supplies differs from shop to shop. That is why the fields do not have descriptive tag names, but numbers: `H1` to `H1000` for the header data of an order and `P1` to `P1000` for the position data. You define what each number stands for in `wws-online-interface.config` in the `HeadData` and `PositionData` sections.

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-HeadName(HX)` | 1110 | all | the configured label of the header parameter |
| `ERP-HeadName(HX,Wert)` | 0110 | all | applies if the label equals `Wert` |
| `ERP-PositionName(PX)` | 1110 | all | the configured label of the position parameter |
| `ERP-PositionName(PX,Wert)` | 0110 | all | applies if the label equals `Wert` |

> [!NOTE]
>
> This way, you do not write the column headings of a table into the template, but retrieve them from the configuration. If the merchandise management system later changes the meaning of a field, a change in the configuration is sufficient.

> [!WARNING]
>
> Two numbers are fixed: `H1` is always the customer number, `P1` is always the quantity. All other numbers can be assigned freely and must be coordinated with the merchandise management system.

## The order list

`ERP-HeadData` is at the same time the number of orders found, the check for hits, and the loop over them.

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-HeadData` | 1111 | List | the number, the check and the loop over the orders |
| `ERP-HeadData_Counter` | 1000 | List/Detail | the sequential number within the loop |
| `ERP-HeadData(HX)` | 1110 | List/Detail | the value of the header parameter |
| `ERP-HeadData(HX,Wert)` | 0110 | List/Detail | applies if the value equals `Wert` |
| `ERP-HeadData_ID` | 1000 | List/Detail | the reference ID assigned by the merchandise management system |
| `ERP-HeadData_ID(Wert)` | 0110 | List/Detail | applies if the ID equals `Wert` |
| `ERP-HeadData_Type` | 1000 | List/Detail | the order type as a number |
| `ERP-HeadData_Type(Wert)` | 0110 | List/Detail | applies if the type equals `Wert` |
| `ERP-HeadData_Type_Txt` | 1000 | List/Detail | the configured text for the order type |
| `ERP-HeadData_Type_Txt(Wert)` | 0110 | List/Detail | applies if the text equals `Wert` |
| `ERP-HeadData_Download` | 1110 | List/Detail | the link to a stored file, and the check whether there is one |
| `ERP-LinkDownload` | 1110 | List/Detail | the same under a second name |
| `ERP-LinkDetail` | 1000 | List | the link to the detail view of this order |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!ERP-HeadData}
   <p>Ihre Anfrage ergab keine Treffer.</p>
{/!ERP-HeadData}

{ERP-HeadData}
   <p>Gefundene Aufträge: ~ERP-HeadData~</p>

   <table>
      <tr>
         <th>Nr.</th>
         <th>~ERP-HeadName(H2)~</th>
         <th>~ERP-HeadName(H4)~</th>
         <th>~ERP-HeadName(H8)~</th>
         <th>Status</th>
         <th></th>
      </tr>

      {@ERP-HeadData}
         <tr>
            <td>~ERP-HeadData_Counter~</td>
            <td>~ERP-HeadData(H2)~</td>
            <td>~ERP-HeadData(H4)~</td>
            <td>~ERP-HeadData(H8)~</td>
            <td>
               {ERP-HeadData_Type_Txt}~ERP-HeadData_Type_Txt~{/ERP-HeadData_Type_Txt}
               {!ERP-HeadData_Type_Txt}Typ ~ERP-HeadData_Type~{/!ERP-HeadData_Type_Txt}
            </td>
            <td>
               <a href="~ERP-LinkDetail~">Details</a>
               {ERP-HeadData_Download}
                  <a href="~ERP-HeadData_Download~">Beleg herunterladen</a>
               {/ERP-HeadData_Download}
            </td>
         </tr>
      {/@ERP-HeadData}
   </table>
{/ERP-HeadData}
```

> [!NOTE]
>
> The order type comes from the merchandise management system as a number. You define the readable text for it in `wws-online-interface.config` in the `Types` section. If an entry is missing there, `ERP-HeadData_Type_Txt` remains empty. The wrapper in the example catches this and then at least shows the number.

> [!NOTE]
>
> `ERP-HeadData_Download` and `ERP-LinkDownload` are two names for the same tag. Use one of them consistently within a template.

> [!WARNING]
>
> As a single tag outside the loop, `ERP-HeadData` outputs the number of hits; inside the loop, everything refers to the order currently being iterated. The number of hits therefore belongs before the loop, not inside it.

## The positions of an order

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-PositionData` | 1111 | List/Detail | the number, the check and the loop over the positions |
| `ERP-PositionData_Counter` | 1000 | List/Detail | the sequential number within the loop |
| `ERP-PositionData(PX)` | 1110 | List/Detail | the value of the position parameter |
| `ERP-PositionData(PX,Wert)` | 0110 | List/Detail | applies if the value equals `Wert` |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@ERP-HeadData}
   <h3>Auftrag ~ERP-HeadData(H4)~</h3>

   {!ERP-PositionData}
      <p>Zu diesem Auftrag liegen keine Positionen vor.</p>
   {/!ERP-PositionData}

   {ERP-PositionData}
      <table>
         <tr>
            <th>~ERP-PositionName(P1)~</th>
            <th>~ERP-PositionName(P3)~</th>
            <th>~ERP-PositionName(P21)~</th>
            <th>~ERP-PositionName(P6)~</th>
         </tr>
         {@ERP-PositionData}
            <tr>
               <td>~ERP-PositionData(P1)~</td>
               <td>~ERP-PositionData(P3)~</td>
               <td>~ERP-PositionData(P21)~</td>
               <td>~ERP-PositionData(P6)~</td>
            </tr>
         {/@ERP-PositionData}
      </table>
   {/ERP-PositionData}
{/@ERP-HeadData}
```

> [!NOTE]
>
> The position loop runs inside the order loop and always refers to the current order. The same nesting works in the list template and in the detail template, so you can copy the block from one to the other.

## Filter and time period

The overview list can be restricted by the number of entries, a time period and an alternative time period. The interface provides all the selection lists required for this ready-made.

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-MaxEntries_select` | 1110 | List | the selection list for the maximum number of orders |
| `ERP-DateFrom_day_select` | 1000 | List | the selection list for the start day |
| `ERP-DateFrom_month_select` | 1000 | List | the selection list for the start month |
| `ERP-DateFrom_year_select` | 1000 | List | the selection list for the start year |
| `ERP-DateUntil_day_select` | 1000 | List | the selection list for the end day |
| `ERP-DateUntil_month_select` | 1000 | List | the selection list for the end month |
| `ERP-DateUntil_year_select` | 1000 | List | the selection list for the end year |
| `ERP-AlternativeDate_select` | 1110 | List | the selection list of predefined time periods |

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-DateSelection` | 0110 | List/Detail | applies if a start or end date is selected |
| `ERP-DateFrom_day` | 1110 | List/Detail | the selected start day |
| `ERP-DateFrom_month` | 1110 | List/Detail | the selected start month as a number |
| `ERP-DateFrom_month_txt` | 1110 | List/Detail | the month name of the start month |
| `ERP-DateFrom_year` | 1110 | List/Detail | the selected start year |
| `ERP-DateUntil_day` | 1110 | List/Detail | the selected end day |
| `ERP-DateUntil_month` | 1110 | List/Detail | the selected end month as a number |
| `ERP-DateUntil_month_txt` | 1110 | List/Detail | the month name of the end month |
| `ERP-DateUntil_year` | 1110 | List/Detail | the selected end year |
| `ERP-AlternativeDate_txt` | 1110 | List/Detail | the text for the selected predefined time period |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<form action="~FORM-Template(tpl_wws-online.htm)~" method="post">
   {ERP-MaxEntries_select}
      <label>Einträge je Seite ~ERP-MaxEntries_select~</label>
   {/ERP-MaxEntries_select}

   <label>Zeitraum von
      ~ERP-DateFrom_day_select~ ~ERP-DateFrom_month_select~ ~ERP-DateFrom_year_select~
   </label>
   <label>Zeitraum bis
      ~ERP-DateUntil_day_select~ ~ERP-DateUntil_month_select~ ~ERP-DateUntil_year_select~
   </label>

   {ERP-AlternativeDate_select}
      <label>Oder ein fester Zeitraum ~ERP-AlternativeDate_select~</label>
   {/ERP-AlternativeDate_select}

   <button type="submit">Anzeigen</button>
</form>

{ERP-DateSelection}
   <p>
      Gewählter Zeitraum:
      {ERP-DateFrom_day}
         vom ~ERP-DateFrom_day~. ~ERP-DateFrom_month_txt~ ~ERP-DateFrom_year~
      {/ERP-DateFrom_day}
      {ERP-DateUntil_day}
         bis ~ERP-DateUntil_day~. ~ERP-DateUntil_month_txt~ ~ERP-DateUntil_year~
      {/ERP-DateUntil_day}
   </p>
{/ERP-DateSelection}

{ERP-AlternativeDate_txt}
   <p>Gewählter Zeitraum: ~ERP-AlternativeDate_txt~</p>
{/ERP-AlternativeDate_txt}
```

> [!NOTE]
>
> `ERP-MaxEntries_select`, `ERP-AlternativeDate_select` and `ERP-Search_Type_select` only take effect as a wrapper if at least **two** entries are configured. With only one option, a list makes no sense, and the label next to it disappears along with it.

> [!NOTE]
>
> The month names and the texts of the predefined time periods are located in `wws-online-interface.config` in the `PeriodSelection` section. There, you also use `ShowYearsAgo` to define how far back the year list goes.

> [!WARNING]
>
> If only a single year is available for selection, `ERP-DateFrom_year_select` and `ERP-DateUntil_year_select` output a hidden field instead of a list. The form continues to work as a result, but the layout lacks a visible element at this point.

> [!WARNING]
>
> The selection lists bring their own field name. Do not place your own `select` element or your own `name` around them.

## The search

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-Search_input` | 1000 | List | the field name for the search input field |
| `ERP-Search_value` | 1110 | List/Detail | the entered search term |
| `ERP-Search_Type_select` | 1110 | List | the selection list that can be used to restrict the order type |
| `ERP-Search_Type` | 1110 | List/Detail | the searched type as a number |
| `ERP-Search_Type(Wert)` | 0110 | List/Detail | applies if the searched type equals `Wert` |
| `ERP-Search_Type_Txt` | 1000 | List/Detail | the configured text for the searched type |
| `ERP-Search_Type_Txt(Wert)` | 0110 | List/Detail | applies if this text equals `Wert` |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<label>Suchbegriff
   <input type="text" name="~ERP-Search_input~" value="~ENCHTML-ERP-Search_value~">
</label>

{ERP-Search_Type_select}
   <label>Nach Auftragstyp filtern ~ERP-Search_Type_select~</label>
{/ERP-Search_Type_select}

{ERP-Search_Type}
   <p>Gefiltert nach ~ERP-Search_Type_Txt~</p>
{/ERP-Search_Type}
```

> [!WARNING]
>
> `ERP-Search_value` outputs the search term **unchanged**, exactly as the visitor typed it. In the `value` attribute of an input field, the prefix `ENCHTML-` is therefore mandatory. Without this prefix, foreign HTML code can be injected into the page via the search field.

> [!NOTE]
>
> As a wrapper without a parameter, `ERP-Search_Type` applies exactly when filtering by a type takes place at all. The value 0 means "no filter".

> [!NOTE]
>
> The comparison in `ERP-Search_Type(Wert)` is numeric. A non-numeric parameter becomes 0 and thus matches the unfiltered state.

## Orders not yet transferred

Time passes between the order in the shop and its transfer to the merchandise management system. During this gap, the merchandise management system does not yet know the order, but the shop does. The separate `PendingEntries` template closes this gap.

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-LinkPendingOrders` | 1000 | List | the link to this template |
| `ERP-LinkOverview` | 1000 | Detail/Pending | the link back to the order list |
| `ERP-PendingOrders` | 1111 | Pending | the number, the check and the loop over the pending orders |
| `ERP-PendingOrderPosition` | 1000 | Pending | the sequential number within the loop |
| `ERP-PendingOrderData` | 1000 | Pending | the order itself |
| `ERP-PendingOrderNumber` | 1000 | Pending | the order number |
| `ERP-PendingOrderDate` | 1000 | Pending | the order date |
| `ERP-PendingOrderTime` | 1000 | Pending | the order time |
| `ERP-LastShopOrderNumber` | 1110 | Pending | the last order number known to the merchandise management system |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!ERP-PendingOrders}
   <p>Alle Ihre Bestellungen sind übernommen.</p>
{/!ERP-PendingOrders}

{ERP-PendingOrders}
   <p>~ERP-PendingOrders~ Bestellungen sind noch in Bearbeitung.</p>
   <ul>
      {@ERP-PendingOrders}
         <li>
            Bestellung ~ERP-PendingOrderNumber~
            vom ~ERP-PendingOrderDate~ um ~ERP-PendingOrderTime~ Uhr
         </li>
      {/@ERP-PendingOrders}
   </ul>
   <a href="~ERP-LinkOverview~">Zurück zur Übersicht</a>
{/ERP-PendingOrders}
```

> [!NOTE]
>
> `ERP-LastShopOrderNumber` is the boundary between the two worlds: everything up to this order number is in the order list, everything above it is in this list. Pointing this out saves inquiries from buyers who miss their most recent order in the overview.

## The stock level

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-StockAmount` | 1110 | StockAmount | the online stock level |
| `ERP-RequestSent` | 0110 | StockAmount | applies if the request has already been sent |
| `ERP-BranchID(Wert)` | 1110 | StockAmount | applies if the selected branch ID equals `Wert` |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!ERP-RequestSent}
   <p>Bitte wählen Sie zuerst eine Filiale aus.</p>
{/!ERP-RequestSent}

{ERP-RequestSent}
   {ERP-StockAmount}
      <p>Verfügbar: ~ERP-StockAmount~ Stück</p>
   {/ERP-StockAmount}
   {!ERP-StockAmount}
      <p>Derzeit nicht vorrätig.</p>
   {/!ERP-StockAmount}
{/ERP-RequestSent}
```

> [!NOTE]
>
> `ERP-RequestSent` separates two states that otherwise look the same in the template: no request has been made yet because the visitor first has to select a branch, or a request was made and the answer is zero. Without this wrapper, the page incorrectly reports in the first case that the product is out of stock.

> [!WARNING]
>
> The stock level is the only query that works without a logged-in buyer. That is exactly why it needs the `{!ST-Robot}` wrapper around the module call. Without it, every crawler run generates as many requests to the merchandise management system as the shop has products.

## General requests

In addition to orders and stock levels, the interface can supply any other data records. The `CommonRequest` template displays them.

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `ERP-CommonName(name)` | 1110 | CommonRequest | the configured description for the technical name |
| `ERP-CommonData` | 1111 | CommonRequest | the number, the check and the loop over the data records |
| `ERP-CommonData_Counter` | 1000 | CommonRequest | the sequential number within the loop |
| `ERP-CommonData_Name` | 1110 | CommonRequest | the technical name of the data record |
| `ERP-CommonData_Name(Wert)` | 0110 | CommonRequest | applies if the technical name equals `Wert` |
| `ERP-CommonData_Value` | 1111 | CommonRequest | the number, the check and the loop over the values of the data record |
| `ERP-CommonData_Value_Counter` | 1000 | CommonRequest | the sequential number within the value loop |
| `ERP-CommonData_Value_Data` | 1110 | CommonRequest | the individual value |
| `ERP-CommonData_Value_Data(Wert)` | 0110 | CommonRequest | applies if the value equals `Wert` |
| `ERP-Type_Select_Name` | 1000 | CommonRequest | the field name of the selection list for the type |
| `ERP-Type_Selected(Wert)` | 0110 | CommonRequest | applies if the selected type equals `Wert` |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ERP-CommonData}
   {@ERP-CommonData}
      <section>
         {ERP-CommonData_Name(bestand)}
            <h3>~ERP-CommonName(bestand)~</h3>
         {/ERP-CommonData_Name(bestand)}
         {ERP-CommonData_Name(termine)}
            <h3>~ERP-CommonName(termine)~</h3>
         {/ERP-CommonData_Name(termine)}

         {ERP-CommonData_Value}
            <ul>
               {@ERP-CommonData_Value}
                  <li>~ERP-CommonData_Value_Data~</li>
               {/@ERP-CommonData_Value}
            </ul>
         {/ERP-CommonData_Value}
      </section>
   {/@ERP-CommonData}
{/ERP-CommonData}
```

> [!NOTE]
>
> A general data record has a name and any number of values. That is why two loops are nested here: the outer one over the data records, the inner one over their values.

> [!NOTE]
>
> `ERP-CommonName()` expects the technical name as a fixed parameter. You therefore build the heading for each data record using a wrapper with `ERP-CommonData_Name(…)`, as in the example. If you do not know the names, simply output `~ERP-CommonData_Name~` instead.

> [!NOTE]
>
> `ERP-CommonName()` accepts a second parameter. `{ERP-CommonName(bestand,verfuegbar)}` then only applies if the configured description for `bestand` equals `verfuegbar`. This notation is not included in the old documentation.

> [!WARNING]
>
> If the technical name passed is not configured at all, `ERP-CommonName()` outputs an empty string instead of drawing attention to itself. A missing heading is therefore an indication of a typo in the name.

> [!NOTE]
>
> `ERP-Type_Selected(Wert)` compares numerically. The parameter must be a number, not text.

## Errors and messages

| Tag | Type | Templates | Returns |
| - | - | - | - |
| `MSG-OnlineERP_Error` | 1110 | all | the message from the merchandise management system |
| `MSG-OnlineERP_ErrorCode` | 1110 | Error | the error code from the merchandise management system |
| `MSG-OnlineERP_TooManyConnections` | 0110 | Error | applies if more requests are currently running than the interface can process |
| `MSG-OnlineERP_InternalError` | 1110 | Error | the internal error of the interface |
| `ERP-InternalErrorMessage` | 1110 | Error | the internal error text in plain text |
| `ERP-UserDependentRequest` | 0110 | all | applies if the request was buyer-related |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{MSG-OnlineERP_TooManyConnections}
   <p>Derzeit sind sehr viele Anfragen unterwegs. Bitte versuchen Sie es in wenigen Minuten erneut.</p>
{/MSG-OnlineERP_TooManyConnections}

{!MSG-OnlineERP_TooManyConnections}
   {MSG-OnlineERP_Error}
      <p>Ihre Daten lassen sich derzeit nicht abrufen.</p>
   {/MSG-OnlineERP_Error}
{/!MSG-OnlineERP_TooManyConnections}

{ERP-InternalErrorMessage}<!-- ~ERP-InternalErrorMessage~ -->{/ERP-InternalErrorMessage}
```

> [!WARNING]
>
> `ERP-InternalErrorMessage` belongs exclusively in an HTML comment. The text is intended for troubleshooting and must not appear to a buyer in plain text. You read it via the browser's source code view.

> [!NOTE]
>
> `ERP-UserDependentRequest` distinguishes buyer-related queries from the stock level query. In the shared error template, you can use it to show the logged-in buyer a different text than the anonymous visitor.

> [!WARNING]
>
> The message from the merchandise management system is third-party text from a system whose wording you have no influence on. Check whether you really want to show it to the buyer, or whether a sentence of your own provides better information.

## The Type column

The "Type" column in the tables on this page has four digits. Each digit stands for a type of use; `1` means permitted, `0` means not permitted.

| Digit | Meaning |
| - | - |
| 1 | Single tag |
| 2 | Range tag |
| 3 | Negative range tag |
| 4 | Loop tag |

A tag with `1111` can therefore be used in all four forms, a tag with `0110` only as a positive and negative wrapper.

## Related topics

* Guide: Using the ERP info data interface
* Guide: Using external includes
* Reference: wws-online-interface.config configuration
* Reference: WS-OnlineERPLink
* Reference: WS-OnlineERPStockLevelLink


## Related topics

- [Using the ERP info data interface](https://dokumentation.websale.de/en/v8s/externe-dienste/wws-infodatenschnittstelle.md)
- [Styles for modules and interfaces](https://dokumentation.websale.de/en/v8s/referenz/styles/module-und-schnittstellen.md)
- [Order data overview](https://dokumentation.websale.de/en/v8s/materialien/uebersicht-bestelldaten.md)
- [Interfaces](https://dokumentation.websale.de/en/v8s/schnittstellen.md)
- [Data migration](https://dokumentation.websale.de/en/migration/daten-migration.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.