Kontomierz API

Wstęp

Oddajemy w Twoje ręce proste i nowoczesne API abyś mógł używać części Kontomierza na swoich warunkach. W oparciu o to API powstały już dwie dojrzałe aplikacje - na iPhone'a i na Androida. Zachęcamy do zabawy!

Możliwości API

  • dodawanie, modyfikacja i usuwanie wydatków i przychodów z portfeli
  • lista kont bankowych i portfeli wraz z saldami (stan finansów)
  • lista transakcji w ramach wybranego konta bankowego lub portfela
  • wyszukiwarka transakcji (wiele kryteriów)

Zarys techniczny:

  • HTTP REST API
  • Wyniki w JSON lub XML (do wyboru - obie wersje działają równolegle)
  • Bezsesyjne

Uwierzytelnienie

API jest bezsesyjne, czyli klient HTTP nie powinien wysyłać żadnych ciastek.

Każde żądanie uwierzytelniane jest niezależnie metodą HTTP Basic Auth.

W przeglądarkach internetowych i dobrych bibliotekach-klientach HTTP sprowadza się to do dopisania "login:password@" do adresu URL, np.:

login demo%40kontomierz.pl ("%40" to enkodowane "@")
hasło demo123
żądanie https://demo%40kontomierz.pl:demo123@kontomierz.pl/user_accounts.xml

W innych bibliotekach jak np. Apache HTTP, istnieją klasy i metody pozwalające ustawić login i hasło na obiekcie żądania, co fizycznie sprowadza się ustawienia nagłówków HTTP.

Konwencje

GET POST PUT DELETE to metody HTTP, których musisz użyć, aby wygenerować poprawne żądanie zgodnie z konwencją REST. Jeśli Twoja biblioteka nie umożliwia ustawienia metod PUT i DELETE, możesz je zasymulować poprzez dodatkowy parametr _method o wartości "put" lub "delete" (z małych liter).
:format format odpowiedzi. Możliwe wartości to "xml" i "json". Każdy URL musi być zakończony rozszerzeniem .xml lub .json
:id identyfikator obiektu

Konta bankowe i portfele

GET /user_accounts.:format

API daje możliwość wylistowania wszystkich kont bankowych i portfeli z ich saldami. Portfele są traktowane analogicznie jak konta. Saldo portfela aktualizuje się automatycznie na serwerze, gdy do portfela wpadają nowe wydatki lub przychody. Salda kont bankowych również aktualizują się automatycznie na serwerze podczas importu danych przez użytkownika.

Parametry: brak

Odpowiedź:

id identyfikator obiektu
balance saldo w PLN
currency-balance saldo w natywnej walucie
iban skrót kryptograficzny IBAN-u
iban-checksum suma kontrolna oryginalnego IBAN-u
best-name nazwa konta lub portfela, którą powinieneś wyświetlać; jest to najlepsza z nazw jaką dysponuje Kontomierz (szczegóły: nazwa użytkownika nadana w Kontomierzu ma priorytet nad nazwą użytkownika nadaną w systemie bankowym, która znów ma priorytet nad oficjalną nazwą konta)
bank-name nazwa banku, którą możesz wyświetlać, ale nie możesz hardkodować w kodzie (jest zmienna)
bank-plugin-name niezmienny symbol banku, który możesz hardkodować w kodzie; dla pseudobanku zawierającego portfele przyjmuje wartość "Wallets"; używaj tego do rozpoznania portfeli do kont bankowych
account-name oficjalna nazwa konta bankowego, którą ewentualnie możesz wyświetlać jako drugorzędną w stosunku do best-name; dla portfeli przyjumuje wartość "Pieniądze w portfelu", ale nie można tego hardkodować (zmienia się)
is-default-wallet true jeśli jest to portfel domyślny; false w przeciwnym wypadku; wartość ma sens tylko dla portfeli i pozwala ustalić, który portfel użytkownik wybrał jako domyślny (główny)
currency-name trzyliterowa nazwa waluty, np. "PLN"
apy oprocentowanie, matematycznie (np. 0.02 to 2%)

Uwaga: nie można polegać na pozostałych zwracanych wartościach. Zostaną one wkrótce usunięte z API. Prosimy bazować wyłącznie na wartościach udokumentowanych powyżej.

Transakcje

GET /money_transactions.:format

Stronicowana lista wszystkich transakcji użytkownika.

Parametry:

page strona wyników
user_account_id identyfikator konta
q szukany tekst
start_on data od w formacie RRRR-MM-DD
end_on data do w formacie RRRR-MM-DD
direction "kierunek" transakcji, jedno z: all | withdrawals | deposits
category_group_id identyfikator grupy kategorii
category_id identyfikator kategorii
without_categories lista identyfikatorów kategorii do pominięcia oddzielona minusem, np. 25-30-31
order_by kolumna po której mają być sortowane transakcje. Biała lista możliwych wartości: {id created_at updated_at amount balance transaction_on booked_on categories.name}. Do każdej można dopisać " asc" lub " desc" aby określić kierunek.

Odpowiedź: jak w szczegółach transakcji poniżej

GET /user_accounts/:id/money_transactions.:format

Stronicowana lista wszystkich transakcji użytkownika w ramach konta o identyfikatorze id.

Parametry: jak w liście transakcji powyżej

Odpowiedź: jak w szczegółach transakcji poniżej

GET /money_transactions/:id.:format

Szczegóły transakcji o identyfikatorze id.

Parametry: brak

Odpowiedź:

id identyfikator obiektu
user-account-id identyfikator konta
amount kwota w PLN
currency-amount kwota w natywnej walucie
balance saldo po transakcji w PLN
currency-balance saldo po transakcji w natywnej walucie
booked-on data księgowania
transaction-on data transakcji
description przyjazny, "inteligentny" opis transakcji. Preferuj to pole względem title/party/kind/name.
title tytuł transakcji
kind rodzaj transakcji, nazywany czasem "typem operacji"
name opis nadany przez użytkownika
category-id identyfikator kategorii
category-name nazwa kategorii
party druga strona transakcji
party-iban skrót kryptograficzny IBAN-u drugiej strony transakcji
iban-checksum suma kontrolna oryginalnego IBAN-u
exclude-from-calculations czy transakcja jest wyłączona z sumowania do wydatków/przychodów?
internal czy transakcja jest pomiędzy własnymi rachunkami?
best-name nazwa konta lub portfela, którą powinieneś wyświetlać; jest to najlepsza z nazw jaką dysponuje Kontomierz (szczegóły: nazwa użytkownika nadana w Kontomierzu ma priorytet nad nazwą użytkownika nadaną w systemie bankowym, która znów ma priorytet nad oficjalną nazwą konta)
account-name oficjalna nazwa konta bankowego, którą ewentualnie możesz wyświetlać jako drugorzędną w stosunku do best-name; dla portfeli przyjumuje wartość "Pieniądze w portfelu", ale nie można tego hardkodować (zmienia się)
currency-name trzyliterowa nazwa waluty, np. "PLN"

Uwaga: nie można polegać na pozostałych zwracanych wartościach. Zostaną one wkrótce usunięte z API. Prosimy bazować wyłącznie na wartościach udokumentowanych powyżej.

POST /money_transactions/create_in_wallet.:format

Utworzenie transakcji w Portfelu. Użyj tego, aby dodawać do Portfela wydatki i przychody gotówkowe. Nie ma możliwości tworzenia transakcji na zwykłych kontach bankowych.

Parametry:

money_transaction[user_account_id] identyfikator portfela; jeśli nie zostanie wysłany, transakcja trafi do portfela domyślnego
money_transaction[category_id] identyfikator kategorii (obowiązkowy)
money_transaction[currency_amount] kwota w natywnej walucie, obowiązkowo dodatnia. Czy jest to wydatek czy przychód gotówkowy ustala się za pomocą parametru "direction". Pozwala to łatwiej zbudować formularz dla użytkownika, w którym najpierw wybiera czy chce dodać wydatek czy przychód, a następnie zawsze wprowadza dodatnią kwotę (obowiązkowy)
money_transaction[currency_id] docelowo identyfikator waluty, obecnie 1 (obowiązkowy)
money_transaction[direction] kierunek kwoty, określa czy jest to wydatek czy przychód, przyjmuje wartości "withdrawal" lub "deposit" (obowiązkowy)
money_transaction[exclude_from_calculations] czy transakcja jest wyłączona z sumowania do wydatków/przychodów? Wartości "0" - domyślne, normalna transakcja. "1" - transakcja wykluczona z sumowania
money_transaction[internal] czy transakcja jest pomiędzy własnymi rachunkami? Wartości "0" - domyślne, normalna transakcja. "1" - transakcja między własnymi rachunkami, np. wpłata we wpłatomacie
money_transaction[tag_string] lista tagów oddzielonych spacją
money_transaction[title] tytuł transakcji
money_transaction[transaction_on] data transakcji (obowiązkowy)
money_transaction[client_assigned_id] zewnętrzny, unikalny identyfikator transakcji generowany przez klienta API. W praktyce najłatwiej go uzyskać na podstawie znacznika czasowego. Przykład: "1665050371". Kontomierz wykorzystuje ten identyfikator aby uniknąć namnażania tej samej transakcji w przypadku gdy klient wielokrotnie próbuje ją wysłać, np. na skutek problemów z siecią. (obowiązkowy)

Odpowiedź:

parametry poprawne? szczegóły dodanej transakcji (identycznie jak przy bezpośrednim zapytaniu o szczegóły transakcji). Klient API uzyskuje w ten sposób bazodanowy identyfikator transakcji (id) nadany przez Kontomierz.
parametry błędne? lista błędów na poszczególnych polach
PUT /money_transactions/:id/update_in_wallet.:format

Aktualizacja transakcji w Portfelu. Użyj tego, aby zmodyfikować wydatek lub przychód gotówkowy w Portfelu. Nie ma możliwości modyfikacji transakcji na zwykłych kontach bankowych.

Parametry: jak przy dodawaniu wydatku, oprócz money_transaction[client_assigned_id], którego tu się już nie wysyła.

Odpowiedź: jak przy dodawaniu wydatku.

DELETE /money_transactions/:id.:format

Parametry: brak

Usunięcie transakcji o identyfikatorze id z Portfela. Nie ma możliwości usunięcia transakcji z kont bankowych.

Kategorie

GET /category_groups.:format

Grupy kategorii z przynależnymi kategoriami. To drzewo kategorii będzie Ci potrzebne w formularzu dodawania i edycji wydatków gotówkowych. Parametr direction pozwala odfiltrować kategorie wydatkowe i przychodowe.

Parametry:

direction "deposit" lub "withdrawal" - pokaż tylko kategorie przychodowe lub wydatkowe. Uwaga: nie możesz pozwolić użytkownikowi na przypisanie kategorii przychodowej do wydatku i vice versa.

Przykłady

Poniżej zamieszczamy kilka przykładowych żądań API dla użytkownika DEMO.

Konta bankowe i Portfel: https://demo%40kontomierz.pl:demo123@kontomierz.pl/user_accounts.xml

Wszystkie transakcje (strona 1): https://demo%40kontomierz.pl:demo123@kontomierz.pl/money_transactions.xml

Wszystkie transakcje (strona 2): https://demo%40kontomierz.pl:demo123@kontomierz.pl/money_transactions.xml?page=2

Kategorie: https://demo%40kontomierz.pl:demo123@kontomierz.pl/category_groups.xml

Wskazówki implementacyjne

Bezpieczeństwo

Wszystkie żądania API są po HTTPS. Znajdź taką bibliotekę HTTP dla Twojego języka, która bez problemu obsługuje ten protokół.

Zwróć szczególną uwagę na przechowywanie loginu i hasła do Kontomierza w Twojej aplikacji. Zadbaj, by w przypadku kradzieży urządzenia z zainstalowanym klientem API odzyskanie loginu i hasła było maksymalnie utrudnione lub niemożliwe.

Opisy transakcji

Jako opisu transakcji używaj wartości "description". Dbamy, by był to optymalny opis transakcji, dla każdej kombinacji atrybutów "cząstkowych", czyli title, party, kind, name. Uwaga: wszystkie cząstkowe atrybuty są opcjonalne (i bardzo często puste).

Synchronizacja

Klient musi obsługiwać niedostępność sieci i niedochodzenie żądań do serwera.

Przemyśl dobrze model synchronizacji danych pomiędzy Kontomierzem i Twoim klientem. Zauważ, że synchronizacja jest obustronna.

Klient API powinien regularnie pobierać z Kontomierza listę kont bankowych, listę transakcji i drzewo kategorii użytkownika. Wszystkie te elementy mogą się w każdej chwili zmienić (np. użytkownik zdefiniował nową kategorię).

Klient API powinien wysyłać do Kontomierza wydatki i przychody, które użytkownik wprowadził offline. Wydatek wprowadzony offline powinien być wysyłany aż do uzyskania poprawnej odpowiedzi z serwera.

UID / id / client_assigned_id

UID w kliencie API nie jest do niczego przydatny i nie powinieneś go używać. Zostanie w przyszłości usunięty z API. UID to identyfikator transakcji z systemu transakcyjnego banku. Używamy go w Kontomierzu do rozpoznania, czy importowana transakcja jest nowa.

id to bazodanowy identyfikator transakcji. Umożliwi Ci odróżnienie transakcji nowo-pobranych od już-posiadanych w Twojej lokalnej bazie danych.

client_assigned_id to tymczasowy identyfikator generowany przez klienta API dla transakcji dodawanych via API. Kontomierz wykorzystuje ten identyfikator aby uniknąć namnażania tej samej transakcji w przypadku gdy klient wielokrotnie próbuje ją wysłać, np. na skutek problemów z siecią.

Pochwal się!

Chętnie odpowiemy na Twoje pytania. Chcemy usłyszeć o Twojej aplikacji. Chcemy ją promować. Poinformuj nas o swoich dokonaniach! Napisz: kontakt@kontomierz.pl