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

# Opis lokalnego API agenta

> API HTTP, które agent ERP Sync udostępnia na komputerze, na którym działa: trasy, parametry i odpowiedzi.

Agent ERP Sync uruchamia na komputerze, na którym jest zainstalowany, niewielkie API HTTP. Możesz za jego pomocą
sprawdzać stan agenta, czytać ostatnie wpisy jego logu oraz wstrzymywać, wznawiać i uruchamiać synchronizację ze
skryptu lub z narzędzia do monitorowania.

To **lokalne** API agenta. Nie jest to API Omnilinkera w chmurze i nie jest dostępne z internetu. Jak wywoływać sam
Omnilinker, opisuje sekcja [Dla programistów](/pl/developers/overview).

## Bazowy adres URL

```text theme={null}
http://localhost:5555
```

Port pochodzi z ustawienia `LocalApiPort` w pliku `appsettings.json` agenta (domyślnie `5555`). Pozostaw wartość
domyślną: zapasowe połączenie aplikacji w zasobniku i karta **Usługa lokalna** w aplikacji webowej zawsze używają
portu 5555. Zobacz [opis konfiguracji](/pl/erp/configuration-reference).

API używa zwykłego HTTP. Udostępnia je usługa Windows, więc jest dostępne tylko wtedy, gdy usługa działa.

## Dostęp i bezpieczeństwo

* **Tylko localhost.** Agent nasłuchuje wyłącznie na adresach pętli zwrotnej (`127.0.0.1` i `::1`). Inne komputery
  w Twojej sieci nie mogą się z nim połączyć i nie potrzebuje on reguły zapory. Żądanie, które wskazuje inny host
  niż `localhost` lub adres pętli zwrotnej, jest odrzucane z kodem `403 Forbidden`.
* **Jeden wymagany nagłówek.** Każde żądanie do trasy zaczynającej się od `/api` musi zawierać nagłówek
  `X-Omnilinker-Local: 1`. Bez niego agent odpowiada `403 Forbidden` z pustą treścią. `/health` nie sprawdza tego
  nagłówka; wysłanie go tam niczemu nie szkodzi.
* **Przeglądarki: tylko Omnilinker.** Strona internetowa nie może dodać tego nagłówka, nie pytając najpierw agenta
  (zapytanie wstępne CORS). Agent zgadza się tylko dla adresu Omnilinkera, `https://omnilinker.pl`, i jego
  subdomen, przez HTTPS. Dzięki temu karta **Usługa lokalna** aplikacji webowej, otwarta w przeglądarce na
  komputerze agenta, odczytuje API. Żądania z każdej innej strony są odrzucane z kodem `403`.
* **Brak uwierzytelniania.** Programy na komputerze, takie jak aplikacja w zasobniku, PowerShell czy `curl`, wysyłają
  nagłówek i nie potrzebują klucza API, hasła ani tokenu.

```powershell theme={null}
Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/status
```

<Warning>
  **API może wywołać każdy, kto może uruchomić program na komputerze agenta.** Może odczytać stan agenta i wpisy
  logu oraz wstrzymać, wznowić lub uruchomić synchronizację. API nie sprawdza grupy
  **Omnilinker ERP Sync Operators**, z której korzysta aplikacja w zasobniku. Nigdy nie zwraca klucza API, hasła do
  ERP ani ciągu połączenia i nie może zmienić ustawień agenta. Mimo to traktuj dostęp do komputera agenta jak dostęp
  do samego agenta: ogranicz grono osób, które mogą się na nim logować.
</Warning>

## Konwencje

* Treści żądań i odpowiedzi są w formacie JSON. Nazwy właściwości są w notacji camelCase.
* Czas jest podawany w UTC, w formacie ISO 8601, na przykład `2026-09-27T08:15:02.1234567Z`.
* Wartości wyliczeniowe są zwracane jako **liczby**, a nie nazwy. Tabele na tej stronie podają ich wartości.
* Trasy sterujące zwracają `400 Bad Request` z [wynikiem polecenia](#wynik-polecenia), gdy agent odrzuca polecenie.
* `403 Forbidden` z pustą treścią oznacza, że żądanie zostało odrzucone, zanim dotarło do agenta: brakuje nagłówka
  `X-Omnilinker-Local`, host to nie `localhost` albo przeglądarka wysłała je z innej strony.
* Przykłady używają PowerShell. W Windows PowerShell 5.1 `curl` jest aliasem polecenia `Invoke-WebRequest`. Aby
  użyć curl, wpisz `curl.exe`.

## Trasy

| Metoda | Trasa                    | Przeznaczenie                                               |
| ------ | ------------------------ | ----------------------------------------------------------- |
| `GET`  | `/health`                | Stan agenta i jego połączeń, jako zwykły tekst.             |
| `GET`  | `/api/sync/health`       | Sprawdzenie żywotności: czy API odpowiada.                  |
| `GET`  | `/api/sync/status`       | Pełny stan agenta.                                          |
| `GET`  | `/api/sync/config`       | Wersja agenta, jego stan i informacja, czy jest wstrzymany. |
| `POST` | `/api/sync/now`          | Prosi agenta o natychmiastowe wyszukanie zmian.             |
| `POST` | `/api/sync/trigger`      | To samo co `/api/sync/now`.                                 |
| `POST` | `/api/sync/pause`        | Wstrzymuje synchronizację.                                  |
| `POST` | `/api/sync/resume`       | Wznawia synchronizację.                                     |
| `GET`  | `/api/sync/logs`         | Ostatnie wpisy logu synchronizacji agenta.                  |
| `GET`  | `/api/sync/outbox/stats` | Liczby zdarzeń w kolejce wychodzącej agenta.                |
| `GET`  | `/api/sync/hash/status`  | Stan wykrywania zmian za pomocą hashy.                      |
| `GET`  | `/api/sync/hash/stats`   | Rozmiar magazynu hashy agenta.                              |
| `POST` | `/api/sync/hash/trigger` | Od razu uruchamia weryfikację hash.                         |

Innych tras nie ma.

## Stan

### GET /health

Uruchamia testy kondycji agenta i zwraca ogólny wynik jako zwykły tekst: `Healthy`, `Degraded` lub `Unhealthy`.
Status HTTP to `200 OK` dla `Healthy` i `Degraded` oraz `503 Service Unavailable` dla `Unhealthy`.

| Test                | Healthy                                 | Degraded                                         | Unhealthy                                                |
| ------------------- | --------------------------------------- | ------------------------------------------------ | -------------------------------------------------------- |
| Lokalna baza danych | Lokalna baza danych agenta odpowiada.   |                                                  | Nie odpowiada.                                           |
| Połączenie z ERP    | Agent jest połączony z bazą danych ERP. |                                                  | Nie jest połączony.                                      |
| Połączenie SQL      | Agent jest połączony z bazą danych ERP. | Baza danych ERP nie jest jeszcze skonfigurowana. | Jest skonfigurowana, ale agent nie jest z nią połączony. |
| Połączenie z chmurą | Omnilinker (`omnilinker.pl`) odpowiada. | Omnilinker odpowiada błędem.                     | Omnilinker jest nieosiągalny.                            |

`/health` zwraca `Unhealthy`, dopóki agent nie połączy się z bazą danych ERP, na przykład zaraz po starcie usługi
albo przed uruchomieniem [kreatora konfiguracji](/pl/erp/setup-wizard). Aby sprawdzić tylko, czy usługa działa,
użyj `/api/sync/health`.

```powershell theme={null}
Invoke-WebRequest -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/health -UseBasicParsing |
  Select-Object StatusCode, Content
```

### GET /api/sync/health

Zwraca `200 OK` zawsze, gdy API odpowiada. Nie sprawdza ERP ani Omnilinkera.

<ResponseField name="status" type="string">
  Zawsze `healthy`.
</ResponseField>

<ResponseField name="timestamp" type="string">
  Bieżący czas agenta, UTC.
</ResponseField>

```bash theme={null}
curl -H "X-Omnilinker-Local: 1" http://localhost:5555/api/sync/health
```

```json theme={null}
{ "status": "healthy", "timestamp": "2026-09-27T08:15:02.1234567Z" }
```

## Status

### GET /api/sync/status

Zwraca pełny stan agenta. Te same dane pokazują okno stanu aplikacji w zasobniku i karta **Usługa lokalna**
w aplikacji webowej.

<ResponseField name="state" type="integer">
  Stan agenta.

  | Wartość | Stan     | Znaczenie                                                                 |
  | ------- | -------- | ------------------------------------------------------------------------- |
  | `0`     | Idle     | Gotowy, czeka na następny cykl.                                           |
  | `1`     | Syncing  | Trwa synchronizacja albo żądanie `POST /api/sync/now` czeka na odebranie. |
  | `2`     | Paused   | Synchronizacja jest wstrzymana.                                           |
  | `3`     | Error    | Ostatni cykl zakończył się błędem. Zobacz `lastError`.                    |
  | `4`     | Starting | Usługa się uruchamia i nie wczytała jeszcze konfiguracji.                 |
  | `5`     | Stopping | Usługa się zamyka.                                                        |
</ResponseField>

<ResponseField name="isConnected" type="boolean">
  Czy ostatnie żądanie agenta do Omnilinkera się powiodło.
</ResponseField>

<ResponseField name="isErpConnected" type="boolean">
  Czy agent jest połączony z bazą danych ERP.
</ResponseField>

<ResponseField name="lastSyncTime" type="string | null">
  Kiedy ostatni cykl synchronizacji zakończył się powodzeniem.
</ResponseField>

<ResponseField name="nextSyncTime" type="string | null">
  Kiedy spodziewany jest następny cykl, jeśli wiadomo.
</ResponseField>

<ResponseField name="errorCount" type="integer">
  Liczba błędów od ostatniego udanego cyklu.
</ResponseField>

<ResponseField name="lastError" type="string | null">
  Ostatni komunikat błędu, na przykład `Waiting for cloud configuration`.
</ResponseField>

<ResponseField name="waitingReason" type="string | null">
  Dlaczego cykl jest opóźniony, na przykład `Product polling delayed (HashCheck in progress)`.
</ResponseField>

<ResponseField name="suggestedActions" type="integer[]">
  Rozwiązania, które aplikacja w zasobniku proponuje dla ostatniego błędu. `1` test połączenia z ERP, `2` test
  połączenia z chmurą, `3` sprawdzenie ustawień, `4` ponowienie teraz, `5` wyświetlenie logów, `6` sprawdzenie sieci,
  `7` kontakt z pomocą techniczną, `8` wyświetlenie szczegółów, `9` pominięcie elementu.
</ResponseField>

<ResponseField name="outbox" type="object">
  Zdarzenia w kolejce wychodzącej agenta: `pending`, `sent`, `failed` i `retrying`. Te same liczby co
  w `/api/sync/outbox/stats`.
</ResponseField>

<ResponseField name="entityCounts" type="object">
  Liczby z kolejki wychodzącej według typu encji, z nazwą typu jako kluczem (na przykład `Product`, `Brand`,
  `PriceLevel`, `Price`, `Warehouse`, `Stock`). Każda wartość zawiera `total`, `synced`, `pending` i `failed`.
  Liczone są tylko zdarzenia, które wciąż są w lokalnej kolejce wychodzącej: wysłane zdarzenia są usuwane po
  24 godzinach (po 1 godzinie podczas synchronizacji początkowej).
</ResponseField>

<ResponseField name="version" type="string">
  Wersja agenta.
</ResponseField>

<ResponseField name="updateAvailable" type="boolean">
  Nieużywane: zawsze `false`. Agent [aktualizuje się sam](/pl/erp/install-agent#zaktualizuj-agenta), ale nie zgłasza
  tu oczekującej aktualizacji.
</ResponseField>

<ResponseField name="updateVersion" type="string | null">
  Nieużywane: zawsze `null`.
</ResponseField>

<ResponseField name="hashCheck" type="object | null">
  Ten sam obiekt co w `/api/sync/hash/status`.
</ResponseField>

<ResponseField name="currentHashCheckProgress" type="object | null">
  Podczas weryfikacji hash: `productsChecked`, `totalProducts`, `brandsChecked`, `totalBrands`, `elapsed`,
  `estimatedTimeRemaining` i `itemsPerSecond`.
</ResponseField>

<ResponseField name="queueDepth" type="object | null">
  `currentPending`, `healthLevel` (`0` normalny, mniej niż 50 oczekujących; `1` podwyższony, od 50 do 199;
  `2` zaległości, 200 lub więcej), `trend` (`0` stały, `1` rosnący, `2` malejący), `trendItemsPerMinute`
  i `trendDescription`.
</ResponseField>

<ResponseField name="currentOperations" type="object[]">
  Operacje trwające w tej chwili, np. odpytywanie lub publikowanie, z liczbą elementów i postępem.
</ResponseField>

<ResponseField name="recentActivity" type="object[]">
  Ostatnio zakończone operacje, z polami `completedAt`, `itemCount`, `duration`, `success` i `errorMessage`.
</ResponseField>

<ResponseField name="systemHealth" type="object">
  Stan czterech komponentów: `erpConnection`, `cloudApi`, `database` i `credentials`. Każdy ma `level` (`0` zdrowy,
  `1` ostrzeżenie, `2` krytyczny), `message` i czas ostatniego sprawdzenia. `overallHealth` to najgorszy z czterech
  stanów, a `issueCount` liczy komponenty, które nie są zdrowe.
</ResponseField>

Obiekty w `currentOperations`, `recentActivity` i `systemHealth` zawierają też pola wyświetlane przez aplikację
w zasobniku. Nie polegaj na ich dokładnej strukturze, bo może się zmieniać między wersjami agenta.

```powershell theme={null}
$status = Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/status
$status | Select-Object state, isConnected, isErpConnected, lastSyncTime, lastError
$status.outbox
```

Skrócona odpowiedź:

```json theme={null}
{
  "state": 0,
  "isConnected": true,
  "isErpConnected": true,
  "lastSyncTime": "2026-09-27T08:15:02.1234567Z",
  "nextSyncTime": null,
  "errorCount": 0,
  "lastError": null,
  "waitingReason": null,
  "suggestedActions": [],
  "outbox": { "pending": 0, "sent": 245, "failed": 0, "retrying": 0 },
  "entityCounts": {
    "Product": { "total": 240, "synced": 240, "failed": 0, "pending": 0 },
    "Brand": { "total": 5, "synced": 5, "failed": 0, "pending": 0 }
  },
  "version": "<agent version>",
  "updateAvailable": false,
  "updateVersion": null
}
```

### GET /api/sync/config

Zwraca kilka informacji o agencie. Nie zwraca jego ustawień ani danych uwierzytelniających.

<ResponseField name="version" type="string">
  Wersja agenta.
</ResponseField>

<ResponseField name="isPaused" type="boolean">
  Czy synchronizacja jest wstrzymana.
</ResponseField>

<ResponseField name="state" type="string">
  Stan agenta jako **nazwa**, na przykład `Idle` (w przeciwieństwie do `/api/sync/status`, który zwraca liczbę).
</ResponseField>

```powershell theme={null}
Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/config
```

## Sterowanie

Te trasy nie przyjmują parametrów ani treści żądania.

### Wynik polecenia

Każda trasa sterująca, a także `POST /api/sync/hash/trigger`, zwraca ten obiekt:

<ResponseField name="success" type="boolean">
  Czy agent przyjął polecenie.
</ResponseField>

<ResponseField name="message" type="string">
  Co się stało albo dlaczego polecenie zostało odrzucone.
</ResponseField>

### POST /api/sync/now

Prosi agenta o natychmiastowe wyszukanie zmian. `POST /api/sync/trigger` działa dokładnie tak samo.

Agent odbiera żądanie w następnym cyklu odpytywania, czyli w ciągu `PollingIntervalSeconds` (domyślnie 60 sekund).
Przy wykrywaniu zmian przez skanowanie skrótów uruchamia weryfikację hash.

| Status HTTP | `message`                       | Kiedy                                            |
| ----------- | ------------------------------- | ------------------------------------------------ |
| `200`       | `Sync started`                  | Przyjęte.                                        |
| `400`       | `Sync is paused. Resume first.` | Synchronizacja jest wstrzymana.                  |
| `400`       | `Sync is already in progress.`  | Trwa synchronizacja albo inne żądanie już czeka. |

```powershell theme={null}
Invoke-RestMethod -Method Post -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/now
```

```bash theme={null}
curl -X POST -H "X-Omnilinker-Local: 1" http://localhost:5555/api/sync/now
```

### POST /api/sync/pause

Wstrzymuje synchronizację. Agent przestaje wykrywać nowe zmiany, dopóki jej nie wznowisz. Zawsze zwraca `200`
z komunikatem `Sync paused`.

* Zdarzenia, które już są w kolejce wychodzącej, są nadal wysyłane do Omnilinkera, gdy agent jest wstrzymany.
* Wstrzymanie nie jest zachowywane po ponownym uruchomieniu usługi.

```powershell theme={null}
Invoke-RestMethod -Method Post -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/pause
```

### POST /api/sync/resume

Wznawia synchronizację. Zawsze zwraca `200` z komunikatem `Sync resumed`.

```powershell theme={null}
Invoke-RestMethod -Method Post -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/resume
```

## Logi

### GET /api/sync/logs

Zwraca najnowsze wpisy własnego logu synchronizacji agenta, od najnowszego. To te same wpisy, które pokazuje okno
logów aplikacji w zasobniku. Nie są to wpisy logów synchronizacji w Omnilinkerze opisane na stronie
[Monitorowanie](/pl/erp/monitoring#logi-synchronizacji) ani pliki logów usługi.

<ParamField query="count" type="integer" default="50">
  Liczba wpisów do zwrócenia. Najwyżej 500; większe wartości zwracają 500.
</ParamField>

<ParamField query="level" type="string">
  Minimalny poziom: `Debug`, `Info`, `Warning`, `Error` lub `Critical` (albo od `0` do `4`). Zwraca wpisy na tym
  poziomie i wyższych.
</ParamField>

<ParamField query="category" type="string">
  Tylko wpisy z tej kategorii, na przykład `ErpPolling`, `HashCheck` lub `ChangeConsumption`. Dokładne dopasowanie.
</ParamField>

<ParamField query="entityType" type="string">
  Tylko wpisy dotyczące tego typu encji. Dokładne dopasowanie.
</ParamField>

Odpowiedź to tablica wpisów logu:

<ResponseField name="id" type="integer">
  Identyfikator wpisu.
</ResponseField>

<ResponseField name="timestamp" type="string">
  Kiedy wpis został zapisany.
</ResponseField>

<ResponseField name="level" type="integer">
  `0` Debug, `1` Info, `2` Warning, `3` Error, `4` Critical.
</ResponseField>

<ResponseField name="message" type="string">
  Komunikat.
</ResponseField>

<ResponseField name="details" type="string | null">
  Dodatkowe szczegóły, jeśli są.
</ResponseField>

<ResponseField name="category" type="string | null">
  Komponent, który zapisał wpis.
</ResponseField>

<ResponseField name="entityType" type="string | null">
  Typ encji, której dotyczy wpis, jeśli dotyczy.
</ResponseField>

<ResponseField name="entityId" type="string | null">
  Encja, której dotyczy wpis, jeśli dotyczy.
</ResponseField>

<ResponseField name="exception" type="string | null">
  Wyjątek, w przypadku błędów.
</ResponseField>

```powershell theme={null}
Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } "http://localhost:5555/api/sync/logs?count=20&level=Warning" |
  Format-Table timestamp, level, category, message
```

```bash theme={null}
curl -H "X-Omnilinker-Local: 1" "http://localhost:5555/api/sync/logs?count=20&level=Warning"
```

## Kolejka wychodząca

### GET /api/sync/outbox/stats

Agent umieszcza każdą zmianę w lokalnej kolejce wychodzącej (outbox) i wysyła ją do Omnilinkera w paczkach. Ta trasa
zlicza zdarzenia w kolejce według stanu.

<ResponseField name="pending" type="integer">
  Czekające na wysłanie, łącznie ze zdarzeniami, których próba wysłania się nie powiodła i które zostaną wysłane
  ponownie.
</ResponseField>

<ResponseField name="sent" type="integer">
  Wysłane pomyślnie i jeszcze nieusunięte. Wysłane zdarzenia są usuwane po 24 godzinach (po 1 godzinie podczas
  synchronizacji początkowej).
</ResponseField>

<ResponseField name="failed" type="integer">
  Nieudane przy każdej próbie (`MaxRetryAttempts`, domyślnie 5). Agent nie wysyła ich ponownie.
</ResponseField>

<ResponseField name="retrying" type="integer">
  Wysyłane w tej chwili. Wbrew nazwie nie jest to liczba zdarzeń czekających na ponowienie: te są w `pending`.
</ResponseField>

```powershell theme={null}
Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/outbox/stats
```

```json theme={null}
{ "pending": 5, "sent": 1245, "failed": 0, "retrying": 0 }
```

Stale rosnąca liczba `pending` oznacza, że agent nie może wysyłać danych do Omnilinkera. Zobacz
[Rozwiązywanie problemów](/pl/erp/troubleshooting).

## Weryfikacja hash

Weryfikacja hash porównuje dane w ERP z tym, co agent wysłał ostatnio, i w ten sposób wykrywa zmiany. Tak agent
wykrywa zmiany w trybie skanowania skrótów. Zobacz [Wapro](/pl/erp/providers/wapro).

### GET /api/sync/hash/status

<ResponseField name="isEnabled" type="boolean">
  Czy weryfikacje hash są włączone w konfiguracji synchronizacji połączenia. Przy śledzeniu zmian WFM\_INT zawsze
  działa cotygodniowa weryfikacja uzgadniająca i ta wartość wynosi `true`.
</ResponseField>

<ResponseField name="isRunning" type="boolean">
  Czy w tej chwili trwa weryfikacja hash.
</ResponseField>

<ResponseField name="isPaused" type="boolean">
  Czy same weryfikacje hash są wstrzymane (z aplikacji w zasobniku).
</ResponseField>

<ResponseField name="lastCheckTime" type="string | null">
  Kiedy zakończyła się ostatnia weryfikacja hash.
</ResponseField>

<ResponseField name="nextCheckTime" type="string | null">
  Kiedy przypada następna.
</ResponseField>

<ResponseField name="lastProductsChecked" type="integer">
  Liczba produktów porównanych w ostatniej weryfikacji. `lastProductsChanged`, `lastBrandsChecked`
  i `lastBrandsChanged` działają analogicznie.
</ResponseField>

<ResponseField name="totalStoredProductHashes" type="integer">
  Liczba produktów w magazynie hashy. `totalStoredBrandHashes` to samo dla marek.
</ResponseField>

<ResponseField name="lastError" type="string | null">
  Ostatni błąd weryfikacji hash.
</ResponseField>

```powershell theme={null}
Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/hash/status
```

### GET /api/sync/hash/stats

<ResponseField name="totalProducts" type="integer">
  Liczba produktów w magazynie hashy.
</ResponseField>

<ResponseField name="totalBrands" type="integer">
  Liczba marek w magazynie hashy.
</ResponseField>

<ResponseField name="lastHashCheck" type="string | null">
  Kiedy weryfikacja hash ostatnio zaktualizowała magazyn.
</ResponseField>

```powershell theme={null}
Invoke-RestMethod -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/hash/stats
```

### POST /api/sync/hash/trigger

Od razu uruchamia weryfikację hash, bez czekania na jej interwał.

| Status HTTP | `message`                                                                               | Kiedy                                                                                                 |
| ----------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| `200`       | `Hash check started`                                                                    | Przyjęte.                                                                                             |
| `400`       | `Hash check is disabled in cloud configuration. Enable it in the web dashboard.`        | Weryfikacje hash są wyłączone w [konfiguracji synchronizacji](/pl/erp/sync-configuration) połączenia. |
| `400`       | `Hash check is already running. Wait for current check to complete or cancel it first.` | Trwa weryfikacja.                                                                                     |

```powershell theme={null}
Invoke-RestMethod -Method Post -Headers @{ "X-Omnilinker-Local" = "1" } http://localhost:5555/api/sync/hash/trigger
```

## Potok nazwany

Aplikacja w zasobniku komunikuje się z usługą głównie przez potok nazwany Windows `OmnilinkerErpSync`, a gdy usługa
nie odpowiada przez potok, korzysta z tego API HTTP. Potok to wewnętrzny interfejs między dwiema częściami agenta,
a nie publiczne API: jego polecenia mogą się zmieniać między wersjami agenta. Do skryptów i monitorowania używaj tras
HTTP opisanych na tej stronie.

* **Kto może się połączyć:** SYSTEM, administratorzy i osoby zalogowane na komputerze, przy konsoli albo przez
  Pulpit zdalny.
* **Co mogą zrobić:** każdy połączony może odczytać status, logi i ustawienia. Polecenia, które zmieniają agenta,
  jego bazę danych ERP lub dane logowania albo go wstrzymują, wymagają członka grupy
  **Omnilinker ERP Sync Operators** albo administratora, którego aplikacja w zasobniku działa z podwyższonymi
  uprawnieniami. Pozostali dostają błąd „Only an administrator of this PC can do that.” (kod `Pipe:NotAllowed`).
  Zobacz [Kto może zmieniać agenta](/pl/erp/install-agent#kto-może-zmieniać-agenta).
* **Która usługa:** aplikacja w zasobniku rozmawia tylko z usługą Windows. Nie ufa innemu programowi, który otworzy
  potok o tej samej nazwie.
