Przewodniki
Saldo
Stan salda, historię operacji i dokumenty podatkowe można odczytać przez API i przez MCP. Płatność kartą, zarówno jednorazowa, jak i automatyczna, zawsze przebiega przez link do Stripe Checkout, który kończy człowiek; samo API nigdy nie obciąży karty. To samo dotyczy opcjonalnego abonamentu miesięcznego.
Kwoty bez VAT, halerze, język opisów
Wszystkie kwoty w tym API to liczby całkowite w HALERZACH i bez VAT. volai jest płatnikiem VAT, ale VAT jest naliczany dopiero przy doładowaniu salda kartą (zestawienie na /cenik). Opisy operacji (GET /v1/credit/ledger) API składa po angielsku na podstawie typu operacji; zapisana czeska notatka nigdy nie jest wysyłana na zewnątrz, także w żadnym innym polu.
Saldo, wystarczalność i powiadomienia
GET /v1/balance zwraca aktualne saldo oraz dwa dodatkowe wyliczenia ADDYTYWNIE (istniejący klienci, którzy czytają tylko balanceHal/balanceCzk/currency, nie przestaną działać): runway (dailyAverageHal - średnia dzienna wydatków z ostatniego okresu, runwayDays - na ile dni wystarczy saldo w tym tempie, null, gdy nie da się policzyć) oraz notice - to samo powiadomienie, które widać na stronie /prehled w portalu, null, gdy go nie ma. Osiem możliwych kształtów notice: {kind:"unknown"} (za mało danych do oszacowania), {kind:"empty"} (saldo zerowe), {kind:"number_fee",feeHal,dueAt} (w ciągu 3 dni upływa termin miesięcznej opłaty za numery głosowe lub numery komórkowe, a saldo jej nie pokrywa; feeHal to suma wszystkich takich opłat, dueAt najwcześniejszy termin; przy włączonym automatycznym doładowaniu nie jest zwracane), {kind:"runway",days} (saldo skończy się za days dni przy obecnym tempie) oraz cztery kształty tylko dla konta z abonamentem miesięcznym: {kind:"subscription_exhausted_topup",renewsAt} (miesięczne saldo z tego okresu zostało wykorzystane, a abonament działa w trybie dokupowania, więc dalsze wydatki idą z doładowanego salda; renewsAt to koniec okresu w ms, kiedy zostanie dopisane nowe saldo miesięczne), {kind:"subscription_cap_reached",renewsAt} (saldo miesięczne zostało wykorzystane, abonament działa z limitem, a doładowane saldo niczego nie pokrywa, więc płatne czynności są wstrzymane do renewsAt lub do ręcznego doładowania) oraz {kind:"subscription_past_due"} (odnowienie abonamentu nie powiodło się, zapisanej karty nie udało się obciążyć; odnowienie można opłacić w portalu lub wymienić kartę) oraz {kind:"subscription_runway",renewsAt,runsOutAt} (saldo skończy się, zanim w renewsAt zostanie dopisane nowe saldo miesięczne; runsOutAt to szacunek w ms, wyliczony z ostrożnego tempa abonamentu, takiego samego jak prognoza salda miesięcznego na karcie abonamentu w portalu: najwyższa z wartości - średnia z 28 dni (tylko przy pełnej historii salda), średnia ruchu z ostatnich 7 dni praskich bez opłat za numery oraz średnia od początku okresu (dopiero po jego pierwszym tygodniu); runway nadal liczy ze średniej z 28 dni; abonentowi jest zwracane zamiast runway, a przy włączonym automatycznym doładowaniu nie jest zwracane). renewsAt jest w ms (epoch), czyli to ten sam moment co subscription.periodEnd w tej samej odpowiedzi, gdzie jest ciągiem ISO 8601; format żadnego z tych pól się nie zmienia. W przypadku abonamentu wypowiedzianego na koniec okresu subscription_exhausted_topup, subscription_cap_reached i subscription_runway zawierają dodatkowo cancelAtPeriodEnd: true: odnowienie nie nastąpi, renewsAt jest końcem abonamentu i nowe saldo miesięczne nie zostanie dopisane (przy limicie można wtedy kontynuować tylko po doładowaniu); bez wypowiedzenia tego pola w powiadomieniu nie ma. W przypadku konta z abonamentem miesięcznym odpowiedź zawiera dodatkowo subscription (stan abonamentu, w przeciwnym razie null) oraz topupBalanceHal (tylko saldo doładowane); balanceHal pozostaje sumą salda miesięcznego i doładowanego, zob. rozdział Abonament miesięczny.
Historia operacji
GET /v1/credit/ledger?limit - najnowsze operacje na początku, BEZ kursora (tylko limit, 1-200, domyślnie 50). Operacji starszych niż 200 najnowszych nie można pobrać przez API; pełną historię ma portal /kredit oraz dokumenty podatkowe. Każdy wpis zawiera type (bonus, topup, call_out, call_in, sms, number_fee, agent, refund, admin, setup_revision - runda poprawek zamówienia pod klucz ponad zakres pakietu, subscription_grant - dopisanie salda miesięcznego z abonamentu oraz subscription_expire - wygaśnięcie jego niewykorzystanej reszty), amountHal (wartość dodatnia to uznanie, ujemna to obciążenie), grossHal (kwota z VAT przy doładowaniu kartą, w pozostałych przypadkach null) oraz angielski description złożony z typu - przy number_fee dodatkowo z numerem, którego dotyczy opłata. Przy wydatkach pokrytych saldem miesięcznym jest dodatkowo pole fromSubscriptionHal - część wydatku, którą pokryło saldo miesięczne; przy pozostałych operacjach go nie ma. Dodatek numer komórkowy pojawia się w historii jako number_fee (pierwszy okres przy zakupie i każde odnowienie po 30 dniach) oraz sms (wysłanie z numeru komórkowego, stawka za segment jest w cenniku); gdy operator później odrzuci SMS wysłany z numeru komórkowego, saldo wraca wpisem refund.
Doładowanie kartą
POST /v1/credit/topup {amountCzk} zwraca {checkoutUrl} - link do Stripe Checkout, który otwiera CZŁOWIEK w przeglądarce. Nic nie zostanie obciążone, dopóki sam nie dokończy płatności. Kompletny adres do faktury (PUT /v1/account/billing) musi być podany PRZED wywołaniem - bez niego nie można wystawić prawidłowego dokumentu podatkowego (billing_address_required). Obsługuje Idempotency-Key - można bezpiecznie powtórzyć po przekroczeniu czasu, bez ryzyka dwóch płatności.
Automatyczne doładowanie
Przez API automatyczne doładowanie można tylko ODCZYTAĆ, WYŁĄCZYĆ i zmienić PRÓG - włączenie i zmiana KWOTY przebiegają wyłącznie przez Stripe Checkout, nigdy przez bezpośredni zapis.
Dlaczego nie zwykłe "enabled: true"
Gdy karta jest już zapisana, samo {"enabled": true} uruchomiłoby pobieranie środków BEZ CZŁOWIEKA przy karcie - dokładnie tego chcemy uniknąć (zasada „pieniądze ruszają się tylko wtedy, gdy człowiek jest przy karcie"). Dlatego PATCH /v1/credit/auto-topup odrzuca zarówno enabled: true, jak i amountHal własnym komunikatem, a nie ogólnym błędem o nieznanym polu.
Odczyt i wyłączenie
GET /v1/credit/auto-topup zwraca {enabled, thresholdHal, amountHal, card: {brand, last4} | null, spentThisMonthHal, monthlyCapHal, disabledReason} - BEZ numeru karty, tylko marka i ostatnie cztery cyfry. PATCH {enabled: false} wyłącza natychmiast, PATCH {thresholdHal} zmienia wyłącznie próg (musi pochodzić z oferowanego zestawu i być niższy niż zapisana kwota, w przeciwnym razie po doładowaniu saldo od razu znów spadłoby poniżej progu).
Włączenie i zmiana kwoty
POST /v1/credit/auto-topup/setup {thresholdHal, amountHal} zwraca {checkoutUrl} - po zakończeniu Checkout NATYCHMIAST zostaje pobrane amountHal jako pierwsze doładowanie i dopiero wtedy karta zostaje zapisana na przyszłe automatyczne doładowania. Działa także z kartą zapisaną wcześniej - to jedyny sposób, aby włączyć automatyczne doładowanie lub zmienić jego kwotę. Po zakończeniu Checkout przeglądarka wraca na CZESKĄ stronę portalu (/kredit?automat=zapnuto), także w przypadku klienta anglojęzycznego - to znana luka, nie błąd w Państwa integracji.
Karta
POST /v1/credit/auto-topup/card zwraca link do Checkout (tryb wymiany karty, nic nie jest pobierane) służący do wymiany zapisanej karty. DELETE /v1/credit/auto-topup/card odłącza kartę NATYCHMIAST - usuwana jest cała konfiguracja (próg i kwota), nie tylko karta; ponowne włączenie jest możliwe wyłącznie przez .../setup, który od razu pobiera pierwsze doładowanie. Po zakończeniu Checkout przeglądarka wraca na CZESKĄ stronę portalu (/kredit?karta=zmenena) niezależnie od języka konta - ta sama znana luka co wyżej.
Limity
Dwa NIEZALEŻNE limity: najwyżej 10 000 CZK doładowanego salda w miesiącu kalendarzowym oraz najwyżej 4 doładowania w DNIU KALENDARZOWYM - bez względu na to, ile razy saldo spadnie poniżej progu. Przekroczenie któregokolwiek z nich samo wyłącza automatyczne doładowanie (disabledReason monthly_cap, odpowiednio daily_cap); spentThisMonthHal/monthlyCapHal w odpowiedzi pokazują, ile zostało z limitu miesięcznego.
MCP: get_auto_topup (odczyt) i disable_auto_topup (wyłączenie) - włączenia, zmiany kwoty ani karty w MCP nie ma, z tego samego powodu co enabled: true w REST powyżej.
Miesięczny limit wydatków
Opcjonalne zabezpieczenie przed niespodziewanie wysokim rachunkiem: samodzielnie ustawia się, ile mogą kosztować połączenia, SMS-y i agent głosowy w miesiącu kalendarzowym (według czasu w Pradze). Funkcja jest włączona tylko na koncie, które ustawiło limit; bez niego nic się nie zmienia, a wydatki miesiąca są jedynie liczone.
GET /v1/account/spend-cap zwraca {spendCap: {enabled, capHal, warnShare, inboundAboveCap, month, monthSpendHal, remainingHal, reached, updatedAt}}. Bez limitu enabled ma wartość false, a pola limitu są null, natomiast monthSpendHal otrzymuje się zawsze. Kwoty są w pełnych halerzach bez VAT.
PUT /v1/account/spend-cap {capHal, warnShare?, inboundAboveCap?} ustawia lub zmienia limit: capHal w pełnych halerzach od 5 000 (50 CZK) do 100 000 000 (1 000 000 CZK), warnShare to część limitu od 0,5 do 0,99 (domyślnie 0,8), po której zostanie wysłany e-mail z ostrzeżeniem, a inboundAboveCap: true pozwala agentom nadal odbierać połączenia przychodzące także powyżej limitu (domyślnie false; przy zmianie bez tego pola obowiązuje zapisana wartość). DELETE /v1/account/spend-cap usuwa limit; usunięcie nieistniejącego limitu nie jest błędem.
Po osiągnięciu limitu nowe połączenia wychodzące, dzwonienie na numer, połączenia próbne i SMS-y są odrzucane z kodem spend_cap_reached (HTTP 402), nic nie jest naliczane, a ponawianie nie pomoże, dopóki nie skończy się miesiąc albo nie zostanie podniesiony lub usunięty limit. Połączenie przychodzące do agenta kończy się po jednym zdaniu i nic nie kosztuje, chyba że inboundAboveCap: true. E-mail przychodzi po osiągnięciu warnShare i po osiągnięciu limitu, każdy najwyżej raz w miesiącu.
Czego limit NIE zatrzyma: połączeń, które właśnie trwają (cena jest pobierana po połączeniu, więc miesiąc może się skończyć powyżej limitu o ich cenę, tak samo jak przy połączeniach zaksięgowanych po północy), przekierowań bez agenta oraz opłat za numery, rundy poprawek Pod klucz i abonamentu miesięcznego, które nie wliczają się do limitu. W przypadku konta z abonamentem do wydatków wlicza się także to, co pokryło saldo miesięczne. Numer we Własnej centrali SIP z inboundAboveCap: true pozostaje w proxy SIP, więc limit nie zatrzyma połączeń wychodzących z centrali.
MCP: get_spend_cap, set_spend_cap i clear_spend_cap wywołują tę samą usługę co REST i portal (sekcja Miesięczny limit wydatków w Saldzie). set_spend_cap ma powtórzyć klientowi kwotę przed zapisem i po nim.
Abonament miesięczny
Opcjonalna subskrypcja: co miesiąc z zapisanej karty pobierana jest cena wybranego poziomu i dopisywane jest saldo miesięczne w CZK, które wydaje się według zwykłego cennika. Stawki ani naliczanie za sekundy się przez to nie zmieniają, abonament jest warstwą nad nimi. Poziomy są trzy, a tier to ich cena w CZK bez VAT: "490", "990" i "1990"; ceny i saldo każdego poziomu zwraca GET /v1/subscription w polu tiers.
Gdy oferta jest niedostępna
Ofertę abonamentu można operacyjnie wyłączyć dla wszystkich kont lub tylko dla niektórych. Gdy jest wyłączona dla konta, GET /v1/subscription zwraca available: false, a włączenie kończy się błędem pausal_unavailable (404). Abonament już włączony działa dalej, nawet jeśli ofertę wyłączono.
Dwa rodzaje salda
Saldo miesięczne pochodzi z abonamentu, na koniec okresu wygasa i nie podlega zwrotowi. Saldo doładowane (doładowania, bonus powitalny, korekty) nie wygasa i podlega zwrotowi jak dotychczas. Stan konta - balanceHal w GET /v1/balance, w portalu i we wszystkich bramkach (minimum na połączenie, limit zadłużenia, ostrzeżenia) - to suma obu rodzajów. Samo saldo doładowane jest w topupBalanceHal, pozostałe saldo miesięczne w subscription.monthlyRemainingHal. Zadłużenie może powstać tylko w saldzie doładowanym.
Kolejność wydatków
Każdy wydatek idzie najpierw z salda miesięcznego, a reszta z doładowanego - połączenia naliczane za sekundy, agent, opłaty za numery i numery komórkowe, SMS-y, dzwonienie na numer i wychodzące zadania. Podział jest atomowy i zapisany w księdze: wydatek pokryty saldem miesięcznym zawiera fromSubscriptionHal (część pokrytą saldem miesięcznym). Korekty właściciela (admin, także ujemne) i zwrot za niewysłany SMS (refund) dotyczą wyłącznie salda doładowanego.
Okres i dopisanie
Okres trwa jeden miesiąc od udanego pobrania (31. 1. daje 28. 2.). Saldo miesięczne jest dopisywane dopiero po potwierdzonej płatności wpisem subscription_grant, a dopisanie jest idempotentne według identyfikatora płatności. Jeśli konto ma w tej chwili zadłużenie w saldzie doładowanym, jest ono najpierw spłacane z nowego salda miesięcznego, aby saldo doładowane nie pozostało ujemne.
Wygaśnięcie
Niewykorzystana reszta salda miesięcznego wygasa w dniu odnowienia (wpis subscription_expire z kwotą ujemną), przy zakończeniu subskrypcji lub przez automatyczne zabezpieczenie, gdy okres zakończył się ponad 36 godzin temu bez odnowienia. Jeśli pobranie się nie powiedzie, reszta już wygasła i nowe saldo nie zostaje dopisane; do czasu opłacenia konto działa wyłącznie na saldzie doładowanym.
Wybór po wyczerpaniu
Przy włączaniu trzeba obowiązkowo wybrać exhaustionMode, bez wartości domyślnej. topup: po wyczerpaniu salda miesięcznego z zapisanej karty dokupywane jest saldo doładowane - to dzisiejsze automatyczne doładowanie z tymi samymi limitami i e-mailami. cap (limit): nic nie jest dokupywane, połączenia wychodzące, SMS-y i zakupy numerów są odrzucane błędem subscription_cap_reached (HTTP 402), a gdy saldo spadnie poniżej zera, zatrzymują się także połączenia przychodzące, przekierowanie i dostęp przez SIP (zatrzymanie przy zerze; wznowienie po doładowaniu lub z nowym miesięcznym saldem). Z limitem nie można włączyć automatycznego doładowania (subscription_cap_active); przełączenie na limit je wyłącza. Najwięcej, ile miesięcznie zapłaci się z limitem, to cena abonamentu.
Zmiana poziomu, wypowiedzenie, wznowienie
Zmiana poziomu (w górę i w dół) obowiązuje od następnego okresu, bez wyrównania. Wypowiedzenie to cancelAtPeriodEnd: true: saldo obowiązuje do końca okresu, potem wygasa, a stan to canceled; do końca okresu wypowiedzenie można cofnąć. Przez REST ani MCP nie można podnieść poziomu, wznowić wypowiedzianego abonamentu ani przełączyć na dokupowanie z karty - te kroki zwiększają lub ponownie włączają cykliczne pobieranie, dlatego zwracają subscription_confirmation_required z confirmUrl, który człowiek otwiera i potwierdza w portalu (ważny 24 godziny).
Podpowiedź przed odnowieniem
Trzy dni przed odnowieniem (najpóźniej dzień wcześniej) przychodzi e-mail, ale tylko wtedy, gdy przy dotychczasowych wydatkach taniej wyszłoby płacenie za sekundy lub niższy poziom. Obowiązuje ta sama zasada co przy podpowiedzi w e-mailu o odnowieniu i w portalu: inna droga musi wyjść taniej o co najmniej 50 CZK i 5 %. Szacunek na cały okres bierze wyższe z temp od początku okresu i z ostatnich 7 dni i nigdy nie jest niższy niż wydatki z ostatnich 30 dni, z których doradza portal; wiersze Poziom i Wypowiedzenie dlatego po kliknięciu nie powiedzą, że poziom pasuje. E-mail podaje dokładną datę i godzinę odnowienia i przychodzi najwyżej raz na okres, nigdy w przypadku abonamentu wypowiedzianego na koniec okresu, z zaplanowaną zmianą poziomu, bez zapisanej karty ani oczekującego na płatność. Przycisk w nim otwiera w portalu od razu wiersz Wypowiedzenie (/kredit?pausal=zrusit) lub Poziom (/kredit?pausal=stupen). E-mail o odnowieniu radzi potem ponownie na podstawie rzeczywistych wydatków z całego okresu, więc podpowiedź może wyjść inaczej.
Nieopłacone odnowienie
Pobranie z zapisanej karty jest próbowane w dniu odnowienia, po 2 i po 4 dniach. Po pierwszym niepowodzeniu stan to past_due, przychodzi e-mail z linkiem do płatności ręcznej i do zmiany karty, a saldo miesięczne wynosi 0; link do płatności ręcznej zwraca POST /v1/subscription/pay. Po trzecim niepowodzeniu abonament się kończy (canceled), a saldo doładowane i konto działają dalej.
VAT i dokumenty
Ceny są bez VAT. Reżim VAT jest odczytywany przed każdym pobraniem, więc płatnik z innego państwa UE z zweryfikowanym numerem VAT płaci bez czeskiego VAT (odwrotne obciążenie), a dokument to odzwierciedla. Dokument podatkowy za każdy opłacony okres wystawia volai samodzielnie (podstawą opodatkowania jest cena poziomu, nie dopisane saldo) i można go znaleźć w GET /v1/billing/documents.
Związek z bonusem i pierwszym doładowaniem
Włączenie abonamentu liczy się jako pierwsza płatność: odblokowuje SMS-y ze wspólnego nadawcy, przekierowanie, drugi numer, numer komórkowy i kartę automatycznego doładowania tak samo jak doładowanie. Bonus powitalny pozostaje saldem doładowanym.
Zwroty
Saldo miesięczne nie podlega zwrotowi i wygasa; saldo doładowane podlega zwrotowi jak dotychczas. Wypowiedzenie abonamentu nie daje prawa do proporcjonalnej części opłaconego okresu. Zwrot płatności za abonament (reklamacja, pomyłka) załatwia ręcznie właściciel volai, przez API ani MCP nie jest to możliwe.
Abonament w REST i MCP
Pieniądze ruszają się tylko wtedy, gdy człowiek jest przy karcie. Włączenie abonamentu i płatność ręczna zwracają wyłącznie link do Stripe Checkout i nigdy nie obciążają karty bezpośrednio; podniesienie poziomu, wznowienie abonamentu ustawionego na koniec okresu i przełączenie na dokupowanie z karty wymagają potwierdzenia zalogowanego człowieka w portalu.
GET /v1/subscription- stan abonamentu (subscriptionlubnull), katalog poziomówtiers(id,priceHal,creditHal),topupBalanceHal,available(można włączyć nowy abonament: oferta jest włączona i żaden abonament nie działa),recommendation(najtańszy sposób płacenia za wydatki z ostatnich 30 dni orazsteady, czyli czy wydatki mają charakter ciągły, a nie jednorazowego szczytu;nullbez oferty lub bez 30 dni historii) orazpreviousPeriod(poprzedni okres z tymi samymi liczbami co e-mail o odnowieniu:usedHalzcreditHal,usedPercent, wydatki ponad saldo miesięczneoverHali wygasła resztaexpiredHal; tylko przy aktywnym abonamencie,nullw pierwszym okresie i gdy wydatków nie da się udowodnić historią).POST /v1/subscription/checkout {tier, exhaustionMode, consumerConsent?}- zwraca{checkoutUrl}do Stripe Checkout, po którego zakończeniu abonament się rozpoczyna.exhaustionMode(topuplubcap) jest wymagany; konsument bez numeru firmy musi wysłaćconsumerConsent: true(w przeciwnym razieconsumer_consent_required). Adres do faktury musi być kompletny (billing_address_required). ObsługujeIdempotency-Key.PATCH /v1/subscription {tier?, cancelAtPeriodEnd?, exhaustionMode?}- obniżenie poziomu, wypowiedzenie (cancelAtPeriodEnd: true) i przełączenie na limit (exhaustionMode: "cap") zostają wykonane i zwracają{subscription}. Podniesienie poziomu, wznowienie abonamentu ustawionego na koniec okresu (cancelAtPeriodEnd: false) iexhaustionMode: "topup"niczego nie zmieniają i zwracają 409subscription_confirmation_requiredzconfirmUrl.POST /v1/subscription/pay- tylko w staniepast_due; zwraca{checkoutUrl}do ręcznego opłacenia odnowienia. ObsługujeIdempotency-Key.POST /v1/subscription/card- zwraca{checkoutUrl}do wymiany zapisanej karty abonamentu, nic nie jest pobierane. ObsługujeIdempotency-Key.GET /v1/balancezawiera dodatkowosubscription(ten sam kształt co wyżej, w przeciwnym razienull) oraztopupBalanceHal.
MCP: get_subscription (odczyt), create_subscription_link (link do włączenia), update_subscription i cancel_subscription (obniżenie poziomu, wypowiedzenie, limit; podniesienie, wznowienie i dokupowanie zwracają confirmUrl ze zdaniem, że musi to potwierdzić człowiek w portalu) oraz create_subscription_payment_link (płatność ręczna). Wymiany karty w MCP nie ma, z tego samego powodu co przy automatycznym doładowaniu: stąd nic nie jest pobierane.
Dokumenty podatkowe
Dokument powstaje automatycznie przy doładowaniu salda kartą (jednorazowym i automatycznym), przy opłaceniu uruchomienia Pod klucz oraz jako dokument korygujący przy zwrocie za uruchomienie - żadnego ręcznego kroku, żadnego wystawiania przez API.
GET /v1/billing/documents?limit&before - najnowsze na początku, kursor before (Unix ms, wyłączny) to nextBefore z poprzedniej strony. Magazyn danych nigdy nie zwróci więcej niż 100 rekordów na jedno wywołanie, nawet jeśli limit żąda więcej.
GET /v1/billing/documents/{id} zwraca {id, number, issuedAt, taxableAt, netHal, vatHal, grossHal, vatRatePercent, reverseCharge, description, customer, paymentRef, pdfUrl} - reverseCharge: true w przypadku płatników z innego państwa UE ze zweryfikowanym numerem VAT (VIES), którzy płacą bez czeskiego VAT. Pole kind jest zawsze wypełnione - "invoice" przy zwykłym dokumencie (także przy dokumentach wystawionych przed wprowadzeniem pola), "credit_note" przy dokumencie korygującym - powstaje automatycznie, gdy właściciel zwraca cenę uruchomienia anulowanego zamówienia Pod klucz, jest numerowany własną serią OD... i zawiera dodatkowo correctsNumber (numer korygowanego dokumentu) oraz correctionReason (powód zwrotu); kwoty netHal/vatHal/grossHal są także przy korekcie DODATNIE, znak minus dodaje dopiero PDF.
GET /v1/billing/documents/{id}/pdf pobiera ten sam dokument jako application/pdf - jest składany od nowa przy każdym pobraniu i nie jest zapisywany. Cudzy lub nieistniejący id zgłasza ten sam błąd (invoice_not_found) w obu endpointach, aby z odpowiedzi nie dało się poznać, że cudzy dokument istnieje.
MCP: list_billing_documents i get_billing_document mają ten sam kształt co REST. PDF jest tylko w REST - MCP nie ma kanału binarnego do przesyłania plików.
Błędy
ledger_unavailable- Historii operacji ani salda nie udaje się teraz odczytać - proszę spróbować ponownie za chwilę.invalid_amount- Kwota doładowania, progu lub automatycznej płatności nie jest jedną z oferowanych stałych wartości.billing_address_required- Adres do faktury nie został podany lub jest niekompletny - proszę uzupełnić go w portalu (/nastaveni) przed doładowaniem, inaczej nie można wystawić prawidłowego dokumentu.stripe_not_configured- Płatności są wyłączone w tym środowisku volai - nie dotyczy konkretnie Państwa żądania.stripe_error- Stripe odmówił utworzenia sesji płatności - proszę spróbować ponownie za chwilę.autotopup_not_configured- Automatyczne doładowanie nigdy nie przeszło przez.../setup- nie ma czego wyłączać, zmieniać ani której karty wymieniać.invoice_not_found- Dokument z tymidnie istnieje na koncie (albo należy do innego konta - odpowiedź jest taka sama).spend_cap_reached- Ustawiony przez Państwa miesięczny limit wydatków został osiągnięty: nowe połączenia wychodzące i SMS-y są odrzucane i nic nie jest naliczane. Limit można podnieść lub usunąć przezPUTalboDELETE /v1/account/spend-cap, w przeciwnym razie obowiązuje do końca miesiąca (do północy w Pradze).subscription_cap_reached- Limit abonamentu: saldo miesięczne i doładowane jest wyczerpane, a konto ma wybrany limit. Połączenia wychodzące, SMS-y i zakupy numerów są odrzucane (HTTP 402) do następnego odnowienia lub do ręcznego doładowania.subscription_exists- Konto ma już abonament; zmiana poziomu, wypowiedzenie i wybór po wyczerpaniu przebiegają przezPATCH /v1/subscription.subscription_missing- Konto nie ma aktywnego abonamentu, który można by zmienić, wypowiedzieć lub opłacić ręcznie.subscription_canceled- Abonament już się zakończył (stancanceled): nie można go zmienić, wypowiedzieć ani opłacić ręcznie. Nowy można włączyć przezPOST /v1/subscription/checkout.subscription_confirmation_required- Podniesienie poziomu, wznowienie abonamentu ustawionego na koniec okresu i dokupowanie z karty potwierdza tylko człowiek w portalu - odpowiedź zawieraconfirmUrli nic się nie zmieniło.consumer_consent_required- Konsument bez numeru firmy musi przy włączaniu potwierdzić wyraźną prośbę o rozpoczęcie świadczenia przed upływem terminu na odstąpienie od umowy (consumerConsent: true).pausal_unavailable- Oferta abonamentu jest teraz wyłączona dla tego konta.invalid_tier- Poziom, który abonament już ma, gdy nie jest zaplanowany żaden inny (poziom, na który abonament już przechodzi, nie jest błędem i jest traktowany jako wykonany, więc to samoPATCH /v1/subscriptionmożna wysłać ponownie po awarii; wyjątkiem jest powrót do obecnego poziomu, który anuluje zaplanowaną zmianę: przy powtórzeniu nie ma już czego anulować); nieznana wartość poza"490","990","1990"kończy się jakovalidation.subscription_cap_active- Z limitem nie można włączyć automatycznego doładowania; najpierw proszę przełączyć wybór po wyczerpaniu natopupw portalu.validation- Konkretnie przyPATCH /v1/credit/auto-topup: próba włączenia (enabled: true) lub zmianyamountHalbezpośrednio - zamiast tego proszę użyćPOST .../setup.
Pełną tabelę błędów dla każdego endpointu można znaleźć w sekcji Saldo w dokumentacji REST API.
Powiązane
Serwer MCP
Podłącz Claude Code, Codex CLI, Codex desktop, Cursor i inne edytory AI.
REST API
Pełna dokumentacja wszystkich endpointów: numery, połączenia, SMS, numery komórkowe do SMS, agenci i ich wersje robocze, narzędzia, nagrania, webhooki, lista „nie dzwonić”, relay, konto, zadania, saldo, dokumenty, kalendarze i integracje.
Zadania
Kampanie wychodzące: tworzenie, import odbiorców z CSV, start/pauza/uzgodnienie, budżet i okno dzwonienia.