Optima API Moduł: Ogólne (współdzielone)

Comarch Optima API: kontrahenci, endpointy REST, pola i synchronizacja

Comarch Optima kontrahenci API od WebArm udostępnia kartotekę klientów i dostawców przez REST/JSON: pobieranie po kodzie lub ID, tworzenie i aktualizacja pojedynczo albo batch do 100, usuwanie z weryfikacją zapisu, obsługę atrybutów oraz adresów. Każda operacja przechodzi przez oficjalną warstwę biznesową Optimy — ta sama walidacja co przy ręcznym zapisie w oknie Optimy. Nie piszesz bezpośrednio do bazy i nie musisz znać struktury tabel Comarcha.

· Optima API · Cennik

To fragment dokumentacji

Opisuje wybraną encję z polami COM i pułapkami wdrożeniowymi. Pełna dokumentacja 976 endpointów (Swagger / OpenAPI) dostarczana jest razem z Optima API. Zobacz wszystkie opisane encje →

Lista endpointów REST

11 endpointów HTTP/JSON. Każdy przechodzi przez walidację COM Comarch — taka sama walidacja jak przy ręcznej pracy w Optimie.

Metoda Endpoint Opis
GET /api/kontrahenci/{kod} Pobierz kontrahenta po unikalnym kodzie. Umożliwia odczyt danych kontrahenta bez bezpośredniego dostępu do SQL. Zwraca 404 jeśli nie istnieje.
GET /api/kontrahenci/id/{id} Pobierz kontrahenta po wewnętrznym ID Optimy, gdy integracja operuje identyfikatorem z dokumentu lub relacji systemowej.
POST /api/kontrahenci/ Dodaj nowego kontrahenta do systemu. Walidacja VAT, NIP, rodzaj. Weryfikacja zapisu po operacji.
POST /api/kontrahenci/batch batch Dodaj wielu kontrahentów jednym żądaniem (max 100) — jedna sesja, jeden zapis.
POST /api/kontrahenci/batch/read batch Pobierz listę kontrahentów po kodach (max 500). Nieznane kody są pomijane bez błędu.
PUT /api/kontrahenci/{kod} Aktualizuj kontrahenta — partial update. null = bez zmian, "" = wyczyść pole.
PUT /api/kontrahenci/batch/update batch Aktualizuj wiele kontrahentów jednym żądaniem (max 100).
DELETE /api/kontrahenci/{kod} Usuń kontrahenta. 204 tylko po weryfikacji zapisu potwierdzającej brak rekordu.
GET /api/kontrahenci/{kod}/atrybuty/ Pobierz wszystkie atrybuty przypisane do kontrahenta.
PUT /api/kontrahenci/{kod}/atrybuty/ Ustaw wartość atrybutu (tworzy lub aktualizuje istniejący).
DELETE /api/kontrahenci/{kod}/atrybuty/{atrybutKod} Usuń atrybut z kontrahenta. Weryfikacja zapisu potwierdza usunięcie.
Comarch Optima API: kontrahenci, REST, CRUD i batch

Co to jest kontrahent w Comarch Optima

Kontrahent w Optimie to dowolny podmiot zewnętrzny, z którym firma prowadzi obrót: klient (odbiorca), dostawca albo jedno i drugie. W module Handel kontrahent jest wymagany do każdego dokumentu sprzedaży i zakupu. W module Kasa/Bank — do każdej płatności i rozrachunku. W Księdze Handlowej — do analityki kosztów i przychodów.

Automatyzacja procesów w tej encji przyspiesza sprzedaż, fakturowanie, rozrachunki i księgowanie, bo jeden zapis kontrahenta może od razu zasilić dokumenty handlowe, płatności i raporty. W interfejsie Optimy kontrahenci siedzą w: Ogólne → Kontrahenci. Przez Optima API od WebArm nigdy nie piszesz bezpośrednio do bazy danych. Zamiast tego używasz HTTP — a serwer Optima API wywołuje pod spodem oficjalną warstwę biznesową Optimy, która robi dokładnie to, co operator klikający „Zapisz” w oknie kartoteki. WebArm utrzymuje kompatybilność Optima API z każdą nową wersją Comarch ERP Optima — Twoja integracja kontrahentów nie ląduje w ślepej uliczce przy upgrade.

Kartoteka kontrahentów Comarch Optima przez REST API Swagger UI z endpointem Optima API do testowania komunikatu JSON

Kiedy użyć API kontrahentów w Comarch Optima

Hasło Comarch Optima kontrahenci API dobrze opisuje sytuację, w której zewnętrzny system musi odczytywać lub zapisywać kartotekę klientów, dostawców, odbiorców B2B albo płatników bez ręcznego klikania w Optimie. Najczęściej chodzi o integrację CRM, sklepu internetowego, panelu B2B, WMS, marketplace albo drugiego systemu ERP.

Najważniejsza decyzja wdrożeniowa brzmi: który system jest źródłem prawdy dla danych kontrahenta. Jeśli źródłem jest sklep lub CRM, Optima API przyjmuje nowe dane przez POST /api/kontrahenci/ i aktualizacje przez PUT /api/kontrahenci/{kod}. Jeśli źródłem jest Comarch ERP Optima, zewnętrzny system powinien pobierać dane po kodzie, ID lub paczkami przez batch/read, a konflikty rozwiązywać w warstwie integracyjnej. Wybór źródła prawdy oznacza, że to ten system decyduje o ostatecznym kształcie danych w całym procesie integracji.

W praktyce API kontrahentów rzadko działa samotnie. Ten sam proces dotyka zwykle zamówień, faktury sprzedaży, dokumentów handlowych, towarów, płatności, rachunków bankowych i stanów magazynowych. Dlatego wdrożenie Web API powinno od razu określać, które dane idą z e-commerce do Optimy, które wracają z Optimy do CRM, a które są tylko odczytywane do raportów i monitoringu.

Takie Web API porządkuje integrację z innymi aplikacjami: e commerce, CRM, WMS, panelem B2B albo systemem zewnętrznym, umożliwiając wymianę danych pomiędzy systemami za pomocą API. W module Handel ten sam kontrahent pojawia się później na fakturach sprzedaży, dokumentach magazynowych, płatnościach i dokumentach handlowych, więc przed wdrożeniem trzeba ustalić także datę dokumentu, datę operacji, stawkę VAT, rachunki bankowe oraz reguły księgowe.

Nie jest to dokumentacja Comarch ERP XL. Jeżeli porównujesz Optimę z Comarch ERP XL, traktuj ten opis jako zakres dla kartoteki kontrahentów w Comarch ERP Optima i dla operacji wykonywanych przez Optima API, a nie jako wspólny kontrakt dla obu systemów.

Architektura integracji kontrahentów: system zewnętrzny, Web API i Comarch ERP Optima
Potrzeba biznesowaEndpoint Optima APICo sprawdzić przed wdrożeniem
Nowy klient z e-commerce trafia do OptimyPOST /api/kontrahenci/Reguła nadawania kodu, deduplikacja po NIP/e-mail, rodzaj kontrahenta.
CRM aktualizuje dane klienta B2BPUT /api/kontrahenci/{kod}Semantyka partial update: pole pominięte i null nie zmieniają wartości, pusty string czyści pole.
Migracja kartoteki klientów z innego ERPPOST /api/kontrahenci/batchPaczki do 100 rekordów, mapowanie adresów, status błędu per rekord.
Aplikacja B2B pobiera tylko wybranych klientówPOST /api/kontrahenci/batch/readLista kodów lub identyfikatorów po stronie aplikacji i zachowanie dla brakujących rekordów.
Segmentacja klientów, limity lub scoring/api/kontrahenci/{kod}/atrybuty/Definicje atrybutów w Optimie, format wartości i odpowiedzialność za aktualizację.

Taki zakres odróżnia stronę encji od ogólnego opisu integracji. Tutaj chodzi o konkretny kontrakt REST dla kartoteki kontrahentów: metody HTTP, pola DTO, batch, atrybuty, adres i zachowanie Optimy po zapisie.

Jeżeli firma ma starszą integrację opartą o obiekty COM albo bezpośrednie zapytania do bazy danych SQL, Optima API porządkuje implementację integracji: jedno REST API, jedna autoryzacja, jawne błędy i powtarzalne wykonywanie operacji. SOAP i XML warto zostawić tylko tam, gdzie są już elementem starszego B2B; dla nowych integracji kontrahentów bezpieczniejszy jest kontrakt HTTP/JSON z walidacją Optimy. To ułatwia rozwój automatyzacji, bo aplikacje zewnętrzne nie muszą znać wewnętrznych tabel Comarcha.

Jak synchronizować kontrahentów w systemie Comarch ERP Optima

Synchronizacja kontrahentów w ERP powinna łączyć trzy elementy: stabilny identyfikator klienta, deduplikację po NIP lub e-mailu oraz zapis przez mechanizmy Comarch ERP Optima. Do integracji z Comarch Optima najczęściej wykorzystuje się REST API, webservice albo dedykowaną warstwę pośredniczącą, która odpowiada za autoryzację, mapowanie pól i obsługę błędów. WebArm realizuje to przez Optima API i VerSync: CRM, sklep internetowy, panel B2B albo drugi ERP wysyła zmianę kontrahenta, a warstwa integracyjna decyduje, czy wykonać POST, PUT czy batch update.

Jeżeli szukasz firmy, która pomoże w synchronizacji kontrahentów w ERP, zwróć uwagę nie tylko na samo połączenie systemów. Ważne są konflikty danych, retry błędów, audyt zmian, mapa pól i jasne reguły, który system jest źródłem prawdy. WebArm oferuje usługi integracyjne obejmujące wdrożenie, konfigurację oraz bieżące wsparcie synchronizacji Comarch ERP Optima z innymi systemami. Synchronizację kontrahentów łączy z dokumentami, płatnościami, cennikami i zamówieniami zamiast traktować kartotekę klienta jako izolowaną tabelę.

ScenariuszZalecany mechanizm
Nowy klient ze sklepuPOST /api/kontrahenci/ przed utworzeniem faktury lub zamówienia.
Aktualizacja danych z CRMPUT /api/kontrahenci/{kod} z partial update i kontrolą pól pustych.
Import wielu klientówPOST /api/kontrahenci/batch do 100 rekordów w jednym żądaniu.
DeduplikacjaOdczyt kandydatów, porównanie NIP/e-mail i zapis atrybutu kontrolnego.
Stała synchronizacjaPipeline VerSync: webhook, kolejka, retry, logi i monitoring.

Struktura zasobów

  • /api/kontrahenci/ — create, create-batch, read-batch, update-batch
  • /api/kontrahenci/{kod} — get, update, delete pojedynczego kontrahenta
  • /api/kontrahenci/id/{id} — get po wewnętrznym ID Optimy
  • /api/kontrahenci/{kod}/atrybuty/ — lista i ustawianie atrybutów
  • /api/kontrahenci/{kod}/atrybuty/{atrybutKod} — usunięcie pojedynczego atrybutu

Lista wszystkich endpointów z opisami — w sekcji Endpointy powyżej.

Przykład: utworzenie kontrahenta i dokumentów powiązanych

Minimalny payload (tylko wymagane):

curl -X POST https://optima.twoja-firma.pl/api/kontrahenci/ \
  -H "X-Api-Key: <klucz>" \
  -H "X-Optima-Firma: FIRMA_GLOWNA" \
  -H "Content-Type: application/json" \
  -d '{
    "kod": "ACME001",
    "nazwa1": "ACME Sp. z o.o.",
    "nip": "5732233120",
    "nipKraj": "PL",
    "rodzaj": 0
  }'

Po utworzeniu kontrahenta ten sam proces może od razu przejść do dokumentów powiązanych: faktury sprzedaży, zamówienia, płatności albo dokumentu magazynowego. W praktyce najważniejsze jest zachowanie tego samego kodu kontrahenta, NIP-u i reguł płatności w całym przepływie.

Rozszerzony payload kontrahenta zwykle obejmuje:

Obszar danychPrzykładowe polaUwagi wdrożeniowe
Identyfikacjakod, nazwa1, nazwa2, nip, nipKrajKod jest kluczem biznesowym, a NIP służy głównie do deduplikacji.
Kontakt i adresemail, telefon1, ulica, miasto, kodPocztowyAdres jest obiektem zagnieżdżonym; integracja musi mapować go świadomie.
Rozliczeniacennik, termin, formaPlatnosciId, rachunekNrTe pola wpływają na faktury sprzedaży, dokumenty handlowe i rozrachunki.
Atrybutysegment, limit, źródłoDanychAtrybuty lepiej aktualizować osobnym endpointem, jeśli zmieniają się niezależnie od kartoteki.

Odpowiedź (HTTP 201 Created): pełny obiekt KontrahentDto z polami nadanymi przez Optimę (id, pola computed nazwaPolaczona, nipPelny) oraz wartościami, które Optima mogła uzupełnić po walidacji.

Przykład: aktualizacja z partial update

Chcesz zmienić tylko email i wyczyścić domyślny rachunek:

curl -X PUT https://optima.twoja-firma.pl/api/kontrahenci/ACME001 \
  -H "X-Api-Key: <klucz>" \
  -H "X-Optima-Firma: FIRMA_GLOWNA" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "rachunekNr": ""
  }'

Semantyka pól:

Wartość w JSONZnaczenie
pole pominięteBrak zmiany
nullBrak zmiany
"" (pusty string)Wyczyść pole (gdzie to dozwolone — np. rachunekNr, email, url)
konkretna wartośćUstaw na tę wartość

To jest kluczowa różnica względem większości REST API, gdzie null i "" traktowane są tak samo.

Przykład: batch create 100 kontrahentów

POST /api/kontrahenci/batch
{
  "items": [
    { "kod": "K0001", "nazwa1": "Firma A", "nip": "1111111111", "nipKraj": "PL", "rodzaj": 0 },
    { "kod": "K0002", "nazwa1": "Firma B", "nip": "2222222222", "nipKraj": "PL", "rodzaj": 0 },
    ...
  ]
}

Limit: 100 pozycji na żądanie. Jedna sesja, jeden zapis — rząd wielkości szybciej niż 100 pojedynczych POST-ów. Odpowiedź zawiera status per pozycję — jeśli 3 się nie uda (np. duplikat kodu), dostaniesz 201 z listą 97 sukcesów i 3 błędów.

Integracja z VerSync od WebArm — orkiestracja synchronizacji

Optima API od WebArm daje Ci endpointy. VerSync od WebArm daje gotowy silnik, który:

  • mapuje Twoje pola zewnętrzne (z CRM, sklepu, innego ERP) na strukturę KontrahentDto,
  • decyduje, kiedy POST (nowy), a kiedy PUT (aktualizacja),
  • obsługuje dedup po NIP, emailu lub custom rule,
  • monitoruje konflikty i retry’uje błędy,
  • pozwala konfigurować real-time sync (webhook → queue → Optima) albo batch.

Jeśli robisz integrację dla jednego klienta — Optima API od WebArm wystarczy. Jeśli zarządzasz synchronizacją dla wielu klientów albo chcesz silnik, który nie wymaga kodowania pipeline’u od zera — zobacz VerSync od WebArm.

Dlaczego przez oficjalną warstwę Optimy

Optima API od WebArm wymusza zapis przez oficjalną warstwę biznesową Optimy. Mogłoby pisać bezpośrednio do bazy danych — byłoby szybsze. Nie robi tego, bo:

  • Walidacja biznesowa — Comarch sprawdza NIP, kody kraju, unikalność, relacje. Bezpośredni zapis to pomija.
  • Event handlers — niektóre pola wyzwalają inne zmiany (np. zmiana grupy aktualizuje limity). Bezpośredni zapis to omija.
  • Kompatybilność między wersjami — schemat bazy może zmieniać się przy aktualizacjach Optimy. Wykorzystanie oficjalnej warstwy stabilizuje API.
  • Gwarancja Comarcha — bezpośredni zapis do bazy powoduje utratę wsparcia Comarcha przy problemach.

Komunikacja z API powinna odbywać się przez HTTPS, a dostęp do firmy i użytkownika powinien być ograniczony tokenem lub kluczem API. Dzięki temu integracja nie udostępnia bezpośrednio serwera SQL, tylko kontrolowany serwer obsługujący API, logi, limity i walidację operacji. Ten sam wzorzec można później wykorzystać do eksportu dokumentów, pobierania PDF-ów albo automatycznego tworzenia dokumentów handlowych powiązanych z kontrahentem.

Dodatkowo po każdym zapisie Optima API od WebArm robi weryfikację zapisu — czyta z Optimy to, co właśnie zapisało, i porównuje z request. Jeśli Optima po cichu zmieniła wartość (np. zignorowała pole rodzaj), zwraca 400 zamiast udawać, że wszystko się powiodło. To kosztuje dodatkowy round-trip, ale chroni przed dryfem między Twoją integracją a stanem w Optimie.

Kiedy się tego używa w praktyce

Typowe sytuacje, w których integracja przez REST API oszczędza dni pracy programistycznej.

Import klientów ze sklepu e-commerce

Nowe zamówienie w sklepie z nowym klientem — POST /api/kontrahenci/ zakłada go w Optimie przed utworzeniem faktury sprzedaży. Deduplikacja po polu nip lub email w warstwie integracyjnej.

Synchronizacja CRM ↔ ERP w czasie rzeczywistym

Zmiana w HubSpot / Pipedrive → webhook → PUT /api/kontrahenci/{kod} z partial update. Zmiana w Optimie → polling GET + diff → update w CRM. Versync orkiestruje cały cykl.

Masowy import z Excela lub innego ERP

POST /api/kontrahenci/batch z 100 pozycjami jednym żądaniem. Jedna sesja, jeden zapis — wielokrotnie szybsze niż create pojedynczo.

Deduplikacja po NIP

POST /api/kontrahenci/batch/read z listą kodów-kandydatów, potem porównanie NIP-ów i oznaczenie duplikatów przez atrybuty.

Aktualizacja limitów kupieckich i terminów płatności

Zmiana polityki kredytowej w firmie — PUT /api/kontrahenci/batch/update z listą kontrahentów i nowymi wartościami pól termin i formaPlatnosciId.

Custom pola biznesowe przez atrybuty

Potrzebujesz pola, którego nie ma w standardzie Optimy (np. 'segment klienta', 'NPS score')? Definiujesz atrybut w Optimie, ustawiasz wartości przez PUT /api/kontrahenci/{kod}/atrybuty/.

Czego nie ma w oficjalnej dokumentacji Comarch

Wiedza z realnych wdrożeń — rzeczy, na których inaczej się przewrócisz.

Kod jest kluczem biznesowym, nie ID

Większość operacji używa pola kod w URL, nie wewnętrznego ID. Kod musi być unikalny w obrębie firmy i nadajesz go sam przy tworzeniu. Wewnętrzne ID istnieje i jest dostępne przez /id/{id}, ale w integracjach używa się go rzadko — głównie w relacjach z dokumentami.

Rodzaj: tylko 0, 1, 2

Endpoint wymusza jedną z trzech wartości pola rodzaj (0 = odbiorca+dostawca, 1 = odbiorca, 2 = dostawca). Po zapisie API robi weryfikację — jeśli Optima z jakiegoś powodu zmieniła rodzaj (np. konflikt z definicjami), dostaniesz 400 zamiast cichego powrotu innej wartości.

Helper fields vs pola bezpośrednie — nie łącz

nazwaPolaczona i nipPelny to pola pomocnicze — API rozparsuje je i zapisze do odpowiednich pól docelowych (nazwa1/2/Pełna, nip/nipKraj). Jeśli w tym samym żądaniu podasz równocześnie nazwaPolaczona i nazwa1, dostaniesz 400 przed zapisem. Używaj jednej z dwóch reprezentacji.

Partial update: null vs empty string

Przy PUT kontrahenta semantyka jest precyzyjna: pole pominięte lub null = nie zmieniaj. Pusty string "" = wyczyść pole. Dla rachunekNr pusty string usuwa domyślny rachunek bankowy. Większość frameworków traktuje null i '' tak samo — tutaj nie można.

DELETE z weryfikacją zapisu

DELETE zwraca 204 dopiero gdy Optima API potwierdzi, że rekord rzeczywiście zniknął. Jeśli operacja usunięcia się powiodła, ale rekord nadal jest widoczny (np. cache, transakcja), dostaniesz 400 — nie 204. To jest feature: lepiej dostać błąd niż fałszywe potwierdzenie usunięcia.

Batch nie jest asynchroniczny

POST /batch to nadal synchroniczne wywołanie — czeka na zakończenie całej operacji. Max 100 dla create/update, max 500 dla read. Przy większych zbiorach dziel na paczki w warstwie klienta.

Adres jest obiektem zagnieżdżonym, nie polami płaskimi

Niektóre prostsze integracje oczekują płaskiej struktury (ulica, miasto, kod jako osobne property). Tutaj adres to zagnieżdżony obiekt AdresDto — warstwa mapująca w Twoim kodzie musi o tym wiedzieć.

Atrybuty mają własny endpoint

Możesz ustawiać atrybuty przy create/update kontrahenta, ale lepszą praktyką jest używanie /api/kontrahenci/{kod}/atrybuty/ — mniej payloadu, lepsze error handling per atrybut, możliwość zmiany jednego atrybutu bez modyfikacji głównej encji.

Częste pytania

Czy Comarch Optima ma API do kontrahentów?

Standardowa instalacja Comarch ERP Optima nie udostępnia publicznego REST API do kartoteki kontrahentów. Optima API od WebArm dodaje lokalny serwer HTTP/JSON, który obsługuje kontrahentów przez endpointy GET, POST, PUT, DELETE i batch, z walidacją przez oficjalną warstwę biznesową Optimy.

Czy muszę mieć licencję Comarch Optima, żeby korzystać z API?

Tak — Optima API to warstwa nad Comarch ERP Optima, nie alternatywa. Pod spodem musi działać licencjonowana instalacja Optimy. Optima API dodaje do niej REST oraz warstwę walidacji i weryfikacji zapisu.

Co się dzieje, gdy dwóch klientów jednocześnie wysyła PUT na tego samego kontrahenta?

Optima API szereguje operacje wewnętrznie — nie ma race condition na poziomie API. Jeśli obaj chcą zapisać te same pola, ostatni wygrywa (last-write-wins). Dla deduplikacji logicznej używaj atrybutów kontroli wersji lub zewnętrznego locka.

Jak synchronizować tylko zmienionych kontrahentów od ostatniego pobrania?

Dla kontrahentów nie ma dedykowanego endpoint /sync z kursorem — polling po ID lub po dacie modyfikacji (jeśli jest atrybut). Dla większych wolumenów lepsze podejście: webhook po zmianie w źródle + PUT/POST na Optima API.

Ile trwa batch create 100 kontrahentów?

W typowej instalacji 2–6 sekund w zależności od atrybutów i sprzętu. Jedna sesja i jeden zapis to wielokrotnie szybsze niż 100 pojedynczych requestów (każdy tworzyłby nową sesję).

Czy mogę mieć wielu kontrahentów z tym samym NIP-em?

Tak — Optima nie wymusza unikalności NIP (np. przy oddziałach tej samej firmy z różnymi rachunkami). Unikalny jest tylko kod kontrahenta. Deduplikację po NIP robisz w warstwie biznesowej.

Jak obsłużyć kontrahenta osoby fizycznej (imię + nazwisko)?

Użyj pary nazwa1 (imię) + nazwa2 (nazwisko) lub nazwaPolaczona (pełne imię nazwisko). Pole pesel zostawisz wypełnione, nip i regon — puste. rodzaj zazwyczaj 1 (odbiorca) dla B2C.

Potrzebujesz integracji z Optimą?

Uruchomimy Optima API u Ciebie lub u Twojego klienta. Licencja jednorazowa, roczny serwis kompatybilności, pełny dostęp do Swagger i wsparcie wdrożeniowe.