API — Zewnętrzne zapasy (External Inventory)

Interfejs OData v4 dla zewnętrznych dostawców do przesyłania danych o zapasach do Business Central — endpoint, autoryzacja i przykłady zapytań.

Strona API N24I Ext. Inv. Entry API umożliwia zewnętrznym dostawcom i magazynom przesyłanie danych o stanach magazynowych do Business Central za pomocą standardowego interfejsu OData v4.

🔗 Endpoint

https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{środowisko}/api/nav24/advancedInventory/v1.0/companies({companyId})/externalInventoryEntries
Parametr Wartość
Publisher nav24
Group advancedInventory
Version v1.0
Entity externalInventoryEntries
Klucz OData entryNo

⚡ Obsługiwane operacje

Operacja Metoda HTTP Opis
Odczyt wszystkich wpisów GET Zwraca listę wpisów
Odczyt pojedynczego wpisu GET .../({entryNo}) Zwraca jeden wpis
Dodanie wpisu POST Tworzy nowy wpis
Aktualizacja wpisu PATCH .../({entryNo}) Aktualizuje istniejący wpis
Usunięcie wpisu DELETE .../({entryNo}) Usuwa wpis

🔑 Autoryzacja

API wymaga autoryzacji OAuth2 z typem Client Credentials (aplikacja do aplikacji).

Wymagane uprawnienie Azure AD:

  • Dynamics 365 Business CentralFinancials.ReadWrite.All (application permission)
POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id={clientId}
&client_secret={clientSecret}
&scope=https://api.businesscentral.dynamics.com/.default

💡 Przykłady

GET — odczyt wszystkich wpisów

GET .../externalInventoryEntries
Authorization: Bearer {token}
Accept: application/json

POST — dodanie nowego wpisu

POST .../externalInventoryEntries
Authorization: Bearer {token}
Content-Type: application/json

{
  "vendorNo": "VENDOR-001",
  "itemNo": "ITEM-001",
  "externalItemNo": "EXT-001",
  "lotNo": "LOT-2026-001",
  "palletNo": "PAL-001",
  "quantity": 100
}

Odpowiedź zawiera nadany entryNo oraz @odata.etag wymagany przy kolejnych operacjach PATCH i DELETE.

PATCH — aktualizacja ilości

PATCH .../externalInventoryEntries(42)
Authorization: Bearer {token}
Content-Type: application/json
If-Match: {etag}

{
  "quantity": 250
}

DELETE — usunięcie wpisu

DELETE .../externalInventoryEntries(42)
Authorization: Bearer {token}
If-Match: {etag}

📝 Uwagi techniczne

  • Pole vendorNo i itemNo nie są walidowane względem słowników BC — dostawca może podać własne identyfikatory.
  • Pole entryNo jest nadawane automatycznie i jest tylko do odczytu.
  • Nagłówek If-Match z wartością @odata.etag jest wymagany przy operacjach PATCH i DELETE — zabezpiecza przed równoczesną edycją.
  • Przy operacji POST pola vendorName i itemDescription są uzupełniane automatycznie, jeśli vendorNo / itemNo istnieje w BC.