ApiFamily

/realizacje

Realizacje i wdrożenia

Projekty opisujemy bez nazw klientów — część z nich objęta jest umową o zachowaniu poufności. Zostawiamy to, co dla Ciebie najistotniejsze: z czym system został połączony, na czym polegała trudność i co się zmieniło po wdrożeniu.

Sztuczna inteligencja

Integracje modeli sztucznej inteligencji

Modele językowe wpięte w istniejący proces tam, gdzie realnie skracają pracę: odczyt danych z dokumentów, klasyfikacja zgłoszeń, treści na wiele rynków, wyszukiwanie po sensie zdania.

Większość zapytań o „dodanie AI" po rozmowie okazuje się jednym z czterech konkretnych zadań: przepisać dane z dokumentu do systemu, posegregować napływające zgłoszenia, napisać tekst według wzoru albo znaleźć coś we własnych materiałach, kiedy nie zna się dokładnych słów. Do każdego z nich model językowy nadaje się dobrze — pod warunkiem, że jest częścią procesu, a nie ozdobą przyklejoną na wierzchu.

Podłączamy modele OpenAI (GPT i ChatGPT), Google Gemini oraz Anthropic Claude do systemów, które już u Ciebie działają. Model nie zastępuje aplikacji: dostaje wąsko określone zadanie, zwraca wynik w ustalonej strukturze i oddaje sterowanie kodowi, który wie, co z tym wynikiem zrobić.

Co wdrażamy najczęściej: odczyt faktur, zamówień i maili do gotowych rekordów zamiast ręcznego przepisywania; klasyfikację i kierowanie zgłoszeń do właściwej osoby; generowanie oraz tłumaczenie opisów produktów dla wielu rynków jednocześnie; wyszukiwanie semantyczne po dokumentacji i historii korespondencji; streszczenia długich wątków przed przekazaniem sprawy dalej.

Model językowy jest niedeterministyczny — na to samo pytanie potrafi odpowiedzieć inaczej i potrafi odpowiedzieć pewnym tonem rzecz nieprawdziwą. Dlatego odpowiedzi nie przyjmujemy na słowo: wymuszamy ustaloną strukturę wyniku, sprawdzamy ją schematem i odrzucamy to, co się nie zgadza. Przy operacjach nieodwracalnych — wystawieniu dokumentu, wysłaniu pieniędzy, skasowaniu danych — model przygotowuje propozycję, a zatwierdza człowiek. To nie brak zaufania do technologii, tylko ta sama zasada, którą stosujemy przy integracjach płatności.

Drugi realny problem to koszt i limity. Każde zapytanie kosztuje, a limity dostawcy kończą się właśnie wtedy, gdy ruch jest największy. Buforujemy powtarzalne odpowiedzi, skracamy przekazywany kontekst do tego, co potrzebne, kolejkujemy zadania, które nie muszą wykonać się natychmiast, i dobieramy model do trudności zadania — do prostej klasyfikacji nie trzeba najdroższego.

Trzeci to uzależnienie od jednego dostawcy. Modele, ceny i limity zmieniają się kilka razy w roku, dlatego zawsze budujemy warstwę pośrednią: aplikacja mówi „sklasyfikuj to zgłoszenie", nie „wyślij zapytanie do konkretnego API". Zmiana modelu albo dostawcy jest wtedy zmianą konfiguracji, a nie przepisywaniem aplikacji, i da się ustawić rezerwowego dostawcę na wypadek awarii.

Osobna rozmowa dotyczy danych osobowych. Wysłanie treści do modelu oznacza przekazanie jej zewnętrznemu podmiotowi, często poza Europejski Obszar Gospodarczy — potrzebna jest umowa powierzenia i wpis w rejestrze czynności przetwarzania. Technicznie ograniczamy zakres: usuwamy z treści dane, które modelowi nie są do niczego potrzebne, zanim opuści ona Twój serwer. O tym mówimy na pierwszym spotkaniu, nie po wdrożeniu.

Co to dało

  • Dokumenty odczytywane automatycznie, z kontrolą człowieka tam, gdzie decyzja jest nieodwracalna.
  • Zmiana modelu lub dostawcy bez przepisywania aplikacji, z możliwością przełączenia na rezerwowego.
  • Koszt zapytań pod kontrolą — bufor, kolejki, krótszy kontekst i tańszy model tam, gdzie wystarcza.
  • Odpowiedzi weryfikowane schematem, więc błąd modelu nie wchodzi cicho do bazy danych.
  • Dane osobowe ograniczone do minimum przed wysłaniem do dostawcy.
  • PHP 8
  • REST API
  • Strumieniowanie SSE
  • Kolejki zadań
  • Wyszukiwanie wektorowe
  • PostgreSQL
  • Redis
  • Docker

Automatyzacja pracy z dokumentami i treścią

Połączone systemy 3

  • OpenAI GPT
  • Google Gemini
  • Anthropic Claude

Integracje logistyczne

Integracje przewoźników i operatorów logistycznych

Jedna warstwa nadawcza dla siedmiu przewoźników — od wyboru punktu odbioru, przez wydruk etykiety, po numer przesyłki wracający do klienta.

Każdy przewoźnik ma własne API, własny słownik pojęć i własne wyobrażenie o tym, jak wygląda przesyłka. Jeden wymaga wagi z dokładnością do grama, drugi wymiarów opakowania, trzeci kodu punktu odbioru w formacie, którego nie zwraca żadna z jego własnych wyszukiwarek. Podłączenie każdego z osobna do systemu sprzedaży kończy się siedmioma niezależnymi kawałkami kodu, które psują się w różnych momentach.

Zbudowaliśmy jedną warstwę nadawczą, która przyjmuje zamówienie w formacie wewnętrznym i sama tłumaczy je na wymagania wybranego przewoźnika. Dodanie ósmego oznacza napisanie jednego adaptera, a nie przerabianie obsługi wysyłek w całym systemie.

Obsługujemy pełny cykl życia przesyłki: sprawdzenie dostępności usługi pod danym adresem, wybór paczkomatu lub punktu odbioru wraz z aktualną listą lokalizacji, generowanie etykiety i listu przewozowego, manifesty dla kuriera, śledzenie statusu, zwroty oraz przesyłki pobraniowe.

Całość działa na kolejce zadań z ponawianiem. Gdy API przewoźnika przestaje odpowiadać — a przestaje regularnie, zwłaszcza w szczycie przedświątecznym — zamówienia nie znikają, tylko czekają na ponowną próbę. Każda operacja ma klucz idempotencji, więc powtórzone zdarzenie nie tworzy drugiej etykiety na tę samą paczkę.

Co to dało

  • Zmiana przewoźnika dla zamówienia bez ingerencji w kod sprzedaży.
  • Awaria po stronie przewoźnika nie gubi wysyłek — odkłada je do ponowienia.
  • Jeden komplet etykiet, statusów i zwrotów niezależnie od operatora.
  • Pełny log wymiany danych — każdą przesyłkę da się odtworzyć krok po kroku.
  • PHP 8
  • REST API
  • SOAP
  • MySQL
  • Redis
  • Kolejki zadań
  • Webhooks
  • Docker

E-commerce / logistyka

Połączone systemy 7

  • InPost
  • Paxy
  • Olza Logistic
  • DHL
  • Poczta Polska
  • ID Logistics
  • ROHLIG SUUS Logistics

Integracje płatności

Integracje bramek płatniczych na rynki europejskie

Jedenaście metod płatności w kilku krajach — z metodami dobieranymi automatycznie do rynku, na którym stoi klient.

Płatności to obszar, w którym „prawie działa" nie istnieje. Albo pieniądze są zaksięgowane i zamówienie ruszyło dalej, albo klient zapłacił i nie ma potwierdzenia — a to kończy się telefonem do obsługi i zwrotem.

Dobór metod płatności jest przy tym lokalny: w Polsce podstawą jest Blik, w Holandii iDEAL, w Belgii Bancontact, w Szwecji Swish, w Danii i Finlandii MobilePay, w krajach bałtyckich Montonio. Klient, który nie widzi metody, jakiej używa codziennie, po prostu porzuca koszyk. Zbudowaliśmy warstwę, która wybiera dostępne metody na podstawie rynku i waluty, więc każdy sklep w grupie pokazuje to, co dla jego kraju naturalne — bez osobnego kodu na kraj.

Po stronie technicznej obsługujemy inicjowanie płatności, powiadomienia zwrotne o zaksięgowaniu, zwroty pełne i częściowe, płatności odroczone oraz uzgadnianie rozliczeń z wyciągiem operatora. Status zamówienia zmienia wyłącznie potwierdzenie przyszłe z bramki, nigdy powrót klienta do sklepu — bo przeglądarkę można zamknąć w dowolnym momencie.

Powiadomienia bywają wysyłane po kilka razy, więc każde jest rozpoznawane po kluczu idempotencji. Ponowne doręczenie tego samego zdarzenia nie tworzy drugiej faktury ani drugiej wysyłki.

Co to dało

  • Metody płatności dopasowane do rynku bez osobnej gałęzi kodu na kraj.
  • Status zamówienia oparty na potwierdzeniu z bramki, nie na powrocie klienta.
  • Zwroty i rozliczenia w jednym miejscu, niezależnie od operatora.
  • Odporność na wielokrotnie doręczane powiadomienia.
  • PHP 8
  • REST API
  • Webhooks
  • OAuth 2.0
  • PostgreSQL
  • Kolejki zadań
  • Idempotencja

E-commerce międzynarodowy

Połączone systemy 11

  • Blik
  • PayU
  • Tpay
  • PayPal
  • Swish
  • MobilePay
  • iDEAL
  • Bancontact
  • Apple Pay
  • Google Pay
  • Montonio

Integracje ERP

Integracje systemów ERP i księgowych

Połączenie sprzedaży internetowej z systemami, w których firma faktycznie prowadzi magazyn i księgowość — bez przepisywania dokumentów ręcznie.

Systemy ERP i księgowe zwykle stały w firmie długo przed sklepem i nikt ich nie wymieni tylko dlatego, że pojawiła się sprzedaż online. Trzeba więc połączyć dwa światy: aplikację webową działającą non stop w internecie i program księgowy pracujący na serwerze w siedzibie, często z bazą, do której nie ma dostępu z zewnątrz.

Każdy z tych systemów udostępnia dane inaczej — jeden przez dedykowany interfejs programistyczny, inny przez usługę sieciową, jeszcze inny właściwie tylko przez własną bazę danych. Dlatego integracja nie polega na „podłączeniu API", a na zaprojektowaniu wymiany, która przetrwa aktualizację systemu po drugiej stronie.

Zakres, który przenosimy w obie strony: kartoteki towarowe i cenniki, stany magazynowe, kontrahenci, zamówienia, dokumenty sprzedaży i magazynowe, płatności i rozrachunki. Kluczowa decyzja przy każdym wdrożeniu to ustalenie, co jest źródłem prawdy dla której danej — bez tego dwa systemy zaczynają się nadpisywać i po tygodniu nikt nie wie, który stan magazynowy jest prawdziwy.

Wymiana jest asynchroniczna i logowana. Konflikty nie są rozstrzygane po cichu — trafiają do rejestru z informacją, które pole i z której strony próbowało się zmienić.

Co to dało

  • Zamówienia i dokumenty bez ręcznego przepisywania między systemami.
  • Jedno ustalone źródło prawdy dla stanów, cen i kontrahentów.
  • Konflikty widoczne w rejestrze, a nie nadpisywane bez śladu.
  • Wymiana odporna na chwilową niedostępność systemu w siedzibie firmy.
  • PHP 8
  • MS SQL
  • MySQL
  • SOAP
  • REST API
  • Kolejki zadań
  • Windows Server

Handel i produkcja

Połączone systemy 4

  • Subiekt GT
  • Enova 365
  • Comarch ERP
  • Symfonia

Integracje domenowe

Integracje rejestratorów domen

Automatyczna obsługa cyklu życia domeny: sprawdzenie dostępności, rejestracja, odnowienie, transfer i zarządzanie rekordami DNS.

Rejestracja domeny wygląda z zewnątrz jak jedno kliknięcie, a w praktyce jest procesem rozłożonym w czasie, w którym niemal każdy krok może się nie udać po stronie rejestru. Domena bywa zajęta w sekundę między sprawdzeniem a rejestracją, transfer wymaga kodu autoryzacji i potwierdzenia, a odnowienie ma nieprzekraczalny termin, po którym adres przechodzi w okres wykupu.

Zintegrowaliśmy system z rejestrami tak, żeby cały ten cykl działał bez ręcznej obsługi: sprawdzanie dostępności, rejestracja, odnawianie, transfer między rejestratorami, aktualizacja danych abonenta i zarządzanie rekordami DNS.

Operacje na domenach są nieodwracalne albo kosztowne, dlatego każda przechodzi przez kolejkę z jednoznacznym stanem i pełnym logiem odpowiedzi rejestru. Nie ma sytuacji, w której system „chyba" zarejestrował domenę — albo jest potwierdzenie, albo zadanie czeka z konkretnym błędem.

Osobno obsłużone są terminy: przypomnienia przed wygaśnięciem, automatyczne odnowienia i wyraźne oznaczenie domen, które weszły w okres wykupu i wymagają decyzji człowieka.

Co to dało

  • Rejestracja i odnawianie domen bez udziału obsługi.
  • Jednoznaczny stan każdej operacji — koniec z „chyba się udało".
  • Przypomnienia i automatyczne odnowienia zamiast pilnowania terminów w arkuszu.
  • Zarządzanie rekordami DNS z panelu, bez logowania do rejestratora.
  • PHP 8
  • EPP
  • REST API
  • MySQL
  • Kolejki zadań
  • Linux

Hosting / usługi internetowe

Połączone systemy 2

  • NASK
  • EuroDNS

/udział w projektach

Projekty, w których byliśmy częścią zespołu

Poniższych systemów nie przedstawiamy jako własnych realizacji, bo nie były nasze w całości — pracowaliśmy w nich jako jeden z programistów, odpowiadając za konkretne fragmenty. Dlatego opisujemy wyłącznie zakres swojej pracy, bez nazw firm i serwisów.

Backend i logika porównywania ofert

Porównywarka ofert usług telekomunikacyjnych

Serwis porównujący oferty internetu, telewizji i telefonu. Trudność nie polega tu na wyświetleniu tabeli, a na tym, że dostępność usługi zależy od konkretnego adresu, a cena od kombinacji usług w pakiecie, długości umowy i trwających promocji.

Za co odpowiadaliśmy

  • Model danych ofert, pakietów i promocji z uwzględnieniem dostępności pod adresem.
  • Silnik porównywania i filtrowania wyników po parametrach usługi.
  • Import i normalizacja cenników pochodzących z różnych źródeł.
  • Obsługa zgłoszeń zainteresowania i przekazywanie ich dalej.
  • PHP
  • MySQL
  • REST API

Backend, wielorynkowość i integracje

Sklep internetowy z artykułami premium — 24 domeny na rynki zagraniczne

Sklep działający pod dwudziestoma czterema domenami obsługującymi rynki europejskie i pozaeuropejskie. Jedno wdrożenie, jeden asortyment, ale każdy rynek ma własną walutę, język, stawki podatku, metody płatności i dostawy oraz własne wymogi formalne.

Największym wyzwaniem w takim układzie jest utrzymanie jednego kodu dla wszystkich rynków. Każdy wyjątek „tylko dla tego kraju" wpisany na sztywno mnoży się później przez dwadzieścia cztery przy każdej zmianie.

Za co odpowiadaliśmy

  • Konfiguracja rynków: waluty, języki, podatki, metody płatności i dostawy.
  • Wspólna baza produktów z tłumaczeniami i cenami zależnymi od rynku.
  • Integracje płatności i przewoźników dobierane automatycznie do kraju.
  • Obsługa zamówień i zwrotów w układzie wielorynkowym.
  • Optymalizacja wydajności przy rosnącej liczbie domen i wariantów.
  • PHP
  • MySQL
  • REST API
  • Redis

Backend systemu i portalu partnerskiego

System zarządzania sprzętem w sieci sprzedaży oraz portal dla partnerów

Producent z branży FMCG udostępnia punktom sprzedaży własny sprzęt chłodniczy — lodówki i zamrażarki rozstawione w sieci liczącej tysiące lokalizacji. Każde urządzenie trzeba przypisać do punktu, serwisować, przenosić, wycofywać z użycia i rozliczać.

Drugą częścią pracy był webowy portal do komunikacji z partnerami handlowymi — miejsce, w którym punkt sprzedaży ma dostęp do swoich danych, dokumentów i zgłoszeń bez telefonowania do przedstawiciela.

Za co odpowiadaliśmy

  • Ewidencja sprzętu: przypisanie do lokalizacji, historia przenosin i statusy.
  • Obsługa zgłoszeń serwisowych i planowanie przeglądów.
  • Portal partnerski: dane punktu, dokumenty, zgłoszenia, komunikacja.
  • Raporty dla przedstawicieli handlowych i działu serwisu.
  • PHP
  • MySQL
  • REST API

Backend obsługi usług hostingowych i domen

System dla firmy hostingowej

Panel do sprzedaży i obsługi usług hostingowych: zakładanie kont, zarządzanie usługami, rejestracja i odnawianie domen oraz instalacja aplikacji na serwerze klienta.

W tego typu systemie każda operacja dotyka realnej infrastruktury — założenie konta, przekierowanie domeny, uruchomienie strony. Nieudane wykonanie w połowie zostawia usługę w stanie nieokreślonym, więc procesy muszą mieć jednoznaczne stany i możliwość bezpiecznego ponowienia.

Za co odpowiadaliśmy

  • Obsługa cyklu życia usługi hostingowej: zamówienie, uruchomienie, odnowienie, wygaśnięcie.
  • Rejestracja i odnawianie domen z komunikacją z rejestrami.
  • Automatyczna instalacja i aktualizacja aplikacji typu CMS.
  • Panel klienta oraz narzędzia dla obsługi technicznej.
  • PHP
  • MySQL
  • Linux
  • REST API

/zakres

Nad czym jeszcze pracujemy

Poza opisanymi wyżej wdrożeniami realizujemy regularnie projekty, których nie opisujemy osobno — najczęściej dlatego, że są rozwinięciem istniejących systemów albo pojedynczą integracją.

  • Panele administracyjne i systemy obiegu dokumentów.
  • Kolejne integracje przewoźników, bramek płatniczych i systemów magazynowych.
  • Migracje danych między systemami i porządkowanie baz po latach eksploatacji.
  • API dla aplikacji mobilnych i partnerów handlowych.
  • Automatyzacja obiegu faktur i dokumentów magazynowych.
  • Optymalizacja wydajności aplikacji, które przestały wyrabiać przy wzroście ruchu.
  • Audyty kodu i infrastruktury przed przejęciem projektu.