BerlinettaBerlinetta

Blog9 min czytania

inFakt API: integracja sklepu i Allegro z fakturowaniem

inFakt API w praktyce: klucz, sandbox, limity 300 i 150 zapytań na minutę, faktury asynchroniczne, KSeF i webhooki. Kiedy pisać integrację, a kiedy nie.

Zespół BerlinettySprzedaż wielokanałowa w praktyce

W tym artykule

inFakt API to interfejs REST w wersji 3, przez który program albo sklep internetowy wystawia faktury na Twoim koncie inFakt, pobiera PDF, oznacza płatności i zleca wysyłkę do KSeF. Dostęp daje klucz z ustawień konta, przekazywany w nagłówku X-inFakt-ApiKey.

Dokumentacja inFakt opisuje każde wywołanie z osobna. Nie mówi jednak, jak ułożyć z nich bezpieczny przebieg „zamówienie, faktura, płatność, KSeF” ani które błędy kosztują najwięcej. Ten przewodnik łączy jedno z drugim: dla sprzedawcy, który wybiera rozwiązanie, i dla programisty, który je buduje.

Krótko mówiąc

  • inFakt API to REST w wersji 3 pod adresem api.infakt.pl/api/v3. Klucz tworzysz w Ustawieniach, w zakładce Inne opcje, API, i przekazujesz w nagłówku X-inFakt-ApiKey.
  • Osobne konto testowe inFakt (sandbox) przyjmie do 2500 faktur miesięcznie, a API działa w nim tak samo jak na produkcji.
  • Limity liczą się od adresu IP: 300 odczytów i 150 zapisów na 60 sekund. Po przekroczeniu dostajesz błąd 429.
  • Faktura powstaje asynchronicznie: zlecenie dostaje odpowiedź 202 i numer zadania, a faktura zawsze startuje jako szkic. Kwoty podajesz w groszach.
  • Wysyłkę do KSeF zlecasz osobnym wywołaniem, a status przechodzi z sent na success z numerem KSeF albo na error.

Co to jest inFakt API i co da się przez nie zrobić

API oparte jest na REST i wymianie danych w JSON. Produkcja działa pod adresem https://api.infakt.pl/api/v3, a połączenie idzie przez HTTPS z TLS 1.2 albo 1.3. Opis wszystkich zasobów znajdziesz w interaktywnej dokumentacji i w repozytorium inFakt na GitHubie.

Dla sklepu internetowego najważniejsza jest sekcja przychodów. Poza fakturami VAT obejmuje korekty, faktury zaliczkowe i końcowe, faktury marża i OSS, raporty fiskalne oraz dowody wewnętrzne.

Obszar Co zrobisz przez API Przykładowy zasób
Faktury VAT wystawienie, podgląd, edycja, usunięcie, następny numer /async/invoices.json, /invoices.json
Korekty korekta do wystawionej faktury /async/corrective_invoices.json
Dokument dla klienta PDF, wysyłka e-mailem, link do udostępnienia /invoices/{uuid}/pdf.json
Płatności oznaczenie faktury jako zapłaconej /async/invoices/{uuid}/paid.json
Kontrahenci i produkty lista, dodanie, edycja /clients.json, /products.json
Konta bankowe lista kont do faktur płatnych przelewem /bank_accounts.json
KSeF wysyłka faktury, status, pobranie pliku XML /ksef2/documents/{uuid}/send.json

Każdy zakres danych ma osobne uprawnienie. Odczyt i zapis faktur to api:invoices:read i api:invoices:write, a zarządzanie integracją z KSeF to api:ksef:integration:write. Osobno nadajesz dostęp do kosztów, księgowości i rachunków bankowych.

Porada profesjonalisty

daj kluczowi tylko te zakresy, których integracja naprawdę używa. Skrypt do wystawiania faktur nie potrzebuje dostępu do kosztów ani do składek ZUS. Wyciek takiego klucza zaszkodzi wtedy znacznie mniej.

inFakt API dokumentacja: od czego zacząć

Zacznij od trzech miejsc. Każde odpowiada na inne pytanie.

  1. docs.infakt.pl to interaktywna dokumentacja wywołań z parametrami i przykładowymi odpowiedziami.
  2. github.com/infakt/API to ta sama wiedza w formie tekstu: punkty dostępu, uprawnienia, limity, kody błędów i filtrowanie.
  3. Plik o KSeF opisuje wysyłkę faktur, statusy i różnice między starszą i nowszą wersją integracji.

Czytaj uważnie uwagi pod opisami wywołań. To w nich stoją zasady, które zmieniają działanie programu, na przykład to, że pobranie PDF zmienia status faktury.

Klucz API inFakt i konto testowe

Jak wygenerować klucz

  1. Zaloguj się do inFakt w przeglądarce.
  2. Wejdź w Ustawienia, Inne opcje, API.
  3. Utwórz klucz i zaznacz potrzebne zakresy uprawnień.
  4. Skopiuj klucz i zapisz go w bezpiecznym miejscu, poza kodem strony.
  5. Sprawdź połączenie prostym odczytem listy faktur.

Klucz dołączasz do każdego zapytania w nagłówku HTTP:

curl -H "X-inFakt-ApiKey: TWOJ_KLUCZ" \
  -H "Content-Type: application/json" \
  https://api.infakt.pl/api/v3/invoices.json

Klucz daje pełny dostęp w ramach nadanych zakresów, więc traktuj go jak hasło do księgowości. Nie wklejaj go do kodu, który trafia do przeglądarki klienta, i nie wysyłaj go e-mailem.

Sandbox inFakt: testy na osobnym koncie

inFakt udostępnia darmowe konto testowe pod adresem https://api.sandbox-infakt.pl/api/v3. Zakładasz je osobno, przez formularz rejestracji sandboxa. Konto przyjmie do 2500 faktur miesięcznie, a dane firmowe są w nim zanonimizowane.

Według dokumentacji API działa tam identycznie jak na produkcji. Masz jednak dostęp tylko do sekcji przychodów i ustawień. Koszty i księgowość przetestujesz dopiero na prawdziwym koncie.

Porada profesjonalisty

numeracja faktur na koncie testowym wygląda tak samo jak na prawdziwym. Jeśli zapisujesz faktury z obu kont w jednej bazie, oznacz testowe od razu przy zapisie. Inaczej dwa dokumenty o tym samym numerze trafią do jednego zestawienia.

Jak wystawić fakturę przez API inFakt krok po kroku

Faktury nie tworzysz jednym wywołaniem. inFakt przyjmuje zlecenie, przetwarza je w tle i dopiero potem zwraca dokument. Pełny przebieg dla zamówienia ze sklepu wygląda tak:

  1. Zlecenie. Wysyłasz dane faktury na POST /async/invoices.json. Kwoty podajesz w groszach jako liczby całkowite.
  2. Numer zadania. inFakt odpowiada kodem 202 („Zlecenie przyjęte”) i numerem zadania w polu invoice_task_reference_number.
  3. Sprawdzenie statusu. Odpytujesz GET /async/invoices/status/{numer}.json, aż zadanie się zakończy i dostaniesz identyfikator faktury.
  4. Szkic. Faktura zawsze powstaje jako szkic. Od tej chwili możesz ją zatwierdzić, wysłać albo oznaczyć jako zapłaconą.
  5. Płatność. Oznaczasz fakturę jako zapłaconą. Data zapłaty nie może być wcześniejsza niż data wystawienia.
  6. Dokument dla kupującego. Pobierasz PDF albo wysyłasz fakturę e-mailem prosto z inFakt.
  7. KSeF. Zlecasz wysyłkę do KSeF i czekasz na status końcowy.
Sześć kroków wystawienia faktury przez API inFakt, od zlecenia do wysyłki do KSeF

Dwa szczegóły z tej listy zaskakują najczęściej. Pierwszy to kwoty: 500000 w polu ceny oznacza 5000,00 zł. Drugi to brutto. Jeśli sklep ma ceny brutto, podaj w pozycji gross_price bez ceny netto, a inFakt sam wyliczy netto i VAT. Suma faktury zgodzi się wtedy z kwotą zapłaconą przez kupującego.

Oznaczenie płatności też jest zleceniem asynchronicznym. Kod 201 oznacza tylko przyjęcie zlecenia, a nie opłacenie faktury. Wynik trzeba potwierdzić odczytem dokumentu.

Limity zapytań i kody błędów inFakt API

inFakt ogranicza liczbę zapytań z jednego adresu IP, a nie z jednego klucza. To ważne, gdy na tym samym serwerze działa kilka skryptów albo kilka sklepów: wszystkie dzielą jedną pulę.

Limity inFakt API: 300 odczytów i 150 zapisów na 60 sekund z jednego adresu IP, 100 rekordów na stronę i 2500 faktur w sandboxie
Limit Wartość
Odczyty (GET) z jednego IP 300 zapytań na 60 sekund
Zapisy, zmiany i usunięcia z jednego IP 150 zapytań na 60 sekund
Rekordów na stronę listy 100
Wysyłek e-mail z płatnego konta 3000 dziennie
Wysyłek e-mail z konta bez płatności 20 dziennie

Kody błędów, które integracja musi rozpoznawać:

  • 429: przekroczony limit zapytań. Odczekaj i zwolnij tempo, zamiast ponawiać od razu.
  • 402: przekroczony limit planu konta inFakt.
  • 403: brak uprawnień albo blokada adresu IP.
  • 422: błąd walidacji, na przykład brak wymaganych danych kupującego.
  • 423: zasób zablokowany do zmian.
  • 503: serwis chwilowo niedostępny.

Porada profesjonalisty

dławij się sam, zanim zrobi to inFakt. Licz zapytania po swojej stronie i trzymaj się wyraźnie poniżej limitu. Przy masowym wystawianiu stu faktur łatwo przekroczyć 150 zapisów na minutę, bo każda faktura to zlecenie, sprawdzenie statusu, płatność i wysyłka.

Integracja inFakt z KSeF przez API

Zanim wyślesz fakturę do KSeF przez API, konto inFakt musi mieć podłączony KSeF. W nowszej wersji integracji (/ksef2/) podłączenie robisz w aplikacji inFakt, a przez API sprawdzasz tylko jego stan.

Samą wysyłkę zlecasz dla jednej faktury albo dla wielu naraz. Według dokumentacji KSeF w inFakt faktura przechodzi przez trzy statusy:

Status Co znaczy
sent faktura wysłana do przetworzenia w KSeF
success faktura przyjęta, w odpowiedzi jest numer KSeF
error faktura odrzucona, opis błędu jest w polu status_description

Status końcowy sprawdzisz osobnym wywołaniem albo dostaniesz go webhookiem. inFakt sam zachęca do webhooka, bo ogranicza on liczbę zbędnych zapytań o status. Przez API pobierzesz też plik XML faktury i zaimportujesz faktury z KSeF do inFakt.

Pamiętaj, że wysyłki do KSeF nie cofniesz. Zlecaj ją dopiero dla faktury zatwierdzonej, a nie dla szkicu, który ktoś jeszcze poprawia. O tym, kogo i od kiedy dotyczy KSeF, piszemy w artykule faktury KSeF w e-commerce.

Webhooki inFakt: powiadomienia zamiast odpytywania

inFakt wysyła webhooki o zdarzeniach, na przykład o utworzeniu faktury albo o końcowym statusie wysyłki do KSeF. Webhook dodajesz w aplikacji inFakt, a nie przez API.

Webhook traktuj jak sygnał, a nie źródło danych. Po powiadomieniu odczytaj dokument swoim kluczem i dopiero wtedy zmień stan u siebie. Zostaw też zwykłe sprawdzanie statusu jako drogę zapasową. Gdy powiadomienie nie dotrze, faktura i tak trafi do Twojego programu przy najbliższym odpytaniu.

Własna integracja z inFakt API czy gotowy program

Prosty skrypt wystawiający fakturę po opłaceniu zamówienia napiszesz w kilka dni. Większość pracy przychodzi jednak później: przy limitach, korektach, błędach walidacji i KSeF.

Porównanie własnego skryptu z inFakt API i gotowej integracji w programie do sprzedaży
Sprawa Własny skrypt Gotowa integracja
Start kilka dni pracy programisty podłączenie klucza i ustawienia
Pozycje, stawki VAT i dostawa mapujesz sam z danych sklepu przechodzą z zamówienia
Limity i błędy 429 budujesz kolejkę i dławienie działają po stronie programu
Ochrona przed drugą fakturą musisz ją zaprojektować jest wbudowana
Zmiany w API utrzymujesz sam utrzymuje dostawca programu

Własny skrypt ma sens, gdy masz jeden kanał sprzedaży, nietypowy proces i programistę na stałe. Gotowa integracja wygrywa, gdy sprzedajesz w kilku miejscach, a faktury mają powstawać według tych samych zasad dla Allegro, Erli i sklepu.

Integracja inFakt z Allegro i sklepem w Berlinettcie

Berlinetta łączy się z Twoim kontem przez inFakt API. Zamówienia z Allegro, Erli i Twojego sklepu masz na jednej liście, a fakturę do każdego z nich wystawiasz w swoim inFakcie. Szczegóły podłączenia opisuje strona integracji z inFakt.

  • Z karty zamówienia. Fakturę wystawiasz przyciskiem „Wystaw w inFakt”.
  • Masowo. Z listy zamówień wystawisz do 100 faktur naraz. Zamówienia bez kompletu danych program pominie i poda powód.
  • Regułą. Reguła automatyzacji utworzy fakturę sama, gdy zamówienie spełni ustawione przez Ciebie warunki.
  • Kwoty bez przeliczania. Pozycje, stawki VAT i koszt dostawy przechodzą z zamówienia, a suma zgadza się z kwotą zapłaconą przez kupującego.
  • Twoja numeracja. Numer nadaje inFakt, a faktura z jego PDF wraca do Dokumentów przy zamówieniu.
  • Bez drugiej faktury. Ta sama faktura nie powstanie dwa razy, nawet po podwójnym kliknięciu.
  • Płatność. Opłacone zamówienie oznacza fakturę jako zapłaconą.
  • Korekta. Korektę ilości wystawisz z karty dokumentu.
  • KSeF. Możesz zaznaczyć, żeby inFakt wysłał fakturę do KSeF zaraz po wystawieniu, a status KSeF wraca do Dokumentów.

Domyślnie w inFakcie powstaje szkic, który zatwierdzasz przyciskiem „Zatwierdź w inFakt”. W ustawieniach przełączysz wystawianie na faktury gotowe od razu. Klucz inFakt program przechowuje w sejfie i nie pokazuje go już nikomu. Zapytania do inFakt program sam rozkłada w czasie, więc masowe wystawianie nie wyczerpuje limitu.

Więcej o dokumentach znajdziesz na stronie dokumenty i faktury. Jeśli rozważasz inny system fakturowy, porównaj go z API wFirmy.

Z praktyki: błędy, które kosztują najwięcej przy inFakt API

Te przypadki zmierzyliśmy na koncie testowym inFakt, budując integrację. Każdy z nich przechodzi testy na pojedynczej fakturze i wychodzi dopiero przy prawdziwym ruchu.

  1. Ponowione zlecenie po zerwanym połączeniu. Odpowiedź nie dotarła, ale faktura mogła powstać. Ślepe ponowienie daje drugą fakturę z kolejnym numerem. Najpierw sprawdź w inFakt, czy dokument istnieje.
  2. PDF szkicu pobrany „na podgląd”. Pobranie PDF zmienia status faktury na „Wydrukowano”. Szkic wygląda wtedy dla księgowej jak dokument gotowy.
  3. Data zapłaty sprzed wystawienia. Zamówienie z marketplace’u jest zwykle opłacone przed fakturą. Gdy wpiszesz datę wpłaty, inFakt odrzuci płatność. Datą zapłaty jest wtedy dzień wystawienia.
  4. Przelew bez konta bankowego. Faktura płatna przelewem wymaga konta bankowego zapisanego w inFakt. Bez niego dostaniesz błąd 422.
  5. Osoba prywatna bez adresu. Faktura dla osoby prywatnej z samym imieniem i nazwiskiem nie przejdzie. Wystarczą miasto i kod pocztowy.
  6. Usunięty szkic. Numer usuniętego szkicu inFakt nada następnej fakturze. Jeśli zapisałeś go u siebie, dwa dokumenty będą miały ten sam numer.

Najdroższe w integracji z systemem fakturowym nie jest samo wystawienie faktury. Najdroższy jest dokument, który powstał dwa razy, albo ten, o którego istnieniu program nie wie. Dlatego każde zlecenie zapisuj u siebie przed wywołaniem API, a wynik zawsze potwierdzaj odczytem.

Zespół Berlinetta

Źródła

  1. 1.inFakt: interaktywna dokumentacja API v3
  2. 2.inFakt na GitHubie: dokumentacja API v3 (punkty dostępu, limity, kody błędów)
  3. 3.inFakt: rejestracja konta testowego (sandbox)
  4. 4.inFakt na GitHubie: integracja z KSeF przez API

Pytania

Najczęstsze pytania

Jak wygenerować klucz API w inFakt?

Zaloguj się do inFakt w przeglądarce i wejdź w Ustawienia, Inne opcje, API. Utwórz klucz i nadaj mu tylko te zakresy, których potrzebuje integracja, na przykład odczyt i zapis faktur. Klucz przekazujesz w każdym zapytaniu w nagłówku X-inFakt-ApiKey.

Gdzie jest dokumentacja inFakt API?

Interaktywna dokumentacja inFakt API v3 jest pod adresem docs.infakt.pl. Opis w formie tekstu, z przykładami zapytań, limitami i kodami błędów, inFakt publikuje też w repozytorium infakt/API na GitHubie, razem z osobnym plikiem o KSeF.

Jakie są limity zapytań w inFakt API?

inFakt liczy limity od adresu IP: 300 zapytań odczytu i 150 zapytań zapisu, zmiany lub usunięcia na 60 sekund. Lista zwraca najwyżej 100 rekordów na stronę. Po przekroczeniu limitu API odpowiada kodem 429, więc integracja powinna odczekać i zwolnić tempo.

Czy przez inFakt API wyślę fakturę do KSeF?

Tak. Gdy na koncie inFakt jest podłączony KSeF, wysyłkę faktury zlecasz osobnym wywołaniem, pojedynczo albo dla wielu faktur. Status sprawdzasz w API albo dostajesz go webhookiem: sent oznacza przetwarzanie, success numer KSeF, a error opis błędu.

Jak połączyć Allegro z inFakt?

Allegro i inFakt łączy program, który pobiera zamówienia z Allegro i wystawia do nich faktury przez API inFakt. Możesz napisać taki skrypt sam albo użyć gotowego programu do obsługi sprzedaży. W Berlinettcie podpinasz konto Allegro i klucz inFakt, a fakturę wystawiasz z karty zamówienia, masowo albo regułą.

Sprzedajesz w kilku miejscach naraz?

Obsługuj Allegro, Erli, własny sklep i kurierów w jednym panelu. Bez przepisywania danych.